2017-06-19 66 views
4

是否有辦法隱藏跟蹤中的單個謂詞?在這樣的規則:從跟蹤中隱藏謂詞

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

我就例如像躲從跟蹤q()s(),因爲我只是感興趣的調用p()q()s()可能會調用很多其他謂詞,這些謂詞完全阻塞了跟蹤,並且很難在其中找到相關調用。

編輯1

現在我試圖在命令行而不是解釋內部執行和管道跟蹤到grep的grepping含p線......但令我失望的我只好從運行時實現在命令行中,它仍然會打開一個prolog shell,所以管道輸出根本不起作用。實際上只有print纔會發送到運行prolog進程的shell。

編輯2(輸出使用跟蹤時,(對,所有))

?- 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。像「追蹤(q,+ call)」,「跟蹤(p,+ call)」。 –

+0

您也可以使用間諜點而不是跟蹤進行調試。 –

回答

2

在SWI-Prolog中您可以使用trace/2這樣的:

trace(p, all)這將使有關P的信息,也該將激活調試模式。

當你在調試模式下,你可以撥打:

p(<Stuff>). 

,這現在將只p顯示信息。

+0

當我這樣做時,我唯一得到的是'Call:p()Exit:p()'。所有呼叫中間沒有顯示。 –

+0

你能舉一個例子說明'p().'可能是什麼? – coder

+0

當然,作爲編輯添加到我的問題的例子。 –