Advertisement
Guest User

Untitled

a guest
Oct 17th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  1. (define (decr x) (- x 1))
  2.  
  3. (define (deriv E)
  4. (cond
  5. ((number? E) 0) ; works
  6. ((symbol? E) 1) ; works
  7. ((eqv? (car E) '+) (list '+ (deriv (cadr E)) (deriv (caddr E)))) ; works
  8. ((eqv? (car E) '-) (list '- (deriv (cadr E)) (deriv (caddr E)))) ; works
  9. ((eqv? (car E) '*) (list '+ (list '* (cadr E) (deriv (caddr E))) (list '* (deriv (cadr E)) (caddr E)))) ; works
  10. ;((eqv? (car E) '^) (list '* (caddr E) (list '^ (cadr E) (decr (caddr E))) (deriv (cadr E)))) ; works
  11. ((eqv? (car E) '^) (list '* (list '^ (cadr E) (decr (caddr E))) (list '* (caddr E) (deriv (cadr E))))) ; works better
  12. )
  13. )
  14.  
  15.  
  16. ; all cases of simplify are tested and working
  17.  
  18. (define (simplify E)
  19. (cond
  20. ((or (number? E) (symbol? E)) E)
  21.  
  22. (else (let (
  23. (one (simplify (cadr E)))
  24. (two (simplify (caddr E)))
  25. )
  26. (cond
  27. ((and (eqv? (car E) '+) (eqv? two 0))
  28. one)
  29. ((and (eqv? (car E) '+) (eqv? one 0))
  30. two)
  31. ((and (eqv? (car E) '-) (eqv? two 0))
  32. one)
  33. ((and (eqv? (car E) '*) (or (eqv? one 0) (eqv? two 0)))
  34. 0)
  35. ((and (eqv? (car E) '*) (eqv? one 1))
  36. two)
  37. ((and (eqv? (car E) '*) (eqv? two 1))
  38. one)
  39. ((and (eqv? (car E) '^) (eqv? two 1))
  40. one)
  41. ((and (eqv? (car E) '^) (eqv? one 1))
  42. 1)
  43. ((and (eqv? (car E) '+) (and (number? one) (number? two)))
  44. (+ one two))
  45. ((and (eqv? (car E) '-) (and (number? one) (number? two)))
  46. (- one two))
  47. ((and (eqv? (car E) '*) (and (number? one) (number? two)))
  48. (* one two))
  49. ((and (eqv? (car E) '^) (and (number? one) (number? two)))
  50. (expt one two))
  51. (else E) ; else it gives up
  52. )
  53. )
  54. )
  55. )
  56. )
  57.  
  58. (define (derivative E)
  59. (simplify (deriv E)))
  60.  
  61. (display (simplify (deriv '(+ (* a 1) (* 1 b)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement