Differentiation

The goal d(E1, X, E2) is true if expression E2 is a possible form for the derivative of expression E1 with respect to X.

     d(X, X, D) :- atomic(X), !, D = 1.
     d(C, X, D) :- atomic(C), !, D = 0.
     d(U+V, X, DU+DV) :- d(U, X, DU), d(V, X, DV).
     d(U-V, X, DU-DV) :- d(U, X, DU), d(V, X, DV).
     d(U*V, X, DU*V+U*DV) :- d(U, X, DU), d(V, X, DV).
     d(U**N, X, N*U**N1*DU) :- integer(N), N1 is N-1, d(U, X, DU).
     d(-U, X, -DU) :- d(U, X, DU).