可以修正回溯。最近,“辣椒” interpreter证明了这一点。执行Prolog目标是线性的,没有回溯,需要使用两个谓词first / 3和next / 2。
这是一个用Peano算术运行的示例:
?- first([add(X,Y,s(s(s(n)))),X-Y],[],[X-Y|L]).
X = n
Y = s(s(s(n)))
?- first([add(X,Y,s(s(s(n)))),X-Y],[],[_|L]), next(L,[X-Y|R]).
X = s(n)
Y = s(s(n))
作为传递闭包的示例,可以计算:
connection(harry, ron).
connection(ron, harry).
connection(hermione, harry).
connected(A, B) :-
connection(A, B).
connected(A, B) :-
connection(A, C),
connected(C, B).
?- connected(hermione, X).
X = harry ;
X = ron.
人们将如何处理它并分别添加制表符?我认为,结果制表将比closure谓词更强大,因为通向同一节点的不同路径将停止更快地搜索,
因为相应的制表可以收集访问列表,该列表未回溯但会跨越析取关系。不确定是否还会导致出现移位/重置,即定界连续显示。