%% Author:
%% Date: 5.3.2009

fac(0,1).
fac(N,F) :- N > 0, M is N - 1, fac(M,Fm), F is N * Fm.

gcd(A,A,A).
gcd(A,B,Res) :-A>B, A1 is A - B, gcd(A1,B,Res).
gcd(A,B,Res) :-A<B, B1 is B - A, gcd(A,B1,Res).

fib(1,1).
fib(2,1).
fib(N,M) :- N>2, N1 is N-1, N2 is N-2, fib(N1, R1), fib(N2, R2), M is R1+R2.

derive(X,X,1).
derive(N,X,0) :- integer(N).
derive(P1+P2,X,D1+D2) :- derive(P1,X,D1), derive(P2,X,D2).
derive(P1-P2,X,D1-D2) :- derive(P1,X,D1), derive(P2,X,D2).
derive(-T,X,-R) :- derive(T,X,R).
derive(N*P,X,N*D) :- integer(N), derive(P,X,D).
derive(P*N,X,N*D) :- integer(N), derive(P,X,D).
derive(P1*P2,X,(P1*D2+P2*D1)) :- derive(P1,X,D1), derive(P2,X,D2).
derive(P^N,X,N*P^(N-1)*D):-integer(N),derive(P,X,D).
