2008. 4. 5.

연습문제 2.11

interval의 각각의 부호에 따르면 총 16가지가 나온다.
하지만 interval의 lower보다 upper가 작은 가지수를 제외하면 총 9가지가 나온다.

각각을 양수 음수로 놓고 표를 만들면 다음과 같다.

(lower x)  (upper x)  (lower y)  (upper y)
    +               +             +              +    : lx.ly . ux.uy
    +               +             +              -    : 불가
    +               +             -              +    : ux.ly . ux,uy
    +               +             -              -    : ux,ly . lx,uy
    +               -             +              +    : 불가
    +               -             +              -    : 불가
    +               -             -              +    : 불가
    +               -             -              -    : 불가
    -               +             +              +    : lx,ly . ux,uy
    -               +             +              -    : 불가
    -               +             -              +    : ??
    -               +             -              -    : ux,ly . lx,ly
    -               -             +              +    : lx,uy . ux,ly
    -               -             +              -    : 불가
    -               -             -              +    : lx,uy . ux,ly
    -               -             -              -    : lx,ly  . ux,uy

따라서 이를 다시 함수로 정의하면 다음과 같다.
(define (sub-interval x y)
  (let ((lx (lower-bound x))
        (ly (lower-bound y))
        (ux (upper-bound x))
        (uy (upper-bound y)))
    (cond ((and (> lx 0) (> ux 0) (> ly 0) (> uy 0)) (make-interval (* lx ly) (* ux uy)))
          ((and (> lx 0) (> ux 0) (< ly 0) (> uy 0)) (make-interval (* ux ly) (* ux uy)))
          ((and (> lx 0) (> ux 0) (< ly 0) (< uy 0)) (make-interval (* ux ly) (* lx uy)))
          ((and (< lx 0) (> ux 0) (> ly 0) (> uy 0)) (make-interval (* lx ly) (* ux uy)))
          ((and (< lx 0) (> ux 0) (< ly 0) (< uy 0)) (make-interval (* ux ly) (* lx ly)))
          ((and (< lx 0) (< ux 0) (> ly 0) (> uy 0)) (make-interval (* lx uy) (* ux ly)))
          ((and (< lx 0) (< ux 0) (> ly 0) (< uy 0)) (make-interval (* lx uy) (* ux ly)))
          ((and (< lx 0) (< ux 0) (< ly 0) (< uy 0)) (make-interval (* lx ly) (* ux uy)))
          (else
           (let
               ((p1 (* lx ly))
                (p2 (* lx uy))
                (p3 (* ux ly))
                (p4 (* ux uy)))
             (make-interval
              (min p1 p2 p3 p4)
              (max p1 p2 p3 p4)))))))


댓글 없음:

댓글 쓰기