次の方針でプログラムを作成する.
プログラム例を以下に示す.
% request.kl1
:- module main.
main :- true | generator(next,20000,Stream), consumer(Stream).
generator(_,0,Stream) :- true | Stream = [].
generator(Next,N,Stream) :- N =\= 0, Next=next |
Stream = [send(N,NextN)|NextStream],
N1 := N - 1,
generator(NextN,N1,NextStream).
consumer([]) :- true | true.
consumer([send(N,Next)|Stream]) :- integer(N) |
Next = next,
consumer(Stream).
さすがにこのプログラムは

と, メモリ不足にならずに動く.
このプログラムは図 4.3 の通り生産者に対して, 消費者が整数を受け取った後に nextを送る. 生産者は消費者から 送られてきた nextで同期をとりながら次の整数を消費者に送る (最初の 1 回を除く).
実行トレースを見てみよう.

残念ながらサスペンドするゴールが増えていることがわかる. 要求駆動型にもそれなりの欠点があり, 前項のような プログラムと併せて時と場合に応じてプログラミングするのが望ましいと 言えよう.
前項のプログラムを要求駆動型にせずに, KL1 の優先度制御記述を利用して 簡単に実現する方法について次節で説明しよう.