% Prolog ärgern: ackermann(_, _, _,D) :- D =< 0, !, throw(error(resource_error(stackdepth),ackermann/3)). ackermann(M0,N0,A0,D1) :- M0 > 3, M1 is M0 - 1, N0 > 0, !, D2 is D1-1, N1 is N0 - 1, ackermann(M0,N1,A1,D2), ackermann(M1,A1,A0,D1). ackermann(M0,0,A,D) :- M0 > 3, !, M1 is M0 - 1, ackermann(M1,1,A,D). ackermann(0,N,A,_) :- !, A is N + 1. ackermann(1,N,A,_) :- !, A is N + 2. ackermann(2,N,A,_) :- !, A is 2*N + 3. ackermann(3,N,A,_) :- !, A is 2^(N+3)-3. run(R, Max) :- length(_,S), ( R = length(S) ; R = ack(M,N,A), between(4,S,M), N is S-M, ( false, A = call ; catch(catch(ackermann(M,N,A, Max),error(resource_error(_),_),false),error(evaluation_error(int_overflow),_),false) ) ).