Hilog术语(XSB)Prolog

Ser*_*gio 8 prolog xsb iso-prolog meta-predicate

Hilog术语(即具有作为算子任意术语的化合物)是否仍被视为XSB Prolog(或任何其他Prolog)中的强大功能?目前有许多XSB项目正在使用此功能吗?例如他们中的哪一个?

我问,因为据我所知,高阶编程同样可以使用ISO内置调用/ N.

具体来说,我想了解XSB是否仅仅出于历史原因使用Hilog术语,或者如果Hilog术语与当前的ISO标准相比具有相当大的优势.

fal*_*lse 5

在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中定义:

    closure(R, X, Y) :- C =.. [R, X, Y], call(C).
    closure(R, X, Y) :- C =.. [R, X, Z], call(C), closure(R, Z, Y). 
Run Code Online (Sandbox Code Playgroud)

然而,与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)