2010-05-23 40 views
4

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

做一些像!, fail对我来说不是问题,但为了完成我想要的,我将不得不在更多的位置使用切割,这是我不喜欢的。

回答

7

你可以使用异常。根据你的问题 - 它应该有所帮助。 参考link

+2

我没有看到任何东西,当我点击你的链接 – Nacht 2012-04-25 15:52:07

2

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

4

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

您可以随时使用不,这是切语法糖失败

3

两个备选方案浮现在脑海中:

  1. 通过周围要控制,并在你写的快速失败的谓词的定义,解释它的代码backtrack(true)backtrack(false)长期通行证如果它设置为backtrack(false),或者如果backtrack(true)继续。请注意,这实际上不会阻止回溯;它应该只启用快速故障。即使你的证明树很深,这应该提供一种快速的方法来防止在回溯时执行某些代码。
  2. 按照@Xonix(+1)的建议使用异常。抛出异常会立即终止证明树的构造,并且可以通过异常直至处理程序传递任何期限数据,绕过任何更多的执行 - 它可能会比第一个选项更快,但可能不如便携式。

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