2014-10-31 2 views
1

에 퀵의 추적을 실행하기위한 다이어그램을 그리는 방법 :나는 프롤로그에서 퀵위한 코드가 어떻게 프롤로그

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

증명 나무 그리기는 완전히 해결되지 않은 테마입니다.

증명 트리는 디버깅하는 동안 필수적인 정보를 포함하지만 각 단계는 활성화 번호로 표시되어 있기 때문에 추적에서 모양을 추론하는 은 쉽지 않습니다. 그리고 우리는 증명 트리가 드러내는 엄청난 양의 정보 때문에 방해 받고 있습니다.

그러나 모양은 복구 할 수 있습니다 : 예를 들어, 추적하고 (예를 들어) graphviz를로 번역 구문 분석 DCG는 ...

기다려주세요, 나는 몇 가지 코드를 게시하려고합니다. 귀하의 질문은 내 작은 프롤로그 IDE (loqt)에 좋은 추가 기능을 구현할 수있는 기회를 제공합니다.

(여기에 내 SW를 사용하여 트리를 렌더링 함)

관련 문제