スパイ制御機能コマンドを以下に示す.
- S 述語
- 指定した述語にスパイを掛ける. 述語名を指定しないと, 現在トレースしている述語にスパイが掛かる.
- N 述語
- 指定した述語のスパイを外す. 述語名を指定しないと, 現在トレースしている述語のスパイが外れる.
実行制御コマンドで説明した ` l' コマンドは, スパイされたゴールが ポートを通るまで, トレースの表示・入力を抑制する.
このため, スパイ機能と ` l' コマンドを組合わせて使うと, ある特定 の述語だけにトレースを掛けてデバッグを進めることができる.
以下にスパイと ` l' コマンドの使用例を示す.
% subset -t 1 1 CALL:main:main? S member Spy point set on predicate main:member/3 1 CALL:main:main? l 4 CALL:main:member(3,[1,3,5],_11)? 5 4 REDU:main:member(3,[1,3,5],_11) :- 6 0:+member(3,[3,5],_11)? 6 CALL:main:member(3,[3,5],_11)? 6 REDU:main:member(3,[3,5],yes)? 5 CALL:main:subset(yes,[1],[1,3,5],_3)? 10 5 REDU:main:subset(yes,[1],[1,3,5],_3) :- 7 0:+member(1,[1,3,5],_21) 8 1:+subset(_21,[],[1,3,5],_3)? 7 CALL:main:member(1,[1,3,5],_21)? 7 REDU:main:member(1,[1,3,5],yes)? N member 15 Spy point reset on predicate main:member/3 7 REDU:main:member(1,[1,3,5],yes)? 8 CALL:main:subset(yes,[],[1,3,5],_3)? 8 REDU:main:subset(yes,[],[1,3,5],yes)? 3 CALL:io:outstream([print(yes),nl])? s 20 yes %
2行目で, 述語 main:member/3にスパイを掛けている. 3行目のゴール main:mainにおいて, ` l' コマンドを実行することにより, main:member/3を実行したところからトレースが始まる.