next up previous contents index
Next: リデュースにともなう再開ゴールの把握 Up: トレースの制御と情報入手 Previous: REDUCE/SUSPEND ポートのトレースのきっかけ

リダクション結果の子ゴールの認識

プログラムの実行はゴール・スタック中のゴールをプログラムにしたがって次々 にリダクションしていくことによって行われる。 このゴール・スタックは 優先度ごとに別のものがある。

リダクションはその時点で空でない最高優先度のゴール・スタックの先頭のゴー ルについて行われる。 このゴールをリデュースした結果の子ゴールは、 そ れぞれの優先度に対応するゴール・スタックの先頭に入れられる。

REDUCEポートを処理するルーチン、 trace_after()には、 親ゴールの優先度に対応するゴール・ スタックの先頭へのポインタが渡される。 CALLポートでその時点のゴール・ スタックの先頭 (リデュースされるゴール自身の次のゴール) は qp_beforeとして記録されているので、 リデュース結果として生成された子ゴールはどこまでかを判別できる (図 8.3。qp_beforeは図中「記憶」に相当する)。


  
Figure 8.3: 子ゴールの認識
\begin{figure}\begin{center}
\epsfile{file=child-goals.eps,width=.7\columnwidth}
\end{center}\par\end{figure}

この方法だけでは、 親ゴールと異なる優先度の子ゴールを把握できない。 異 なる優先度の子ゴールができるのは、 優先度指定があるボディ・ゴールについ てだけである。 このような優先度指定つきのゴールについては若干面倒な処 理が必要なので、 コンパイルしたオブジェクト・コード中で直接行うのでは なく、 実行時サブルーチンを呼ぶようになっている。 そこで、 トレース用の 実行時ライブラリでは、 このサブルーチンをトレース・フラグが立っている場 合にはトレース用情報を保存するようにしている。

多くのプログラムでは子ゴールの優先度が親ゴールと同じである場合が支配的 である。 したがって、 トレース用の実行時ライブラリを使う場合に生じる、 優先度指定つきゴール処理ルーチン内でのフラグ判定オーバヘッドは、 通常ほ とんど無視できる程度である。



Sekita Daigo
1998-05-18