#lang racket (define (deriv exp var) (cond ((number? exp) 0) ((variable? exp) (if (same-variable? exp var) 1 0)) ((sum? exp) (make-sum (deriv (addend exp) var) (deriv (augend exp) var))) ((dif? exp) (make-dif (deriv (addend exp) var) (deriv (augend exp) var))) ((product? exp) (make-sum (make-product (multiplier exp) (deriv (multipicand exp) var)) (make-product (deriv (multiplier exp) var) (multipicand exp)))) ((exponentiation? exp) (make-product (make-product (exponent exp) (make-exponentiation (base exp) (- (exponent exp) 1))) (deriv (base exp) var))) ((sinus? exp) (make-product (deriv (base exp) var)(make-cos (base exp)))) ((cosinus? exp) (make-product (deriv (base exp)var)(make-sin (base exp)))) ((ex? exp) (make-product (deriv (base exp) var)(make-exp (base exp)))) (else error "unknow expression type -- DERIV" exp))) (define (ex? x) (and (pair? x) (eq? 'exp (car x)))) (define (make-exp a0)(list 'exp a0)) (define (sinus? x) (and (pair? x) (eq? 'sin (car x) ))) (define (make-cos a0)(list 'cos a0)) (define (cosinus? x) (and (pair? x) (eq? 'cos (car x) ))) (define (make-sin a0)(list '-sin a0)) (define (=number? exp num) (and (number? exp) (= exp num))) (define (multipicand p) (caddr p)) (define (variable? x) (symbol? x)) (define (same-variable? v0 v1) (and (variable? v0) (variable? v1) (eq? v0 v1))) (define (make-sum a0 a1) (cond ((and (number? a0) (number? a1)) (+ a0 a1)) (else (list '+ a0 a1)))) (define (sum? x) (and (pair? x) (eq? (car x) '+))) (define (dif? x) (and (pair? x) (eq? (car x) '-))) (define (make-dif a0 a1) (cond ((and (number? a0) (number? a1)) (- a0 a1)) (else (list '- a0 a1)))) (define (addend s) (cadr s)) (define (augend s) (caddr s)) (define (make-product m0 m1) (cond ((or (=number? m0 0) (=number? m1 0)) 0) ((=number? m0 1) m1) ((=number? m1 1) m0) ((and (number? m0) (number? m1)) (* m0 m1)) (else (list '* m0 m1)))) (define (product? x) (and (pair? x) (eq? (car x) '*))) (define (multiplier p) (cadr p)) (define (make-exponentiation x n) (cond ((= n 0) 1) ((= n 1) x) (else (list '** x n)))) (define (exponentiation? x) (and (pair? x) (eq? (car x) '**))) (define (base s) (cadr s)) (define (exponent s) (caddr s))