Skip to content

2.07

; Alyssa’s program is incomplete because she has not specified 
; the implementation of the interval abstraction. Here is a 
; definition of the interval constructor:

(define (make-interval a b) (cons a b))

; Define selectors upper-bound and lower-bound to complete the implementation.

(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)))))

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

(define (print-interval z)
    (newline)
    (display "[")
    (display (lower-bound z))
    (display ", ")
    (display (upper-bound z))
    (display "]"))

; Testing
; (i) Testing addition
;   [1.5, 1.8] + [5.6, 5.75] => [7.1, 7.55]
(define interval1 (make-interval 1.5 1.8))
(define interval2 (make-interval 5.6 5.75))
(define interval3 (add-interval interval1 interval2))
(print-interval interval3) ; [7.1, 7.55]

; (ii) Testing multiplication
;   [1.5, 1.8] * [5.6, 5.75] => [8.4, 10.35]
(define interval4 (mul-interval interval1 interval2))
(print-interval interval4) ; [8.399999999999999, 10.35]

; (iii) Testing division
;   [1.5, 1.8] / [5.6, 5.75] => [1.5, 1.8] * [0.1739130435, 0.1785714286]
;                            => [0.26, 0.32]
(define interval5 (div-interval interval1 interval2))
(print-interval interval5) ; [.2608695652173913, .32142857142857145]

; (iv) Testing negative
(print-interval (add-interval 
                    (make-interval -1.5 -1.2) 
                    (make-interval -1 2))) ; [-2.5, .8]
(print-interval (mul-interval 
                    (make-interval -1.5 -1.2) 
                    (make-interval -1 2))) ; [-3., 1.5]
(print-interval (div-interval 
                    (make-interval -1.5 -1.2) 
                    (make-interval -1 2))) ; [-.75, 1.5]