優先度指定を使うにあたり, 次のことに注意すべきである.
優先度は下げる方向で使うべきである
一般的に, 優先度は下げる方向で使うよう心掛けるべきである. 例えば, 次に示すプログラムは優先度を上げる方向で使った例で, 思った通りには 実行されない悪い優先度の使い方の例である.
top:- true |
go@priority(100000)
go:- true |
a,b.
a :- true | goal_0@priority(200000).
b :- true | goal_1@priority(300000).
まず, 最低優先度のゴール goの中でゴール aと bを実行する. それぞれのゴールの 中では, 自分の優先度を 200000 と 300000 に上げている. ユーザが意図するところはおそらく次のようなものであろう.
ところが, 実際には次のように実行されて思い通りには動かないかも知れない.
この例の問題点は, ゴールの優先度を変えるという処理を行なうゴール aと bの優先度が, 変えた後のゴールの優先度よりも低い点であることは明らかで あろう. この例はごく単純な例なので, このような間違った優先度制御を行なうことは まずないと思われるが, プログラム中で動的に優先度を変える場合, しばしば 優先度を上げる方向で使ってしまうことがあるので注意すること.
優先度制御を行なう場合には, あくまでも優先度を下げる方向で使うように心掛け るべきである.
さらにもうひとつ重要な注意点がある. 次のことである.
ゴール優先度は, 同一プロセッサ内でのみ有効である.マルチプロセッサ環境下で将来 KLIC を動作させる時の注意である. 例えば生産者と消費者を別々のプロセッサで動作させた場合, 前述のゴール優先度を利用したプログラムでは過剰生産を防ぐことは できないのである.