我正在阅读Learn Prolog Now!的关于削减的章节以及 Bratko 的人工智能 Prolog 编程,第 5 章:控制回溯。起初,cut 似乎是模仿其他编程语言中已知的 if-else 子句的直接方式,例如
# Find the largest number
max(X,Y,Y):- X =< Y,!.
max(X,Y,X).
然而,正如下面所述,如果所有变量都被实例化,即使我们期望,该代码也会失败false
,例如
?- max(2,3,2).
true.
原因很清楚:第一个规则失败,第二个规则不再有任何条件与之相关,所以它会成功。我明白这一点,但随后提出了一个解决方案(这里是嗖嗖声):
max(X,Y,Z):- X =< Y,!, Y = Z.
max(X,Y,X).
我很困惑我应该如何阅读这个。我!
的意思是:'如果在此之前的所有内容!
都是真实的,请停止终止,包括具有相同谓词的任何其他规则'。但是,这不可能是正确的,因为这意味着实例化Y = Z
仅在失败的情况下发生,这对于该规则是无用的。
那么应该如何以“人类”的方式阅读剪辑呢?而且,作为扩展,我应该如何阅读上述建议的解决方案max/3
?