next up previous contents
Next: 4.3.2 ゴール優先度指定の文法 Up: 4.3 KL1 のゴール優先度指定方法 Previous: 4.3 KL1 のゴール優先度指定方法

4.3.1 再び生産者と消費者の問題

優先度指定付きのプログラムをまず見せよう.

%  genconwp.kl1
:- module main.

main:- true |
     generator(20000,Stream)@lower_priority, consumer(Stream).

generator(0,Stream) :- true | Stream = [].
generator(N,Stream) :- N =\= 0 |
     Stream = [N | NextStream],
     N1 := N - 1,
     generator(N1,NextStream).

consumer([]):- true | true.
consumer([N|Stream]):- integer(N) | consumer(Stream).

先ほどの要求駆動型プログラムより簡単であり, gif ページの プログラムとほとんど変わらない.

次の通りメモリ不足に陥らず, 計算できる.

実行トレースを見てみよう.

実行順序が制御されていることが分かる.

ソースプログラム中の見慣れない記号を説明しよう. 今までの記述と 異なるのは次の箇所である.

generator(20000,Stream)@lower_priority

ゴールの後ろについた@lower_priorityは, ゴール優先度指定プラグマと 呼ばれる. この記述は `現在よりひとつ低い優先度でこのゴールリダクションを 試みよ' を意味する. この優先度に関しては, 次の規則に従って KL1 プログラムが実行されている.

この規則に従うと上述のプログラムは, 次の意味付けされていると 考えることができる. そんな訳でメモリの大量消費を防ぐことができたのである. さて文法に ついて次項で説明しよう.



next up previous contents
Next: 4.3.2 ゴール優先度指定の文法 Up: 4.3 KL1 のゴール優先度指定方法 Previous: 4.3 KL1 のゴール優先度指定方法



KLIC