Courses/CS 332L/SymbolicDifferentiation

From CSWiki

Jump to: navigation, search

[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),
  !.

Personal tools