Prolog的Cut谓词是否在真/是调用后执行?



假设我的查询中有以下文字列表和一个剪切:

?- c(X), d(X), e(X), !.

如果X=1将所有文字求值为true,那么最后的cut、!谓词是否会被调用,或者整个过程是否会回溯?

根据我自己的经验,它似乎无法回溯,这意味着即使在找到trueyes之后也会调用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的链接中。

最新更新