96d1407
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96d1407
;
96d1407
; Atomization
96d1407
;
96d1407
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96d1407
 
96d1407

96d1407
; binding between an LF var and an (atomic) formula
96d1407
(declare atom (! v var (! p formula type)))
96d1407

96d1407
(declare decl_atom
96d1407
  (! f formula
96d1407
  (! u (! v var 
96d1407
       (! a (atom v f)
96d1407
         bottom))
96d1407
    bottom)))
96d1407
    
96d1407
; direct clausify
96d1407
(declare clausify_form
96d1407
  (! f formula
96d1407
  (! v var
96d1407
  (! a (atom v f)
96d1407
  (! u (th_holds f)
96d1407
    (holds (clc (pos v) cln)))))))
96d1407
    
96d1407
(declare clausify_form_not
96d1407
  (! f formula
96d1407
  (! v var
96d1407
  (! a (atom v f)
96d1407
  (! u (th_holds (not f))
96d1407
    (holds (clc (neg v) cln)))))))
96d1407

96d1407
(declare clausify_false
96d1407
  (! u (th_holds false)
96d1407
    bottom))
96d1407

96d1407
(declare let_pf 
96d1407
  (! c clause
96d1407
  (! c' clause
96d1407
  (! u (holds c)
96d1407
  (! u2 (! v (holds c) bottom)
96d1407
    bottom)))))
96d1407
    
96d1407
(declare th_let_pf
96d1407
  (! f formula
96d1407
  (! u (th_holds f)
96d1407
  (! u2 (! v (th_holds f) bottom)
96d1407
    bottom))))
96d1407

96d1407
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96d1407
;
96d1407
; Theory reasoning
96d1407
; - make a series of assumptions and then derive a contradiction (or false)
96d1407
; - then the assumptions yield a formula like "v1 -> v2 -> ... -> vn -> false"
96d1407
; - In CNF, it becomes a clause: "~v1, ~v2, ..., ~vn"
96d1407
;
96d1407
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96d1407

96d1407
(declare ast
96d1407
  (! v var
96d1407
  (! f formula
96d1407
  (! C clause
96d1407
  (! r (atom v f)       ;this is specified
96d1407
  (! u (! o (th_holds f)
96d1407
         (holds C))
96d1407
    (holds (clc (neg v) C))))))))
96d1407

96d1407
(declare asf
96d1407
  (! v var
96d1407
  (! f formula
96d1407
  (! C clause
96d1407
  (! r (atom v f)
96d1407
  (! u (! o (th_holds (not f))
96d1407
         (holds C))
96d1407
    (holds (clc (pos v) C))))))))
96d1407

96d1407
(declare contra
96d1407
  (! f formula
96d1407
  (! r1 (th_holds f)
96d1407
  (! r2 (th_holds (not f))
96d1407
    (holds cln)))))
96d1407

96d1407
(declare th_ast
96d1407
  (! f formula
96d1407
  (! u (! o (th_holds f)
96d1407
         (holds cln))
96d1407
    (th_holds (not f)))))
96d1407
    
96d1407
(declare th_asf
96d1407
  (! f formula
96d1407
  (! u (! o (th_holds (not f))
96d1407
         (holds cln))
96d1407
    (th_holds f))))
96d1407
    
96d1407
(declare lem
96d1407
  (! f formula
96d1407
  (! v var
96d1407
  (! a (atom v f)
96d1407
    (holds (clc (pos v) (clc (neg v) cln)))))))
96d1407

96d1407
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96d1407
;
96d1407
; Theory of Equality and Congruence Closure
96d1407
;
96d1407
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96d1407

96d1407
(declare refl
96d1407
  (! s sort
96d1407
  (! t (term s)
96d1407
    (th_holds (= s t t)))))
96d1407

96d1407
(declare symm (! s sort
96d1407
              (! x (term s)
96d1407
              (! y (term s)
96d1407
              (! u (th_holds (= _ x y))
96d1407
                (th_holds (= _ y x)))))))
96d1407

96d1407
(declare trans (! s sort
96d1407
               (! x (term s)
96d1407
               (! y (term s)
96d1407
               (! z (term s)
96d1407
               (! u (th_holds (= _ x y))
96d1407
               (! u (th_holds (= _ y z))
96d1407
                 (th_holds (= _ x z)))))))))
96d1407

96d1407
(declare cong (! s1 sort
96d1407
              (! s2 sort
96d1407
              (! a1 (term (arrow s1 s2))
96d1407
              (! b1 (term (arrow s1 s2))
96d1407
              (! a2 (term s1)
96d1407
              (! b2 (term s1)
96d1407
              (! u1 (th_holds (= _ a1 b1))
96d1407
              (! u2 (th_holds (= _ a2 b2))
96d1407
                (th_holds (= _ (apply _ _ a1 a2) (apply _ _ b1 b2))))))))))))
96d1407