在(XSB)序言Hilog条款(Hilog terms in (XSB) Prolog)

2019-07-21 20:50发布

是Hilog条款(具有如函子任意条款,即化合物)仍然被视为XSB Prolog的(或任何其他的Prolog)的强大功能? 是否有正在使用此功能很多XSB项目? 这其中例如?

我问,因为据我了解使用ISO内置通话/ N高阶编程同样是可能的。

具体来说,我想如果XSB使用Hilog而言只是由于历史的原因,或者如果Hilog方面具有相当大的优势相比,目前的ISO标准理解。

Answer 1:

在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内置插件和library(call)在序言的Quintus与只有粗略的文档 。 有人提出由理查德·奥基夫1984年 。 在另一方面, call/N显然是未知的Hilog的作者,如在陈卫东,迈克尔Kifer,大卫·斯科特·沃伦的p.1101例证: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). 

然而,这显然是不雅相比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).


文章来源: Hilog terms in (XSB) Prolog