プロセス・ネットワークの重要な要素であるマージャには, 入力ストリームの本数という問題点がある. 次のマージャプログラムは入力ストリーム2本用のものである.
merge([],In2,Out) :- Out=In2.
merge(In1,[],Out) :- Out=In1.
merge([Msg|In1],In2,Out) :- Out=[Msg|OutTail], merge(In1,In2,OutTail).
merge(In1,[Msg|In2],Out) :- Out=[Msg|OutTail], merge(In1,In2,OutTail).
入力ストリームを3本, 4本と増やしたい場合には,
3本用マージャ, 4本用マージャと一つ一つプログラムを用意してやるか,
2本用マージャでもって木構造をつくる
(図 2.5参照)かしなければならない.
前者の方法では, プログラムサイズが大きくなるという問題点がある.
後者の方法では, 入力ストリームがN本あった場合,
最低でも深さ
の木構造を構成してやる必要があり,
実行時の効率も悪くなる
.
この問題を解決するためにKLIC処理系では組み込み述語として マージャをサポートする.
これは, ``merge(In,Out)'' という形で呼び出し, ``In'' に入力スト
リームを要素とするベクトルをunifyしてやることで利用出来る. 例えば,
以下の二つのボディゴールによって, ``In1,In2,In3'' を入力ストリーム,
``Out'' を出力ストリームとする入力ストリーム3本用マージャが用
意出来る.
merge(In,Out),
In = { In1, In2, In3 },