2014-10-31 64 views
1

運行快速排序的痕跡在序言中對快速排序代碼:我如何畫一個圖中的Prolog

gt(X,Y):- X @> Y. 
conc([], List, List). 
conc([Head|Tail], List1, [Head|List2]):- conc(Tail, List1, List2). 

quicksort([], []). 
quicksort([X|Tail], Sorted):- 
    split(X,Tail,Small,Big), 
    quicksort(Small,SortedSmall), 
    quicksort(Big, SortedBig), 
    conc(SortedSmall, [X|SortedBig], Sorted). 

split(X,[],[],[]). 
split(X,[Y|Tail],[Y|Small],Big):- 
    gt(X,Y),!, 
    split(X,Tail,Small, Big). 
split(X,[Y|Tail],Small,[Y|Big]):- 
    split(X,Tail,Small,Big). 

的例子是quicksort([3,2,4,1,5], Sorted)。 我已經幾乎畫出這一個,但我只找到一個Small=[2, 1]列表的跟蹤,然後我不會做同樣的Big號碼列表。 有沒有人可以幫我畫這個代碼的圖表?我想了解程序的運行軌跡。 我真的很感激!

回答

2

繪圖證明樹是一個閃亮的主題,沒有完全解決。

校驗樹包含調試時必不可少的信息,但 從軌跡推斷形狀並不容易,因爲每個步驟都是由激活號標記的 。我們受到的關注有限,受到證明樹暴露的大量信息的干擾。

但形狀可以回收:例如,一個DCG來解析跟蹤並轉化爲(例如)的Graphviz ...

請耐心等待,我會嘗試張貼一些代碼。您的問題讓我有機會實現對我的小型Prolog IDE(loqt)來說似乎是一個很好的補充。

(我用我的SW在這裏渲染樹)