标签: swi-prolog-for-sharing

读一剪!在序言中

我正在阅读Learn Prolog Now!的关于切割的章节,同时是 Bratko 的人工智能 Prolog 编程,第 5 章:控制回溯。起初,cut 似乎是模仿其他编程语言中已知的 if-else 子句的直接方式,例如

# Find the largest number
max(X,Y,Y):- X =< Y,!. 
max(X,Y,X).
Run Code Online (Sandbox Code Playgroud)

但是,正如下面所指出的,即使在我们期望的情况下,在所有变量都被实例化的情况下,此代码将失败false,例如

?- max(2,3,2).
true.
Run Code Online (Sandbox Code Playgroud)

原因很明显:第一个规则失败,第二个不再有任何条件与之相关,所以它会成功。我明白这一点,但随后提出了一个解决方案(这是一个swish):

max(X,Y,Z):- X =< Y,!, Y = Z. 
max(X,Y,X).
Run Code Online (Sandbox Code Playgroud)

我很困惑我应该如何阅读这个。我认为的!意思是:“如果在此之前的所有内容!都是真的,请停止终止,包括具有相同谓词的任何其他规则”。但是,这不可能是正确的,因为这意味着 的实例化Y = Z仅在失败的情况下发生,这对于该规则是无用的。

那么应该如何以“人”的方式阅读剪辑?而且,作为扩展,我应该如何阅读上述建议的解决方案max/3

prolog prolog-cut swi-prolog-for-sharing

6
推荐指数
1
解决办法
2718
查看次数