図 4.13: 優先度を用いて幅優先評価を行なうプログラム(prio.kl1)
前述したcont.kl1はゴールの優先度制御を行なわないため ノード評価打ち切りの機能の働く保証がなかった. ここでは優先度を用いて幅優先評価を行ない ノード評価の打ち切りを行なう方法を示す.
プログラム(prio.kl1)を図4.13に示す. このプログラムは9,12行目のeval/3に優先度のプラグマが付いていることを除いて 図4.9のcont.kl1と全く同じである.
eval/3は, 2つのeval/3とand_node/6あるいはor_node/6を
フォークするが(7
12行目),
2つのeval/3の優先度はand_node/6及びor_node/6よりも低い.
この結果 eval/3よりもand_node/6及びor_node/6が優先的に実行され
不要なノード評価の打ち切られることが期待される.
またルートに近いノードに関するゴールほど高い優先度で実行されるので
全体としては幅優先評価が行なわれる.
図 4.15: prio.kl1の実行トレース(eval/3のリダクション)
図4.14にゴールの優先度を, 図4.15にeval/3のリダクションの様子を示す. 3つのノードが評価を打ち切られ(5,6,7行目), 17ノード中4ノードについてのみeval/3の通常実行が行なわれた.