next up previous contents
Next: 4.6 応用: 簡単な探索問題 Up: 4.5 応用: 幅優先評価の実現 Previous: 4.5.3 不要なノード評価を打ち切る方法

4.5.4 優先度を用いて幅優先に評価を行なう方法

  
図 4.13: 優先度を用いて幅優先評価を行なうプログラム(prio.kl1)

  
図 4.14: 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を フォークするが(712行目), 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の通常実行が行なわれた.



next up previous contents
Next: 4.6 応用: 簡単な探索問題 Up: 4.5 応用: 幅優先評価の実現 Previous: 4.5.3 不要なノード評価を打ち切る方法



KLIC