理系学生日記

おまえはいつまで学生気分なのか

問題2-73a (2.4.3 Data-Directed Programming and Additivity)

微分する関数として以前こんなのを書かされた。

(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))))
        <more rules can be added here>
        (else (error "unknown expression type -- DERIV" exp))))

でもこういう形だと、割り算についての微分を加えるときとか、引き算についての微分を加えるときとかたいへんです><
そこで、以下のようにして、足し算についての微分とかを行う関数をモジュールみたくテーブルに登録して、足し算を微分するとき、引き算を微分するときなど、必要な関数をgetで自動的に取り出すようにすればいいじゃんと、そういう話。data-directed programmingとかいうらしい。

(define (deriv exp var)
   (cond ((number? exp) 0)
         ((variable? exp) (if (same-variable? exp var) 1 0))
         (else ((get 'deriv (operator exp)) (operands exp)
                                            var))))
(define (operator exp) (car exp))
(define (operands exp) (cdr exp))

a. 上記コードはなにしてんの。なんでnumer?とかvariable?とかは統合できないの。

関数に演算に対する微分の仕方を書き加えていくんじゃなくて、``微分の仕方''をテーブルから取り出すような形に変えてる。そしたら、新しい``式に対する微分''を加えるときもテーブルに登録してやれば、derivをいじらなくてもよくなって世界が平和になるし、病気は治るし、温暖化は止まる。


number?とかが統合できないのは、オペレータがないから。テーブルをルックアップすることができない。