next up previous contents
Next: 【演習問題】 データ記録方法の練習 Up: 3 差分リストの使い方 Previous: 3.3 ショートサーキット

3.4 出力ストリーム

KL1 は並列言語であり, 一般の手続型言語のように処理順が明確に規定されて いるわけではない. (KL1 ではゴールの実行順を規定するのは, ゴール間の引数の同期の 機構だけである. )

このような並列言語でデータを出力するような場合に, 単純にデータを出力するような機能を用意してプログラムを書いてしまうと, 一つしかない出力装置を取り合うことになってしまう.

 
図 3.8: アクセスの競合

一つしかない共有資源を, 複数の処理単位(ゴール)が並列にアクセ スするような場合には, あらかじめ一本のストリームを用意して各ゴールからのアクセスを差分リスト で渡すようにするか, アクセスを取りまとめるような仲介者( merger) を介在させて, 最終的に一本のストリームにまとめるかしなければならない.

 
図 3.9: 共有資源へのアクセス

このような事情から 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 で引数の内容が具体化していない場 合には同期の機構が働いて待ち合わせするようになっており, 具体化されるまで 実際の出力はされない.



next up previous contents
Next: 【演習問題】 データ記録方法の練習 Up: 3 差分リストの使い方 Previous: 3.3 ショートサーキット



KLIC