假设我的查询中有以下文字列表和一个剪切:
?- c(X), d(X), e(X), !.
如果X=1
将所有文字求值为true
,那么最后的cut、!
谓词是否会被调用,或者整个过程是否会回溯?
根据我自己的经验,它似乎无法回溯,这意味着即使在找到true
或yes
之后也会调用cut谓词,这准确吗?
是;尽管我不确定你说时在想什么
无论如何都被调用
即使它的名称是感叹号而不是单词,并且它做了一些超出正常逻辑的事情,cut也是"只是另一个谓词";("literal"(的含义是,如果执行到达它,它就会被调用。如果c(X(对于X的当前值成立,则d(X(被调用。如果成立,则调用e(X(。如果这样的话!被调用。
使用一些低成本的代理:
?- member(X, [1,2,3,4,5]), write(X), X>2, write(X).
?- member(X, [1,2,3,4,5]), write(X), X>2, write(X), !.
第一行,成员为X选择一个值并绑定X=1,标记一个选择点,写入1,在X>2,回溯到选择点,重新绑定X=2,再次尝试,再次失败,再次回溯到选择位置,重新绑定X=3,现在三个都成功;Prolog为您提供X = 3
作为解决方案,而选择点仍然存在,因此它等待您要求更多解决方案或取消。如果您提示更多信息,它会返回到choicepoint,绑定X=4,然后重试。
第二行一开始也是这样,但当它达到X=3时,就会调用cut,member((中的choicepoint会被删除,Prolog会给你X = 3
并完成,没有任何提示。它已经找到了一个解决方案,并修剪了搜索树,因此它没有也不会探索所有可能的解决方案。
由于Prolog程序可以有很多选择点发生;切割";不会全部删除;任何给定的CCD_ 8确切地删除了哪些是在@brebs的链接中。