假设你有一个程序:
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树下激活。
问题是存在这样的虚拟切割。
答案 0 :(得分:1)
此功能称为“祖先剪切”,请参阅documentation页面。 Searching因为它会得到相当多的答案。
总之,我认为异常处理(参见throw / 1,ISO标准化)它是这个旧工具的真正替代品。