我刚刚开始Prolog,并真正想知道为什么以下几行(特别是'is'部分)总是产生false:
highest(L) :-
path(_,_,Z),
Z >= L,
L is Z.
highestWrap :-
highest(0).
highestWrap被调用。
多谢,祝您有美好的一天!
答案 0 :(得分:1)
除非存在长度为0
的路径,否则该路径将不起作用,即使那样,它也可能不会产生您想要的内容:它将只是说真的。
在Prolog中,变量只能设置一次,这意味着如果将L
设置为0
,则除非您在该分配上回溯,否则它将保留0
。
在这里,这意味着您致电highest(0)
,接着您指示Prolog致电path(_, _, Z)
,这可能会导致零,一个或多个解决方案。如果没有path(_, _, Z)
,则呼叫将失败。但是如果有的话,Z
(如果我对谓词做出正确的假设)将有一个数值,例如7
。
现在在这种情况下,条件Z >= L
当然成立了(如果Z
是7
),所以这不是问题。但是现在您指定L is Z
。因此,这意味着您调用0 is 7
。 is/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)
统一起来。