2.3.2 Example: Symbolic Differentiation
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_sec_2.3.2
記号微分。この辺、個人的には嫌いじゃない。
問題 2.56
指数関数の導入。
; 構成子 (define (make-exponentiation base exponent) (cond ((=number? exponent 0) 1) ((=number? exponent 1) base) (else (list '** base exponent)))) ; 選択子 (define (exponentiation? x) (and (pair? x) (eq? (car x) '**))) (define (base s) (cadr s)) (define (exponent s) (caddr s)) ; deriv関数(変更分のみ) ((exponentiation? exp) (make-product (make-product (exponent exp) (make-exponentiation (base exp) (- (exponent exp) 1))) (deriv (base exp) var)))
問題 2.57
3項以上扱えるようにするやつ。
; 加算の選択子 (define (augend s) (if (= (length s) 3) (caddr s) (cons '+ (cddr s)))) ; 乗算の選択子 (define (multiplicand p) (if (= (length p) 3) (caddr p) (cons '* (cddr p))))
問題2.58
中置演算子を解釈する。
方法は色々あると思うが、ぼくはParser方式で。でも、2項演算子でギブ。残りは、SICP Liteで。
(define (parser exp) (cond ((symbol? exp) exp) ((number? exp) exp) ((eq? (car exp) '+) exp) ((eq? (car exp) '*) exp) ((= (length exp) 3) (list (cadr exp) (parser (car exp)) (parser (caddr exp)))) (else (error "Not implemented when parsing generic expression"))))