prolog,失败,不回轨
-
04-10-2019 - |
题
SWI-Prolog中是否有任何构建谓词会始终失败并防止机器回溯 - 它阻止程序立即执行(这不是什么 fail/0
做)?我可以使用剪裁,但我不喜欢它们。
做类似的事情 !, fail
对我来说不是问题,但是为了完成我想要的事情,我必须在更多的位置使用削减,这就是我不喜欢的。
解决方案
您可以使用异常。基于您的问题 - 应该有所帮助。参考 关联
其他提示
您可以使用明确设计的机制来帮助您完成一些事情,但您不喜欢它?
您可以随时不使用,这是句法糖的切割失败
想到了两个替代方案:
- 传递a
backtrack(true)
或者backtrack(false)
通过您要控制的代码术语,并在您写作的谓词的定义中解释它,如果将其设置为backtrack(false)
, ,或继续backtrack(true)
. 。请注意,这实际上不会阻止回溯;它应该启用 快速失败. 。即使您的证明树很深,这也应该提供一种快速的方法来防止在回溯时执行某些代码。 - 如@xonix(+1)所建议的,使用异常。抛出例外将立即终止证明树的构造,您可以通过例外的任何术语数据传递给处理程序,绕过任何执行力 - 它可能比第一个选项更快,但可能不那么便携。
就我个人而言,我以前使用过这两种方法 - 第一个在编写代码之前我期望需要的地方,后者没有。
太糟糕了,这就是削减的目的。
不隶属于 StackOverflow