問題 2.6
;; one (define one (lambda (f) (lambda (x) (f x)))) ;; two (define two (lambda (f) (lambda (x) (f (f x)))))
確かこんな感じだったw 次いってみよー。
問題 2.7
(define (make-interval a b) (cons a b))
make-intarval はこのように実装されて、add-interval などから
(cons 下限許容限界値 上限許容限界値)
になることがわかりますので、
(define (lower-bound x) (car x)) (define (upper-bound x) (cdr x))
このように実装すれば良いでしょう。
問題 2.8
引き算の場合は、
許容限界値の最小値 : x の下限許容限界値 - y の上限許容限界値
許容限界値の最大値 : x の上限許容限界値 - y の下限許容限界値
となるので、sub-interval 手続きは
(define (sub-interval x y) (make-interval (- (lower-bound x) (upper-bound y)) (- (upper-bound x) (lower-bound y))))
と実装できます。
ここまで実装すると冒頭の、6.8Ω 10% の抵抗と 4.7Ω 5% の抵抗を並列に接続したときの計算ができます。
(define r1 (make-interval 6.12 7.48)) (define r2 (make-interval 4.47 4.94))
抵抗値の ±10% を計算して下限許容限界値と上限許容限界値を求めないといけないので面倒くさいですが、
2 つの抵抗は make-interval 手続きを使ってこのように定義できます。
(define (rp r1 r2) (div-interval (make-interval 1 1) (add-interval (div-interval (make-interval 1 1) r1) (div-interval (make-interval 1 1) r2))))
2つの抵抗を並列に接続したときの全体の抵抗値は、
本文に計算式が載っているので interval 用の手続きを使って
このように実装できます。
gosh> (rp r1 r2) (2.583229461756374 . 2.975136876006441)
cons の値そのままですが、正しい結果を得ます。
print-interval 手続きを実装すれば、もっときれいに表示出来るようになるでしょう。