Prolog,失败,不回溯

时间:2010-05-23 15:48:24

标签: prolog backtracking prolog-cut

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

!, fail这样的事情对我来说不是问题,但为了达到我想要的目的,我必须在更多地方使用剪切,这是我不喜欢的。

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

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

你总是可以使用not,这是剪切失败的语法糖

答案 2 :(得分:3)

有两种选择:

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

答案 3 :(得分:2)

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