(define derivative-rules (rule-simplifier '( ((d/d ?u ?x) (constant? ?u ?x) 0) ((d/d ?x ?x) none 1) ((d/d (+ ?u ?v) ?x) none (+ (d/d ?u ?x) (d/d ?v ?x))) ((d/d (* ?u ?v) ?x) none (+ (* (d/d ?u ?x) ?v) (* ?u (d/d ?v ?x)))) ((d/d (expt ?u ?n) ?x) (constant ?n ?x) (* ?n (expt ?u (- ?n 1)) (d/d ?u ?x))) ;; ... more rules ... ) )) (define (constant? expr var) (not (occurs-in? var expr))) (define (occurs-in? x u) (cond ((equal? x u) #t) ((pair? u) (or (occurs-in? x (car u)) (occurs-in? x (cdr u)))) (else #f))) #| (derivative-rules '(+ (d/d (* a (* x x)) x) 1)) ;Value: (+ (+ (* 0 (* x x)) (* a (+ (* 1 x) (* x 1)))) 1) |# (define algebra-rules (rule-simplifier '( ((+ 0 ?x) none ?x) ((+ ?x 0) none ?x) ((* 0 ?x) none 0) ((* ?x 0) none 0) ((* 1 ?x) none ?x) ((* ?x 1) none ?x) ) )) #| (algebra-rules (derivative-rules '(+ (d/d (* a (* x x)) x) 1))) ;Value: (+ (* a (+ x x)) 1) |#