2

假设你有一个程序:

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)(this X=a) 绑定,下一次尝试绑定b(b)并失败,并且由于?放置在 的级别上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.因为切割从未在a(X)SLD 树下激活。

问题是这种虚拟剪辑是否存在。

4

1 回答 1

2

此功能称为“祖先切割”,请参阅文档页面。搜索它会产生相当多的答案。

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

于 2014-04-15T05:44:27.480 回答