#lang sicp
(define (make-interval a b) (cons a b))
(define (lower-bound int) (car int))
(define (upper-bound int) (cdr int))
(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 (contains? interval x)
  (and (<= (lower-bound interval) x) (<= x (upper-bound interval))))
(define (div-interval x y)
  (if (not (contains? y 0))
      (mul-interval x (make-interval (/ 1.0 (upper-bound y))
                                     (/ 1.0 (lower-bound y))))
      (error "div-interval called with interval containing zero")))
(define (disp-interval int)
  (display "[") (display (lower-bound int)) (display ", ") 
  (display (upper-bound int)) (display "]"))
(define (disp-interval-op a b c d func character)
  (let ((i1 (make-interval a b))
        (i2 (make-interval c d)))
    (disp-interval i1) (display character) (disp-interval i2) (display " = ")
    (disp-interval (func i1 i2)) (newline)))

(display "Division by an interval containing zero:") (newline)
(disp-interval-op 2 3 -1 1.1 div-interval " / ")
