kprolog K-Prolog Compiler Version 6.0

モード宣言

モード宣言とは、多数の節からなる述語で、入力引数の性質が定まっているものを 高速にアクセスするための宣言です。
   :-mode p(+,'#'(+,?,?),-)
は、p の第1引数および、第2引数の関数記号と、第2引数の第1引数が 呼び出し時に確定した値をもっており、第3引数が変数であることを指定しています。 この宣言により、インタプリタは、+または#に対応する引数をキーとして、 述語pの節を(実際にはハッシュ法により)検索します。

また、コンパイラは、 コンパイルコードの最適化 情報としてモード宣言があれば使用しますが、 publicされていないつまり、公的でない述語の場合、モードの自動推定も行なっていますので、 特に際だった指定を行なうことを意図している場合を除いてモード宣言は不要です。
モード宣言の引数として書けるものは、

    +,-,'+'(D,D,...),'#'(D,D,...)
    D は、+,-  または ? 
の形です。
モード宣言が有効な引数は、述語の第1〜第4引数です。そのそれぞれの引数 について、最大3引数、'#'(+,+,+)まで、指定できます。
[例]

   p(x(a),f(x,X),X).
   p(x(b),g(y,X),X).
   p(y(b),h(y,X),X).
   p(z(b),i(y,X),X).
   p(z(c),k(y,X),X).
 
に対し、

   :- mode p(+,?,?).
   :- mode p('#'(+),'#'(+,?),?).
   :- mode p('#'(?),'#'(?,?),?).
   :- mode p(?,'#'(?,?),?).
はそれぞれ有効なモード宣言です。
+記号は検索の範囲を狭くするために用いますが、インタプリタの場合、 +記号の数が少ない方がハッシュは速くなるので、最後のものが原理的には最も高速で す。
コンパイラの場合は、適切なインデキシングコードが生成されます。

インタプリタで動作させる場合、 モード宣言は、述語を呼び出していないときならば、いつでも変更できます。 また、モード宣言されている述語に対し、 asserta や assertzで 節を追加することや、 retractで節を削除することは 自由に行えます。
しかし、述語を呼び出している途中(たとえば、代替節が残っているとき) にモード宣言を実行すると、その後の実行は保障されません。


一つ上に戻る 目次に戻る