src/HOL/Decision_Procs/Cooper.thy
changeset 35416 d8d7d1b785af
parent 33063 4d462963a7db
child 36526 353041483b9b
equal deleted inserted replaced
35342:4dc65845eab3 35416:d8d7d1b785af
   291 
   291 
   292 lemma bound0_qf: "bound0 p \<Longrightarrow> qfree p"
   292 lemma bound0_qf: "bound0 p \<Longrightarrow> qfree p"
   293 by (induct p, simp_all)
   293 by (induct p, simp_all)
   294 
   294 
   295 
   295 
   296 constdefs djf:: "('a \<Rightarrow> fm) \<Rightarrow> 'a \<Rightarrow> fm \<Rightarrow> fm"
   296 definition djf :: "('a \<Rightarrow> fm) \<Rightarrow> 'a \<Rightarrow> fm \<Rightarrow> fm" where
   297   "djf f p q \<equiv> (if q=T then T else if q=F then f p else 
   297   "djf f p q \<equiv> (if q=T then T else if q=F then f p else 
   298   (let fp = f p in case fp of T \<Rightarrow> T | F \<Rightarrow> q | _ \<Rightarrow> Or (f p) q))"
   298   (let fp = f p in case fp of T \<Rightarrow> T | F \<Rightarrow> q | _ \<Rightarrow> Or (f p) q))"
   299 constdefs evaldjf:: "('a \<Rightarrow> fm) \<Rightarrow> 'a list \<Rightarrow> fm"
   299 definition evaldjf :: "('a \<Rightarrow> fm) \<Rightarrow> 'a list \<Rightarrow> fm" where
   300   "evaldjf f ps \<equiv> foldr (djf f) ps F"
   300   "evaldjf f ps \<equiv> foldr (djf f) ps F"
   301 
   301 
   302 lemma djf_Or: "Ifm bbs bs (djf f p q) = Ifm bbs bs (Or (f p) q)"
   302 lemma djf_Or: "Ifm bbs bs (djf f p q) = Ifm bbs bs (Or (f p) q)"
   303 by (cases "q=T", simp add: djf_def,cases "q=F",simp add: djf_def) 
   303 by (cases "q=T", simp add: djf_def,cases "q=F",simp add: djf_def) 
   304 (cases "f p", simp_all add: Let_def djf_def) 
   304 (cases "f p", simp_all add: Let_def djf_def) 
   338   hence "list_all qfree (disjuncts p)"
   338   hence "list_all qfree (disjuncts p)"
   339     by (induct p rule: disjuncts.induct, auto)
   339     by (induct p rule: disjuncts.induct, auto)
   340   thus ?thesis by (simp only: list_all_iff)
   340   thus ?thesis by (simp only: list_all_iff)
   341 qed
   341 qed
   342 
   342 
   343 constdefs DJ :: "(fm \<Rightarrow> fm) \<Rightarrow> fm \<Rightarrow> fm"
   343 definition DJ :: "(fm \<Rightarrow> fm) \<Rightarrow> fm \<Rightarrow> fm" where
   344   "DJ f p \<equiv> evaldjf f (disjuncts p)"
   344   "DJ f p \<equiv> evaldjf f (disjuncts p)"
   345 
   345 
   346 lemma DJ: assumes fdj: "\<forall> p q. f (Or p q) = Or (f p) (f q)"
   346 lemma DJ: assumes fdj: "\<forall> p q. f (Or p q) = Or (f p) (f q)"
   347   and fF: "f F = F"
   347   and fF: "f F = F"
   348   shows "Ifm bbs bs (DJ f p) = Ifm bbs bs (f p)"
   348   shows "Ifm bbs bs (DJ f p) = Ifm bbs bs (f p)"
   393   "bnds a = []"
   393   "bnds a = []"
   394 recdef lex_ns "measure (\<lambda> (xs,ys). length xs + length ys)"
   394 recdef lex_ns "measure (\<lambda> (xs,ys). length xs + length ys)"
   395   "lex_ns ([], ms) = True"
   395   "lex_ns ([], ms) = True"
   396   "lex_ns (ns, []) = False"
   396   "lex_ns (ns, []) = False"
   397   "lex_ns (n#ns, m#ms) = (n<m \<or> ((n = m) \<and> lex_ns (ns,ms))) "
   397   "lex_ns (n#ns, m#ms) = (n<m \<or> ((n = m) \<and> lex_ns (ns,ms))) "
   398 constdefs lex_bnd :: "num \<Rightarrow> num \<Rightarrow> bool"
   398 definition lex_bnd :: "num \<Rightarrow> num \<Rightarrow> bool" where
   399   "lex_bnd t s \<equiv> lex_ns (bnds t, bnds s)"
   399   "lex_bnd t s \<equiv> lex_ns (bnds t, bnds s)"
   400 
   400 
   401 consts
   401 consts
   402   numadd:: "num \<times> num \<Rightarrow> num"
   402   numadd:: "num \<times> num \<Rightarrow> num"
   403 recdef numadd "measure (\<lambda> (t,s). num_size t + num_size s)"
   403 recdef numadd "measure (\<lambda> (t,s). num_size t + num_size s)"
   453 by (induct t rule: nummul.induct, auto simp add: algebra_simps numadd)
   453 by (induct t rule: nummul.induct, auto simp add: algebra_simps numadd)
   454 
   454 
   455 lemma nummul_nb: "\<And> i. numbound0 t \<Longrightarrow> numbound0 (nummul i t)"
   455 lemma nummul_nb: "\<And> i. numbound0 t \<Longrightarrow> numbound0 (nummul i t)"
   456 by (induct t rule: nummul.induct, auto simp add: numadd_nb)
   456 by (induct t rule: nummul.induct, auto simp add: numadd_nb)
   457 
   457 
   458 constdefs numneg :: "num \<Rightarrow> num"
   458 definition numneg :: "num \<Rightarrow> num" where
   459   "numneg t \<equiv> nummul (- 1) t"
   459   "numneg t \<equiv> nummul (- 1) t"
   460 
   460 
   461 constdefs numsub :: "num \<Rightarrow> num \<Rightarrow> num"
   461 definition numsub :: "num \<Rightarrow> num \<Rightarrow> num" where
   462   "numsub s t \<equiv> (if s = t then C 0 else numadd (s, numneg t))"
   462   "numsub s t \<equiv> (if s = t then C 0 else numadd (s, numneg t))"
   463 
   463 
   464 lemma numneg: "Inum bs (numneg t) = Inum bs (Neg t)"
   464 lemma numneg: "Inum bs (numneg t) = Inum bs (Neg t)"
   465 using numneg_def nummul by simp
   465 using numneg_def nummul by simp
   466 
   466 
   503 lemma not_qf: "qfree p \<Longrightarrow> qfree (not p)"
   503 lemma not_qf: "qfree p \<Longrightarrow> qfree (not p)"
   504 by (cases p, auto)
   504 by (cases p, auto)
   505 lemma not_bn: "bound0 p \<Longrightarrow> bound0 (not p)"
   505 lemma not_bn: "bound0 p \<Longrightarrow> bound0 (not p)"
   506 by (cases p, auto)
   506 by (cases p, auto)
   507 
   507 
   508 constdefs conj :: "fm \<Rightarrow> fm \<Rightarrow> fm"
   508 definition conj :: "fm \<Rightarrow> fm \<Rightarrow> fm" where
   509   "conj p q \<equiv> (if (p = F \<or> q=F) then F else if p=T then q else if q=T then p else And p q)"
   509   "conj p q \<equiv> (if (p = F \<or> q=F) then F else if p=T then q else if q=T then p else And p q)"
   510 lemma conj: "Ifm bbs bs (conj p q) = Ifm bbs bs (And p q)"
   510 lemma conj: "Ifm bbs bs (conj p q) = Ifm bbs bs (And p q)"
   511 by (cases "p=F \<or> q=F",simp_all add: conj_def) (cases p,simp_all)
   511 by (cases "p=F \<or> q=F",simp_all add: conj_def) (cases p,simp_all)
   512 
   512 
   513 lemma conj_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (conj p q)"
   513 lemma conj_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (conj p q)"
   514 using conj_def by auto 
   514 using conj_def by auto 
   515 lemma conj_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (conj p q)"
   515 lemma conj_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (conj p q)"
   516 using conj_def by auto 
   516 using conj_def by auto 
   517 
   517 
   518 constdefs disj :: "fm \<Rightarrow> fm \<Rightarrow> fm"
   518 definition disj :: "fm \<Rightarrow> fm \<Rightarrow> fm" where
   519   "disj p q \<equiv> (if (p = T \<or> q=T) then T else if p=F then q else if q=F then p else Or p q)"
   519   "disj p q \<equiv> (if (p = T \<or> q=T) then T else if p=F then q else if q=F then p else Or p q)"
   520 
   520 
   521 lemma disj: "Ifm bbs bs (disj p q) = Ifm bbs bs (Or p q)"
   521 lemma disj: "Ifm bbs bs (disj p q) = Ifm bbs bs (Or p q)"
   522 by (cases "p=T \<or> q=T",simp_all add: disj_def) (cases p,simp_all)
   522 by (cases "p=T \<or> q=T",simp_all add: disj_def) (cases p,simp_all)
   523 lemma disj_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (disj p q)"
   523 lemma disj_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (disj p q)"
   524 using disj_def by auto 
   524 using disj_def by auto 
   525 lemma disj_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (disj p q)"
   525 lemma disj_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (disj p q)"
   526 using disj_def by auto 
   526 using disj_def by auto 
   527 
   527 
   528 constdefs   imp :: "fm \<Rightarrow> fm \<Rightarrow> fm"
   528 definition imp :: "fm \<Rightarrow> fm \<Rightarrow> fm" where
   529   "imp p q \<equiv> (if (p = F \<or> q=T) then T else if p=T then q else if q=F then not p else Imp p q)"
   529   "imp p q \<equiv> (if (p = F \<or> q=T) then T else if p=T then q else if q=F then not p else Imp p q)"
   530 lemma imp: "Ifm bbs bs (imp p q) = Ifm bbs bs (Imp p q)"
   530 lemma imp: "Ifm bbs bs (imp p q) = Ifm bbs bs (Imp p q)"
   531 by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) (simp_all add: not)
   531 by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) (simp_all add: not)
   532 lemma imp_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (imp p q)"
   532 lemma imp_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (imp p q)"
   533 using imp_def by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) (simp_all add: not_qf) 
   533 using imp_def by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) (simp_all add: not_qf) 
   534 lemma imp_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (imp p q)"
   534 lemma imp_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (imp p q)"
   535 using imp_def by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) simp_all
   535 using imp_def by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) simp_all
   536 
   536 
   537 constdefs   iff :: "fm \<Rightarrow> fm \<Rightarrow> fm"
   537 definition iff :: "fm \<Rightarrow> fm \<Rightarrow> fm" where
   538   "iff p q \<equiv> (if (p = q) then T else if (p = not q \<or> not p = q) then F else 
   538   "iff p q \<equiv> (if (p = q) then T else if (p = not q \<or> not p = q) then F else 
   539        if p=F then not q else if q=F then not p else if p=T then q else if q=T then p else 
   539        if p=F then not q else if q=F then not p else if p=T then q else if q=T then p else 
   540   Iff p q)"
   540   Iff p q)"
   541 lemma iff: "Ifm bbs bs (iff p q) = Ifm bbs bs (Iff p q)"
   541 lemma iff: "Ifm bbs bs (iff p q) = Ifm bbs bs (Iff p q)"
   542   by (unfold iff_def,cases "p=q", simp,cases "p=not q", simp add:not) 
   542   by (unfold iff_def,cases "p=q", simp,cases "p=not q", simp add:not) 
  1747   assumes lp: "iszlfm p"
  1747   assumes lp: "iszlfm p"
  1748   and up: "d\<beta> p 1" and dd: "d\<delta> p d" and dp: "d > 0"
  1748   and up: "d\<beta> p 1" and dd: "d\<delta> p d" and dp: "d > 0"
  1749   shows "(\<exists> x. Ifm bbs (x#bs) p) = ((\<exists> j\<in> {1 .. d}. Ifm bbs (j#bs) (minusinf p)) \<or> (\<exists> j\<in> {1.. d}. \<exists> b\<in> (Inum (i#bs)) ` set (\<beta> p). Ifm bbs ((b+j)#bs) p))"
  1749   shows "(\<exists> x. Ifm bbs (x#bs) p) = ((\<exists> j\<in> {1 .. d}. Ifm bbs (j#bs) (minusinf p)) \<or> (\<exists> j\<in> {1.. d}. \<exists> b\<in> (Inum (i#bs)) ` set (\<beta> p). Ifm bbs ((b+j)#bs) p))"
  1750   using cp_thm[OF lp up dd dp,where i="i"] by auto
  1750   using cp_thm[OF lp up dd dp,where i="i"] by auto
  1751 
  1751 
  1752 constdefs unit:: "fm \<Rightarrow> fm \<times> num list \<times> int"
  1752 definition unit :: "fm \<Rightarrow> fm \<times> num list \<times> int" where
  1753   "unit p \<equiv> (let p' = zlfm p ; l = \<zeta> p' ; q = And (Dvd l (CN 0 1 (C 0))) (a\<beta> p' l); d = \<delta> q;
  1753   "unit p \<equiv> (let p' = zlfm p ; l = \<zeta> p' ; q = And (Dvd l (CN 0 1 (C 0))) (a\<beta> p' l); d = \<delta> q;
  1754              B = remdups (map simpnum (\<beta> q)) ; a = remdups (map simpnum (\<alpha> q))
  1754              B = remdups (map simpnum (\<beta> q)) ; a = remdups (map simpnum (\<alpha> q))
  1755              in if length B \<le> length a then (q,B,d) else (mirror q, a,d))"
  1755              in if length B \<le> length a then (q,B,d) else (mirror q, a,d))"
  1756 
  1756 
  1757 lemma unit: assumes qf: "qfree p"
  1757 lemma unit: assumes qf: "qfree p"
  1812   }
  1812   }
  1813   ultimately show ?thes by blast
  1813   ultimately show ?thes by blast
  1814 qed
  1814 qed
  1815     (* Cooper's Algorithm *)
  1815     (* Cooper's Algorithm *)
  1816 
  1816 
  1817 constdefs cooper :: "fm \<Rightarrow> fm"
  1817 definition cooper :: "fm \<Rightarrow> fm" where
  1818   "cooper p \<equiv> 
  1818   "cooper p \<equiv> 
  1819   (let (q,B,d) = unit p; js = iupt 1 d;
  1819   (let (q,B,d) = unit p; js = iupt 1 d;
  1820        mq = simpfm (minusinf q);
  1820        mq = simpfm (minusinf q);
  1821        md = evaldjf (\<lambda> j. simpfm (subst0 (C j) mq)) js
  1821        md = evaldjf (\<lambda> j. simpfm (subst0 (C j) mq)) js
  1822    in if md = T then T else
  1822    in if md = T then T else