Prolog,失败和不回溯

4

在SWI-Prolog中,是否有内置谓词可以始终失败并防止机器回溯-即立即停止程序执行(这不是fail/0的作用)? 我可以使用割,但我不喜欢它们。

!,fail这样做对我来说不是问题,但为了实现我想要的功能,我需要在更多位置使用割,这就是我不喜欢的地方。

4个回答

7
你可以使用异常。根据你的问题 - 这应该有所帮助。 请参考 链接

2
当我点击你的链接时,我什么也看不到。 - Nacht

4

你可以使用专门设计的机制来帮助你完成某件事情,但你不喜欢它吗?

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


3
我想到了两种解决方案:
  1. 在你想要控制的代码中传递一个backtrack(true)backtrack(false)项,并在你编写的谓词的定义中进行解释,如果它被设置为backtrack(false)则快速失败,否则继续。请注意,这并不能真正防止回溯;它只应该启用快速失败。即使你的证明树很深,这也应该提供一种快速的方式来防止执行某些代码时出现回溯。
  2. 使用异常,如@Xonix(+1)所建议的。抛出异常将立即终止证明树的构建,并且你可以通过异常将任何项数据传递到处理程序中,绕过任何更多的执行 - 这可能比第一个选项更快,但可能不太具有移植性。
就我个人而言,我以前都使用过这两种方法 - 第一种是在编写代码之前预测到需要哪种方法,而后一种是没有预测到需要哪种方法。

2
很遗憾,这就是切割的目的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接