2012-02-25 44 views

回答

13

如果你的Prolog系統有一個可定製的調試器,你可以很容易地編寫你自己的運行時圖形採集代碼 。假設你的 Prolog系統有一個回調掛鉤goal_tracing/2,如Jekejeke Prolog。然後我們可以繼續檢查當前幀和父幀以在圖形中創建鏈接。下面是代碼:

goal_tracing(call, F) :- 
    frame_property(F, sys_call_indicator(N, A)), 
    frame_property(F, sys_parent_frame(G)), 
    frame_property(G, sys_call_indicator(M, B)), 
    !, 
    update_link(N/A, M/B). 
goal_tracing(_, _). 

:- dynamic link/2. 
update_link(A, B) :- 
    link(A, B), 
    !. 
update_link(A, B) :- 
    assertz(link(A, B)). 

可以看出我們只檢查電話端口,我們只看看 謂詞指標。但其他方法也可能收集更多數據。現在我們需要一些實用工具來顯示結果。只有 復位收集之前調用,並且展示給 集合後調用:

reset :- 
    retract(link(_, _)), fail. 
reset. 

show :- 
    write('http://yuml.me/diagram/scruffy/class/'), 
    link(A, B), 
    write(([B] -> [A])), 
    write(', '), 
    fail. 
show. 

我們生產由yuml.me理解的鏈接。 讓我們試試peano因子程序。程序代碼看起來 如下:

add(n, X, X). 
add(s(X), Y, Z) :- 
    add(X, s(Y), Z). 

mul(n, _, n). 
mul(s(X), Y, Z) :- 
    mul(X, Y, H), 
    add(Y, H, Z). 

fac(n, s(n)). 
fac(s(X), Y) :- 
    fac(X, H), 
    mul(s(X), H, Y). 

我們可以按以下方式運行收集器:

?- reset. 
?- trace. 
?- fac(s(s(n)),X). 
X = s(s(n)) 
?- nodebug. 
?- show. 
http://yuml.me/diagram/scruffy/class/[fac/2] -> [fac/2], [fac/2] -> [mul/3], [mul/3] -> [mul/3], [mul/3] -> [add/3], [add/3] -> [add/3], Yes 

人們可以那麼URL粘貼到瀏覽器中,將看到圖。刪除URL末尾的「,是」 。下面是結果:

Call Graph

問候

+0

你真了不起。我沒有話語​​。 – 2012-02-27 15:24:23

+0

也許是我閱讀過的最好的答案之一。謝謝@ j4n bur53。 – Will 2015-12-29 15:12:18

+0

其有點過時了,frame_property/2目標需要升級。 – 2015-12-29 15:40:27

2

序言搜索樹通常太大而無法逐步檢查,但繪製一個可能相當簡單,也很有趣。也許我會嘗試使用html_write庫編寫一個。那樣的話,我會報告結果。

與此同時,SWI-Prolog在其調試器中有一個相當奇特的表示。有關Prolog程序樹的有趣的細節。這不是那麼容易使用,我必須承認我還沒有閱讀文檔。但是我經常使用調試器。您可以瀏覽樹和各個節點上的實例化變量。那是強大的

可視化Prolog搜索空間是一個非常有趣的任務,並不簡單!

編輯我忘了提及XPCE有能力顯示大型樹木。如果你已經證明樹,顯示它應該很容易。只需打開查看器。在XPCE手動幫助中應該有一些例子。你可以基於這個顯示。

+0

@Robert Oschler:非常感謝糾正我的糟糕表現後。這很有意思,儘管我擔心,我會繼續表現得很差。但我很欣賞。 – CapelliC 2012-02-26 13:44:04

+0

我的榮幸,特別是因爲所包含的信息很重要。另外,來自一位Prolog粉絲的粉絲你好! – 2012-02-26 14:53:56