Ser*_*gio 8 prolog xsb iso-prolog meta-predicate
Hilog术语(即具有作为算子任意术语的化合物)是否仍被视为XSB Prolog(或任何其他Prolog)中的强大功能?目前有许多XSB项目正在使用此功能吗?例如他们中的哪一个?
我问,因为据我所知,高阶编程同样可以使用ISO内置调用/ N.
具体来说,我想了解XSB是否仅仅出于历史原因使用Hilog术语,或者如果Hilog术语与当前的ISO标准相比具有相当大的优势.
在XSB中,Hilog术语与XSB独有的模块系统密切相关.XSB有一个基于仿函数的模块系统.也就是说,在同一范围内length(X)可能属于一个模块,而length(L, N)可能属于另一个模块.因此,call(length(L), N)可能会引用一个模块和call(length(L, N))另一个模块:
[Patch date: 2013/02/20 06:17:59]
| ?- use_module(basics,length/2).
yes
| ?- length(Xs,2).
Xs = [_h201,_h203]
yes
| ?- call(length(Xs),2).
Xs = [_h217,_h219]
yes
| ?- use_module(inex,length/1).
yes
| ?- length(Xs,2).
Xs = [_h201,_h203]
yes
| ?- call(length(Xs),2).
++Error[XSB/Runtime/P]: [Existence (No module inex exists)] in arg 1 of predicate load
| ?- call(call(length,Xs),2).
Xs = [_h228,_h230];
Run Code Online (Sandbox Code Playgroud)
可能在这样的背景下call/N,Hilog术语与Hilog术语之间存在差异.但是,到目前为止,还没有找到一个.
历史上,Hilog术语已于1987-1989引入.在那个时间点,call/N已经存在于NU和library(call)Quintus Prolog中的内置插件,只有粗略的文档.它由Richard O'Keefe于1984年提出.另一方面,call/NHilog的作者显然不知道,如Weidong Chen,Michael Kifer,David Scott Warren的第101页所示:HiLog:高阶逻辑编程构造的一阶语义.NACLP 1989. 1090-1114.MIT-出版社.
...通用传递闭包也可以在Prolog中定义:
Run Code Online (Sandbox Code Playgroud)closure(R, X, Y) :- C =.. [R, X, Y], call(C). closure(R, X, Y) :- C =.. [R, X, Z], call(C), closure(R, Z, Y).然而,与HiLog相比,这显然是不优雅的(参见第2.1节),因为这涉及从列表中构造一个术语并使用"调用"将该术语反映到原子公式中.这个例子的要点是,Prolog中缺少高阶构造的理论基础导致了一种模糊的语法,这部分地解释了为什么涉及这种结构的Prolog程序难以理解.
现在,这可以这样完成call/N:
closure(R, X, Y) :- call(R, X, Y).
closure(R, X, Y) :- call(R, X, Z), closure(R, Z, Y).
Run Code Online (Sandbox Code Playgroud)
这比(=..)/2反转更为普遍,因为R它不再局限于原子.顺便说一句,我宁愿写:
closure(R_2, X0,X) :- call(R_2, X0,X1), closure0(R_2, X1,X).
closure0(_R_2, X,X).
closure0(R_2, X0,X) :- call(R_2, X0,X1), closure0(R_2, X1,X).
Run Code Online (Sandbox Code Playgroud)