假设你有一个程序:
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 树下激活。
问题是这种虚拟剪辑是否存在。