% Prolog ärgern: ackermann(M, _, _) :- M < 0, throw(error(domain_error(not_less_than_zero,M),ackermann/3)). ackermann(M0,N0,A0) :- M0 > 0, M1 is M0 - 1, N0 > 0, !, N1 is N0 - 1, ackermann(M0,N1,A1), ackermann(M1,A1,A0). ackermann(M0,0,A) :- M0 > 0, !, M1 is M0 - 1, ackermann(M1,1,A). 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) :- length(_,S), ( R = length(S) ; R = ack(M,N,A), between(4,S,M), N is S-M, ( false, A = call ; catch(ackermann(M,N,A),error(resource_error(_),_),false) ) ).