(* ------------------------------------------------------------------------- *)
(* Evaluate a quantifier-free formula given a sign matrix row for its polys. *)
(* ------------------------------------------------------------------------- *)
(*
let rec testform pmat fm = 
  match fm with 
      Atom(R(a,[p;Fn("0",[])])) -> 
        let s = assoc p pmat in 
          if a = "=" then s = Zero 
          else if a = "<=" then s = Zero or s = Negative 
          else if a = ">=" then s = Zero or s = Positive 
          else if a = "<" then s = Negative 
          else if a = ">" then s = Positive 
          else failwith "testform: unknown literal" 
    | False -> false 
    | True -> true 
    | Not(p) -> not(testform pmat p) 
    | And(p,q) -> testform pmat p & testform pmat q 
    | Or(p,q) -> testform pmat p or testform pmat q 
    | Imp(p,q) -> not(testform pmat p) or testform pmat q 
    | Iff(p,q) -> (testform pmat p = testform pmat q) 
    | _ -> failwith "testform: non-propositional formula";; 
The model version of testform takes a row of the sign matrix in the form
 (p_1,s_1),(p_2,s_2),...,(p_n,s_n)
The corresponding argument of TESTFORM is a theorem representing
an `interpsigns` proposition.  This is natural.  The next argument,
the formula to be tested, is the same.  
*)
(* ====================================================================== *)
(*  Theorems                                                              *)
(* ====================================================================== *)
(* --------------------------------  T   -------------------------------- *)
let t_thm = prove(`!set:real->bool. (!x. set x ==> T)`,
MESON_TAC[]);;
 
 
(* --------------------------------  F  --------------------------------- *)
let f_thm = prove(`!set:real->bool. ~(?x. set x /\ F)`,
MESON_TAC[]);;
 
 
(* --------------------------------  ~  --------------------------------- *)
let neg_thm_p = prove(
  `!P set. (!x. set x ==> P x) ==> (~ ?x. set x /\ ~ P x)`,
MESON_TAC[]);;
 
 
let neg_thm_n = prove(
  `!P set. (~ ?x. set x /\ P x) ==> (!x. set x ==> ~ P x)`,
MESON_TAC[]);;
 
 
(* --------------------------------  /\  -------------------------------- *)
let and_thm_pp = prove(
  `!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==> (!x. set x ==> Q x) ==>
        (!x. set x ==> (P x /\ Q x))`,
MESON_TAC[]);;
 
 
let and_thm_pn = prove(
  `!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==> 
     (~ ?x. set x /\ Q x) ==> (~ ?x. set x /\ P x /\ Q x)`,
MESON_TAC[]);;
 
 
let and_thm_np = prove(
  `!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==> 
          (!x. set x ==> Q x) ==> (~ ?x. set x /\ P x /\ Q x)`,
MESON_TAC[]);;
 
 
let and_thm_nn = prove(
  `!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==> 
    (~ ?x. set x /\ Q x) ==> (~ ?x. set x /\ P x /\ Q x)`,
MESON_TAC[]);;
 
 
(* --------------------------------  \/  -------------------------------- *)
let or_thm_p = prove(
`!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==> (!x. set x ==> (P x \/ Q x))`,
  MESON_TAC[]);;
 
 
let or_thm_q = prove(
  `!P Q set. (?x. set x) ==> (!x. set x ==> Q x) ==> (!x. set x ==> (P x \/ Q x))`,
  MESON_TAC[]);;
 
 
let or_thm_nn = prove(`!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==>
          (~ ?x. set x /\ Q x) ==> (~ ?x. set x /\ (P x \/ Q x))`,
MESON_TAC[]);;
 
 
(* -------------------------------  ==>  -------------------------------- *)
let imp_thm_pp = prove(`!P Q set. (?x. set x) ==> (!x. set x ==> Q x) ==> 
        (!x. set x ==> (P x ==> Q x))`,
MESON_TAC[]);;
 
 
let imp_thm_pn = prove(`!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==>
        (~ ?x. set x /\ Q x) ==> (~ ?x. set x /\ (P x ==> Q x))`,
MESON_TAC[]);;
 
 
let imp_thm_n = prove(`!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==> 
     (!x. set x ==> (P x ==> Q x))`,
MESON_TAC[]);;
 
 
(* --------------------------------  =  --------------------------------- *)
let iff_thm_pp = prove(
  `!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==> (!x. set x ==> Q x) ==>
        (!x. set x ==> (P x <=> Q x))`,
MESON_TAC[]);;
 
 
let iff_thm_pn = prove(
  `!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==> 
     (~ ?x. set x /\ Q x) ==> (~ ?x. set x /\ (P x <=> Q x))`,
MESON_TAC[]);;
 
 
let iff_thm_np = prove(
  `!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==> 
          (!x. set x ==> Q x) ==> (~ ?x. set x /\ (P x <=> Q x))`,
MESON_TAC[]);;
 
 
let iff_thm_nn = prove(
  `!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==> 
    (~ ?x. set x /\ Q x) ==> (!x. set x ==> (P x <=> Q x))`,
MESON_TAC[]);;
 
 
(* ---------------------------------------------------------------------- *)
(*  Atoms                                                                 *)
(* ---------------------------------------------------------------------- *)
(* ---------------------------  ?x. p x < &0  --------------------------- *)
let eq_lt_thm = prove(
  `!P set. (!x. set x ==> (P x = &0)) ==> ~ ?x. set x /\ P x < &0`,
 
 
let gt_lt_thm = prove(
  `!P set. (!x. set x ==> (P x > &0)) ==> ~ ?x. set x /\ P x < &0`,
 
 
(* ---------------------------  ?x. p x = &0  --------------------------- *)
let lt_eq_thm = prove(
  `!P set. (!x. set x ==> (P x < &0)) ==> ~ ?x. set x /\ (P x = &0)`,
 
 
let gt_eq_thm = prove(
  `!P set. (!x. set x ==> (P x > &0)) ==> ~ ?x. set x /\ (P x = &0)`,
 
 
(* ---------------------------  ?x. p x > &0  --------------------------- *)
let eq_gt_thm = prove(
  `!P set. (!x. set x ==> (P x = &0)) ==> ~ ?x. set x /\ (P x > &0)`,
 
 
let lt_gt_thm = prove(
  `!P set. (!x. set x ==> (P x < &0)) ==> ~ ?x. set x /\ (P x > &0)`,
 
 
(* --------------------------  ?x. p x <= &0  --------------------------- *)
let lt_le_thm = prove(
  `!P set. (!x. set x ==> (P x < &0)) ==> !x. set x ==> (P x <= &0)`,
 
 
let eq_le_thm = prove(
  `!P set. (!x. set x ==> (P x = &0)) ==> (!x. set x ==> (P x <= &0))`,
 
 
let gt_le_thm = prove(
  `!P set. (!x. set x ==> (P x > &0)) ==> ~ ?x. set x /\ (P x <= &0)`,
 
 
(* --------------------------  ?x. p x >= &0  --------------------------- *)
  
let lt_ge_thm = prove(
  `!P set. (!x. set x ==> (P x < &0)) ==> ~ ?x. set x /\ (P x >= &0)`,
 
 
let eq_ge_thm = prove(
  `!P set. (!x. set x ==> (P x = &0)) ==> (!x. set x ==> (P x >= &0))`,
 
 
let gt_ge_thm = prove(
  `!P set. (!x. set x ==> (P x > &0)) ==> (!x. set x ==> (P x >= &0))`,
 
 
(* let lookup_sign isigns_thm fm =  *)
(*   let asms,_ = dest_thm isigns_thm in *)
(*   let    *)
(* }}} *)
(* }}} *)