4

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

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

4

4 回答 4

7

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

于 2010-05-23T22:02:56.833 回答
4

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

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

于 2010-05-23T15:58:20.007 回答
3

想到了两种选择:

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

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

于 2010-05-24T00:38:33.450 回答
2

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

于 2010-05-23T15:57:04.490 回答