1 (* ------------------------------------------------------------------------- *)
2 (* Evaluate a quantifier-free formula given a sign matrix row for its polys. *)
3 (* ------------------------------------------------------------------------- *)
6 let rec testform pmat fm =
8 Atom(R(a,[p;Fn("0",[])])) ->
9 let s = assoc p pmat in
10 if a = "=" then s = Zero
11 else if a = "<=" then s = Zero or s = Negative
12 else if a = ">=" then s = Zero or s = Positive
13 else if a = "<" then s = Negative
14 else if a = ">" then s = Positive
15 else failwith "testform: unknown literal"
18 | Not(p) -> not(testform pmat p)
19 | And(p,q) -> testform pmat p & testform pmat q
20 | Or(p,q) -> testform pmat p or testform pmat q
21 | Imp(p,q) -> not(testform pmat p) or testform pmat q
22 | Iff(p,q) -> (testform pmat p = testform pmat q)
23 | _ -> failwith "testform: non-propositional formula";;
25 The model version of testform takes a row of the sign matrix in the form
26 (p_1,s_1),(p_2,s_2),...,(p_n,s_n)
27 The corresponding argument of TESTFORM is a theorem representing
28 an `interpsigns` proposition. This is natural. The next argument,
29 the formula to be tested, is the same.
33 (* ====================================================================== *)
35 (* ====================================================================== *)
37 (* -------------------------------- T -------------------------------- *)
39 let t_thm = prove(`!set:real->bool. (!x. set x ==> T)`,MESON_TAC[]);;
41 (* -------------------------------- F --------------------------------- *)
43 let f_thm = prove(`!set:real->bool. ~(?x. set x /\ F)`,MESON_TAC[]);;
45 (* -------------------------------- ~ --------------------------------- *)
47 let neg_thm_p = prove(
48 `!P set. (!x. set x ==> P x) ==> (~ ?x. set x /\ ~ P x)`,MESON_TAC[]);;
50 let neg_thm_n = prove(
51 `!P set. (~ ?x. set x /\ P x) ==> (!x. set x ==> ~ P x)`,MESON_TAC[]);;
53 (* -------------------------------- /\ -------------------------------- *)
55 let and_thm_pp = prove(
56 `!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==> (!x. set x ==> Q x) ==>
57 (!x. set x ==> (P x /\ Q x))`,MESON_TAC[]);;
59 let and_thm_pn = prove(
60 `!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==>
61 (~ ?x. set x /\ Q x) ==> (~ ?x. set x /\ P x /\ Q x)`,MESON_TAC[]);;
63 let and_thm_np = prove(
64 `!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==>
65 (!x. set x ==> Q x) ==> (~ ?x. set x /\ P x /\ Q x)`,MESON_TAC[]);;
67 let and_thm_nn = prove(
68 `!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==>
69 (~ ?x. set x /\ Q x) ==> (~ ?x. set x /\ P x /\ Q x)`,MESON_TAC[]);;
71 (* -------------------------------- \/ -------------------------------- *)
74 `!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==> (!x. set x ==> (P x \/ Q x))`,
78 `!P Q set. (?x. set x) ==> (!x. set x ==> Q x) ==> (!x. set x ==> (P x \/ Q x))`,
82 prove(`!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==>
83 (~ ?x. set x /\ Q x) ==> (~ ?x. set x /\ (P x \/ Q x))`,MESON_TAC[]);;
85 (* ------------------------------- ==> -------------------------------- *)
88 prove(`!P Q set. (?x. set x) ==> (!x. set x ==> Q x) ==>
89 (!x. set x ==> (P x ==> Q x))`,MESON_TAC[]);;
92 prove(`!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==>
93 (~ ?x. set x /\ Q x) ==> (~ ?x. set x /\ (P x ==> Q x))`,MESON_TAC[]);;
96 prove(`!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==>
97 (!x. set x ==> (P x ==> Q x))`,MESON_TAC[]);;
99 (* -------------------------------- = --------------------------------- *)
101 let iff_thm_pp = prove(
102 `!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==> (!x. set x ==> Q x) ==>
103 (!x. set x ==> (P x <=> Q x))`,MESON_TAC[]);;
105 let iff_thm_pn = prove(
106 `!P Q set. (?x. set x) ==> (!x. set x ==> P x) ==>
107 (~ ?x. set x /\ Q x) ==> (~ ?x. set x /\ (P x <=> Q x))`,MESON_TAC[]);;
109 let iff_thm_np = prove(
110 `!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==>
111 (!x. set x ==> Q x) ==> (~ ?x. set x /\ (P x <=> Q x))`,MESON_TAC[]);;
113 let iff_thm_nn = prove(
114 `!P Q set. (?x. set x) ==> (~ ?x. set x /\ P x) ==>
115 (~ ?x. set x /\ Q x) ==> (!x. set x ==> (P x <=> Q x))`,MESON_TAC[]);;
117 (* ---------------------------------------------------------------------- *)
119 (* ---------------------------------------------------------------------- *)
121 (* --------------------------- ?x. p x < &0 --------------------------- *)
123 let eq_lt_thm = prove(
124 `!P set. (!x. set x ==> (P x = &0)) ==> ~ ?x. set x /\ P x < &0`,
125 MESON_TAC[REAL_LT_LE]);;
127 let gt_lt_thm = prove(
128 `!P set. (!x. set x ==> (P x > &0)) ==> ~ ?x. set x /\ P x < &0`,
129 MESON_TAC[real_gt;REAL_LT_REFL;REAL_LT_TRANS]);;
131 (* --------------------------- ?x. p x = &0 --------------------------- *)
133 let lt_eq_thm = prove(
134 `!P set. (!x. set x ==> (P x < &0)) ==> ~ ?x. set x /\ (P x = &0)`,
135 MESON_TAC[REAL_LT_LE]);;
137 let gt_eq_thm = prove(
138 `!P set. (!x. set x ==> (P x > &0)) ==> ~ ?x. set x /\ (P x = &0)`,
139 MESON_TAC[real_gt;REAL_LT_LE]);;
141 (* --------------------------- ?x. p x > &0 --------------------------- *)
143 let eq_gt_thm = prove(
144 `!P set. (!x. set x ==> (P x = &0)) ==> ~ ?x. set x /\ (P x > &0)`,
145 MESON_TAC[real_gt;REAL_LT_LE]);;
147 let lt_gt_thm = prove(
148 `!P set. (!x. set x ==> (P x < &0)) ==> ~ ?x. set x /\ (P x > &0)`,
149 MESON_TAC[real_gt;REAL_LT_LE;REAL_LT_TRANS]);;
151 (* -------------------------- ?x. p x <= &0 --------------------------- *)
153 let lt_le_thm = prove(
154 `!P set. (!x. set x ==> (P x < &0)) ==> !x. set x ==> (P x <= &0)`,
155 MESON_TAC[real_gt;REAL_LT_LE;REAL_LT_TRANS]);;
157 let eq_le_thm = prove(
158 `!P set. (!x. set x ==> (P x = &0)) ==> (!x. set x ==> (P x <= &0))`,
159 MESON_TAC[real_gt;REAL_LT_LE;REAL_LT_TRANS;real_le]);;
161 let gt_le_thm = prove(
162 `!P set. (!x. set x ==> (P x > &0)) ==> ~ ?x. set x /\ (P x <= &0)`,
163 MESON_TAC[real_gt;REAL_LT_LE;REAL_LT_TRANS;real_le]);;
165 (* -------------------------- ?x. p x >= &0 --------------------------- *)
167 let lt_ge_thm = prove(
168 `!P set. (!x. set x ==> (P x < &0)) ==> ~ ?x. set x /\ (P x >= &0)`,
169 MESON_TAC[real_gt;REAL_LT_LE;REAL_LT_TRANS;real_ge]);;
171 let eq_ge_thm = prove(
172 `!P set. (!x. set x ==> (P x = &0)) ==> (!x. set x ==> (P x >= &0))`,
173 MESON_TAC[real_gt;REAL_LT_LE;REAL_LT_TRANS;real_ge;real_le]);;
175 let gt_ge_thm = prove(
176 `!P set. (!x. set x ==> (P x > &0)) ==> (!x. set x ==> (P x >= &0))`,
177 MESON_TAC[real_gt;REAL_LT_LE;REAL_LT_TRANS;real_ge;real_le]);;
179 (* let lookup_sign isigns_thm fm = *)
180 (* let asms,_ = dest_thm isigns_thm in *)
184 let NOT_EXISTS_CONJ_THM = prove_by_refinement(
185 `~(?x. P x /\ Q x) ==> (!x. P x ==> ~Q x)`,
192 let testform_itlem = prove_by_refinement(
193 `(!x. P x ==> ~Q x) ==> (!x. P2 x ==> ~Q x) ==> (!x. P x \/ P2 x ==> ~ Q x)`,