编写 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].
这就是我要使用的,它从我的 运行 开始逐一列出。但是,我不确定应该在哪里包含一条规则来找出 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.
显然我们需要在 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.
我正在尝试编写一个 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].
这就是我要使用的,它从我的 运行 开始逐一列出。但是,我不确定应该在哪里包含一条规则来找出 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.
显然我们需要在 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.