首页 > 解决方案 > Prolog 列表返回 false

问题描述

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

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

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

谢谢你的帮助。

标签: prolog

解决方案


问题出在线路上S is S + R.。在 prolog 中,一个变量不能在一个子句的主体中取不同的值。在这里,您希望 的值发生S变化,但这不起作用(除非R为 0,在这种情况下S保持不变;因此它已经适用于单元素列表)。

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

mult([], _, 0).

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

我还冒昧地修复了您收到的单例变量警告。尽管在这种情况下它是无害的,但您永远不应该忽略它们,因为它们通常指向有缺陷的逻辑。


推荐阅读