“辣椒”解释器中的Prolog传递闭包

时间:2019-04-16 17:07:43

标签: prolog metaprogramming transitive-closure

可以修正回溯。最近,“辣椒” 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谓词更强大,因为通向同一节点的不同路径将停止更快地搜索,

因为相应的制表可以收集访问列表,该列表未回溯但会跨越析取关系。不确定是否还会导致出现移位/重置,即定界连续显示。

0 个答案:

没有答案