在Prolog中添加数字并使用相同的变量统一它

时间:2014-11-25 07:08:16

标签: prolog

假设我有一个递归定义,每次运行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('')
   ).

2 个答案:

答案 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表示XSum必须是相同的数字。

现在,如果你想实际添加两个东西并保留新的总和,你必须为它使用一个新变量,因为这是变量的工作方式:

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.