%% $Id: ackermann.mercury,v 1.3 2001/05/13 01:22:35 doug Exp $
%% http://www.bagley.org/~doug/shootout/

:- module mytest.

:- interface.

:- import_module io.

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

:- implementation.

:- func ack(int, int) = int.
:- mode ack(in, in) = out is det.

:- import_module string, list, int.

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

ack(M, N) = R :- 
    ( if M = 0 then
    R = N + 1
      else if N = 0 then
    R = ack(M - 1, 1)
      else
    R = ack(M - 1, ack(M, N - 1))
    ).

mytest(Num) -->
    io__write_string("Ack(3,"),
    io__write_int(Num),
    io__write_string("): "),
    io__write_int(ack(3,Num)),
    io__write_string("\n").

main -->
    io__command_line_arguments(Args),
    ( if { Args = [] } then
         mytest(1)
      else if { Args = [Arg|_] } then
         ( if { string__to_int(Arg, N), N > 0 } then
             mytest(N)
       else
             mytest(1)
         )
    ).