List 编写从给定数字返回整数和列表的Prolog代码

List 编写从给定数字返回整数和列表的Prolog代码,list,prolog,dcg,List,Prolog,Dcg,我正在尝试编写一个Prolog谓词,它可以使用DCG将给定的非负整数分解为每个可能的和 例如: ?- s(3, L, []). L = [3] ? ; L = [2,1] ? ; L = [1,2] ? ; L = [1,1,1] ? ; false. 我首先编写了一个谓词,它接受一个数字N,并返回L=[1,2,3,…,N]: mkList(N, L) :- m(0, N, L). m(X, X, []). m(Y, L, [H|T]) :- H is Y+1, m(H,

我正在尝试编写一个Prolog谓词,它可以使用DCG将给定的非负整数分解为每个可能的和

例如:

?- s(3, L, []).
L = [3] ? ;
L = [2,1] ? ;
L = [1,2] ? ;
L = [1,1,1] ? ;
false.
我首先编写了一个谓词,它接受一个数字
N
,并返回
L=[1,2,3,…,N]

mkList(N, L) :-
   m(0, N, L).

m(X, X, []).
m(Y, L, [H|T]) :-
   H is Y+1,
   m(H, L, T).
然而,我不确定如何继续

s(Input) -->
   { mkList(Input, InputList) },
   { member(X, InputList) },
   [X].

这就是我将要使用的,它开始我一个接一个地浏览列表。但是,我不确定应该在哪里包括一条规则来找出
X
Input

之间的差异。最好的方法是像Prolog一样思考,也就是递归地思考。是的,你有递归。这甚至可能是对的,但我不明白

这样想应该行得通:

mkList(Number,List) :-
 pick a number between 1 and number.  It'll be your first addend.
 subtract it from number to get the remainder.
 make a recursive call to handle the remainder.
 patch together List based on the first addend and the list from the recursive call.
显然,当数字小于1时,我们需要停止

这不使用DCG,但就我个人而言,我看不出DCG在这里有什么关系。

基本情况很简单:

all_sum(N) --> [N].
现在,我们可以递归调用,如果我们提供m1和N,然后取其余的R(注意它必须大于0)

请用上面的提示填写这些点。 你会得到

?- phrase(all_sum(3),L).
L = [3] ;
L = [1, 2] ;
L = [1, 1, 1] ;
L = [2, 1] ;
false.

您显示的不是使用DCG。你读过DCG文档了吗?此外,您对标准说的是“非负整数”,这意味着
s(3,L,[])
的有效解决方案应包括,
[0,3]
[0,0,3]
等等。我想你真的是指正整数?和应该由正整数组成,是的,这不是我所说的非负整数。我没有读过文档,我只是从网上的书“现在就学习Prolog”中学到了以下两个非常相关的答案:和。一个使用,另一个使用纯Prolog。嗯@潜伏者。在我看来,这个问题基本上是一样的,但是它的名字很糟糕:难怪这个用户127992没有找到它。在这里应该怎么做?重新命名旧问题?让新问题指向旧问题?将新问题标记为重复的(OP永远不会发现的问题)?你有什么建议吗?谢谢,这很有帮助。但是,我想找到一种使用DCG的方法。我开始的方式现在已经被编辑进了帖子。
?- phrase(all_sum(3),L).
L = [3] ;
L = [1, 2] ;
L = [1, 1, 1] ;
L = [2, 1] ;
false.