2017-06-19 5 views
4

トレースから個々の述語を隠す方法はありますか?このようなルールでは:トレースから述語を隠す

p(<Stuff>) :- 
    q(), 
    p(<ModifiedStuff>); 
    s(), 
    p(<ModifiedStuff>); 
    p(<ModifiedStuff>). 

私は例えば、私が唯一p()への呼び出しに興味を持っていますので、トレースからq()s()を非表示にしたいと思います。 q()s()は多くの他の述語を呼び出す可能性があり、トレースを完全に詰まらせ、関連する呼び出しを見つけることが困難になります。私は今、コマンドラインからではなく、インタプリタ内部から実行するとpを含む行をgrepをするためにはgrepにトレースをパイプ試してみました...しかし、私の失望に、私はから実行するときに実現しなければならなかった

編集1

コマンドラインではまだプロローグシェルを開きますので、出力をパイプ処理することはまったく機能しません。 printのみが実際にプロローグプロセスを実行するシェルに送信されます。

編集2(出力トレース(P、すべて)を使用して)あなたのようなtrace/2を使用することができますSWI-Prologで

?- trace(shift_reduce, all). 
%   shift_reduce/2: [call,redo,exit,fail] 
true. 

[debug] ?- shift_reduce([λ,x,x], T). 
T Call: (8) shift_reduce([λ, x, x], _7344) 
T Exit: (8) shift_reduce([λ, x, x], [e, [λ], [v, [x]], [e, [v, [...]]]]) 
T = [e, [λ], [v, [x]], [e, [v, [x]]]] ; 
T Exit: (8) shift_reduce([λ, x, x], [e, [λ], [v, [x]], [e, [v, [...]]]]) 
T = [e, [λ], [v, [x]], [e, [v, [x]]]] ; 
T Fail: (8) shift_reduce([λ, x, x], _7344) 
false. 

[debug] ?- 
+0

コマンドラインから実行してファイルに出力する場合は、 'tee'を試しましたか? (もちろん、あなたがLinuxを使っていると仮定しても、あなたは言わなかった...私はWindowsに同等のコマンドがあると思う) – lurker

+0

[trace/2](http://www.swi-prolog .org/pldoc/man?predicate = trace/2)あなたの述語だけを対象にしてintrestingをトレースします。 'trace(q、+ call).'、' trace(p、+ call) 'のようなものです。 –

+0

トレースの代わりにスパイポイントを使用してデバッグすることもできます。 –

答えて

2

trace(p, all)、これは、pに関連した情報を有効にしても、このされますがデバッグモードが有効になります。

デバッグモードにしている間、あなたが呼び出すことができます。

p(<Stuff>). 
を、これは今だけのpのための情報が表示されます。

+0

私がそれをするとき、私が得るのは 'Call:p()出口:p()'だけです。その間のすべての通話は表示されません。 –

+0

あなたは 'p().'にできるものの例を挙げることができますか? – coder

+0

確かに、編集として私の質問に例を追加しました。 –