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,失败,不要回溯的主要内容,如果未能解决你的问题,请参考以下文章