%-----------------------------------------------------------------------------%
% Test nondet stack segments.

:- module nondet_stseg.
:- interface.

:- import_module io.

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

%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%

:- implementation.

:- import_module int.
:- import_module list.

%-----------------------------------------------------------------------------%

main(!IO) :-
    % Do a lot of nondet stuff.
    A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    B = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
    (
        l_perm(A, As),
        l_perm(B, Bs),
        As = Bs
    ->
        io.write_string("equal lists\n", !IO)
    ;
        io.write_string("not equal lists\n", !IO)
    ).

% Reproduce list.m procedures for easier debugging.

:- pred l_perm(list(T)::in, list(T)::out) is multi.

l_perm([], []).
l_perm([X | Xs], Ys) :-
    l_perm(Xs, Ys0),
    l_insert(X, Ys0, Ys).

:- pred l_insert(T::in, list(T)::in, list(T)::out) is multi.

l_insert(Elem, List0, List) :-
    l_delete(List, Elem, List0).

:- pred l_delete(list(T)::out, T::in, list(T)::in) is multi.

l_delete([X | L], X, L).
l_delete([X | Xs], Y, [X | L]) :-
    l_delete(Xs, Y, L).

%-----------------------------------------------------------------------------%
% vi: ft=mercury ts=8 sts=4 sw=4 et
