next up previous contents index
Next: Listing of the buggy Up: Appendices Previous: Appendices

   
Listing of qsort.m

%   qsort
%
%   adapted from a Prolog program written by David H. D. Warren
%
%   quicksort a list of integers

:- module qsort.

:- interface.

:- import_module list, int, printlist, io.

:- pred main1(list(int)).
:- mode main1(out) is det.

:- pred main(io__state, io__state).
:- mode main(di, uo) is det.

:- pred main3(list(int), io__state, io__state).
:- mode main3(out, di, uo) is det.

:- implementation.

main --> main3(_).

main1(Out) :-
        data(Data),
        qsort(Data, Out, []).

main3(Out) -->
        { main1(Out) },
        print_list(Out).

:- pred data(list(int)).
:- mode data(out) is det.

:- pred qsort(list(int), list(int), list(int)).
:- mode qsort(in, out, in) is det.

:- pred partition(list(int), int, list(int), list(int)).
:- mode partition(in, in, out, out) is det.

data([3, 1, 2]).

qsort([X|L], R, R0) :-
        partition(L, X, L1, L2),
        qsort(L2, R1, R0),
        qsort(L1, R, [X|R1]).
qsort([], R, R).

partition([], _P, [], []).
partition([H|T], P, Lo, Hi) :-
        ( H =< P ->
                partition(T, P, Lo1, Hi),
                Lo = [H|Lo1]
        ;
                partition(T, P, Lo, Hi1),
                Hi = [H|Hi1]
        ).


%------------------------------------------------------------------------------%
:- module printlist.

:- interface.

:- import_module list, int, io.

:- pred print_list(list(int), io__state, io__state).
:- mode print_list(in, di, uo) is det.

:- implementation.

print_list(Xs) -->
        (
                { Xs = [] }
        ->
                io__write_string("[]\n")
        ;
                io__write_string("["),
                print_list_2(Xs),
                io__write_string("]\n")
        ).

:- pred print_list_2(list(int), io__state, io__state).
:- mode print_list_2(in, di, uo) is det.

print_list_2([]) --> [].
print_list_2([X|Xs]) --> 
        io__write_int(X),
        (
                { Xs = [] }
        ->
                []
        ;
                io__write_string(", "),
                print_list_2(Xs)
        ).


jahier@irisa.fr