Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (define (decr x) (- x 1))
- (define (deriv E)
- (cond
- ((number? E) 0) ; works
- ((symbol? E) 1) ; works
- ((eqv? (car E) '+) (list '+ (deriv (cadr E)) (deriv (caddr E)))) ; works
- ((eqv? (car E) '-) (list '- (deriv (cadr E)) (deriv (caddr E)))) ; works
- ((eqv? (car E) '*) (list '+ (list '* (cadr E) (deriv (caddr E))) (list '* (deriv (cadr E)) (caddr E)))) ; works
- ;((eqv? (car E) '^) (list '* (caddr E) (list '^ (cadr E) (decr (caddr E))) (deriv (cadr E)))) ; works
- ((eqv? (car E) '^) (list '* (list '^ (cadr E) (decr (caddr E))) (list '* (caddr E) (deriv (cadr E))))) ; works better
- )
- )
- ; all cases of simplify are tested and working
- (define (simplify E)
- (cond
- ((or (number? E) (symbol? E)) E)
- (else (let (
- (one (simplify (cadr E)))
- (two (simplify (caddr E)))
- )
- (cond
- ((and (eqv? (car E) '+) (eqv? two 0))
- one)
- ((and (eqv? (car E) '+) (eqv? one 0))
- two)
- ((and (eqv? (car E) '-) (eqv? two 0))
- one)
- ((and (eqv? (car E) '*) (or (eqv? one 0) (eqv? two 0)))
- 0)
- ((and (eqv? (car E) '*) (eqv? one 1))
- two)
- ((and (eqv? (car E) '*) (eqv? two 1))
- one)
- ((and (eqv? (car E) '^) (eqv? two 1))
- one)
- ((and (eqv? (car E) '^) (eqv? one 1))
- 1)
- ((and (eqv? (car E) '+) (and (number? one) (number? two)))
- (+ one two))
- ((and (eqv? (car E) '-) (and (number? one) (number? two)))
- (- one two))
- ((and (eqv? (car E) '*) (and (number? one) (number? two)))
- (* one two))
- ((and (eqv? (car E) '^) (and (number? one) (number? two)))
- (expt one two))
- (else E) ; else it gives up
- )
- )
- )
- )
- )
- (define (derivative E)
- (simplify (deriv E)))
- (display (simplify (deriv '(+ (* a 1) (* 1 b)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement