Advertisement
Guest User

Untitled

a guest
May 2nd, 2016
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.56 KB | None | 0 0
  1. #lang racket
  2.  
  3. ;; Used for TODO
  4. (define ... null)
  5.  
  6. ;; Variable functions
  7.  
  8. (define (variable? e)
  9.   (symbol? e))
  10.  
  11. (define (same-variable? v1 v2)
  12.   (and (variable? v1)
  13.        (variable? v2)
  14.        (eq? v1 v2)))
  15.  
  16. (define (=number? exp num)
  17.   (and (number? exp)
  18.        (= exp num)))
  19.  
  20. ;; Definition of addition functions
  21.  
  22. (define (sum? e)
  23.   (and (pair? e)
  24.        (eq? (car e) '+)))
  25.  
  26. (define (addend e)
  27.   (cadr e))
  28.  
  29. (define (augend e)
  30.   (if (null? (cdddr e))
  31.       (caddr e)
  32.       (cons '+ (cddr e))))
  33.  
  34. (define (make-sum a1 a2)
  35.   (cond ((=number? a1 0) a2)
  36.         ((=number? a2 0) a1)
  37.         ((and (number? a1) (number? a2))
  38.          (+ a1 a2))
  39.         (else
  40.          (list '+ a1 a2))))
  41.  
  42. ;; Definition of multiplication functions
  43.  
  44. (define (product? e)
  45.   (and (pair? e)
  46.        (eq? (car e) '*)))
  47.  
  48. (define (multiplier e)
  49.   (cadr e))
  50.  
  51. (define (multiplicand e)
  52.   (if (null? (cdddr e))
  53.       (caddr e)
  54.       (cons '* (cddr e))))
  55.  
  56. (define (make-product m1 m2)
  57.   (cond ((or (=number? m1 0) (=number? m2 0)) 0)
  58.         ((=number? m1 1) m2)
  59.         ((=number? m2 1) m1)
  60.         ((and (number? m1) (number? m2))
  61.          (* m1 m2))
  62.         (else (list '* m1 m2))))
  63.  
  64.  
  65. ;; Defintion of expotentiation functions
  66.  
  67. (define (expotentiation? e)
  68.   (and (pair? e)
  69.        (eq? (car e) '**)))
  70.  
  71. (define (base e)
  72.   (cadr e))
  73.  
  74. (define (exponent e)
  75.   (caddr e))
  76.  
  77. (define (make-expotentiation b e)
  78.   (cond ((=number? e 0) 1)
  79.         ((=number? e 1) b)
  80.         ((and (number? b) (number? e))
  81.          (expt b e))
  82.         (else (list '** b e))))
  83.  
  84. ;; Definition of Derivation
  85.  
  86. (define (deriv exp var)
  87.   (cond ((number? exp) 0)
  88.         ((variable? exp) (if (same-variable? exp var) 1 0))
  89.         ((sum? exp) (make-sum (deriv (addend exp) var)
  90.                               (deriv (augend exp) var)))
  91.         ((product? exp)
  92.          (make-sum (make-product (multiplier exp)
  93.                                  (deriv (multiplicand exp) var))
  94.                    (make-product (multiplicand exp)
  95.                                  (deriv (multiplier exp) var))))
  96.         ((expotentiation? exp)
  97.          (make-product (exponent exp)
  98.                        (make-product (make-expotentiation (base exp)
  99.                                                           (make-sum (exponent exp) -1))
  100.                                      (deriv (base exp) var))))
  101.         (else
  102.          (error "unknown expression type: DERIV" exp))))
  103.  
  104.  
  105. ;; Tests
  106.  
  107. (deriv '(+ x 3) 'x) ;; Returns 1
  108. (deriv '(* x y) 'x) ;; Returns (+ y 0)
  109. (deriv '(+ x y (+ x 3)) 'x)
  110. (deriv '(** x (* x x)) 'x)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement