44 | "Inum bs (Sub a b) = Inum bs a - Inum bs b" |
44 | "Inum bs (Sub a b) = Inum bs a - Inum bs b" |
45 | "Inum bs (Mul c a) = (real_of_int c) * Inum bs a" |
45 | "Inum bs (Mul c a) = (real_of_int c) * Inum bs a" |
46 (* FORMULAE *) |
46 (* FORMULAE *) |
47 datatype (plugins del: size) fm = |
47 datatype (plugins del: size) fm = |
48 T| F| Lt num| Le num| Gt num| Ge num| Eq num| NEq num| |
48 T| F| Lt num| Le num| Gt num| Ge num| Eq num| NEq num| |
49 NOT fm| And fm fm| Or fm fm| Imp fm fm| Iff fm fm| E fm| A fm |
49 Not fm| And fm fm| Or fm fm| Imp fm fm| Iff fm fm| E fm| A fm |
50 |
50 |
51 instantiation fm :: size |
51 instantiation fm :: size |
52 begin |
52 begin |
53 |
53 |
54 primrec size_fm :: "fm \<Rightarrow> nat" |
54 primrec size_fm :: "fm \<Rightarrow> nat" |
55 where |
55 where |
56 "size_fm (NOT p) = 1 + size_fm p" |
56 "size_fm (Not p) = 1 + size_fm p" |
57 | "size_fm (And p q) = 1 + size_fm p + size_fm q" |
57 | "size_fm (And p q) = 1 + size_fm p + size_fm q" |
58 | "size_fm (Or p q) = 1 + size_fm p + size_fm q" |
58 | "size_fm (Or p q) = 1 + size_fm p + size_fm q" |
59 | "size_fm (Imp p q) = 3 + size_fm p + size_fm q" |
59 | "size_fm (Imp p q) = 3 + size_fm p + size_fm q" |
60 | "size_fm (Iff p q) = 3 + 2 * (size_fm p + size_fm q)" |
60 | "size_fm (Iff p q) = 3 + 2 * (size_fm p + size_fm q)" |
61 | "size_fm (E p) = 1 + size_fm p" |
61 | "size_fm (E p) = 1 + size_fm p" |
85 | "Ifm bs (Gt a) = (Inum bs a > 0)" |
85 | "Ifm bs (Gt a) = (Inum bs a > 0)" |
86 | "Ifm bs (Le a) = (Inum bs a \<le> 0)" |
86 | "Ifm bs (Le a) = (Inum bs a \<le> 0)" |
87 | "Ifm bs (Ge a) = (Inum bs a \<ge> 0)" |
87 | "Ifm bs (Ge a) = (Inum bs a \<ge> 0)" |
88 | "Ifm bs (Eq a) = (Inum bs a = 0)" |
88 | "Ifm bs (Eq a) = (Inum bs a = 0)" |
89 | "Ifm bs (NEq a) = (Inum bs a \<noteq> 0)" |
89 | "Ifm bs (NEq a) = (Inum bs a \<noteq> 0)" |
90 | "Ifm bs (NOT p) = (\<not> (Ifm bs p))" |
90 | "Ifm bs (Not p) = (\<not> (Ifm bs p))" |
91 | "Ifm bs (And p q) = (Ifm bs p \<and> Ifm bs q)" |
91 | "Ifm bs (And p q) = (Ifm bs p \<and> Ifm bs q)" |
92 | "Ifm bs (Or p q) = (Ifm bs p \<or> Ifm bs q)" |
92 | "Ifm bs (Or p q) = (Ifm bs p \<or> Ifm bs q)" |
93 | "Ifm bs (Imp p q) = ((Ifm bs p) \<longrightarrow> (Ifm bs q))" |
93 | "Ifm bs (Imp p q) = ((Ifm bs p) \<longrightarrow> (Ifm bs q))" |
94 | "Ifm bs (Iff p q) = (Ifm bs p = Ifm bs q)" |
94 | "Ifm bs (Iff p q) = (Ifm bs p = Ifm bs q)" |
95 | "Ifm bs (E p) = (\<exists>x. Ifm (x#bs) p)" |
95 | "Ifm bs (E p) = (\<exists>x. Ifm (x#bs) p)" |
170 |
170 |
171 definition iff :: "fm \<Rightarrow> fm \<Rightarrow> fm" |
171 definition iff :: "fm \<Rightarrow> fm \<Rightarrow> fm" |
172 where |
172 where |
173 "iff p q = |
173 "iff p q = |
174 (if p = q then T |
174 (if p = q then T |
175 else if p = NOT q \<or> NOT p = q then F |
175 else if p = Not q \<or> Not p = q then F |
176 else if p = F then not q |
176 else if p = F then not q |
177 else if q = F then not p |
177 else if q = F then not p |
178 else if p = T then q |
178 else if p = T then q |
179 else if q = T then p |
179 else if q = T then p |
180 else Iff p q)" |
180 else Iff p q)" |
181 |
181 |
182 lemma iff[simp]: "Ifm bs (iff p q) = Ifm bs (Iff p q)" |
182 lemma iff[simp]: "Ifm bs (iff p q) = Ifm bs (Iff p q)" |
183 by (unfold iff_def, cases "p = q", simp, cases "p = NOT q", simp) (cases "NOT p = q", auto) |
183 by (unfold iff_def, cases "p = q", simp, cases "p = Not q", simp) (cases "Not p = q", auto) |
184 |
184 |
185 lemma conj_simps: |
185 lemma conj_simps: |
186 "conj F Q = F" |
186 "conj F Q = F" |
187 "conj P F = F" |
187 "conj P F = F" |
188 "conj T Q = Q" |
188 "conj T Q = Q" |
207 "imp P F = not P" |
207 "imp P F = not P" |
208 "imp P P = T" |
208 "imp P P = T" |
209 "P \<noteq> T \<Longrightarrow> P \<noteq> F \<Longrightarrow> P \<noteq> Q \<Longrightarrow> Q \<noteq> T \<Longrightarrow> Q \<noteq> F \<Longrightarrow> imp P Q = Imp P Q" |
209 "P \<noteq> T \<Longrightarrow> P \<noteq> F \<Longrightarrow> P \<noteq> Q \<Longrightarrow> Q \<noteq> T \<Longrightarrow> Q \<noteq> F \<Longrightarrow> imp P Q = Imp P Q" |
210 by (simp_all add: imp_def) |
210 by (simp_all add: imp_def) |
211 |
211 |
212 lemma trivNOT: "p \<noteq> NOT p" "NOT p \<noteq> p" |
212 lemma trivNot: "p \<noteq> Not p" "Not p \<noteq> p" |
213 by (induct p) auto |
213 by (induct p) auto |
214 |
214 |
215 lemma iff_simps: |
215 lemma iff_simps: |
216 "iff p p = T" |
216 "iff p p = T" |
217 "iff p (NOT p) = F" |
217 "iff p (Not p) = F" |
218 "iff (NOT p) p = F" |
218 "iff (Not p) p = F" |
219 "iff p F = not p" |
219 "iff p F = not p" |
220 "iff F p = not p" |
220 "iff F p = not p" |
221 "p \<noteq> NOT T \<Longrightarrow> iff T p = p" |
221 "p \<noteq> Not T \<Longrightarrow> iff T p = p" |
222 "p\<noteq> NOT T \<Longrightarrow> iff p T = p" |
222 "p\<noteq> Not T \<Longrightarrow> iff p T = p" |
223 "p\<noteq>q \<Longrightarrow> p\<noteq> NOT q \<Longrightarrow> q\<noteq> NOT p \<Longrightarrow> p\<noteq> F \<Longrightarrow> q\<noteq> F \<Longrightarrow> p \<noteq> T \<Longrightarrow> q \<noteq> T \<Longrightarrow> iff p q = Iff p q" |
223 "p\<noteq>q \<Longrightarrow> p\<noteq> Not q \<Longrightarrow> q\<noteq> Not p \<Longrightarrow> p\<noteq> F \<Longrightarrow> q\<noteq> F \<Longrightarrow> p \<noteq> T \<Longrightarrow> q \<noteq> T \<Longrightarrow> iff p q = Iff p q" |
224 using trivNOT |
224 using trivNot |
225 by (simp_all add: iff_def, cases p, auto) |
225 by (simp_all add: iff_def, cases p, auto) |
226 |
226 |
227 (* Quantifier freeness *) |
227 (* Quantifier freeness *) |
228 fun qfree:: "fm \<Rightarrow> bool" |
228 fun qfree:: "fm \<Rightarrow> bool" |
229 where |
229 where |
230 "qfree (E p) = False" |
230 "qfree (E p) = False" |
231 | "qfree (A p) = False" |
231 | "qfree (A p) = False" |
232 | "qfree (NOT p) = qfree p" |
232 | "qfree (Not p) = qfree p" |
233 | "qfree (And p q) = (qfree p \<and> qfree q)" |
233 | "qfree (And p q) = (qfree p \<and> qfree q)" |
234 | "qfree (Or p q) = (qfree p \<and> qfree q)" |
234 | "qfree (Or p q) = (qfree p \<and> qfree q)" |
235 | "qfree (Imp p q) = (qfree p \<and> qfree q)" |
235 | "qfree (Imp p q) = (qfree p \<and> qfree q)" |
236 | "qfree (Iff p q) = (qfree p \<and> qfree q)" |
236 | "qfree (Iff p q) = (qfree p \<and> qfree q)" |
237 | "qfree p = True" |
237 | "qfree p = True" |
260 | "bound0 (Le a) = numbound0 a" |
260 | "bound0 (Le a) = numbound0 a" |
261 | "bound0 (Gt a) = numbound0 a" |
261 | "bound0 (Gt a) = numbound0 a" |
262 | "bound0 (Ge a) = numbound0 a" |
262 | "bound0 (Ge a) = numbound0 a" |
263 | "bound0 (Eq a) = numbound0 a" |
263 | "bound0 (Eq a) = numbound0 a" |
264 | "bound0 (NEq a) = numbound0 a" |
264 | "bound0 (NEq a) = numbound0 a" |
265 | "bound0 (NOT p) = bound0 p" |
265 | "bound0 (Not p) = bound0 p" |
266 | "bound0 (And p q) = (bound0 p \<and> bound0 q)" |
266 | "bound0 (And p q) = (bound0 p \<and> bound0 q)" |
267 | "bound0 (Or p q) = (bound0 p \<and> bound0 q)" |
267 | "bound0 (Or p q) = (bound0 p \<and> bound0 q)" |
268 | "bound0 (Imp p q) = ((bound0 p) \<and> (bound0 q))" |
268 | "bound0 (Imp p q) = ((bound0 p) \<and> (bound0 q))" |
269 | "bound0 (Iff p q) = (bound0 p \<and> bound0 q)" |
269 | "bound0 (Iff p q) = (bound0 p \<and> bound0 q)" |
270 | "bound0 (E p) = False" |
270 | "bound0 (E p) = False" |
319 | "decr (Le a) = Le (decrnum a)" |
319 | "decr (Le a) = Le (decrnum a)" |
320 | "decr (Gt a) = Gt (decrnum a)" |
320 | "decr (Gt a) = Gt (decrnum a)" |
321 | "decr (Ge a) = Ge (decrnum a)" |
321 | "decr (Ge a) = Ge (decrnum a)" |
322 | "decr (Eq a) = Eq (decrnum a)" |
322 | "decr (Eq a) = Eq (decrnum a)" |
323 | "decr (NEq a) = NEq (decrnum a)" |
323 | "decr (NEq a) = NEq (decrnum a)" |
324 | "decr (NOT p) = NOT (decr p)" |
324 | "decr (Not p) = Not (decr p)" |
325 | "decr (And p q) = conj (decr p) (decr q)" |
325 | "decr (And p q) = conj (decr p) (decr q)" |
326 | "decr (Or p q) = disj (decr p) (decr q)" |
326 | "decr (Or p q) = disj (decr p) (decr q)" |
327 | "decr (Imp p q) = imp (decr p) (decr q)" |
327 | "decr (Imp p q) = imp (decr p) (decr q)" |
328 | "decr (Iff p q) = iff (decr p) (decr q)" |
328 | "decr (Iff p q) = iff (decr p) (decr q)" |
329 | "decr p = p" |
329 | "decr p = p" |
888 where |
888 where |
889 "simpfm (And p q) = conj (simpfm p) (simpfm q)" |
889 "simpfm (And p q) = conj (simpfm p) (simpfm q)" |
890 | "simpfm (Or p q) = disj (simpfm p) (simpfm q)" |
890 | "simpfm (Or p q) = disj (simpfm p) (simpfm q)" |
891 | "simpfm (Imp p q) = imp (simpfm p) (simpfm q)" |
891 | "simpfm (Imp p q) = imp (simpfm p) (simpfm q)" |
892 | "simpfm (Iff p q) = iff (simpfm p) (simpfm q)" |
892 | "simpfm (Iff p q) = iff (simpfm p) (simpfm q)" |
893 | "simpfm (NOT p) = not (simpfm p)" |
893 | "simpfm (Not p) = not (simpfm p)" |
894 | "simpfm (Lt a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v < 0) then T else F | _ \<Rightarrow> Lt a')" |
894 | "simpfm (Lt a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v < 0) then T else F | _ \<Rightarrow> Lt a')" |
895 | "simpfm (Le a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v \<le> 0) then T else F | _ \<Rightarrow> Le a')" |
895 | "simpfm (Le a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v \<le> 0) then T else F | _ \<Rightarrow> Le a')" |
896 | "simpfm (Gt a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v > 0) then T else F | _ \<Rightarrow> Gt a')" |
896 | "simpfm (Gt a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v > 0) then T else F | _ \<Rightarrow> Gt a')" |
897 | "simpfm (Ge a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v \<ge> 0) then T else F | _ \<Rightarrow> Ge a')" |
897 | "simpfm (Ge a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v \<ge> 0) then T else F | _ \<Rightarrow> Ge a')" |
898 | "simpfm (Eq a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v = 0) then T else F | _ \<Rightarrow> Eq a')" |
898 | "simpfm (Eq a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v = 0) then T else F | _ \<Rightarrow> Eq a')" |
1029 fun prep :: "fm \<Rightarrow> fm" |
1029 fun prep :: "fm \<Rightarrow> fm" |
1030 where |
1030 where |
1031 "prep (E T) = T" |
1031 "prep (E T) = T" |
1032 | "prep (E F) = F" |
1032 | "prep (E F) = F" |
1033 | "prep (E (Or p q)) = disj (prep (E p)) (prep (E q))" |
1033 | "prep (E (Or p q)) = disj (prep (E p)) (prep (E q))" |
1034 | "prep (E (Imp p q)) = disj (prep (E (NOT p))) (prep (E q))" |
1034 | "prep (E (Imp p q)) = disj (prep (E (Not p))) (prep (E q))" |
1035 | "prep (E (Iff p q)) = disj (prep (E (And p q))) (prep (E (And (NOT p) (NOT q))))" |
1035 | "prep (E (Iff p q)) = disj (prep (E (And p q))) (prep (E (And (Not p) (Not q))))" |
1036 | "prep (E (NOT (And p q))) = disj (prep (E (NOT p))) (prep (E(NOT q)))" |
1036 | "prep (E (Not (And p q))) = disj (prep (E (Not p))) (prep (E(Not q)))" |
1037 | "prep (E (NOT (Imp p q))) = prep (E (And p (NOT q)))" |
1037 | "prep (E (Not (Imp p q))) = prep (E (And p (Not q)))" |
1038 | "prep (E (NOT (Iff p q))) = disj (prep (E (And p (NOT q)))) (prep (E(And (NOT p) q)))" |
1038 | "prep (E (Not (Iff p q))) = disj (prep (E (And p (Not q)))) (prep (E(And (Not p) q)))" |
1039 | "prep (E p) = E (prep p)" |
1039 | "prep (E p) = E (prep p)" |
1040 | "prep (A (And p q)) = conj (prep (A p)) (prep (A q))" |
1040 | "prep (A (And p q)) = conj (prep (A p)) (prep (A q))" |
1041 | "prep (A p) = prep (NOT (E (NOT p)))" |
1041 | "prep (A p) = prep (Not (E (Not p)))" |
1042 | "prep (NOT (NOT p)) = prep p" |
1042 | "prep (Not (Not p)) = prep p" |
1043 | "prep (NOT (And p q)) = disj (prep (NOT p)) (prep (NOT q))" |
1043 | "prep (Not (And p q)) = disj (prep (Not p)) (prep (Not q))" |
1044 | "prep (NOT (A p)) = prep (E (NOT p))" |
1044 | "prep (Not (A p)) = prep (E (Not p))" |
1045 | "prep (NOT (Or p q)) = conj (prep (NOT p)) (prep (NOT q))" |
1045 | "prep (Not (Or p q)) = conj (prep (Not p)) (prep (Not q))" |
1046 | "prep (NOT (Imp p q)) = conj (prep p) (prep (NOT q))" |
1046 | "prep (Not (Imp p q)) = conj (prep p) (prep (Not q))" |
1047 | "prep (NOT (Iff p q)) = disj (prep (And p (NOT q))) (prep (And (NOT p) q))" |
1047 | "prep (Not (Iff p q)) = disj (prep (And p (Not q))) (prep (And (Not p) q))" |
1048 | "prep (NOT p) = not (prep p)" |
1048 | "prep (Not p) = not (prep p)" |
1049 | "prep (Or p q) = disj (prep p) (prep q)" |
1049 | "prep (Or p q) = disj (prep p) (prep q)" |
1050 | "prep (And p q) = conj (prep p) (prep q)" |
1050 | "prep (And p q) = conj (prep p) (prep q)" |
1051 | "prep (Imp p q) = prep (Or (NOT p) q)" |
1051 | "prep (Imp p q) = prep (Or (Not p) q)" |
1052 | "prep (Iff p q) = disj (prep (And p q)) (prep (And (NOT p) (NOT q)))" |
1052 | "prep (Iff p q) = disj (prep (And p q)) (prep (And (Not p) (Not q)))" |
1053 | "prep p = p" |
1053 | "prep p = p" |
1054 |
1054 |
1055 lemma prep: "\<And>bs. Ifm bs (prep p) = Ifm bs p" |
1055 lemma prep: "\<And>bs. Ifm bs (prep p) = Ifm bs p" |
1056 by (induct p rule: prep.induct) auto |
1056 by (induct p rule: prep.induct) auto |
1057 |
1057 |
1058 (* Generic quantifier elimination *) |
1058 (* Generic quantifier elimination *) |
1059 fun qelim :: "fm \<Rightarrow> (fm \<Rightarrow> fm) \<Rightarrow> fm" |
1059 fun qelim :: "fm \<Rightarrow> (fm \<Rightarrow> fm) \<Rightarrow> fm" |
1060 where |
1060 where |
1061 "qelim (E p) = (\<lambda>qe. DJ qe (qelim p qe))" |
1061 "qelim (E p) = (\<lambda>qe. DJ qe (qelim p qe))" |
1062 | "qelim (A p) = (\<lambda>qe. not (qe ((qelim (NOT p) qe))))" |
1062 | "qelim (A p) = (\<lambda>qe. not (qe ((qelim (Not p) qe))))" |
1063 | "qelim (NOT p) = (\<lambda>qe. not (qelim p qe))" |
1063 | "qelim (Not p) = (\<lambda>qe. not (qelim p qe))" |
1064 | "qelim (And p q) = (\<lambda>qe. conj (qelim p qe) (qelim q qe))" |
1064 | "qelim (And p q) = (\<lambda>qe. conj (qelim p qe) (qelim q qe))" |
1065 | "qelim (Or p q) = (\<lambda>qe. disj (qelim p qe) (qelim q qe))" |
1065 | "qelim (Or p q) = (\<lambda>qe. disj (qelim p qe) (qelim q qe))" |
1066 | "qelim (Imp p q) = (\<lambda>qe. imp (qelim p qe) (qelim q qe))" |
1066 | "qelim (Imp p q) = (\<lambda>qe. imp (qelim p qe) (qelim q qe))" |
1067 | "qelim (Iff p q) = (\<lambda>qe. iff (qelim p qe) (qelim q qe))" |
1067 | "qelim (Iff p q) = (\<lambda>qe. iff (qelim p qe) (qelim q qe))" |
1068 | "qelim p = (\<lambda>y. simpfm p)" |
1068 | "qelim p = (\<lambda>y. simpfm p)" |
1217 |
1217 |
1218 fun rlfm :: "fm \<Rightarrow> fm" |
1218 fun rlfm :: "fm \<Rightarrow> fm" |
1219 where |
1219 where |
1220 "rlfm (And p q) = conj (rlfm p) (rlfm q)" |
1220 "rlfm (And p q) = conj (rlfm p) (rlfm q)" |
1221 | "rlfm (Or p q) = disj (rlfm p) (rlfm q)" |
1221 | "rlfm (Or p q) = disj (rlfm p) (rlfm q)" |
1222 | "rlfm (Imp p q) = disj (rlfm (NOT p)) (rlfm q)" |
1222 | "rlfm (Imp p q) = disj (rlfm (Not p)) (rlfm q)" |
1223 | "rlfm (Iff p q) = disj (conj (rlfm p) (rlfm q)) (conj (rlfm (NOT p)) (rlfm (NOT q)))" |
1223 | "rlfm (Iff p q) = disj (conj (rlfm p) (rlfm q)) (conj (rlfm (Not p)) (rlfm (Not q)))" |
1224 | "rlfm (Lt a) = case_prod lt (rsplit0 a)" |
1224 | "rlfm (Lt a) = case_prod lt (rsplit0 a)" |
1225 | "rlfm (Le a) = case_prod le (rsplit0 a)" |
1225 | "rlfm (Le a) = case_prod le (rsplit0 a)" |
1226 | "rlfm (Gt a) = case_prod gt (rsplit0 a)" |
1226 | "rlfm (Gt a) = case_prod gt (rsplit0 a)" |
1227 | "rlfm (Ge a) = case_prod ge (rsplit0 a)" |
1227 | "rlfm (Ge a) = case_prod ge (rsplit0 a)" |
1228 | "rlfm (Eq a) = case_prod eq (rsplit0 a)" |
1228 | "rlfm (Eq a) = case_prod eq (rsplit0 a)" |
1229 | "rlfm (NEq a) = case_prod neq (rsplit0 a)" |
1229 | "rlfm (NEq a) = case_prod neq (rsplit0 a)" |
1230 | "rlfm (NOT (And p q)) = disj (rlfm (NOT p)) (rlfm (NOT q))" |
1230 | "rlfm (Not (And p q)) = disj (rlfm (Not p)) (rlfm (Not q))" |
1231 | "rlfm (NOT (Or p q)) = conj (rlfm (NOT p)) (rlfm (NOT q))" |
1231 | "rlfm (Not (Or p q)) = conj (rlfm (Not p)) (rlfm (Not q))" |
1232 | "rlfm (NOT (Imp p q)) = conj (rlfm p) (rlfm (NOT q))" |
1232 | "rlfm (Not (Imp p q)) = conj (rlfm p) (rlfm (Not q))" |
1233 | "rlfm (NOT (Iff p q)) = disj (conj(rlfm p) (rlfm(NOT q))) (conj(rlfm(NOT p)) (rlfm q))" |
1233 | "rlfm (Not (Iff p q)) = disj (conj(rlfm p) (rlfm(Not q))) (conj(rlfm(Not p)) (rlfm q))" |
1234 | "rlfm (NOT (NOT p)) = rlfm p" |
1234 | "rlfm (Not (Not p)) = rlfm p" |
1235 | "rlfm (NOT T) = F" |
1235 | "rlfm (Not T) = F" |
1236 | "rlfm (NOT F) = T" |
1236 | "rlfm (Not F) = T" |
1237 | "rlfm (NOT (Lt a)) = rlfm (Ge a)" |
1237 | "rlfm (Not (Lt a)) = rlfm (Ge a)" |
1238 | "rlfm (NOT (Le a)) = rlfm (Gt a)" |
1238 | "rlfm (Not (Le a)) = rlfm (Gt a)" |
1239 | "rlfm (NOT (Gt a)) = rlfm (Le a)" |
1239 | "rlfm (Not (Gt a)) = rlfm (Le a)" |
1240 | "rlfm (NOT (Ge a)) = rlfm (Lt a)" |
1240 | "rlfm (Not (Ge a)) = rlfm (Lt a)" |
1241 | "rlfm (NOT (Eq a)) = rlfm (NEq a)" |
1241 | "rlfm (Not (Eq a)) = rlfm (NEq a)" |
1242 | "rlfm (NOT (NEq a)) = rlfm (Eq a)" |
1242 | "rlfm (Not (NEq a)) = rlfm (Eq a)" |
1243 | "rlfm p = p" |
1243 | "rlfm p = p" |
1244 |
1244 |
1245 lemma rlfm_I: |
1245 lemma rlfm_I: |
1246 assumes qfp: "qfree p" |
1246 assumes qfp: "qfree p" |
1247 shows "(Ifm bs (rlfm p) = Ifm bs p) \<and> isrlfm (rlfm p)" |
1247 shows "(Ifm bs (rlfm p) = Ifm bs p) \<and> isrlfm (rlfm p)" |
2487 | fm_of_term vs (\<^term>\<open>(\<longleftrightarrow>) :: bool \<Rightarrow> bool \<Rightarrow> bool\<close> $ t1 $ t2) = |
2487 | fm_of_term vs (\<^term>\<open>(\<longleftrightarrow>) :: bool \<Rightarrow> bool \<Rightarrow> bool\<close> $ t1 $ t2) = |
2488 @{code Iff} (fm_of_term vs t1, fm_of_term vs t2) |
2488 @{code Iff} (fm_of_term vs t1, fm_of_term vs t2) |
2489 | fm_of_term vs (\<^term>\<open>HOL.conj\<close> $ t1 $ t2) = @{code And} (fm_of_term vs t1, fm_of_term vs t2) |
2489 | fm_of_term vs (\<^term>\<open>HOL.conj\<close> $ t1 $ t2) = @{code And} (fm_of_term vs t1, fm_of_term vs t2) |
2490 | fm_of_term vs (\<^term>\<open>HOL.disj\<close> $ t1 $ t2) = @{code Or} (fm_of_term vs t1, fm_of_term vs t2) |
2490 | fm_of_term vs (\<^term>\<open>HOL.disj\<close> $ t1 $ t2) = @{code Or} (fm_of_term vs t1, fm_of_term vs t2) |
2491 | fm_of_term vs (\<^term>\<open>HOL.implies\<close> $ t1 $ t2) = @{code Imp} (fm_of_term vs t1, fm_of_term vs t2) |
2491 | fm_of_term vs (\<^term>\<open>HOL.implies\<close> $ t1 $ t2) = @{code Imp} (fm_of_term vs t1, fm_of_term vs t2) |
2492 | fm_of_term vs (\<^term>\<open>Not\<close> $ t') = @{code NOT} (fm_of_term vs t') |
2492 | fm_of_term vs (\<^term>\<open>HOL.Not\<close> $ t') = @{code Not} (fm_of_term vs t') |
2493 | fm_of_term vs (Const (\<^const_name>\<open>Ex\<close>, _) $ Abs (xn, xT, p)) = |
2493 | fm_of_term vs (Const (\<^const_name>\<open>Ex\<close>, _) $ Abs (xn, xT, p)) = |
2494 @{code E} (fm_of_term (("", dummyT) :: vs) p) |
2494 @{code E} (fm_of_term (("", dummyT) :: vs) p) |
2495 | fm_of_term vs (Const (\<^const_name>\<open>All\<close>, _) $ Abs (xn, xT, p)) = |
2495 | fm_of_term vs (Const (\<^const_name>\<open>All\<close>, _) $ Abs (xn, xT, p)) = |
2496 @{code A} (fm_of_term (("", dummyT) :: vs) p) |
2496 @{code A} (fm_of_term (("", dummyT) :: vs) p) |
2497 | fm_of_term vs t = error ("fm_of_term : unknown term " ^ Syntax.string_of_term \<^context> t); |
2497 | fm_of_term vs t = error ("fm_of_term : unknown term " ^ Syntax.string_of_term \<^context> t); |
2518 \<^term>\<open>0::real\<close> $ term_of_num vs t |
2518 \<^term>\<open>0::real\<close> $ term_of_num vs t |
2519 | term_of_fm vs (@{code Ge} t) = \<^term>\<open>(\<le>) :: real \<Rightarrow> real \<Rightarrow> bool\<close> $ |
2519 | term_of_fm vs (@{code Ge} t) = \<^term>\<open>(\<le>) :: real \<Rightarrow> real \<Rightarrow> bool\<close> $ |
2520 \<^term>\<open>0::real\<close> $ term_of_num vs t |
2520 \<^term>\<open>0::real\<close> $ term_of_num vs t |
2521 | term_of_fm vs (@{code Eq} t) = \<^term>\<open>(=) :: real \<Rightarrow> real \<Rightarrow> bool\<close> $ |
2521 | term_of_fm vs (@{code Eq} t) = \<^term>\<open>(=) :: real \<Rightarrow> real \<Rightarrow> bool\<close> $ |
2522 term_of_num vs t $ \<^term>\<open>0::real\<close> |
2522 term_of_num vs t $ \<^term>\<open>0::real\<close> |
2523 | term_of_fm vs (@{code NEq} t) = term_of_fm vs (@{code NOT} (@{code Eq} t)) |
2523 | term_of_fm vs (@{code NEq} t) = term_of_fm vs (@{code Not} (@{code Eq} t)) |
2524 | term_of_fm vs (@{code NOT} t') = HOLogic.Not $ term_of_fm vs t' |
2524 | term_of_fm vs (@{code Not} t') = HOLogic.Not $ term_of_fm vs t' |
2525 | term_of_fm vs (@{code And} (t1, t2)) = HOLogic.conj $ term_of_fm vs t1 $ term_of_fm vs t2 |
2525 | term_of_fm vs (@{code And} (t1, t2)) = HOLogic.conj $ term_of_fm vs t1 $ term_of_fm vs t2 |
2526 | term_of_fm vs (@{code Or} (t1, t2)) = HOLogic.disj $ term_of_fm vs t1 $ term_of_fm vs t2 |
2526 | term_of_fm vs (@{code Or} (t1, t2)) = HOLogic.disj $ term_of_fm vs t1 $ term_of_fm vs t2 |
2527 | term_of_fm vs (@{code Imp} (t1, t2)) = HOLogic.imp $ term_of_fm vs t1 $ term_of_fm vs t2 |
2527 | term_of_fm vs (@{code Imp} (t1, t2)) = HOLogic.imp $ term_of_fm vs t1 $ term_of_fm vs t2 |
2528 | term_of_fm vs (@{code Iff} (t1, t2)) = \<^term>\<open>(\<longleftrightarrow>) :: bool \<Rightarrow> bool \<Rightarrow> bool\<close> $ |
2528 | term_of_fm vs (@{code Iff} (t1, t2)) = \<^term>\<open>(\<longleftrightarrow>) :: bool \<Rightarrow> bool \<Rightarrow> bool\<close> $ |
2529 term_of_fm vs t1 $ term_of_fm vs t2; |
2529 term_of_fm vs t1 $ term_of_fm vs t2; |