我刚刚开始Prolog,我真的想知道为什么以下几行代码,特别是'is‘部分,总是产生false:
highest(L) :-
path(_,_,Z),
Z >= L,
L is Z.
highestWrap :-
highest(0).
调用highestWrap。
提前感谢,祝你有一个美好的一天!
发布于 2019-02-22 05:12:21
除非存在长度为0
的路径,否则这将不起作用,即使到那时,它也可能不会产生您想要的结果:它只会显示为true。
在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](http://www.swi-prolog.org/pldoc/doc_for?object=(is%29/2)谓词旨在解决第二个参数的表达式(该表达式在本例中为7
,因此没有太多需要解决的问题),然后将其与左侧的术语统一起来。但由于0
不等于7
,所以失败了。
如果您想获得最高路径,例如可以使用 [swi-doc]库:
:- use_module(library(aggregate)).
highest(L) :-
aggregate(Max(Z), path(_,_,Z), Max(L)).
然后,您可以使用higest(X)
调用它,以在对path(_, _, Z)
的调用中使用Z
的最高值来统一X
。
https://stackoverflow.com/questions/54816168
复制相似问题