src/HOL/Decision_Procs/Ferrack.thy
changeset 74101 d804e93ae9ff
parent 73869 7181130f5872
child 74397 e80c4cde6064
equal deleted inserted replaced
74100:fb9c119e5b49 74101:d804e93ae9ff
    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)"
   102   by simp
   102   by simp
   103 
   103 
   104 lemma IfmEqSub: "\<lbrakk> Inum bs s = s' ; Inum bs t = t' \<rbrakk> \<Longrightarrow> Ifm bs (Eq (Sub s t)) = (s' = t')"
   104 lemma IfmEqSub: "\<lbrakk> Inum bs s = s' ; Inum bs t = t' \<rbrakk> \<Longrightarrow> Ifm bs (Eq (Sub s t)) = (s' = t')"
   105   by simp
   105   by simp
   106 
   106 
   107 lemma IfmNOT: " (Ifm bs p = P) \<Longrightarrow> (Ifm bs (NOT p) = (\<not>P))"
   107 lemma IfmNot: " (Ifm bs p = P) \<Longrightarrow> (Ifm bs (Not p) = (\<not>P))"
   108   by simp
   108   by simp
   109 
   109 
   110 lemma IfmAnd: " \<lbrakk> Ifm bs p = P ; Ifm bs q = Q\<rbrakk> \<Longrightarrow> (Ifm bs (And p q) = (P \<and> Q))"
   110 lemma IfmAnd: " \<lbrakk> Ifm bs p = P ; Ifm bs q = Q\<rbrakk> \<Longrightarrow> (Ifm bs (And p q) = (P \<and> Q))"
   111   by simp
   111   by simp
   112 
   112 
   125 lemma IfmA: " (!! x. Ifm (x#bs) p = P x) \<Longrightarrow> (Ifm bs (A p) = (\<forall>x. P x))"
   125 lemma IfmA: " (!! x. Ifm (x#bs) p = P x) \<Longrightarrow> (Ifm bs (A p) = (\<forall>x. P x))"
   126   by simp
   126   by simp
   127 
   127 
   128 fun not:: "fm \<Rightarrow> fm"
   128 fun not:: "fm \<Rightarrow> fm"
   129 where
   129 where
   130   "not (NOT p) = p"
   130   "not (Not p) = p"
   131 | "not T = F"
   131 | "not T = F"
   132 | "not F = T"
   132 | "not F = T"
   133 | "not p = NOT p"
   133 | "not p = Not p"
   134 
   134 
   135 lemma not[simp]: "Ifm bs (not p) = Ifm bs (NOT p)"
   135 lemma not[simp]: "Ifm bs (not p) = Ifm bs (Not p)"
   136   by (cases p) auto
   136   by (cases p) auto
   137 
   137 
   138 definition conj :: "fm \<Rightarrow> fm \<Rightarrow> fm"
   138 definition conj :: "fm \<Rightarrow> fm \<Rightarrow> fm"
   139 where
   139 where
   140   "conj p q =
   140   "conj p q =
   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;