
RULES

(X0  IF
     AND-IF
     (free-of? 'x '?x)
     THEN
     (constant ?x))
(X1  IF
     AND-IF
     (not (free-of? 'x '?x))
     THEN
     (not-constant ?x))

(s0 IF 
    THEN (simp (+ ?x 0) ?x))
(s1 IF
    THEN (simp (+ 0 ?x) ?x))
(s2 IF 
    THEN (simp (+ ?x ?x) (* 2 ?x)))
(s3 IF
    THEN (simp (- ?x 0) ?x))
(s4 IF
    THEN (simp (- 0 ?x) (- ?x)))
(s5 IF
    THEN (simp (- (- ?x)) ?x))
(s6 IF
    THEN (simp (* ?x 1) ?x))
(s7 IF
    THEN (simp (* 1 ?x) ?x))
(s8 IF
    THEN (simp (* ?x 0) 0))
(s8 IF
    THEN (simp (* ?0 x) 0))
(s9 IF 
    THEN (simp (* ?x 0) 0))
(s10 IF
     THEN (simp (* ?x ?x) (^ ?x 2)))
(s11 IF
     THEN (simp (/ ?x 0) undefined))
(s12 IF
     THEN (simp (/ 0 ?x) 0))
(s13 IF
     THEN (simp (/ ?x 1) ?x))
(s14 IF
     THEN (simp (/ ?x ?x) 1))
(s15 IF
     THEN (simp (^ 0 0) undefined))
(s16 IF
     THEN (simp (^ ?x 0) 1))
(s17 IF
     THEN (simp (^ 1 ?x) 1))
(s18 IF
     THEN (simp (^ ?x 1) ?x))
(s19 IF
     THEN (simp (^ ?x -1) (/ 1 ?x)))
(s20 IF
     THEN (simp (* ?x (/ ?y ?x)) ?y))
(s21 IF
     THEN (simp (* (/ ?y ?x) ?x) ?y))
(s22 IF
     THEN (simp (/ (* ?y ?x) ?x) ?y))
(s22 IF
     THEN (simp (/ (* ?x ?y) ?x) ?y))
(s23 IF
     THEN (simp (+ ?x (- ?x)) 0))
(s24 IF
     THEN (simp (+ (- ?x) ?x) 0))
(s25 IF
     THEN (simp (- (+ ?x ?y) ?x) ?y))
(s26 IF
     THEN (simp (+ (- ?x ?y) ?y) ?x))
(s27 IF (constant ?n)
        (not-constant ?s)
     THEN (simp (* ?s ?n) (* ?n ?s)))
(s28 IF (constant ?n)
        (constant ?m)
     THEN (simp (* ?m (* ?n ?x)) (* (* ?m ?n) ?x)))
(s28 IF (constant ?n)
     THEN (simp (* ?x (* ?n ?y)) (* ?n (* ?x ?y))))
(s28 IF (constant ?n)
     THEN (simp (* (* ?n ?x) ?y) (* ?n (* ?x ?y))))
(s30 IF (constant ?n)
        (not-constant ?s)
     THEN (simp (+ ?n ?s) (* ?s ?n)))
(s31 IF (constant ?n)
     THEN (simp (+ ?x (+ ?y ?n)) (+ (?x ?y) ?n)))
(s32 IF (constant ?n)
     THEN (simp (+ (+ ?x ?n) ?y) (+ (?x ?y) ?n)))
(s33 IF 
     THEN (simp (log 1) 0))
(s34 IF
     THEN (simp (log 0) undefined))
(s35 IF
     THEN (simp (log e) 1))
(s36 IF
     THEN (simp (sin 0) 0))
(s37 IF
     THEN (simp (sin pi) 0))
(s38 IF
     THEN (simp (cos 0) 1))
(s38 IF
     THEN (simp (cos pi) -1))
(s39 IF
     THEN (simp (sin (/ pi 2)) 1))
(s40 IF
     THEN (simp (cos (/ pi 2)) 0))
(s41 IF
     THEN (simp (log (^ e ?x)) ?x))
(s42 IF
     THEN (simp (^ e (log ?x)) ?x))
(s43 IF
     THEN (simp (* (^ ?x ?y) (^ ?x ?z)) (^ ?x (+ ?y ?z))))
(s44 IF
     THEN (simp (/ (^ ?x ?y) (^ ?x ?z)) (^ ?x (- ?y ?z))))
(s45 IF
     THEN (simp (+ (log ?x) (log ?y)) (log (* ?x ?y))))
(s46 IF
     THEN (simp (- (log ?x) (log ?y)) (log (/ ?x ?y))))
(s47 IF
     THEN (simp (- (log ?x) (log ?y)) (log (/ ?x ?y))))
(s48 IF
     THEN (simp (+ (^ (sin ?x) 2) (^ (cos ?x) 2)) 1))
(s49 IF
     THEN (simp (+ (^ (cos ?x) 2) (^ (sin ?x) 2)) 1))
(s50 IF (simp ?x1 ?s1)
	(simp ?x2 ?s2)
     THEN (simp (?op ?x1 ?x2) (?op ?s1 ?s2)))
(s51 IF (simp ?x1 ?s1)
     THEN (simp (?op ?x1) (?op ?s1)))
(s52 IF
     THEN (simp ?x ?x))

;; Only derivatives wrt x
(D1  IF   
     THEN (deriv x 1))
(D2  IF (constant ?x)
     THEN (deriv ?x ?y 0))
(D3  IF   (deriv ?x ?dx)
          (deriv ?y ?dy)
     THEN (deriv (+ ?x ?y) (+ ?dx ?dy)))
(D4  IF   (deriv ?x ?dx)
          (deriv ?y ?dy)
     THEN (deriv (- ?x ?y) (- ?dx ?dy)))
(D5  IF   (deriv ?x ?dx)
          (deriv ?y ?dy)
     THEN (deriv (* ?x ?y) (+ (* ?x ?dy) (* ?dx ?y))))
(D6  IF   (deriv ?x ?dx)
          (deriv ?y ?dy)
     THEN (deriv (/ ?x ?y) (- (/ ?dx ?y) (/ ?x (^ ?y 2)))))
(D7  IF   (deriv ?x ?dx)
     THEN (deriv (- ?x) (- ?dx)))
(D8  IF   (deriv ?x ?dx)
          (constant ?n)
     THEN (deriv (^ ?x ?n)
		 (* (* ?n (^ ?x (- ?n 1))) ?dx)))
(D9  IF   (deriv ?x ?dx)
          (deriv ?y ?dx)
     THEN (deriv (^ ?x ?y)
		 (+ (* (* ?y (^ ?x (- ?y 1))) ?dx)
		    (* (* ?x (^ ?y (log ?x))) ?dy))))
(D10  IF   (deriv ?x ?dx)
     THEN (deriv (log ?x) (/ ?dx ?x)))
(D11 IF   (deriv ?x ?dx)
     THEN (deriv (sin ?x) (* (cos ?x) ?dx)))
(D12 IF   (deriv ?x ?dx)
     THEN (deriv (cos ?x) (* (- (sin ?x)) ?dx)))
(D13 IF   (deriv ?x ?dx)
     THEN (deriv (^ e ?x) (* (^ e ?x) ?dx)))
(D14 IF   (simp ?x ?y)
	  (deriv ?y ?z)
	  (simp ?z ?w)
     THEN (d ?x ?w))

(I1 IF   
    THEN (table-int (log ?x) (- (* ?x (log ?x)) ?x)))
(I2 IF   
    THEN (table-int (^ e ?x) (^ e ?x)))
(I3 IF
    THEN (table-int (sin ?x) (- (cos ?x))))
(I4 IF
    THEN (table-int (cos ?x) (sin ?x)))

(I5 IF   (table-int ?x ?ix)
    THEN (int ?x ?ix))
(I5 IF   (table-int ?x ?ix)
    AND-IF 
    THEN (int ?x ?ix))


CODE

(define (member-tree? thing tree)
  (cond ((equal? thing tree) #t)
	((pair? tree)
	 (or (member-tree? thing (car tree))
	     (member-tree? thing (cdr tree))))
	(else #f)))

(define (free-of? var exp)
  (not (member-tree? var exp)))
