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; |