List 编写从给定数字返回整数和列表的Prolog代码
我正在尝试编写一个Prolog谓词,它可以使用DCG将给定的非负整数分解为每个可能的和 例如: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,
?- 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.