% Auteur:
% Date: 08/10/2010

nat(zero).
nat(s(X)) :- nat(X).

%Addition
add(zero,Y,Y) :- nat(Y). %0 + Y = Y
add(s(x),Y,s(Z)) :- add(X,Y,Z). %(X+1) + Y = (Z+1) si X + Y = Z

%Multiplication
mult(zero,Y,zero) :- nat(Y). %0 * Y = 0
mult(s(X),Y,Z) :- mult(X,Y,Z1),
               add(Z1,Y,Z). %(X+1) * Y = X * Y
               
%Division
div(zero,Y,zero). %0 * Y = 0
div(s(X),Y,Z) :- mult(X,Y,Z1).

%Soustraction
sous(X,Y,Z) :- add(Z,Y,X).

%Egalite
egal(X,X) :- nat(X).

%Recursion simple
pair(zero).
pair(s(s(x))) :- pair(X).

impair(s(zero))) :- impair(s(s(X))) :- impair(X).

%Récursion croisée
pair(zero).
pair(s(x)) :- impair(X).
impair(s(x)) :- pair(X).