2013-03-18 5 views
7

ヒルグ語(すなわち、任意の用語を持つファンクタを持つ化合物)は、XSBプロローグ(または他のプロローグ)の強力な特徴と考えられていますか? 現在この機能を使用しているXSBプロジェクトはたくさんありますか?それらのうちどれですか?プロローグ

ISOビルトインコール/ Nを使用すると、より高度なプログラミングが同様に可能であることが分かります。

具体的には、歴史的な理由からだけXSBがヒロッグ用語を使用しているか、ヒロッグ用語が現在のISO標準と比較してかなりの利点があるかどうかを理解したいと思います。

答えて

5

XSB内では、Hilogの用語はXSBに固有のモジュールシステムと非常に強く結びついています。 XSBには、ファンクタベースのモジュールシステムがあります。つまり、同じスコープ内でlength(X)が1つのモジュールに属している可能性がありますが、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のビルトインとして存在し、only cursory documentationのQuintus Prologにはlibrary(call)として存在していました。 1984 by Richard O'Keefeが提案されている。一方、call/Nは、Weidong Chen、Michael Kifer、David Scott Warrenのp.1101に例示されているように、Hilogの著者には明らかに知られていませんでした:HiLog:A First-Order 高次論理プログラミング構造のセマンティクス。 NACLP 1989. 1090-1114。 MIT-Press。

...一般的な推移閉包も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で行うことができません。でも、より一般的なRため(=..)/2 -versionより

closure(R, X, Y) :- call(R, X, Y). 
closure(R, X, Y) :- call(R, X, Z), closure(R, Z, Y). 

はもはや原子であることに制限されています。私はむしろ次のように書きます。

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