-- $Id: ackermann.gnat,v 1.0 2003/06/11 12:01:00 dada Exp $
-- http://dada.perl.it/shootout/
-- Ada 95 code by C.C.
with Ada.Command_Line, Text_IO, Ada.Strings.Fixed, Interfaces;
procedure Ackermann is
function L_Trim (Source : String; Side : Ada.Strings.Trim_End :=
Ada.Strings.Left) return String renames Ada.Strings.Fixed.Trim;
subtype Nat is Interfaces.Integer_32 range 0 .. Interfaces.Integer_32'Last;
subtype Pos is Nat range 1 .. Nat'Last; -- Largest is 2_147_483_647
use type Nat;
function Ack (M, N : Nat) return Pos is
pragma Suppress (Overflow_Check);
pragma Suppress (Range_Check);
begin
if M = 0 then
return N + 1;
elsif N = 0 then
return Ack (M - 1, 1);
else
return Ack (M - 1, Ack (M, N - 1));
end if;
end Ack;
N : Pos := 1;
begin
if Ada.Command_Line.Argument_Count > 0 then
N := Pos'Value (Ada.Command_Line.Argument (1));
end if;
Text_IO.Put_Line ("Ack(3," & L_Trim (Pos'Image (N)) & "):" &
Pos'Image (Ack (3, N)));
end Ackermann;