ゴールの優先度について述べてきたが, ここではもうひとつの 節優先度指定プラグマ alternatively について説明する.
再度生産者-消費者問題のプログラムを考えてみよう. 今度は 以下プログラムのように生産者が処理を中止するかどうかを判断する ために変数をひとつもち, この変数に何か値が設定された時に処理を 中止するように定義する.
generator(stop,Stream) :- true | Stream = [].
generator(Stop,Stream) :- true |
Stream = [1 | NextStream],
generator(Stop,NextStream).
説明を簡単にするため整数列を 1 の列で表現した.
このプログラムにはバグがある. 述語 generator は 2 つの節をもち, 次の意味で実行したい.
しかしこのプログラムをコンパイルすると

といった警告メッセージが出力される. つまりこのままではコンパイラが最適なコードを生成するにあたり, 述語 generator 定義中に冗長節があると指摘してしまう. このような場合, リダクションを試行する節に 優先順序を記述することで generator 定義にある両節への リダクションチャンスを与えることができる. それが alternatively である. alternatively を使ったプログラムを示す.
generator(stop,Stream) :- true | Stream = [].
alternatively.
generator(Stop,Stream) :- true |
Stream = [1 | NextStream],
generator(Stop,NextStream).
述語 generatorの第 1 節のリダクション, つまり第 1 引数への
メッセージ到着済みであることが確認できれば第 1 節を選択し,
確認できなければ第 2 節を実行することになる.