96d1407
; polynomial normalization for unary minus
96d1407

96d1407
(declare pn_mul_u-_c_L
96d1407
  (! y (term Real)
96d1407
  (! py poly
96d1407
  (! pz poly
96d1407
  (! x mpq
96d1407
  (! pny (poly_norm y py)
96d1407
  (! a (^ (poly_mul_c py (mp_neg x)) pz)
96d1407
    (poly_norm (*_Real (u-_Real (a_real x)) y) pz))))))))
96d1407
    
96d1407
(declare pn_mul_u-_c_R
96d1407
  (! y (term Real)
96d1407
  (! py poly
96d1407
  (! pz poly
96d1407
  (! x mpq
96d1407
  (! pny (poly_norm y py)
96d1407
  (! a (^ (poly_mul_c py (mp_neg x)) pz)
96d1407
    (poly_norm (*_Real y (u-_Real (a_real x))) pz))))))))
96d1407

96d1407
(declare pn_u-
96d1407
  (! y (term Real)
96d1407
  (! py poly
96d1407
  (! pz poly
96d1407
  (! pny (poly_norm y py)
96d1407
  (! a (^ (poly_neg py) pz)
96d1407
    (poly_norm (u-_Real y) pz)))))))
96d1407
   
96d1407
    
96d1407
; and normalization
96d1407

96d1407
(program do_and_elim ((f formula) (c mpz) (isEnd bool)) formula
96d1407
  (match f
96d1407
    ((and f1 f2) 
96d1407
      (mp_ifzero c 
96d1407
        (match isEnd (tt f) (ff f1)) 
96d1407
        (do_and_elim f2 (mp_add c (~ 1)) isEnd)))
96d1407
    (default f)))
96d1407
    
96d1407
(program do_and_rem ((f formula) (c mpz)) formula
96d1407
  (match f
96d1407
    ((and f1 f2) (mp_ifzero c f2 (and f1 (do_and_rem f2 (mp_add c (~ 1))))))
96d1407
    (default f)))
96d1407
    
96d1407
(declare and_elim
96d1407
  (! f formula
96d1407
  (! f' formula
96d1407
  (! c mpz
96d1407
  (! u1 (th_holds f)
96d1407
  (! r (^ (do_and_elim f c ff) f')
96d1407
    (th_holds f')))))))
96d1407
    
96d1407
(declare and_elim_end
96d1407
  (! f formula
96d1407
  (! f' formula
96d1407
  (! c mpz
96d1407
  (! u1 (th_holds f)
96d1407
  (! r (^ (do_and_elim f c tt) f')
96d1407
    (th_holds f')))))))
96d1407
    
96d1407
(declare and_rem
96d1407
  (! f formula
96d1407
  (! f' formula
96d1407
  (! c mpz
96d1407
  (! u1 (th_holds f)
96d1407
  (! r (^ (do_and_rem f c) f')
96d1407
    (th_holds f')))))))
96d1407

96d1407
; and normalize
96d1407
(program do_and_normalize_h ((f formula) (fc formula)) formula
96d1407
    (match f
96d1407
     ; ((true) fc)
96d1407
      ((and f1 f2) (do_and_normalize_h f1 (do_and_normalize_h f2 fc)))
96d1407
      (default (and f fc))))
96d1407
    
96d1407
(program do_and_normalize ((f formula)) formula
96d1407
  (match f
96d1407
    ((and f1 f2) (do_and_normalize_h f1 (do_and_normalize f2)))
96d1407
    (default f)))
96d1407

96d1407
(declare and_norm
96d1407
  (! f formula
96d1407
  (! f' formula
96d1407
  (! u (th_holds f)
96d1407
  (! r (^ (do_and_normalize f) f')
96d1407
    (th_holds f'))))))
96d1407
    
96d1407
(declare and_normalize
96d1407
  (! f' formula
96d1407
  (! f formula
96d1407
  (! r (^ (do_and_normalize f) f')
96d1407
    (th_holds (iff f f'))))))
96d1407

96d1407
(declare and_nd
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! f' formula
96d1407
  (! u (th_holds (iff f1 f2))
96d1407
  (! r (^ (do_and_normalize f1) f')
96d1407
    (th_holds (iff f1 f2))))))))
96d1407

96d1407
(declare and_redundant
96d1407
  (! f formula
96d1407
    (th_holds (iff (and f f) f))))
96d1407
    
96d1407
(declare and_symm
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
    (th_holds (iff (and f1 f2) (and f2 f1))))))
96d1407

96d1407

96d1407

96d1407

96d1407

96d1407
; or elimination
96d1407

96d1407
(program do_or_elim ((f formula) (c mpz) (isEnd bool)) formula
96d1407
  (match f
96d1407
    ((or f1 f2) 
96d1407
      (mp_ifzero c 
96d1407
        (match isEnd (tt f) (ff f1)) 
96d1407
        (do_or_elim f2 (mp_add c (~ 1)) isEnd)))
96d1407
    (default f)))
96d1407

96d1407
(declare or_elim
96d1407
  (! f formula
96d1407
  (! f' formula
96d1407
  (! c mpz
96d1407
  (! u1 (th_holds (not f))
96d1407
  (! r (^ (do_or_elim f c ff) f')
96d1407
    (th_holds (not f'))))))))
96d1407
    
96d1407
(declare or_elim_end
96d1407
  (! f formula
96d1407
  (! f' formula
96d1407
  (! c mpz
96d1407
  (! u1 (th_holds (not f))
96d1407
  (! r (^ (do_or_elim f c tt) f')
96d1407
    (th_holds (not f'))))))))
96d1407

96d1407
(program do_or_normalize_h ((f formula) (fc formula)) formula
96d1407
  (match f
96d1407
  ;  ((false) fc)
96d1407
    ((or f1 f2) (do_or_normalize_h f1 (do_or_normalize_h f2 fc)))
96d1407
    (default (or f fc))))
96d1407
    
96d1407
(program do_or_normalize ((f formula)) formula
96d1407
  (match f
96d1407
    ((or f1 f2) (do_or_normalize_h f1 (do_or_normalize f2)))
96d1407
    (default f)))
96d1407

96d1407
(declare or_norm
96d1407
  (! f formula
96d1407
  (! f' formula
96d1407
  (! u (th_holds f)
96d1407
  (! r (^ (do_or_normalize f) f')
96d1407
    (th_holds f'))))))
96d1407
    
96d1407
(declare or_normalize
96d1407
  (! f' formula
96d1407
  (! f formula
96d1407
  (! r (^ (do_or_normalize f) f')
96d1407
    (th_holds (iff f f'))))))
96d1407
    
96d1407
(declare or_nd
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! f' formula
96d1407
  (! u (th_holds (iff f1 f2))
96d1407
  (! r (^ (do_or_normalize f1) f')
96d1407
    (th_holds (iff f1 f2))))))))
96d1407

96d1407
(declare or_redundant
96d1407
  (! f formula
96d1407
    (th_holds (iff (or f f) f))))
96d1407
    
96d1407
(declare or_symm
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
    (th_holds (iff (or f1 f2) (or f2 f1))))))
96d1407
    
96d1407
(declare or_intro_1 
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! v var
96d1407
  (! a (atom v f2)
96d1407
  (! u (th_holds f1)
96d1407
    (th_holds (or f1 f2))))))))
96d1407
    
96d1407
(declare or_intro_2 
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! v var
96d1407
  (! a (atom v f2)
96d1407
  (! u (th_holds f1)
96d1407
    (th_holds (or f2 f1))))))))
96d1407

96d1407

96d1407

96d1407

96d1407

96d1407

96d1407

96d1407
; transitivity for iff
96d1407
(declare impl_trans (! f1 formula
96d1407
                   (! f2 formula
96d1407
                   (! f3 formula
96d1407
                   (! i1 (th_holds (impl f1 f2))
96d1407
                   (! i2 (th_holds (impl f2 f3))
96d1407
                      (th_holds (impl f1 f3))))))))
96d1407

96d1407
(define impl_mp impl_elim)
96d1407

96d1407
; reflexivity for impl
96d1407
(declare impl_refl (! f formula
96d1407
                       (th_holds (impl f f))))
96d1407
; reflexivity for impl
96d1407
(declare impl_refl_atom (! v var
96d1407
                        (! f formula
96d1407
                        (! a (atom v f)
96d1407
                          (th_holds (impl f f))))))
96d1407
(declare impl_refl_atom_not (! v var
96d1407
                            (! f formula
96d1407
                            (! a (atom v f)
96d1407
                              (th_holds (impl (not f) (not f))))))) 
96d1407
                          
96d1407
                     
96d1407
(declare impl_refl_false (th_holds (impl false false)))
96d1407
(declare impl_refl_true (th_holds (impl true true)))
96d1407

96d1407
; symmetry for iff
96d1407
(declare impl_symm (! f1 formula
96d1407
                  (! f2 formula
96d1407
                  (! i1 (th_holds (impl f1 f2))
96d1407
                    (th_holds (impl f2 f1))))))
96d1407
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96d1407
;
96d1407
; Rules for iff
96d1407
;
96d1407
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96d1407

96d1407
; dual implication is iff
96d1407
(declare iff_intro (! f1 formula
96d1407
                   (! f2 formula
96d1407
                   (! i1 (th_holds (impl f1 f2))
96d1407
                   (! i2 (th_holds (impl f2 f1))
96d1407
                     (th_holds (iff f1 f2)))))))
96d1407

96d1407
; reflexivity for iff
96d1407
(declare iff_refl_false (th_holds (iff false false)))
96d1407
(declare iff_refl_true (th_holds (iff true true)))
96d1407
(declare iff_refl 
96d1407
  (! f formula
96d1407
    (th_holds (iff f f))))
96d1407

96d1407
; symmetry for iff
96d1407
(declare iff_symm (! f1 formula
96d1407
                  (! f2 formula
96d1407
                  (! i1 (th_holds (iff f1 f2))
96d1407
                    (th_holds (iff f2 f1))))))
96d1407

96d1407
; transitivity for iff
96d1407
(declare iff_trans (! f1 formula
96d1407
                   (! f2 formula
96d1407
                   (! f3 formula
96d1407
                   (! i1 (th_holds (iff f1 f2))
96d1407
                   (! i2 (th_holds (iff f2 f3))
96d1407
                      (th_holds (iff f1 f3))))))))
96d1407
                  
96d1407
; mp for iff
96d1407
(declare iff_mp (! f1 formula
96d1407
                (! f2 formula
96d1407
                (! i1 (th_holds f1)
96d1407
                (! i2 (th_holds (iff f1 f2))
96d1407
                  (th_holds f2))))))
96d1407

96d1407
;;
96d1407

96d1407
(declare basic_subst_op_=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! i1 (th_holds (= Real t1 t2))
96d1407
  (! i2 (th_holds (= Real t3 t4))
96d1407
    (th_holds (iff (= Real t1 t3) (= Real t2 t4))))))))))
96d1407
    
96d1407
(declare basic_subst_op_<
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! i1 (th_holds (= Real t1 t2))
96d1407
  (! i2 (th_holds (= Real t3 t4))
96d1407
    (th_holds (iff (<_Real t1 t3) (<_Real t2 t4))))))))))
96d1407
    
96d1407
(declare basic_subst_op_>
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! i1 (th_holds (= Real t1 t2))
96d1407
  (! i2 (th_holds (= Real t3 t4))
96d1407
    (th_holds (iff (>_Real t1 t3) (>_Real t2 t4))))))))))
96d1407
    
96d1407
(declare basic_subst_op_<=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! i1 (th_holds (= Real t1 t2))
96d1407
  (! i2 (th_holds (= Real t3 t4))
96d1407
    (th_holds (iff (<=_Real t1 t3) (<=_Real t2 t4))))))))))
96d1407
    
96d1407
(declare basic_subst_op_>=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! i1 (th_holds (= Real t1 t2))
96d1407
  (! i2 (th_holds (= Real t3 t4))
96d1407
    (th_holds (iff (>=_Real t1 t3) (>=_Real t2 t4))))))))))
96d1407
    
96d1407
(declare basic_subst_op_distinct
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! i1 (th_holds (= Real t1 t2))
96d1407
  (! i2 (th_holds (= Real t3 t4))
96d1407
    (th_holds (iff (distinct Real t1 t3) (distinct Real t2 t4))))))))))
96d1407
    
96d1407
    
96d1407
;; subst op1
96d1407
    
96d1407
(declare basic_subst_op1_+
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! i1 (th_holds (= Real t1 t2))
96d1407
  (! i2 (th_holds (= Real t3 t4))
96d1407
    (th_holds (= Real (+_Real t1 t3) (+_Real t2 t4))))))))))
96d1407
    
96d1407
(declare basic_subst_op1_-
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! i1 (th_holds (= Real t1 t2))
96d1407
  (! i2 (th_holds (= Real t3 t4))
96d1407
    (th_holds (= Real (-_Real t1 t3) (-_Real t2 t4))))))))))
96d1407
    
96d1407
(declare basic_subst_op1_*
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! i1 (th_holds (= Real t1 t2))
96d1407
  (! i2 (th_holds (= Real t3 t4))
96d1407
    (th_holds (= Real (*_Real t1 t3) (*_Real t2 t4))))))))))
96d1407
    
96d1407
(declare basic_subst_op1_or
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! f3 formula
96d1407
  (! f4 formula
96d1407
  (! i1 (th_holds (iff f1 f2))
96d1407
  (! i2 (th_holds (iff f3 f4))
96d1407
    (th_holds (iff (or f1 f3) (or f2 f4))))))))))
96d1407
    
96d1407
(declare basic_subst_op1_and
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! f3 formula
96d1407
  (! f4 formula
96d1407
  (! i1 (th_holds (iff f1 f2))
96d1407
  (! i2 (th_holds (iff f3 f4))
96d1407
    (th_holds (iff (and f1 f3) (and f2 f4))))))))))
96d1407

96d1407
(declare basic_subst_op1_iff
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! f3 formula
96d1407
  (! f4 formula
96d1407
  (! i1 (th_holds (iff f1 f2))
96d1407
  (! i2 (th_holds (iff f3 f4))
96d1407
    (th_holds (iff (iff f1 f3) (iff f2 f4))))))))))
96d1407

96d1407
(define basic_subst_op1_= basic_subst_op_=)
96d1407
(define basic_subst_op1_>= basic_subst_op_>=)
96d1407
(define basic_subst_op1_<= basic_subst_op_<=)
96d1407
(define basic_subst_op1_> basic_subst_op_>)
96d1407
(define basic_subst_op1_< basic_subst_op_<)
96d1407
(define basic_subst_op1_distinct basic_subst_op_distinct)
96d1407

96d1407
(declare basic_subst_op1_impl_or
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! f3 formula
96d1407
  (! f4 formula
96d1407
  (! i1 (th_holds (impl f1 f2))
96d1407
  (! i2 (th_holds (impl f3 f4))
96d1407
    (th_holds (impl (or f1 f3) (or f2 f4))))))))))
96d1407
    
96d1407
(declare basic_subst_op1_impl_and
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! f3 formula
96d1407
  (! f4 formula
96d1407
  (! i1 (th_holds (impl f1 f2))
96d1407
  (! i2 (th_holds (impl f3 f4))
96d1407
    (th_holds (impl (and f1 f3) (and f2 f4))))))))))
96d1407
    
96d1407

96d1407

96d1407
(declare basic_subst_op0_not
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! i1 (th_holds (iff f1 f2))
96d1407
    (th_holds (iff (not f1) (not f2)))))))
96d1407
    
96d1407
(declare basic_subst_op0_u-
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! i1 (th_holds (= Real t1 t2))
96d1407
    (th_holds (= Real (u-_Real t1) (u-_Real t2)))))))
96d1407
    
96d1407
(declare optimized_subst_op_ite
96d1407
  (! f formula
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! u1 (th_holds (= Real (ite Real f t1 t2) (ite Real f t3 t4)))
96d1407
  (! u2 (th_holds (iff f1 f2))
96d1407
    (th_holds (= Real (ite Real f1 t1 t2) (ite Real f2 t3 t4)))))))))))))
96d1407
    
96d1407
(declare optimized_subst_op_ite_t1
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! t (term Real)
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! u1 (th_holds (= Real (ite Real f1 t t2) (ite Real f2 t t4)))
96d1407
  (! u (th_holds (= Real t1 t3))
96d1407
    (th_holds (= Real (ite Real f1 t1 t2) (ite Real f2 t3 t4)))))))))))))
96d1407
    
96d1407
(declare optimized_subst_op_ite_t2
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! t (term Real)
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! u1 (th_holds (= Real (ite Real f1 t1 t) (ite Real f2 t3 t)))
96d1407
  (! u (th_holds (= Real t2 t4))
96d1407
    (th_holds (= Real (ite Real f1 t1 t2) (ite Real f2 t3 t4)))))))))))))
96d1407
    
96d1407
    
96d1407
(declare optimized_subst_op_ifte
96d1407
  (! f formula
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! ft1 formula
96d1407
  (! ft2 formula
96d1407
  (! ft3 formula
96d1407
  (! ft4 formula
96d1407
  (! u1 (th_holds (iff (ifte f ft1 ft2) (ifte f ft3 ft4)))
96d1407
  (! u2 (th_holds (iff f1 f2))
96d1407
    (th_holds (iff (ifte f1 ft1 ft2) (ifte f2 ft3 ft4)))))))))))))
96d1407
    
96d1407
(declare optimized_subst_op_ifte_t1
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! ft formula
96d1407
  (! ft1 formula
96d1407
  (! ft2 formula
96d1407
  (! ft3 formula
96d1407
  (! ft4 formula
96d1407
  (! u1 (th_holds (iff (ifte f1 ft ft2) (ifte f2 ft ft4)))
96d1407
  (! u (th_holds (iff ft1 ft3))
96d1407
    (th_holds (iff (ifte f1 ft1 ft2) (ifte f2 ft3 ft4)))))))))))))
96d1407
    
96d1407
(declare optimized_subst_op_ifte_t2
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! ft formula
96d1407
  (! ft1 formula
96d1407
  (! ft2 formula
96d1407
  (! ft3 formula
96d1407
  (! ft4 formula
96d1407
  (! u1 (th_holds (iff (ifte f1 ft1 ft) (ifte f2 ft3 ft)))
96d1407
  (! u (th_holds (iff ft2 ft4))
96d1407
    (th_holds (iff (ifte f1 ft1 ft2) (ifte f2 ft3 ft4)))))))))))))
96d1407
    
96d1407
(declare optimized_subst_op_impl_ite
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! u (th_holds (impl f1 f2))
96d1407
    (th_holds (= Real (ite Real f1 t1 t2) (ite Real f2 t1 t2)))))))))
96d1407
    
96d1407
(declare optimized_subst_op_impl_and
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! f3 formula
96d1407
  (! u (th_holds (impl f1 f2))
96d1407
    (th_holds (impl (and f1 f3) (and f1 f3))))))))
96d1407
    
96d1407
(declare optimized_subst_op_impl_or
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! f3 formula
96d1407
  (! u (th_holds (impl f1 f2))
96d1407
    (th_holds (impl (or f1 f3) (or f1 f3))))))))
96d1407
    
96d1407
    
96d1407
;; real shadow
96d1407

96d1407
(declare real_shadow_<_<
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! f1 (th_holds (<_Real t1 t2))
96d1407
  (! f2 (th_holds (<_Real t2 t3))
96d1407
    (th_holds (<_Real t1 t3))))))))
96d1407
    
96d1407
(declare real_shadow_<_<=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! f1 (th_holds (<_Real t1 t2))
96d1407
  (! f2 (th_holds (<=_Real t2 t3))
96d1407
    (th_holds (<_Real t1 t3))))))))
96d1407
    
96d1407
(declare real_shadow_<=_<
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! f1 (th_holds (<=_Real t1 t2))
96d1407
  (! f2 (th_holds (<_Real t2 t3))
96d1407
    (th_holds (<_Real t1 t3))))))))
96d1407
    
96d1407
(declare real_shadow_<=_<=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! f1 (th_holds (<=_Real t1 t2))
96d1407
  (! f2 (th_holds (<=_Real t2 t3))
96d1407
    (th_holds (<=_Real t1 t3))))))))
96d1407
    
96d1407
;; real shadow eq
96d1407

96d1407
(declare real_shadow_eq
96d1407
 (! t1 (term Real)
96d1407
 (! t2 (term Real)
96d1407
 (! i1 (th_holds (<=_Real t1 t2))
96d1407
 (! i2 (th_holds (<=_Real t2 t1))
96d1407
   (th_holds (= Real t1 t2)))))))
96d1407

96d1407
;; add inequalities 
96d1407

96d1407
(declare add_inequalities_<_<=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (!f1 (th_holds ( <_Real t1 t2))
96d1407
  (!f2 (th_holds ( <=_Real t3 t4))
96d1407
    (th_holds (<_Real (+_Real t1 t3) (+_Real t2 t4))))))))))
96d1407

96d1407

96d1407
;; right minus left
96d1407

96d1407
(declare right_minus_left_=
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
    (th_holds (iff (= Real x y) (= Real (a_real 0/1) (-_Real y x)))))))
96d1407
    
96d1407
(declare right_minus_left_>
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
    (th_holds (iff (>_Real x y) (>_Real (a_real 0/1) (-_Real y x)))))))
96d1407
    
96d1407
(declare right_minus_left_<
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
    (th_holds (iff (<_Real x y) (<_Real (a_real 0/1) (-_Real y x)))))))
96d1407
    
96d1407
(declare right_minus_left_>=
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
    (th_holds (iff (>=_Real x y) (>=_Real (a_real 0/1) (-_Real y x)))))))
96d1407
    
96d1407
(declare right_minus_left_<=
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
    (th_holds (iff (<=_Real x y) (<=_Real (a_real 0/1) (-_Real y x)))))))
96d1407

96d1407
(declare right_minus_left_distinct
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
    (th_holds (iff (distinct Real x y) (distinct Real (a_real 0/1) (-_Real y x)))))))
96d1407

96d1407
; minus to plus
96d1407

96d1407
(declare minus_to_plus
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
    (th_holds (= Real (-_Real x y) (+_Real x (*_Real (a_real (~ 1/1)) y)))))))
96d1407

96d1407
;; plus pred
96d1407

96d1407
(declare plus_predicate_=
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! z (term Real)
96d1407
    (th_holds (iff (= Real x y) (= Real (+_Real x z) (+_Real y z))))))))
96d1407

96d1407
(declare plus_predicate_>
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! z (term Real)
96d1407
    (th_holds (iff (>_Real x y) (>_Real (+_Real x z) (+_Real y z))))))))
96d1407
    
96d1407
(declare plus_predicate_<
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! z (term Real)
96d1407
    (th_holds (iff (<_Real x y) (<_Real (+_Real x z) (+_Real y z))))))))
96d1407

96d1407
(declare plus_predicate_>=
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! z (term Real)
96d1407
    (th_holds (iff (>=_Real x y) (>=_Real (+_Real x z) (+_Real y z))))))))
96d1407
    
96d1407
(declare plus_predicate_<=
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! z (term Real)
96d1407
    (th_holds (iff (<=_Real x y) (<=_Real (+_Real x z) (+_Real y z))))))))
96d1407

96d1407
(declare plus_predicate_distinct
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! z (term Real)
96d1407
    (th_holds (iff (distinct Real x y) (distinct Real (+_Real x z) (+_Real y z))))))))
96d1407
    
96d1407
;; mult_ineqn
96d1407

96d1407
(declare mult_eqn
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! c mpq
96d1407
    (th_holds (iff (= Real x y) (= Real (*_Real x (a_real c)) (*_Real y (a_real c))))))))))
96d1407
    
96d1407
(declare mult_ineqn_>
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! c mpq
96d1407
  (! u (^ (mpq_ifpos c) tt)
96d1407
    (th_holds (iff (>_Real x y) (>_Real (*_Real x (a_real c)) (*_Real y (a_real c))))))))))
96d1407
    
96d1407
(declare mult_ineqn_<
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! c mpq
96d1407
  (! u (^ (mpq_ifpos c) tt)
96d1407
    (th_holds (iff (<_Real x y) (<_Real (*_Real x (a_real c)) (*_Real y (a_real c))))))))))
96d1407
    
96d1407
(declare mult_ineqn_>=
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! c mpq
96d1407
  (! u (^ (mpq_ifpos c) tt)
96d1407
    (th_holds (iff (>=_Real x y) (>=_Real (*_Real x (a_real c)) (*_Real y (a_real c))))))))))
96d1407
    
96d1407
(declare mult_ineqn_<=
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! c mpq
96d1407
  (! u (^ (mpq_ifpos c) tt)
96d1407
    (th_holds (iff (<=_Real x y) (<=_Real (*_Real x (a_real c)) (*_Real y (a_real c))))))))))
96d1407

96d1407
(declare mult_ineqn_neg_>
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! c mpq
96d1407
  (! u (^ (mp_ifneg c tt ff) tt)
96d1407
    (th_holds (iff (>_Real x y) (>_Real (*_Real y (a_real c)) (*_Real x (a_real c))))))))))
96d1407
    
96d1407
(declare mult_ineqn_neg_<
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! c mpq
96d1407
  (! u (^ (mp_ifneg c tt ff) tt)
96d1407
    (th_holds (iff (<_Real x y) (<_Real (*_Real y (a_real c)) (*_Real x (a_real c))))))))))
96d1407
    
96d1407
(declare mult_ineqn_neg_>=
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! c mpq
96d1407
  (! u (^ (mp_ifneg c tt ff) tt)
96d1407
    (th_holds (iff (>=_Real x y) (>=_Real (*_Real y (a_real c)) (*_Real x (a_real c))))))))))
96d1407
    
96d1407
(declare mult_ineqn_neg_<=
96d1407
  (! x (term Real)
96d1407
  (! y (term Real)
96d1407
  (! c mpq
96d1407
  (! u (^ (mp_ifneg c tt ff) tt)
96d1407
    (th_holds (iff (<=_Real x y) (<=_Real (*_Real y (a_real c)) (*_Real x (a_real c))))))))))
96d1407

96d1407
;; canon
96d1407
(declare canonize_=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! p poly
96d1407
  (! pn (poly_norm (-_Real t1 t2) p)
96d1407
  (! u (^ (mp_ifzero (is_poly_const p) tt ff) tt)
96d1407
    (th_holds (= Real t1 t2))))))))
96d1407
    
96d1407
(declare canonize_iff
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! p1 poly
96d1407
  (! p2 poly
96d1407
  (! pn1 (poly_norm (-_Real t1 t2) p1)
96d1407
  (! pn2 (poly_norm (-_Real t3 t4) p2)
96d1407
  (! u (^ (mp_ifzero (is_poly_const (poly_add p1 p2)) tt ff) tt)
96d1407
    (th_holds (iff (= Real t1 t2) (= Real t3 t4)))))))))))))
96d1407
    
96d1407
(declare canonize_conv
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real) 
96d1407
  (! t1' (term Real)
96d1407
  (! t2' (term Real)  
96d1407
  (! p poly
96d1407
  (! p' poly
96d1407
  (! pn (poly_norm (-_Real t1 t2) p)
96d1407
  (! pn (poly_norm (-_Real t1' t2') p')
96d1407
  (! u (th_holds (= Real t1 t2))
96d1407
  (! r (^ (mp_ifzero (is_poly_const (poly_sub p p')) tt ff) tt)
96d1407
    (th_holds (= Real t1' t2')))))))))))))
96d1407

96d1407
;; flip_inequality
96d1407

96d1407
(declare flip_inequality_>_<
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
    (th_holds (iff (>_Real t1 t2) (<_Real t2 t1))))))
96d1407
    
96d1407
(declare flip_inequality_>=_<=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
    (th_holds (iff (>=_Real t1 t2) (<=_Real t2 t1))))))
96d1407
    
96d1407
   (declare flip_inequality_<_>
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
    (th_holds (iff (<_Real t1 t2) (>_Real t2 t1))))))
96d1407
    
96d1407
(declare flip_inequality_<=_>=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
    (th_holds (iff (<=_Real t1 t2) (>=_Real t2 t1)))))) 
96d1407

96d1407
;; negated inequality
96d1407

96d1407
(declare negated_inequality_>_<=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
    (th_holds (iff (not (>_Real t1 t2)) (<=_Real t1 t2))))))
96d1407
    
96d1407
(declare negated_inequality_>=_<
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
    (th_holds (iff (not (>=_Real t1 t2)) (<_Real t1 t2))))))
96d1407
    
96d1407
(declare negated_inequality_<_>=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
    (th_holds (iff (not (<_Real t1 t2)) (>=_Real t1 t2))))))
96d1407
    
96d1407
(declare negated_inequality_<=_>
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
    (th_holds (iff (not (<=_Real t1 t2)) (>_Real t1 t2))))))
96d1407
    
96d1407
;; imply negated inequality
96d1407

96d1407
(declare imply_negated_inequality_<_<
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! p1 poly
96d1407
  (! p2 poly
96d1407
  (! pn1 (poly_norm t1 p1)
96d1407
  (! pn2 (poly_norm t2 p2)
96d1407
  (! u (^ (mp_ifneg (is_poly_const (poly_add p1 p2)) tt ff) tt)
96d1407
    (th_holds 
96d1407
      (impl (<_Real (a_real 0/1) t1)
96d1407
            (not (<_Real (a_real 0/1) t2))))))))))))
96d1407

96d1407
(declare imply_negated_inequality_<=_<=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! p1 poly
96d1407
  (! p2 poly
96d1407
  (! pn1 (poly_norm t1 p1)
96d1407
  (! pn2 (poly_norm t2 p2)
96d1407
  (! u (^ (mp_ifneg (is_poly_const (poly_add p1 p2)) tt ff) tt)
96d1407
    (th_holds 
96d1407
      (impl (<=_Real (a_real 0/1) t1)
96d1407
            (not (<=_Real (a_real 0/1) t2))))))))))))
96d1407

96d1407
(declare imply_negated_inequality_<=_<
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! p1 poly
96d1407
  (! p2 poly
96d1407
  (! pn1 (poly_norm t1 p1)
96d1407
  (! pn2 (poly_norm t2 p2)
96d1407
  (! u (^ (mp_ifneg (is_poly_const (poly_add p1 p2)) tt ff) tt)
96d1407
    (th_holds 
96d1407
      (impl (<=_Real (a_real 0/1) t1)
96d1407
            (not (<_Real (a_real 0/1) t2))))))))))))
96d1407

96d1407
(declare imply_negated_inequality_<_<=
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)    
96d1407
  (! p1 poly
96d1407
  (! p2 poly
96d1407
  (! pn1 (poly_norm t1 p1)
96d1407
  (! pn2 (poly_norm t2 p2)
96d1407
  (! u (^ (mp_ifneg (is_poly_const (poly_add p1 p2)) tt ff) tt)
96d1407
    (th_holds 
96d1407
      (impl (<_Real (a_real 0/1) t1)
96d1407
            (not (<=_Real (a_real 0/1) t2))))))))))))
96d1407

96d1407
;; imply weaker inequality
96d1407

96d1407
(declare imply_weaker_inequality_<_<
96d1407
  (! t (term Real)
96d1407
  (! c1 mpq
96d1407
  (! c2 mpq
96d1407
  (! u (^ (mp_ifneg (mp_add c2 (mp_mul (~ 1/1 ) c1)) tt ff) ff)
96d1407
    (th_holds 
96d1407
      (impl (<_Real (a_real 0/1) (+_Real (a_real c1) t)) 
96d1407
            (<_Real (a_real 0/1) (+_Real (a_real c2) t)))))))))
96d1407
           
96d1407
(declare imply_weaker_inequality_<=_<=
96d1407
  (! t (term Real)
96d1407
  (! c1 mpq
96d1407
  (! c2 mpq
96d1407
  (! u (^ (mp_ifneg (mp_add c2 (mp_mul (~ 1/1 ) c1)) tt ff) ff)
96d1407
    (th_holds 
96d1407
      (impl (<=_Real (a_real 0/1) (+_Real (a_real c1) t)) 
96d1407
            (<=_Real (a_real 0/1) (+_Real (a_real c2) t)))))))))
96d1407
            
96d1407
(declare imply_weaker_inequality_<=_<
96d1407
  (! t (term Real)
96d1407
  (! c1 mpq
96d1407
  (! c2 mpq
96d1407
  (! u (^ (mpq_ifpos (mp_add c2 (mp_mul (~ 1/1 ) c1))) tt)
96d1407
    (th_holds 
96d1407
      (impl (<=_Real (a_real 0/1) (+_Real (a_real c1) t)) 
96d1407
            (<_Real (a_real 0/1) (+_Real (a_real c2) t)))))))))
96d1407
           
96d1407
(declare imply_weaker_inequality_<_<=
96d1407
  (! t (term Real)
96d1407
  (! c1 mpq
96d1407
  (! c2 mpq
96d1407
  (! u (^ (mp_ifneg (mp_add c2 (mp_mul (~ 1/1 ) c1)) tt ff) ff)
96d1407
    (th_holds 
96d1407
      (impl (<_Real (a_real 0/1) (+_Real (a_real c1) t)) 
96d1407
            (<=_Real (a_real 0/1) (+_Real (a_real c2) t)))))))))
96d1407
            
96d1407
            
96d1407
(declare rewrite_iff_symm 
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
    (th_holds (iff (iff f1 f2) (iff f2 f1))))))
96d1407

96d1407
(declare rewrite_eq_symm 
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
    (th_holds (iff (= Real t1 t2) (= Real t2 t1))))))
96d1407
    
96d1407

96d1407
;; rewrite implies
96d1407

96d1407
(declare rewrite_implies
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
    (th_holds (iff (impl f1 f2) (or (not f1) f2))))))
96d1407

96d1407
;; not to iff
96d1407

96d1407
(declare not_to_iff
96d1407
  (! f1 formula
96d1407
  (! f2 (th_holds (not f1))
96d1407
    (th_holds (iff f1 false)))))
96d1407

96d1407
;; rewrite_not_not
96d1407

96d1407
(declare rewrite_not_not
96d1407
  (! f formula
96d1407
    (th_holds (iff (not (not f)) f ))))
96d1407
    
96d1407
(declare uminus_to_mult
96d1407
  (! c mpq
96d1407
    (th_holds (= Real (u-_Real (a_real c)) (*_Real (a_real (~ 1/1)) (a_real c))))))
96d1407
    
96d1407
;; const_predicate
96d1407
(declare const_predicate_=
96d1407
  (! c1 mpq
96d1407
  (! c2 mpq
96d1407
  (! r (^ (mp_ifzero (mp_add c2 (mp_mul (~ 1/1) c1)) tt ff) ff)
96d1407
    (th_holds (iff (= Real (a_real c1) (a_real c2)) false))))))
96d1407

96d1407
(declare const_predicate_<
96d1407
  (! c1 mpq
96d1407
  (! c2 mpq
96d1407
  (! r (^ (mpq_ifpos (mp_add c2 (mp_mul (~ 1/1) c1))) ff)
96d1407
    (th_holds (iff (<_Real (a_real c1) (a_real c2)) false))))))
96d1407
    
96d1407
(declare const_predicate_<=
96d1407
  (! c1 mpq
96d1407
  (! c2 mpq
96d1407
  (! r (^ (mp_ifneg (mp_add c2 (mp_mul (~ 1/1) c1)) tt ff) tt)
96d1407
    (th_holds (iff (<=_Real (a_real c1) (a_real c2)) false))))))
96d1407
    
96d1407
(declare const_predicate_=_t
96d1407
  (! c1 mpq
96d1407
  (! c2 mpq
96d1407
  (! r (^ (mp_ifzero (mp_add c2 (mp_mul (~ 1/1) c1)) tt ff) tt)
96d1407
    (th_holds (iff (= Real (a_real c1) (a_real c2)) true))))))
96d1407
    
96d1407
(declare const_predicate_<_t
96d1407
  (! c1 mpq
96d1407
  (! c2 mpq
96d1407
  (! r (^ (mpq_ifpos (mp_add c2 (mp_mul (~ 1/1) c1))) tt)
96d1407
    (th_holds (iff (<_Real (a_real c1) (a_real c2)) true))))))
96d1407
    
96d1407
(declare const_predicate_<=_t
96d1407
  (! c1 mpq
96d1407
  (! c2 mpq
96d1407
  (! r (^ (mp_ifneg (mp_add c2 (mp_mul (~ 1/1) c1)) tt ff) ff)
96d1407
    (th_holds (iff (<=_Real (a_real c1) (a_real c2)) true))))))
96d1407
    
96d1407
    
96d1407
(declare rewrite_not_true (th_holds (iff (not true) false)))
96d1407

96d1407
(declare rewrite_not_false (th_holds (iff (not false) true)))
96d1407

96d1407
(declare rewrite_eq_symm
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
    (th_holds (iff (= Real t1 t2) (= Real t2 t1))))))
96d1407

96d1407
(declare rewrite_eq_refl
96d1407
 (! t1 (term Real)
96d1407
   (th_holds (iff (= Real t1 t1) true))))
96d1407

96d1407
; class of ignored rules
96d1407

96d1407
(declare iff_true 
96d1407
  (! f formula
96d1407
  (! u (th_holds f)
96d1407
    (th_holds (iff f true)))))
96d1407
    
96d1407
    
96d1407
(declare iff_not_false
96d1407
  (! f formula
96d1407
  (! u (th_holds f)
96d1407
    (th_holds (iff (not f) false)))))
96d1407
    
96d1407
(declare iff_true_elim
96d1407
  (! f formula
96d1407
  (! u (th_holds (iff f true))
96d1407
    (th_holds f))))
96d1407
    
96d1407
(declare iff_false_elim
96d1407
  (! f formula
96d1407
  (! u (th_holds (iff f false))
96d1407
    (th_holds (not f)))))
96d1407
 
96d1407
(declare not_to_iff
96d1407
  (! f formula
96d1407
  (! u (th_holds (not f))
96d1407
    (th_holds (iff f false)))))
96d1407
    
96d1407
    
96d1407
(declare iff_true_impl
96d1407
  (! f formula
96d1407
  (! u (th_holds f)
96d1407
    (th_holds (impl f true)))))
96d1407
    
96d1407
(declare iff_not_false_impl
96d1407
  (! f formula
96d1407
  (! u (th_holds f)
96d1407
    (th_holds (impl (not f) false)))))
96d1407
    
96d1407
(declare iff_true_elim_impl
96d1407
  (! f formula
96d1407
  (! u (th_holds (impl f true))
96d1407
    (th_holds f))))
96d1407
    
96d1407
(declare iff_false_elim_impl
96d1407
  (! f formula
96d1407
  (! u (th_holds (impl f false))
96d1407
    (th_holds (not f)))))
96d1407
 
96d1407
(declare not_to_iff_impl
96d1407
  (! f formula
96d1407
  (! u (th_holds (not f))
96d1407
    (th_holds (impl f false)))))
96d1407
    
96d1407

96d1407
; the different rewrite_iff cases
96d1407

96d1407
(declare rewrite_iff_true_l
96d1407
  (!f1 formula
96d1407
    (th_holds (iff (iff true f1) f1))))
96d1407

96d1407
(declare rewrite_iff_false_l
96d1407
  (!f1 formula
96d1407
    (th_holds (iff (iff false f1) (not f1)))))
96d1407

96d1407
(declare rewrite_iff_not_l
96d1407
  (!f1 formula
96d1407
    (th_holds (iff (iff (not f1) f1) false))))
96d1407

96d1407
(declare rewrite_iff_true_r
96d1407
  (!f1 formula
96d1407
    (th_holds (iff (iff f1 true) f1))))
96d1407

96d1407
(declare rewrite_iff_false_r
96d1407
  (!f1 formula
96d1407
    (th_holds (iff (iff f1 false) (not f1)))))
96d1407

96d1407
(declare rewrite_iff_not_r
96d1407
  (!f1 formula
96d1407
    (th_holds (iff (iff f1 (not f1)) false))))
96d1407

96d1407

96d1407

96d1407
; ite axiom
96d1407
(declare ite_axiom
96d1407
  (! f formula
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
    (th_holds (ifte f (= Real (ite Real f t1 t2) t1) (= Real (ite Real f t1 t2) t2)))))))
96d1407

96d1407
; ite same
96d1407
(declare rewrite_ite_same
96d1407
  (! f formula
96d1407
  (! t (term Real)
96d1407
    (th_holds (= Real (ite Real f t t) t)))))
96d1407
    
96d1407
(declare imply_equalities
96d1407
  (! t1 (term Real)
96d1407
  (! t2 (term Real)
96d1407
  (! t3 (term Real)
96d1407
  (! t4 (term Real)
96d1407
  (! p1 poly
96d1407
  (! p2 poly
96d1407
  (! pn1 (poly_norm (-_Real t2 t1) p1)
96d1407
  (! pn2 (poly_norm (-_Real t4 t3) p2)
96d1407
  (! u1 (th_holds (<=_Real t1 t2))
96d1407
  (! u2 (th_holds (<=_Real t3 t4))
96d1407
  (! u (^ (mp_ifzero (is_poly_const (poly_add p1 p2)) tt ff) tt)
96d1407
    (th_holds (and (= Real t1 t2) (= Real t3 t4)))))))))))))))
96d1407
    
96d1407
    
96d1407
(declare contrapositive
96d1407
  (! f1 formula
96d1407
  (! f2 formula
96d1407
  (! u (th_holds (impl f1 f2))
96d1407
    (th_holds (impl (not f2) (not f1)))))))