编写 Prolog 代码,其中 returns 给定数字的整数和列表

Writing Prolog Code which returns list of integer sums from a given number

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

例如:

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

我开始写一个谓词,它接受一个数字 N 和 returns 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].

这就是我要使用的,它从我的 运行 开始逐一列出。但是,我不确定应该在哪里包含一条规则来找出 XInput 之间的区别。

最好的方法是像 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.

显然我们需要在 Number 小于 1 时停止。

这不使用 DCG,但就我的生活而言,我看不出 DCG 在这里有何相关性。

基本情况很简单:

all_sum(N) --> [N].

现在,如果我们提供一个 M between 1 和 N,然后取其余的 R(注意它必须 > 0)

,我们就可以递归调用
all_sum(N) --> {...},[M],all_sum(R).

请使用上面的提示填写圆点。 你会得到

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