Blob


1 (define (deriv exp var)
2 (cond ((number? exp) 0)
3 ((variable? exp)
4 (if (same-variable? exp var) 1 0))
5 ((sum? exp)
6 (make-sum (deriv (addend exp) var)
7 (deriv (augend exp) var)))
8 ((product? exp)
9 (make-sum
10 (make-product (multiplier exp)
11 (deriv (multiplicand exp) var))
12 (make-product (deriv (multiplier exp) var)
13 (multiplicand exp))))
14 (else
15 (error "unknown expression type -- DERIV" exp))))
16 (define (variable? x) (symbol? x))
17 (define (same-variable? v1 v2)
18 (and (variable? v1) (variable? v2) (eq? v1 v2)))
19 (define (make-sum a1 a2) (list '+ a1 a2))
20 (define (make-product m1 m2) (list '* m1 m2))
21 (define (sum? x)
22 (and (pair? x) (eq? (car x) '+)))
23 (define (addend s) (cadr s))
24 (define (augend s) (caddr s))
25 (define (product? x)
26 (and (pair? x) (eq? (car x) '*)))
27 (define (multiplier p) (cadr p))
28 (define (multiplicand p) (caddr p))
29 (define (exponentiation? x)
30 (and (pair? x) (eq? (car x) '**)))
31 (define (base e) (cadr e))
32 (define (exponent e) (caddr e))
33 (define (make-exponentiation base exponent)
34 (cond ((=number? exponent 0) 1)
35 ((=number? exponent 1) base)
36 ((and (number? base) (number? exponent)) (expt base exponent))
37 (else (list '** base exponent))))
38 ((exponentiation? exp)
39 (make-product
40 (make-product (exponent exp)
41 (make-exponentiation
42 (base exp)
43 (make-sum (exponent exp) -1)))
44 (deriv (base exp) var)))