Hilog术语(即具有作为函子任意术语的化合物)仍然被视为XSB Prolog(或任何其他Prolog)中的强大特征? 目前有很多XSB项目使用这个功能吗?他们中的哪一个?(XSB)中的Hilog术语Prolog
我问,因为据我所知,使用ISO内置呼叫/ N,同样可以进行更高阶的编程。
具体而言,我想了解XSB是否仅出于历史原因使用Hilog术语,或者Hilog术语与现行ISO标准相比具有相当大的优势。
Hilog术语(即具有作为函子任意术语的化合物)仍然被视为XSB Prolog(或任何其他Prolog)中的强大特征? 目前有很多XSB项目使用这个功能吗?他们中的哪一个?(XSB)中的Hilog术语Prolog
我问,因为据我所知,使用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];
这可能是在这样的背景下有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).