リダクションはその時点で空でない最高優先度のゴール・スタックの先頭のゴー ルについて行われる。 このゴールをリデュースした結果の子ゴールは、 そ れぞれの優先度に対応するゴール・スタックの先頭に入れられる。
REDUCEポートを処理するルーチン、 trace_after()には、 親ゴールの優先度に対応するゴール・ スタックの先頭へのポインタが渡される。 CALLポートでその時点のゴール・ スタックの先頭 (リデュースされるゴール自身の次のゴール) は qp_beforeとして記録されているので、 リデュース結果として生成された子ゴールはどこまでかを判別できる (図 8.3。qp_beforeは図中「記憶」に相当する)。
この方法だけでは、 親ゴールと異なる優先度の子ゴールを把握できない。 異 なる優先度の子ゴールができるのは、 優先度指定があるボディ・ゴールについ てだけである。 このような優先度指定つきのゴールについては若干面倒な処 理が必要なので、 コンパイルしたオブジェクト・コード中で直接行うのでは なく、 実行時サブルーチンを呼ぶようになっている。 そこで、 トレース用の 実行時ライブラリでは、 このサブルーチンをトレース・フラグが立っている場 合にはトレース用情報を保存するようにしている。
多くのプログラムでは子ゴールの優先度が親ゴールと同じである場合が支配的 である。 したがって、 トレース用の実行時ライブラリを使う場合に生じる、 優先度指定つきゴール処理ルーチン内でのフラグ判定オーバヘッドは、 通常ほ とんど無視できる程度である。