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