8

Hilog ターム (つまり、ファンクターとして任意のタームを持つ化合物) は、XSB Prolog (またはその他の Prolog) の強力な機能とみなされますか? 現在、この機能を使用している XSB プロジェクトは多数ありますか? たとえば、どれですか?

私が理解している限りでは、ISO 組み込みの call/N を使用して高次のプログラミングが同様に可能であるため、質問します。

具体的には、XSB が単に歴史的な理由で Hilog 用語を使用しているのか、それとも現在の ISO 標準と比較して Hilog 用語にかなりの利点があるのか​​を理解したいと思います。

4

2 に答える 2

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 用語の間に違いがある可能性があります。しかし、私はこれまでに1つも見つけていません。

歴史的に、Hilog 用語は 1987 年から 1989 年に導入されました。その時点で、call/N既に NU のビルトインとして存在しlibrary(call)、Quintus Prolog のように大雑把なドキュメントしかありませんでした。1984 年に Richard O'Keefe によって提案されました。一方、call/NWeidong Chen、Michael Kifer、David Scott Warren の p.1101 で例示されているように、Hilog の作成者には明らかに知られていませんでした: HiLog: A First-Order Semantics for Higher-Order Logic Programming Constructs. 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たため、これは - バージョンよりもさらに一般的です。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).
于 2013-03-18T18:04:28.150 に答える