-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathderiv.scm
92 lines (90 loc) · 3.09 KB
/
deriv.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#lang scheme/base
(define (accumulate op initial sequence)
(if (null? sequence) initial
(op (car sequence) (accumulate op initial (cdr sequence)))
)
)
(define (filter predicate sequence)
(cond ((null? sequence) null)
((predicate (car sequence)) (cons (car sequence) (filter predicate (cdr
sequence))))
(else (filter predicate (cdr sequence)))
)
)
(define (variable? x) (symbol? x))
(define (same-variable? v1 v2) (and (variable? v1) (variable? v2) (eq? v1 v2)))
;(define (make-sum a1 a2) (list '+ a1 a2));first version
(define (=number? exp num)
(and (number? exp) (= exp num))
)
(define (sum? x) (and (pair? x) (eq? (car x) '+)))
;(define (make-sum a1 a2)
; (cond ((=number? a1 0) a2)
; ((=number? a2 0) a1)
; ((and (number? a1) (number? a2)) (+ a1 a2))
; ((and (sum? a1) (sum? a2)) (cons '+ (append (cdr a1) (cdr a2))))
; ((and (sum? a1) (number? a2)) (cons '+ (cons a2 (cdr a1))))
; ((and (number? a1) (sum? a2)) (make-sum a2 a1))
; (else (list '+ a1 a2))
; )
;)
(define (make-sum a . r)
(define (make-sum-util a1 a2)
(cond ((=number? a1 0) a2)
((=number? a2 0) a1)
((and (number? a1) (number? a2)) (+ a1 a2))
(else (list ’+ a1 a2))))
(append make-sum a r))
(define x (make-sum 1 'x))
(define y (make-sum 1 'y))
(define z (make-sum x y))
;(define (make-product m1 m2) (list '* m1 m2));first version
(define (make-product m1 m2)
(cond ((or (=number? m1 0) (=number? m2 0)) 0)
((=number? m1 1) m2)
((=number? m2 1) m1)
((and (number? m1) (number? m2)) (* m1 m2))
(else (list '* m1 m2))
)
)
(define (make-exponentiation b e)
(cond ((=number? b 1) 1)
((=number? e 1) b)
(else (list '^ b e))
)
)
(define (exponentiation? x)
(and (pair? x) (eq? (car x) '^))
)
(define (base e)
(cadr e)
)
(define (exponent e)
(caddr e)
)
(define (addend s) (cadr s))
(define (augend s)
(if (> (length s) 3) (cons '+ (cdr (cdr s)))
(caddr s)
)
)
(define (product? x)
(and (pair? x) (eq? (car x) '*)))
(define (multiplier p) (cadr p))
(define (multiplicand p) (caddr p))
(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)))
((product? exp) (make-sum (make-product (multiplier exp) (deriv (multiplicand exp) var))
(make-product (deriv (multiplier exp) var) (multiplicand exp))))
((exponentiation? exp) (make-product (make-product (exponent exp)
(make-exponentiation
(base exp)
(make-sum (exponent exp) (- 1)))
) (deriv (base exp) var)))
(else (error "unknown expression type - DERIVE" exp))
)
)