% vim: ts=4 sw=4 et ft=mercury

:- module bug302.

:- interface.

:- import_module io.

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

:- implementation.

:- import_module int.
:- import_module list.
:- import_module string.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

main(!IO) :-
   io.command_line_arguments(Args, !IO),
   ( if
      Args = [Arg],
      string.to_int(Arg, N)
   then
      iota(N, [], List),
      % io.print(List, !IO),
      % io.nl(!IO),
      test(List, Result),
      io.print(Result, !IO),
      io.nl(!IO)
   else
      io.print("Usage: bug302 number\n", !IO)
   ).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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

iota(N, !List) :-
   ( if N = 0 then
      true
   else
      !:List = [N | !.List],
      iota(N - 1, !List)
   ).

:- pred test(list(int)::in, string::out) is det.

test(List, Result) :-
   ( if
      % We look for a number that cannot be in the list,
      % to force in_list to use the maximum amount of nondet stack.
      in_list(M, List),
      M = -1
   then
      Result = "found"
   else
      Result = "not found"
   ).

% Our own version of list.member(out, in) so it gets compiled how we want it.
:- pred in_list(int::out, list(int)::in) is nondet.

in_list(N, [H | T]) :-
   (
      N = H
   ;
      in_list(N, T)
   ).
