fork download
  1. ; symbolic differentiation
  2.  
  3. (define (variable? x) (symbol? x))
  4.  
  5. (define (same-variable? v1 v2)
  6. (and (variable? v1)
  7. (variable? v2)
  8. (eq? v1 v2)))
  9.  
  10. (define (=number? exp num)
  11. (and (number? exp) (= exp num)))
  12.  
  13. (define (make-sum a1 a2)
  14. (cond ((=number? a1 0) a2)
  15. ((=number? a2 0) a1)
  16. ((and (number? a1) (number? a2))
  17. (+ a1 a2))
  18. (else (list '+ a1 a2))))
  19.  
  20. (define (make-product m1 m2)
  21. (cond ((or (=number? m1 0)
  22. (=number? m2 0))
  23. 0)
  24. ((=number? m1 1) m2)
  25. ((=number? m2 1) m1)
  26. ((and (number? m1) (number? m2))
  27. (* m1 m2))
  28. (else (list '* m1 m2))))
  29.  
  30. (define (sum? x)
  31. (and (pair? x) (eq? (car x) '+)))
  32.  
  33. (define (addend s) (cadr s))
  34.  
  35. (define (augend s) (caddr s))
  36.  
  37. (define (product? x)
  38. (and (pair? x) (eq? (car x) '*)))
  39.  
  40. (define (multiplier p) (cadr p))
  41.  
  42. (define (multiplicand p) (caddr p))
  43.  
  44. (define (deriv exp var)
  45. (cond ((number? exp) 0)
  46. ((variable? exp)
  47. (if (same-variable? exp var) 1 0))
  48. ((sum? exp)
  49. (make-sum (deriv (addend exp) var)
  50. (deriv (augend exp) var)))
  51. ((product? exp)
  52. (make-sum
  53. (make-product
  54. (multiplier exp)
  55. (deriv (multiplicand exp) var))
  56. (make-product
  57. (deriv (multiplier exp) var)
  58. (multiplicand exp))))
  59. (else (error 'deriv "unknown expression type"))))
  60.  
  61. (display (deriv '(+ x 3) 'x)) (newline)
  62. (display (deriv '(* x y) 'x)) (newline)
  63. (display (deriv '(* (* x y) (+ x 3)) 'x)) (newline)
Success #stdin #stdout 0.01s 42848KB
stdin
Standard input is empty
stdout
1
y
(+ (* x y) (* y (+ x 3)))