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