5

関数 (例: hammingweight) を追加して、右辺で発生する式で使用するにはどうすればよい(is)/2ですか?

ここで、goal_expansion や term_expansion のようなものが役に立ちますか?

これが大きな機能ではないことは認めますが、私の Prolog プログラムの一部を読みやすくすることができます。

カスタム(is)/2述語を作成する (カスタム式エバリュエーターを実装する) ことは可能ですが、この場合、ランタイム オーバーヘッドのために読みやすさを犠牲にしたくないため、ランタイム オーバーヘッドを低く抑えたいと考えています。

4

4 に答える 4

1

移植性があり、サポートされている 12 の Prolog コンパイラ (*) で動作する Logtalk の項拡張メカニズムを使用できます。Logtalk のコンパイルとロードおよびロード述語は、Prolog ファイルを受け入れ、対応する Prolog 拡張ファイルを出力します。たとえば、展開するファイルの名前が であり、述語の定義が という名前のファイルにあると仮定すると、次のsource.plように実行できます。term_expansion/2goal_expansion/2expansions.pl

% first, load the expansion hooks:
| ?- [expansions].
...

% second, expand a file using those hooks:
| ?- logtalk_compile(source, [hook(user)]).
...

展開されたファイルを取得します。このファイルには (デフォルトで) 名前が付けられます( Logtalk フラグsource_pl.plの値に依存するディレクトリ内)。scratch_directory拡張が Prolog モジュールに含まれている場合は、代わりにモジュール名の上に を使用しますusersource.plファイルにプレーンな Prolog コードではなくモジュールが含まれている場合は、述語にいくつかの句を定義して、Logtalk がモジュールをオブジェクトとしてコンパイルしないようにする必要がありますterm_expansion/2。しかし、モジュールを使用していない単純なケースでは、上記の 2 つのクエリで十分です。

{}/1Logtalk の用語拡張メカニズムの便利な機能の 1 つは、制御構造でラップすることにより、用語または目標を拡張またはさらに拡張しないようにマークできることです。

(*) 項拡張メカニズムは標準ではなく、すべての Prolog 実装で提供されているわけではなく、実装間に大きな違いがあることに注意してください。

于 2015-03-04T14:04:54.527 に答える