ここでは, トレースを続けたり中止したりするコマンドについて説明する.
- c, <cr>
- そのままトレースを続行し, 次のポートで止まり, 再び入力待ちとなる.
- a
- トレースを中止する. プログラムはその時点から最後までフリーに実行される.
- s
- その時点でコマンド入力待ちのポートにあるゴールのトレース フラグを offにする. 新たにトレース on となっているゴールが ポートを通過するまで, プログラムはフリーに実行される.
- l
- スパイされたゴールがポートを通るまで, トレースの表示・入力を抑制する. スパイされたゴールがポートを通ると, トレースモードに戻る.
また以下のコマンドは, サブゴールのトレースフラグの on/offを制御する もので, REDUポートでのみ入力可能である.
- + サブゴール番号:
- そのサブゴールのトレースフラグを onにする.
- − サブゴール番号:
- そのサブゴールのトレースフラグを offにする.
- サブゴール番号:
- そのサブゴールのトレースフラグを反転する.
図2.2の部分集合をチェックするプログラムを用いた, ` c', ` <cr>', ` a', ` s' コマンドの使用例を以下に示す. ` l' コマンドはリープコマンドと呼ばれる. 後で述べるスパイ機能と 併せて使用例を示す.
% subset -t 1 1 CALL:main:main? 1 REDU:main:main :- 2 0:+subset(yes,[3,1],[1,3,5],_3) 3 1:+io:outstream([print(_3),nl])? c 5 2 CALL:main:subset(yes,[3,1],[1,3,5],_3)? 2 REDU:main:subset(yes,[3,1],[1,3,5],_3) :- 4 0:+member(3,[1,3,5],_11) 5 1:+subset(_11,[1],[1,3,5],_3)? 4 CALL:main:member(3,[1,3,5],_11)? s 10 5 CALL:main:subset(yes,[1],[1,3,5],_3)? 5 REDU:main:subset(yes,[1],[1,3,5],_3) :- 6 0:+member(1,[1,3,5],_1C) 7 1:+subset(_1C,[],[1,3,5],_3)? -0 5 REDU:main:subset(yes,[1],[1,3,5],_3) :- 15 6 0:-member(1,[1,3,5],_1C) 7 1:+subset(_1C,[],[1,3,5],_3)? 7 CALL:main:subset(yes,[],[1,3,5],_3)? 7 REDU:main:subset(yes,[],[1,3,5],yes)? 3 CALL:io:outstream([print(yes),nl])? a 20 %
10行目の ` s' コマンドにより, ゴール番号4番の member ゴールはトレー スされなくなった. 14行目の ` -0' コマンドにより, ゴール番号6番の member 述語はトレースされなくなった. 12行目の ` a' コマンドによ り, トレースが中止されプログラムが最後まで実行された.