; CSE 341 lecture 19 (parsing; derivatives) code ; differentiates the given function with respect to the given variable. ; differentiation rules: ; dc/dx = 0 ; dx/dx = 1 ; d(u+v)/dx = du/dx + dv/dx ; d(u*v)/dx = u(dv/dx) + v(du/dx) (define (deriv exp var) (cond ((number? exp) 0) ((symbol? exp) (if (eq? exp var) 1 0)) ((sum? exp) (handle-sum (deriv (cadr exp) var) (deriv (caddr exp) var))) ((product? exp) (handle-sum (handle-product (cadr exp) (deriv (caddr exp) var)) (handle-product (deriv (cadr exp) var) (caddr exp)))) (else (error "illegal!")))) ; (sum? '(+ 2 4)) -> #t ; (sum? 42) -> #f (define (sum? lst) (and (list? lst) (eq? '+ (car lst)))) ; (product? '(* 2 4)) -> #t ; (product? 42) -> #f (define (product? lst) (and (list? lst) (eq? '* (car lst)))) ; does the heavy lifting for the sum (+) case ; (performs a few basic optimizations along the way) (define (handle-sum exp1 exp2) (cond ((eq? exp1 0) exp2) ; anything + 0 = itself ((eq? exp2 0) exp1) ((and (number? exp1) (number? exp2)) (+ exp1 exp2)) (else (list '+ exp1 exp2)))) ; does the heavy lifting for the product (*) case ; (performs a few basic optimizations along the way) (define (handle-product exp1 exp2) (cond ((or (eq? exp1 0) (eq? exp2 0)) 0) ; anything * 0 = 0 ((eq? exp1 1) exp2) ; anything * 1 = itself ((eq? exp2 1) exp1) ((and (number? exp1) (number? exp2)) (* exp1 exp2)) (else (list '* exp1 exp2)))) ; test functions for deriv procedure ; d/dx 42 -> 0 (define f0 42) ; d/dx (x+3) -> 1 (define f1 '(+ x 3)) ; d/dx (5x) -> 5 (define f2 '(* x 5)) ; d/dz (z^2 + 5z) -> 2z + 5 (define f3 '(+ (* z z) (* 5 z))) ; d/dx (ax^2 + bx + c) -> 2ax + b (define f4 '(+ (+ (* a (* x x)) (* b x)) c))