/* Peter Schorn 25-Jul-84 */

/* differentiation rules */
diff(X+Y,Simple):-
  part(X,Dx,Y,Dy),
  simplify(Dx+Dy,Simple).

diff(X-Y,Simple):-
  part(X,Dx,Y,Dy),
  simplify(Dx-Dy,Simple).

diff(X*Y,Simple):-
  part(X,Dx,Y,Dy),
  simplify(Dx*Y+X*Dy,Simple).

diff(X/Y,Simple):-
  part(X,Dx,Y,Dy),
  simplify((Y*Dx-X*Dy)/(Y*Y),Simple).

diff(+X,Simple):-
  diff(X,Dx),
  simplify(Dx,Simple).

diff(-X,Simple):-
  diff(X,Dx),
  simplify(-Dx,Simple).

diff(x,1).

diff(X,0).

part(X,Dx,Y,Dy):-
  diff(X,Dx),
  diff(Y,Dy).

/* simplification rules */
simple(-0,0).
simple(0-X,-X).
simple(X-0,X).
simple(X*0,0).
simple(0*X,0).
simple(X+0,X).
simple(0+X,X).
simple(0/X,0).
simple(X/1,X).
simple(X/X,1).
simple(X-X,0).
simple(1*X,X).
simple(X*1,X).

simple(-X,-Sx):-simple(X,Sx).
simple(X+Y,Sx+Sy):-simple(X,Sx),simple(Y,Sy).
simple(X-Y,Sx-Sy):-simple(X,Sx),simple(Y,Sy).
simple(X*Y,Sx*Sy):-simple(X,Sx),simple(Y,Sy).
simple(X/Y,Sx/Sy):-simple(X,Sx),simple(Y,Sy).
simple(X,X).

simplify(X,Y):-simple(X,H),decide(H,X,Y).
decide(X,X,X):-!.
decide(H,X,Y):-simplify(H,Y).

d(X):-
  simplify(X,H),
  diff(H,Y),
  writeln('Die Ableitung von  ',X,'  nach x ist  ',Y,'. ').
