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

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

有帮助吗?

解决方案

您可以使用异常。基于您的问题 - 应该有所帮助。参考 关联

其他提示

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

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

想到了两个替代方案:

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

就我个人而言,我以前使用过这两种方法 - 第一个在编写代码之前我期望需要的地方,后者没有。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top