next up previous
Next: 研究成果 Up: 無題 Previous: 研究の背景と目的

研究内容

デバッガ(より具体的にはトレーサ) を実装していないため,プログラミング処理系としては未完成であった. そこで本研究ではPRISMトレーサの開発を主な目標とした. Prolog メタインタプリタに基づくことによって単一化等の計算や 基本的な探索制御を Prolog 処理系に任せることができ,短期間での 開発が可能になり,また今後の拡張が容易になる.また,トレース中に プログラムの確率情報をオンラインで表示するような仕組みを組み込む ことを試みた.

Prolog はその記述能力の高さによって非常にシンプルな形で メタインタプリタを記述できることが知られている.しかし プログラミング上欠かせないカットや失敗としての否定を扱う にはやや複雑な仕掛けが必要である. PRISMトレーサの実装に当たって我々は以下の3つを組み込んだ. 各々の要素はどのように働くかを本節で述べる.

gif の右はオブジェクトプログラムの探索木で, 左はPRISMトレーサの探索木である.PRISMプログラム中の各ゴールは solve/3 の第3引数として扱われる.PRISMトレーサの探索木における各ゴールノード には一意なIDが与えられ, solve/3 は第1引数と第2引数にそれぞれ 自分のIDと親のIDを保持する. 純 Prolog メタインタプリタの探索木と比較すると,PRISMインタプリタは ボディには push/1 pop/1 が現れる sub_solve/3 という述語が新たに導入されている.

  
図: PRISMトレーサの探索木

PRISMインタプリタは各ゴールノードに 付与した一意なIDをスタックに蓄えることができる. カットの作用によりスタック内の ID には ` *' ラベル が付いていることがある. push(I)I というIDをスタックに push する.I は ground で呼び出され, push(I) は常に成功する. pop(I) はスタックの先頭 I を pop する.I にラベルがついていないときに成功し,I に ` *' ラベルがついていれば失敗する. PRISMトレーサは図中の部分木 T で PRISM プログラムにおける fail をキャッチし, push/1 pop/1 で様々な場面に 応じた適切な処理を行なう.



next up previous
Next: 研究成果 Up: 無題 Previous: 研究の背景と目的



www-admin@icot.or.jp