2013-03-18 83 views
7

Hilog术语(即具有作为函子任意术语的化合物)仍然被视为XSB Prolog(或任何其他Prolog)中的强大特征? 目前有很多XSB项目使用这个功能吗?他们中的哪一个?(XSB)中的Hilog术语Prolog

我问,因为据我所知,使用ISO内置呼叫/ N,同样可以进行更高阶的编程。

具体而言,我想了解XSB是否仅出于历史原因使用Hilog术语,或者Hilog术语与现行ISO标准相比具有相当大的优势。

回答

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]; 

这可能是在这样的背景下有call/N和Hilog方面的差异。但是,我到目前为止没有找到一个。

从历史上看,Hilog术语已在1987-1989年推出。在那个时间点,call/N已经作为NU的内建插件和Quintus Prolog的library(call)作为only cursory documentation存在。已经提出1984 by Richard O'Keefe。另一方面,对于Hilog的作者来说,call/N显然是未知的,正如在Weidong Chen,Michael Kifer,David Scott Warren:HiLog:高阶逻辑编程构造的一阶 语义的第101页上所例证的。 NACLP 1989. 1090-1114。 MIT-出版社。

...通用传递闭包也可以在序言定义:

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). 

这甚至比(=..)/2 -version因为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).