序言列表返回false

时间:2018-11-15 03:28:37

标签: prolog

我在Prolog中相对较新。 我正在尝试将列表的所有元素相乘并相加,但它仅适用于一个元素。 怎么了?

 %Basic
mult([],A,0).

mult([X|Xs],A,S) :-
   mult(Xs,A,R),
   S is (X * A),
   S is S + R.

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

问题出在行S is S + R.上。在序言中,一个变量不能在子句主体内采用不同的值。在这里,您期望S的值会发生变化,但这是行不通的(除非R为0,在这种情况下,S保持不变;因此为什么它已经适用于单个元素列表)。

您需要使用其他变量来存储中间结果,并且仅将输出变量用于最终结果。例如:

mult([], _, 0).

mult([X|Xs], A, S):-
    mult(Xs, A, R),
    Tmp is (X * A),
    S is Tmp + R.

我也自由地修复了您得到的单例变量警告。尽管在这种情况下它是无害的,但您永远不应忽略它们,因为它们通常会指出有缺陷的逻辑。

相关问题