假设我有一个递归定义,每次运行4次,为X1
赋予新值,A1
的最终值应该是所有X1
的总和。(这是我想实现A1=A1+X1
,其中X1
在每次递归调用后获取新值)
add(A1,X1,L1,L):-
L1 is L+1,
A1 is A1+X1.
Sum(A1,L):-
nth1(L,[1,2,4,5],X1),
add(A1,X1,L1,L),
( L1<=4 ->Sum(A1,L1)
; write('')
).
答案 0 :(得分:1)
我感觉看着你的代码和你用于变量的名称,你认为变量总是以全局的形式存在。你没有必要宣布&#34;或&#34;实例化&#34; N is 1
的数字。所以你的代码可能是:
main :-
add(2, 3).
add(X, Y) :-
sum(X, Y, Sum), write(Sum), /* X is Sum */ write(X), nl.
sum(X, Y, Sum) :-
Sum is X + Y.
在这种情况下,X is Sum
表示X
和Sum
必须是相同的数字。
现在,如果你想实际添加两个东西并保留新的总和,你必须为它使用一个新变量,因为这是变量的工作方式:
add(X, Y) :-
sum(X, Y, Sum), write(Sum),
nl,
sum(Sum, X, X1), write(X1),
nl.
答案 1 :(得分:1)
变量,一旦绑定到一个值(统一)就不再是变量。它们成为不可改变的对象。
然而,为了达到你想要的效果(我理解你的问题陈述),你可以这样说:
sum(A,X,1,S) :- % one iteration, and we're done. Just compute the sum of A+X.
S is A+X . % - just compute the sum of A+X and unify it with S.
sum(A,X,N,S) :- % otherwise...
N > 1 , % - so long as N > 1 ,
N1 is N-1 , % - decrement N
A1 is A+X , % - compute a new A, the sum of the current A+X
sum(A1,X,N1,S) . % - and recurse down, passing the new values.