2013-03-18 59 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).