K-Prolog Compiler Version 6.0 
デバッガは、デバッグの対象となる述語を次の4点で制御します。
引き数を調べるためには、creep、skip、や warpを使って
そのゴールの callポートや exitポートに向かって実行を進めます。
また、spy点を設定したうえで leap によって指定の述語が呼び出される
ところまで進めることもできます。
失敗を捕捉するためには、
leash(off),leash(+fail)で failポートで止まるように指定すればよいでしょう。また、
leash(off)を指定すれば、ポートにおいて止まらずに実行トレースを得られます。 以下にデバッガをコントロールするための組込み述語を紹介します。
デバッグ中のプログラムが活性ポートに達したとき、 プロンプトに対して以下の1字から成る制御コマンドを入力して、 デバッガの実行を制御します。
42: ?- debug.
0 exit : call(debug)
yes
43: ?- -qsort.pl.
qsort.pl 43646 words free.
yes
44: ?- listing.
qsort([X|L],W,Result) :-
partition(L,X,Small,Big),
qsort(Small,W,R),
qsort(Big,[X|R],Result).
qsort([],R,R).
partition([X|L],Y,[X|L1],L2) :-
X@=<Y,
!,
partition(L,Y,L1,L2).
partition([X|L],Y,L1,[X|L2]) :-
!,
partitlon(L,Y,L2,L1).
partition([],_,[],[]).
yes
45: ?- qsort([efl,awk,c,lex],[],Progs).
1 call : qsort([efl,awk,c,lex],[],_148) ? <nl>
2 call : partition([awk,c,lex],efl,_280,_278) ? b
[BREAK] 46: ?- spy partition.
spy on: partition/4
yes
[BREAK] 47: ?- ^D
2 call : partition([awk,c,lex],efl,_280,_278) ? l
3 call : partition([c,lex],efl,_268,_296) ? l
4 call : partition([lex],efl,_286,_314) ? l
Error signalled by partitlon([],efl,_304,_286)
Undefined predicate call - predicate not found
trace back(y/n)? y
6 partitlon([],efl,_,_) ? P
5 partition([lex],efl,L1,[lex|L2]) :-
!,
--> partitlon([],efl,L2,L1).
4 partition([c,lex],efl,[c|L1],[lex|L2]) :-
c@=<efl,
!,
--> partition([lex],efl,L1,[lex|L2]).
3 partition([awk,c,lex],efl,[awk,c|L1],[lex|L2]) :-
awk@=<efl,
!,
--> partition([c,lex],efl,[c|L1],[lex|L2]).
2 qsort([efl,awk,c,lex],[],Result) :-
--> partition([awk,c,lex],efl,[awk,c|L1],[lex|L2]),
qsort([lex|L2],[],R),
qsort([awk,c|L1],[efl|R],Result).
1 call(qsort([efl,awk,c,lex],[],Result))
Abort
partitolonというスペルミスがわかったのでエディタで修正します。
47: ?- edit qsort.pl.
qsort.pl 43642 words free.
yes
次のように修正しました。
partition([X|L],Y,[X|L1],L2) :-
X@=<Y,
!,
partition(L,Y,L1,L2).
partition([X|L],Y,L1,[X|L2]) :-
!,
partition(L,Y,L2,L1). /* <-- */
partition([],_,[],[]).
もう一度初めから実行してみます。
48: ?- history.
47: <edit [qsort|pl]>
46: <spy partition>
45: <qsort([efl,awk,c,lex],[],Progs)> ;
49: qsort([efl,awk,c,lex],[],Progs)
1 call : qsort([efl,awk,c,lex],[],_148) ? w
1 exit : qsort([efl,awk,c,lex],[],[lex,efl,c,awk]) ? <nl>
Progs = [lex,efl,c,awk] <nl>
yes
答えは出ましたが、ソートの順序が反対です。
49: ?- ;qsort.
49: qsort([efl,awk,c,lex],[],Progs)
1 call : qsort([efl,awk,c,lex],[],_270) ? <nl>
2 call : partition([awk,c,lex],efl,_634,_632) ? <nl>
3 call : awk@=<efl ? b
[BREAK] 50: ?- spy qsort.
spy on: qsort/3
yes
[BREAK] 51: ?- ^D
3 call : awk@=<efl ? l
2 call : qsort([awk,c],[],_696) ? l
3 call : qsort([],[],_734) ? l
3 call : qsort([c],[awk],_760) ? l
4 call : qsort([],[awk],_772) ? P
3 qsort([c],[awk],Result) :-
partition([],c,[],[]),
--> qsort([],[awk],R),
qsort([],[c|R],Result).
2 qsort([awk,c],[],Result) :-
partition([c],awk,[],[c]),
qsort([],[],[]),
--> qsort([c],[awk],Result).
1 qsort([efl,awk,c,lex],[],Result) :-
partition([awk,c,lex],efl,[awk,c],[lex]),
--> qsort([awk,c],[],R),
qsort([lex],[efl|R],Result).
4 call : qsort([],[awk],_772) ? n
Progs = [lex,efl,c,awk] <nl>
qsortがおかしいようです。
50: ?- listing qsort.
qsort([X|L],W,Result) :-
partition(L,X,Small,Big),
qsort(Small,W,R),
qsort(Big,[X|R],Result).
qsort([],R,R).
yes
エディタで修正します。
51: ?- edit qsort.pl.
qsort.pl 43640 words free.
yes
52: ?- listing qsort.
qsort([X|L],W,Result) :-
partition(L,X,Small,Big),
qsort(Big,W,R),
qsort(Small,[X|R],Result).
qsort([],R,R).
yes
53: ?- ;49.
53: qsort([efl,awk,c,lex],[],Progs)
1 call : qsort([efl,awk,c,lex],[],_228) ? n
Progs = [awk,c,efl,lex] <nl>
正しく動作することが確認できました。