kprolog K-Prolog Compiler Version 6.0

論理的代入

副作用を用いず項を保存する機能として論理代入機能 があります。 この機能により論理的な空間に項を保存できます。論理的な、とは この機能により保存した項が通常の単一化の対象であり、 値がバックトラックにより復元されるということを意味しています。
この機能の主要な部分は等価なProlog言語での実装があります。
従来、項オブジェクトの書き換えに伴って、 述語の起動ごとに新しい引数を追加しなければならなかったのに対し、 この機能を使うと、同じオブジェクトの中で書き換えが行われているように 見えるため、引数の追加が必要ありません。

たとえば、4X4の囲碁の盤面をPrologの項で表したいとします。

board(
	col(_,_,_,_),
	col(_,_,_,_),
	col(_,_,_,_),
	col(_,_,_,_)
)
こんな項の形が考えられますが、1の1に黒石を置くためには この項全体の書き換えが必要です。 論理的代入を使えば、
putnm(Board,N,M,Color):-
	arg(Board,N,Line),
	arg(Line,M,Place),
	Place <= Color.
という直感的にわかりやすい記述ですみます。

【例】項の論理的な保存

Xに値を代入するとして、2つの値を順に代入した後に読み出す例

	X=}0{,               % X を保存のための容器とし、初期値 0 を附値
	X<=1,               % X に1を附値
	X<=foo,             % X にfooを附値
	X=>Y,               % Y にXの値を単一化する(この場合はfoo)

sample/array.pl には、この機能を使って代入可能な配列を実現した例、
demo/java/reversi/ には、オセロの盤面を実現した例がありますので、 参考にしてください。

モジュール内グローバル変数

論理代入機能を使ったもうひとつの応用はとして、モジュール内グローバル変数の実現があります。この機能は、アトミックな項Aに対しひとつの論理代入可能な変数を対応させることによって、引数渡し以外の変数の受け渡しを実現するものです。
【例】
	global(x),	% x をモジュール内グローバル変数とする
	x<=bar		% x にbarを附値
	...		% その後の計算で、x=>Y にてbar を取り出せる
ひとつのモジュール内にグローバル変数は4096個作ることができます。 sample/array.pl には、この機能を使って代入可能な配列を実現した例、
demo/java/reversi/ には、オセロの盤面を実現した例がありますので、 参考にしてください。


一つ上に戻る 目次に戻る