next up previous contents index
Next: 並列処理系 Up: トレースの制御と情報入手 Previous: トレースされた中断ゴールの再開の把握

trace_after()の処理

これまでの説明の各所で出現した、trace_after()で行われている処理について、 以下に纏める。

1.
トレース状態を、親ゴールがスケジュールされたときの状態(parent_info)に する。

2.
ゴールスタックの先頭から、親ゴールがスケジュールされたときの 先頭ゴール(qp_before == before)までのゴールを調べる。

(a)
再開によりエンキューされたゴールかどうか調べる。

再開によりエンキューされたゴールは、「再開ゴールリスト (different_prio_resume)」に記録されているので、 ゴールスタック上のゴールがこのリストに記録されているかどうか調べれば判明する。

  • 再開によりエンキューされたゴールであれば、そのゴールが再開によるもので あることを記録する。
  • 再開によるものでなければ、そのゴールが再開によるものであることを 記録しない。

3.
現在の優先度ではないゴールがエンキューされた時に 記録されるリスト(trace_enqueued_goal)を調べる。

(a)
再開によりエンキューされたゴールかどうか調べる。

再開によりエンキューされたゴールは、「再開ゴールリスト (different_prio_resume)」に記録されているので、 ゴールスタック上のゴールがこのリストに記録されているかどうか調べれば判明する。

  • 再開によりエンキューされたゴールであれば、そのゴールが再開によるもので あることを記録する。
  • 再開によるものでなければ、そのゴールが再開によるものであることを 記録しない。

4.
REDUCE portがenableになっており、Leap状態ではないか、 そのゴールがSpy状態であれば、以下の処理を行う。
5.
親ゴールの処理を以下のように行う。

(a)
ます、ゴールが印字対象かどうか検査する。以下の何れかであれば 印字対象となる。
  • 「部分項モード」ではない。
  • 「部分項モード」で対象ゴールである。

(b)
上記の検査で印字対象であれば、REDUとして印字する。

6.
Subgoalについて以下の処理を行い、必要あればゴールを印字する。 また、印字するか否かに関わらず、subgoalを記録しておく(current_subgoals)。

(a)
まず、ゴールスタック中にあるゴールを調べる。 親ゴールの時と同様の条件で判断し、必要あればゴールを印字する。

(b)
次に別優先度のスタックにエンキューされたゴールを調べる。 親ゴールの時と同様の条件で判断し、必要あればゴールを印字する。

7.
REDUCE ポートがleash状態であるか、当該ゴールがspy状態であるか yどちらかならば、REDUCE ポートのコマンドの入力を則す。

8.
ゴールスタック中のゴール、別優先度のゴールリストを調べ、 trace状態にすべきsubgoalについては、trace_goal処理を行う。 さもなくば、untrace_goal処理を行う。

9.
別優先度のゴールについては、ゴールをエンキューする (トレース中は、直接エンキューされず、このリストに記録されるので、 処理が終了した後にエンキューする)。

10.
trace_enqueued_goal を空にし、割り込みを終了状態にする。



Sekita Daigo
1998-05-18