读一个剪辑! 在Prolog中
我正在通过Learn Prolog阅读! 关于剪辑的章节,同时Bratko的人工智能Prolog编程,第5章:控制回溯。 起初,似乎削减是模仿其他编程语言中已知的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
的建议解决方案?
另请参阅此答案和此问题。
我应该如何阅读上述max / 3的建议解决方案?
max(X,Y,Z):- X =< Y, !, Y = Z.
max(X,Y,X).
你可以阅读这个如下:
当X =< Y
,忘记谓词的第二个子句,并统一Y
和Z
削减抛出选择点。 选择点是证明树中的标记,用于在找到解决方案后,告诉Prolog继续搜索更多解决方案的位置。 所以切割部分切割了验证树。 上面的第一个链接(这里再次)讨论了一些细节的切割,但是这个答案的很大一部分仅仅是引用了其他人对别处的切割所说的话。
我猜得到的回答是,一旦你在Prolog程序中进行了裁剪,你就会强迫自己在操作上阅读而不是声明式阅读。 为了理解证明树的哪些部分将被删除,你(程序员)必须通过动作,考虑子句的顺序,考虑哪些子目标可以创建选择点,考虑哪些解决方案丢失。 您需要构建证明树(而不是让Prolog执行此操作)。
您可以使用许多技巧来避免创建您不需要的选择点。 然而,这是一个很大的话题。 您应该阅读可用材料并提出具体问题。
链接地址: http://www.djcxy.com/p/66945.html