KL1 は並列言語であり, 一般の手続型言語のように処理順が明確に規定されて いるわけではない. (KL1 ではゴールの実行順を規定するのは, ゴール間の引数の同期の 機構だけである. )
このような並列言語でデータを出力するような場合に, 単純にデータを出力するような機能を用意してプログラムを書いてしまうと, 一つしかない出力装置を取り合うことになってしまう.
一つしかない共有資源を, 複数の処理単位(ゴール)が並列にアクセ スするような場合には, あらかじめ一本のストリームを用意して各ゴールからのアクセスを差分リスト で渡すようにするか, アクセスを取りまとめるような仲介者( merger) を介在させて, 最終的に一本のストリームにまとめるかしなければならない.
このような事情から klic では, 直接出力装置にアクセスする手段はなく, 一本のアクセス要求ストリームを処理するデータ出力のための組 込み述語( outstream/1)を提供している.
job :- true | work(O), io:outstream(O).
work(O) :- true |
worker1( ... ,O,O1),
worker2( ... ,O1,O2),
.
.
workerN( ... ,On,[]).
outstream が受け入れるコマンドは print/1(引数の内容出力要求) と nl(改行要求)がある. なお, print/1 で引数の内容が具体化していない場 合には同期の機構が働いて待ち合わせするようになっており, 具体化されるまで 実際の出力はされない.