option(guard_simplification,off). option(mode,tak_chr(+,+,+,?)). :- constraints tak_chr/4. tak_chr(X,Y,Z,A) <=> X =< Y | Z = A. tak_chr(X,Y,Z,A) <=> X > Y | X1 is X - 1, tak_chr(X1,Y,Z,A1), Y1 is Y - 1, tak_chr(Y1,Z,X,A2), Z1 is Z - 1, tak_chr(Z1,X,Y,A3), tak_chr(A1,A2,A3,A). repeat(_N). repeat(N):- N > 1, N1 is N-1, repeat(N1). go :- measure(tak(1000),true,Utime,Gtime,System), write(bench(tak_prolog,1000,Utime,Gtime,System)),write('.'),nl,fail. go :- measure(tak_chr(1000),true,Utime,Gtime,System), write(bench(tak_CHR,1000,Utime,Gtime,System)),write('.'),nl,fail. tak(N) :- repeat(N),tak ,fail ;true. tak :- tak(18,12,6,_),fail. tak_chr(N) :- repeat(N),tak_chr ,fail ;true. tak_chr :- tak_chr(18,12,6,_),fail. % generated: 17 November 1989 % option(s): SOURCE_TRANSFORM_1 % % tak % % Evan Tick (from Lisp version by R. P. Gabriel) % % (almost) Takeuchi function (recursive arithmetic) tak(X,Y,Z,A):- X =< Y,!, Z = A. tak(X,Y,Z,A):- X1 is X - 1, tak(X1,Y,Z,A1), Y1 is Y - 1, tak(Y1,Z,X,A2), Z1 is Z - 1, tak(Z1,X,Y,A3), tak(A1,A2,A3,A).