2008. 8. 4.

연습문제 2.73

a. 덧셈, 곱셈 및 기타 연산에 대한 미분 함수를 연산 표에 입력시켰다 number?나 variable? 은 연산으로 표시되는 경우와는 구분된다. 이들은 별도로 구분할 연산규칙이 없기때문에 연산 표에 등재할 이유가 없다.

b.

(define (install-deriv-package)
  (define (addend exp) (car exp))
  (define (augend exp) (cadr exp))
  (define (make-sum s1 s2)
    (list '+ s1 s2))
 
  (define (multiplier exp) (car exp))
  (define (multiplicand exp) (cadr exp))
  (define (make-product p1 p2)
    (list '* p1 p2))
 
  (define (deriv-sum exp var)
    (make-sum (deriv (addend exp) var)
              (deriv (augend exp) var)))
 
  (define (deriv-product exp var)
    (make-sum (make-product (multipier exp)
                            (deriv (mltiplicand exp) var))
              (make-product (deriv (multiplier exp) var)
                            (multiplicand exp))))
 
  (put 'deriv '+ deriv-sum)
  (put 'deriv '* deriv-product))
c.

(define (make-exponentiation base exponent)
  (cond ((=number? base 0) 0)
        ((=number? base 1) 0)
        ((=number? exponent 0) 1)
        ((=number? exponent 1) base)
        (else (list '** base exponent))))


(define (base exp)
  (car exp))

(define (exponent exp)
  (cadr exp))

(define (deriv-exponent exp var)
  (make-product (make-product (exponent exp)
                              (make-exponentiation (base exp)
                                                   (- (exponent exp) 1)))))

(put 'deriv '** deriv-exponent)

d. get 과 put을 하는 시스템의 변경은 있을 수 있겠지만, 실제로 이들을 등록하고 사용하는 측면에서는 get과 put에 관련된 루틴이외에는 변경할 필요가 없다

댓글 없음:

댓글 쓰기