From CSWiki
[edit] Symbolic Differentiation
% The % symbol is for comments.
% differentiate(+Expression, +Variable, ?Result).
differentiate(F, X, Result) :- simplify(F, F1), deriv(F1, X, FD), simplify(FD, Result).
% deriv(+Expression, +Variable, ?Result).
deriv(C, _, 0) :- number(C), !.
deriv(X, X, 1) :- \+ number(X), atom(X), !.
deriv(-F, X, -G) :- !, deriv(F, X, G).
deriv(F+G, X, H+I) :- !, deriv(F, X, H), deriv(G, X, I).
deriv(F-G, X, H-I) :- !, deriv(F, X, H), deriv(G, X, I).
deriv(C*F, X, C*H) :- number(C), !, deriv(F, X, H).
deriv(F*G, X, H*G+F*I) :- !, deriv(F, X, H), deriv(G, X, I).
deriv(F^C, X, C*F^(C-1)*G) :- integer(C), !, deriv(F, X, G).
deriv(F/G, X, H/G - (F/G^2)*I) :- !, deriv(F, X, H), deriv(G, X, I).
deriv(log(F), X, H*(F^(-1))) :- !, deriv(F, X, H).
% simplify(+Expression, ?Result)
simplify(X^1, Y) :- !, simplify(X, Y).
simplify(1*X, Y) :- !, simplify(X, Y).
simplify(X*1, Y) :- !, simplify(X, Y).
simplify(0+X, Y) :- !, simplify(X, Y).
simplify(X+0, Y) :- !, simplify(X, Y).
simplify(X/1, Y) :- !, simplify(X, Y).
simplify(0-X, -Y) :- !, simplify(X, Y).
simplify(X-0, Y) :- !, simplify(X, Y).
simplify(Expr, Result) :-
argsCanSimplify(Expr, Expr1),
!,
simplify(Expr1, Result).
simplify(Expr, Result) :-
\+ argsCanSimplify(Expr, _),
numericArgs(Expr),
!,
Result is Expr.
simplify(Expr, Expr) :-
\+ argsCanSimplify(Expr, _),
\+ numericArgs(Expr),
!.
argsCanSimplify(Expr, Expr1) :-
Expr =.. [Op, X, Y],
simplify(X, X1),
simplify(Y, Y1),
Expr1 =.. [Op, X1, Y1],
Expr \= Expr1,
!.
numericArgs(Expr) :-
Expr =.. [_, X, Y],
number(X),
number(Y),
!.