Prolog,失败,不要回溯

Posted

技术标签:

【中文标题】Prolog,失败,不要回溯【英文标题】:Prolog, fail and do not backtrack 【发布时间】:2010-05-23 15:48:24 【问题描述】:

SWI-Prolog 中是否有任何内置谓词总是会失败并阻止机器回溯 - 它是立即停止程序执行(这不是 fail/0 所做的)? 我可以使用剪辑,但我不喜欢它们。

!, fail 这样的事情对我来说不是问题,但为了完成我想要的,我必须在更多位置使用剪辑,这是我不喜欢的。

【问题讨论】:

【参考方案1】:

您可以使用例外。根据您的问题 - 它应该有所帮助。 参考link

【讨论】:

当我点击你的链接时没有看到任何东西【参考方案2】:

您可以使用明确设计的机制来帮助您完成某事,但您不喜欢它?

你总是可以使用 not,它是 cut fail 的语法糖

【讨论】:

【参考方案3】:

我想到了两种选择:

    通过您要控制的代码传递backtrack(true)backtrack(false) 术语,并在您正在编写的谓词的定义中对其进行解释,如果它设置为backtrack(false),则会快速失败,或者继续如果backtrack(true)。请注意,这实际上不会阻止回溯;它应该只启用 fast-failure。即使您的证明树很深,这也应该提供一种快速的方法来防止在回溯时执行某些代码。 按照@Xonix (+1) 的建议使用例外。抛出异常将立即终止证明树的构造,并且您可以通过异常将任何术语数据传递给处理程序,绕过任何更多的执行 - 它可能会比第一个选项更快,但可能不那么可移植。

就我个人而言,我以前使用过这两种方法——第一种是我在编写代码之前就已经预料到的需要,而第二种我没有。

【讨论】:

【参考方案4】:

太糟糕了,这就是削减的目的。

【讨论】:

以上是关于Prolog,失败,不要回溯的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Prolog 回溯期间获取值列表?

在Python中实现Prolog统一算法?回溯

如何具体化 Prolog 的回溯状态以执行与 Clojure 中的“lazy seq”相同的任务?

太多的回溯:为啥这里有“重做”?

mysql主从失败回溯

prolog简介