2

foo(で定義)という名前のモジュールがあるとしますfoo.pl。このモジュールはterm_expansion、たとえば次のことを行います。

:- module(foo,[term_expansion/2]).

term_expansion(A,A) :-
    print A.

もちろん、実際のコードは用語を使ってもっと複雑なことを行います。

今、私はこのライブラリをファイルにインポートしたいと思いますtest.pl.

:- use_module(foo).
fact(a).

ただし、使用するswi-prologと、次のエラーが発生します。

ERROR: Cannot import foo:term_expansion/2 into module user: name clash

このエラーを解決するにはどうすればよいですか?

4

1 に答える 1

3

項展開述語は、通常 (標準ではありません) マルチファイル (および場合によっては動的) 述語として宣言されます。term_expansion/2SWI-Prolog の特定のケースでは、用語拡張メカニズムはすでに疑似モジュールの述語の定義を定義して呼び出していますuser。したがって、考えられる解決策は、代わりに次のように書くことです。

:- module(foo).

:- multifile(user:term_expansion/2).
:- dynamic(user:term_expansion/2).

user:term_expansion(A,A) :-
    print(A).

用語展開したいファイルをロードする前に、このモジュールの定義をロードするだけでよいはずです。

term_expansion/2述語がデフォルトで複数ファイルとして宣言されていない理由についてのフォローアップの質問について。あなたの質問には2つの異なる解釈を与えることができます。私は両方に対処します。(1) なぜ繰り返す必要があるのかmultifile/1指令?ISO Prolog 標準では、マルチファイルの述語は、その句を含むすべてのファイルでマルチファイルとして宣言する必要があることを暗示しています (標準では、ファイルではなく「プロローグ テキスト」について話しているため、指定するのではなく、暗示すると言います)。実際、SWI-Prolog はここでは非常に寛大ですが、他のシステムがこの点でより厳密に標準に準拠している場合は、ディレクティブを繰り返すことをお勧めします。(2) そもそも、項展開述語をマルチファイル (および動的) と宣言しなければならないのはなぜですか? それは実装に依存します。たとえば、用語拡張メカニズムの Logtalk 実装では、それらはマルチファイルでも動的でもありません。

于 2013-10-16T15:57:39.553 に答える