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