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/N
Weidong 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).