“Prolog”中的传递闭包;“辣椒”;口译译员

“Prolog”中的传递闭包;“辣椒”;口译译员,prolog,metaprogramming,transitive-closure,Prolog,Metaprogramming,Transitive Closure,可以具体化回溯。最近一个“辣椒”就证明了这一点。执行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)) 作为传递闭包的

可以具体化回溯。最近一个“辣椒”就证明了这一点。执行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.
你会怎么做,给它加上闭包?我认为结果表将比谓词更强大,因为通向同一节点的不同路径将更快地停止搜索


因为相应的表格可以收集访问列表,它不是回溯的,而是跨析取运行的。不确定这是否也会导致移位/重置的演示,即分隔的继续。

我想我将继续我的移位/重置实验,这似乎比具体化回溯更容易,也可能更有效。另请参阅:我想我将继续我的移位/复位实验,这似乎比具体化回溯更容易,也可能更有效。另见: