96d1407
(declare color type)
96d1407
(declare A color)
96d1407
(declare B color)
96d1407

96d1407
; formula f is an interpolant for (A,B)
96d1407
(declare interpolant (! f formula type))
96d1407

96d1407
; input formula f is from "c", where c is A|B
96d1407
(declare color_atom (! c color (! f formula type)))
96d1407

96d1407
; simplify interpolant
96d1407
    
96d1407
(program simplify_f ((f formula)) formula
96d1407
  (match f 
96d1407
    ((and f1 f2) 
96d1407
      (let f1' (simplify_f f1)
96d1407
      (match f1'
96d1407
        (true (simplify_f f2))
96d1407
        (false false)
96d1407
        (default 
96d1407
          (let f2' (simplify_f f2)
96d1407
          (match f2'
96d1407
            (true f1')
96d1407
            (false false)
96d1407
            (default (and f1' f2'))))))))
96d1407
    ((or f1 f2) 
96d1407
      (let f1' (simplify_f f1)
96d1407
      (match f1'
96d1407
        (true true)
96d1407
        (false (simplify_f f2))
96d1407
        (default 
96d1407
          (let f2' (simplify_f f2)
96d1407
          (match f2'
96d1407
            (true true)
96d1407
            (false f1')
96d1407
            (default (or f1' f2'))))))))
96d1407
    ((impl f1 f2) 
96d1407
      (let f1' (simplify_f f1)
96d1407
      (match f1'
96d1407
        (true (simplify_f f2))
96d1407
        (false true)
96d1407
        (default 
96d1407
          (let f2' (simplify_f f2)
96d1407
          (match f2'
96d1407
            (true true)
96d1407
            (false (match f1'
96d1407
                     ((not f1'') f1'')
96d1407
                     (default (not f1'))))
96d1407
            (default (impl f1' f2'))))))))
96d1407
    ((not f1)
96d1407
      (let f1' (simplify_f f1)
96d1407
      (match f1'
96d1407
        ((not f1'') f1'')
96d1407
        (default (not f1')))))
96d1407
    (default f)))
96d1407
    
96d1407
(declare simplify_interpolant
96d1407
  (! f formula
96d1407
  (! f' formula
96d1407
  (! i (interpolant f)
96d1407
  (! u (^ (simplify_f f) f')
96d1407
    (interpolant f'))))))