#ifndef MERCURY #include "harness.cpp" data(triple(18, 12, 6)). benchmark(triple(X, Y, Z), Out) :- tak(X, Y, Z, Out). #else :- module tak. :- interface. :- import_module int, io. :- pred benchmark(int). :- mode benchmark(out) is det. :- pred main(io__state, io__state). :- mode main(di, uo) is det. :- implementation. benchmark(Out) :- tak(18, 12, 6, Out). main --> { tak(18, 12, 6, Out) }, io__write_int(Out), io__write_string("\n"). :- pred tak(int, int, int, int). :- mode tak(in, in, in, out) is det. #endif #ifdef AQUARIUS_DECLS :- mode((tak(X, Y, Z, A) :- ground(X), rderef(X), integer(X), ground(Y), rderef(Y), integer(Y), ground(Z), rderef(Z), integer(Z) )). #endif #ifdef NUPROLOG_DECLS :- tak(X, Y, Z, A) when X and Y and Z. #endif #ifdef SICSTUS_DECLS :- block tak(-, ?, ?, ?), tak(?, -, ?, ?), tak(?, ?, -, ?). #endif #ifdef MERCURY tak(X, Y, Z, A) :- (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) ). #else #ifdef SWIPROLOG tak(X, Y, Z, A) :- (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) ). #else tak(X,Y,Z,A) :- X =< Y, Z = A. tak(X,Y,Z,A) :- X > Y, 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). #endif #endif