HiLog 术语在现代 Prolog 中仍然有用吗?

问题描述 投票:0回答:2

Hilog 项(即具有任意项作为函子的复合项)仍然被视为 XSB Prolog(或任何其他 Prolog)中的强大功能吗? 目前有很多 XSB 项目使用此功能吗?例如其中哪一个?

我问这个问题是因为据我了解,使用 ISO 内置调用/N 同样可以进行高阶编程。

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

module prolog iso-prolog meta-predicate xsb
2个回答
6
投票

在 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 Prolog 中,并且只有粗略的文档。它是由理查德·奥基夫 (Richard O'Keefe) 于 1984 年提出的。另一方面,call/N
 对于 Hilog 的作者来说显然是未知的,正如 Weidong Chen、Michael Kifer、David Scott Warren 的第 1101 页所示:HiLog:一阶
高阶逻辑编程结构的语义。 NACLP
1989。1090-1114。麻省理工学院出版社。

...通用传递闭包也可以在 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 节),因为这涉及从列表中构造一个术语,并使用“call”将该术语反映到原子公式中。这个例子的要点是,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

 版本更通用,因为 
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).
    

-2
投票
HiLog 允许实现以下目标:

foo(X(a, Y(b))).
而 ISO Prolog 则不然。在 ISO Prolog 中,你必须这样写

foo(T), T=..[X, a, R], R=..[Y, b].
不太方便并且可能会更慢。

© www.soinside.com 2019 - 2024. All rights reserved.