在Prolog中切入更高的级别

时间:2014-04-15 03:24:49

标签: prolog prolog-cut

假设你有一个程序:

a(X) :- b(X).
a(X) :- c(X).

b(a).
b(b) :- !,fail.
b(c).
c(a).

查询a(X)将返回A=a; X=a。我正在寻找一种机制,其中cut(!)不仅阻止一个人在执行树的同一节点中进一步执行谓词,而且只是回溯到某个级别。


虚拟剪辑(?

例如,如果该运算符为?

程序:

a(X) :- ?,b(X).
a(X) :- c(X).

b(a).
b(b) :- !,fail.
b(c).
c(a).

会导致X=a,因为它首先与b(a)绑定(此X=a),然后尝试与b(b)绑定并失败,并且从{{1}开始}被放置在?的水平上,这个"虚拟切割"被激活以及阻止a(X)进入下一个分支。

如果是以下程序:

a(X)

结果应为a(X) :- ?,b(X). a(X) :- c(X). b(a). b(b). b(c). c(a). ,因为切换永远不会在X=a; X=b; X=c; X=a. SLD树下激活。

问题是存在这样的虚拟切割。

1 个答案:

答案 0 :(得分:1)

此功能称为“祖先剪切”,请参阅documentation页面。 Searching因为它会得到相当多的答案。

总之,我认为异常处理(参见throw / 1,ISO标准化)它是这个旧工具的真正替代品。