package SPARK2 with SPARK_Mode is function Expon (Value, Exp : Natural) return Natural is (if Exp = 0 then 1 else Value * Expon (Value, Exp - 1)) with Ghost, Pre => Value <= Max_Factorial_Number and Exp <= Max_Factorial_Number, Annotate => (GNATprove, Terminating); -- CRASH! Max_Factorial_Number : constant := 6; function Factorial (N : Natural) return Natural with Pre => N < Max_Factorial_Number, Post => Factorial'Result <= Expon (Max_Factorial_Number, N); end SPARK2;