Symbolic Data
;; Symbolic differentiation (SICP 2.3.2)
(define (variable? x) (symbol? x))
(define (same-variable? a b) (and (variable? a) (variable? b) (eq? a b)))
(define (=number? e n) (and (number? e) (= e n)))
(define (make-sum a b)
(cond ((=number? a 0) b) ((=number? b 0) a)
((and (number? a) (number? b)) (+ a b))
(else (list '+ a b))))
(define (make-product a b)
(cond ((or (=number? a 0) (=number? b 0)) 0)
((=number? a 1) b) ((=number? b 1) a)
((and (number? a) (number? b)) (* a b))
(else (list '* a b))))
(define (make-exponentiation base n)
(cond ((=number? n 0) 1) ((=number? n 1) base) (else (list '** base n))))
(define (sum? e) (and (pair? e) (eq? (car e) '+)))
(define (product? e) (and (pair? e) (eq? (car e) '*)))
(define (exponentiation? e) (and (pair? e) (eq? (car e) '**)))
(define (deriv e var)
(cond ((number? e) 0)
((variable? e) (if (same-variable? e var) 1 0))
((sum? e) (make-sum (deriv (cadr e) var) (deriv (caddr e) var)))
((product? e)
(make-sum (make-product (cadr e) (deriv (caddr e) var))
(make-product (deriv (cadr e) var) (caddr e))))
((exponentiation? e)
(ma
…