メッセージを受けてそれに従って仕事をする, というふうにプロセスを書き表 せることを説明したが, もし仕事の内容がメッセージだけで完全に決まるのな らわざわざそんな書き方をする必要はない. プロセスを作ってそれにメッセー ジを送る代わりに, 必要な仕事をする述語を定義してそれを呼び出してしまえ ば良い.
メッセージ駆動のプロセスとして記述する意義は, プロセスには 状態 (state) を持たせることができるということにある. 前述の和を求める例で は, PSum という部分和を保持する引数が, その状態を表すものになっていた.
プロセスの状態がもっと明確に現れる例を示そう. 整数値を保持し, メッセー ジによってそれを増減するようなカウンタの機能を持つプロセスは, 以下のよ うに書ける.
このプログラムで定義するプロセスは, 第2引数としてその時々のカウンタの 値を保持している. 初期値は 0 で, 後から up, down というメッセージが来 るたびにそれを増減して再帰呼び出しの引数に渡すことによって, 状態を更新 しているわけである. このように KL1 のプロセスは 状態を引数値とし て保持する.counter(Stream):- counter(Stream,0). counter([],Count). counter([up|Stream],Count) :- New:=Count+1, counter(Stream,New). counter([down|Stream],Count) :- New:=Count-1, counter(Stream,New).
このプロセスを呼び出す時には
のようにして, メッセージ・ストリームを媒介して他のプロセスと通信できる ようにするわけだが, このストリームがカウンタのプロセスとそれ以外のプロ セスとを結ぶ唯一の通信手段である. 状態として保持しているカウンタの値 を直接他のプロセスが操作することはできない. つまり, プロセスの状態と して値を保持することは 情報を隠蔽していることになる...., counter(Stream), some_other_process(Stream), ...
この隠された情報にはどうやってアクセスしたら良いのだろう. 上のプログ ラムではメッセージを送ってカウンタを上下することはできるが, カウンタの 値が何なのかを読むことができない. これについては次節で説明しよう.