Key to CSE341 Section #7 Problems 1. One possible solution appears below: (define (deriv exp var) (cond ((number? exp) 0) ((symbol? exp) (if (eq? exp var) 1 0)) ((sum? exp) (make-sum (deriv (arg1 exp) var) (deriv (arg2 exp) var))) ((product? exp) (make-sum (make-product (arg1 exp) (deriv (arg2 exp) var)) (make-product (deriv (arg1 exp) var) (arg2 exp)))) (else (error "unknown expression type -- DERIV" exp)))) (define (make-product m1 m2) (list '* m1 m2)) (define (product? x) (and (pair? x) (eq? (car x) '*))) 2. One possible solution appears below: (define (parse-multisequence lst) (let ((result (parse-sequence lst))) (cond ((and (> (length result) 1) (eq? '& (cadr result))) (let ((result2 (parse-multisequence (cddr result)))) (cons (string-append (car result) "--" (car result2)) (cdr result2)))) (else result)))) 3. One possible solution appears below: (define (make-sum a1 a2) (cond ((eq? a1 0) a2) ((eq? a2 0) a1) ((and (number? a1) (number? a2)) (+ a1 a2)) (else (list '+ a1 a2)))) (define (make-product m1 m2) (cond ((or (eq? m1 0) (eq? m2 0)) 0) ((eq? m1 1) m2) ((eq? m2 1) m1) ((and (number? m1) (number? m2)) (* m1 m2)) (else (list '* m1 m2)))) 4. One possible solution appears below: (define (derivative exp var) (cond ((number? exp) 0) ((symbol? exp) (if (eq? exp var) 1 0)) ((sum? exp) (make-sum (derivative (arg1 exp) var) (derivative (arg2 exp '+) var))) ((product? exp) (make-sum (make-product (arg1 exp) (derivative (arg2 exp '*) var)) (make-product (derivative (arg1 exp) var) (arg2 exp '*)))) (else (error "unknown expression type -- DERIVATIVE" exp)))) (define (arg2 lst operator) (if (> (length lst) 3) (cons operator (cddr lst)) (caddr lst)))