4

私は ECLiPSe Prolog でメタプログラムを実装しようとしています。ここに私が書いたコードがあります -

:- dynamic go/1.
sol(true):- !.
sol((A,B)):- !, sol(A), sol(B).
sol(A):- clause(A, Body), sol(Body).
go(X):- X is 5. 

でクエリを実行するとsol(go(X)).、エラーが発生accessing a procedure defined in another module in clause(X is 5, _292)して中止されます。すべてのトップレベル モジュールをクリアし、ECLiPSe を再度開いてから実行しようとしましたが、それでも同じエラーが発生します。

その理由は何ですか?

ありがとう!

4

1 に答える 1

3

Predicatep/1は組み込みの predicate を使用してい(is)/2ます。X is 5は、構文的により便利な書き方であることに注意してくださいis(X,5)。ただし、メタインタープリターは、ユーザー定義の述語と制御構造(',')/2とのみを期待していますtrue/0。処理したい場合(is)/2は、別の節を導入する必要があります。

sol(X is Y) :- !, X is Y.

ISO Prolog 内では、組み込みの述語であるpredicate_property(Goal,built_in)かどうかをテストするためにゴールを使用できます。Goalこれは、B、GNU、SICStus、SWI、XSB、YAP などの多くのシステムで機能します。したがって、次のように書くことができます。

sol(Bip) :- predicate_property(Bip, built_in), !, Bip.

ECLiPSe では、このビルトインは直接利用できません。ライブラリをロードする必要があります。マニュアルのインデックスは、ライブラリswiまたはを使用することを提案していますquintus。なんらかの (不明な) 理由で、ECLiPSe ライブラリの一部ではありisoませんが、ISO です。そう状態

:- use_module(library(swi)).

最初にファイル(またはトップレベル)で。

完全な Prolog 言語をカバーするメタインタープリターが必要な場合は、すべての制御構造を明示的に処理する必要があります。ここにそれらがあります-標準で定義されているとおりです(7.8 Controlコンストラクト)。

  1. true/0
  2. fail/0
  3. call/1
  4. !/0
  5. (',')/2
  6. (;)/2-選言
  7. (->)/2
  8. (;)/2- if-then-else
  9. catch/3
  10. throw/1

直接ゴールを呼び出して扱えるものはごく一部ですのでご注意ください。それらのほとんどは、明示的に処理する必要があります!

于 2012-02-19T01:33:07.763 に答える