計算機プログラムの構造と解釈 第二版 P53 問題2.8

この問題は、intervalどうしの差を求める。

  • 手続きsub-internalを定義


んで、難しいのがどんな場合に、差は最小値、最大値になるのか?
どういう組み合わせがあるか考えてみる。


大 - 大
小 - 小
大 - 小
小 - 大


この四つの中から考える。


んー。
仮に以下のようなintervalを考えると、


(12 . 20)
(3 . 5)


具体的に


大 - 大 : 15
小 - 小 : 9
大 - 小 : 17
小 - 大 : 7


なんか、
小 - 大
は7で最小になるね。


そんで、
大 - 小
は17で最大になる。


だので、あとは実装あるのみ。

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

(use ggc.debug.trace)
(use math.mt-random)


;;P53
;;和
(define (add-interval x y)
  (make-interval (+ (lower-bound x) (lower-bound y))
                 (+ (upper-bound x) (upper-bound y))))

;;積
(define (mul-interval x y)
  (let ((p1 (* (lower-bound x) (lower-bound y)))
        (p2 (* (lower-bound x) (upper-bound y)))
        (p3 (* (upper-bound x) (lower-bound y)))
        (p4 (* (upper-bound x) (upper-bound y))))
    (make-interval (min p1 p2 p3 p4)
                   (max p1 p2 p3 p4))))

;;商
(define (div-interval x y)
  (mul-interval x
                (make-interval (/ 1.0 (upper-bound y))
                               (/ 1.0 (lower-bound y)))))

;;問題2-7
(define (make-interval a b) (cons a b))

(define upper-bound cdr)
(define lower-bound car)

;;問題2-8
;;差
(define (sub-interval x y)
  (make-interval (- (lower-bound x) (upper-bound y)) 
                 (- (upper-bound x) (lower-bound y))))


(define interval1 (make-interval 12 20))
(define interval2 (make-interval 3 5))

(define interval-sub (sub-interval interval1 interval2))

;; main
(define (main args)

  (newline)
  (display "interval1:")
  (display interval1)(newline)

  (display "interval2:")
  (display interval2)(newline)


  (display "(lower-bound interval-sub): ")
  (display (lower-bound interval-sub))(newline)

  (display "(upper-bound interval-sub): ")
  (display (upper-bound  interval-sub))(newline)

  (newline)
0)


そんで、実行

interval1:(12 . 20)
interval2:(3 . 5)
(lower-bound interval-sub): 7
(upper-bound interval-sub): 17