简单的Prolog谓词-语句始终被评估为false

时间:2019-02-21 21:02:11

标签: prolog

我刚刚开始Prolog,并真正想知道为什么以下几行(特别是'is'部分)总是产生false:

highest(L) :-
    path(_,_,Z),
    Z >= L,
    L is Z.
highestWrap :-
    highest(0).

highestWrap被调用。

多谢,祝您有美好的一天!

1 个答案:

答案 0 :(得分:1)

除非存在长度为0的路径,否则该路径将不起作用,即使那样,它也可能不会产生您想要的内容:它将只是说真的。

在Prolog中,变量只能设置一次,这意味着如果将L设置为0,则除非您在该分配上回溯,否则它将保留0

在这里,这意味着您致电highest(0),接着您指示Prolog致电path(_, _, Z),这可能会导致零,一个或多个解决方案。如果没有path(_, _, Z),则呼叫将失败。但是如果有的话,Z(如果我对谓词做出正确的假设)将有一个数值,例如7

现在在这种情况下,条件Z >= L当然成立了(如果Z7),所以这不是问题。但是现在您指定L is Z。因此,这意味着您调用0 is 7is/2 [swi-doc]谓词旨在解决第二个参数的表达式(该示例中的表达式为7,因此没有太多要解决的问题),然后<目标>目标进行统一它与左侧的术语。但是由于0不等于7,因此失败。

如果要获取最高路径,例如可以使用aggregate [swi-doc]库:

:- use_module(library(aggregate)).

highest(L) :-
    aggregate(Max(Z), path(_,_,Z), Max(L)).

然后,您可以使用higest(X)对其进行调用,以在对X的调用中将Z的最高值的path(_, _, Z)统一起来。