src/HOL/Decision_Procs/Cooper.thy
changeset 41836 c9d788ff7940
parent 41807 ab5d2d81f9fb
child 41837 6fc224dc5473
equal deleted inserted replaced
41835:9712fae15200 41836:c9d788ff7940
     4 
     4 
     5 theory Cooper
     5 theory Cooper
     6 imports Complex_Main "~~/src/HOL/Library/Efficient_Nat"
     6 imports Complex_Main "~~/src/HOL/Library/Efficient_Nat"
     7 uses ("cooper_tac.ML")
     7 uses ("cooper_tac.ML")
     8 begin
     8 begin
     9 
       
    10 function iupt :: "int \<Rightarrow> int \<Rightarrow> int list" where
       
    11   "iupt i j = (if j < i then [] else i # iupt (i+1) j)"
       
    12 by pat_completeness auto
       
    13 termination by (relation "measure (\<lambda> (i, j). nat (j-i+1))") auto
       
    14 
       
    15 lemma iupt_set: "set (iupt i j) = {i..j}"
       
    16   by (induct rule: iupt.induct) (simp add: simp_from_to)
       
    17 
     9 
    18 (* Periodicity of dvd *)
    10 (* Periodicity of dvd *)
    19 
    11 
    20   (*********************************************************************************)
    12   (*********************************************************************************)
    21   (****                            SHADOW SYNTAX AND SEMANTICS                  ****)
    13   (****                            SHADOW SYNTAX AND SEMANTICS                  ****)
  1810 qed
  1802 qed
  1811     (* Cooper's Algorithm *)
  1803     (* Cooper's Algorithm *)
  1812 
  1804 
  1813 definition cooper :: "fm \<Rightarrow> fm" where
  1805 definition cooper :: "fm \<Rightarrow> fm" where
  1814   "cooper p \<equiv> 
  1806   "cooper p \<equiv> 
  1815   (let (q,B,d) = unit p; js = iupt 1 d;
  1807   (let (q,B,d) = unit p; js = [1..d];
  1816        mq = simpfm (minusinf q);
  1808        mq = simpfm (minusinf q);
  1817        md = evaldjf (\<lambda> j. simpfm (subst0 (C j) mq)) js
  1809        md = evaldjf (\<lambda> j. simpfm (subst0 (C j) mq)) js
  1818    in if md = T then T else
  1810    in if md = T then T else
  1819     (let qd = evaldjf (\<lambda> (b,j). simpfm (subst0 (Add b (C j)) q)) 
  1811     (let qd = evaldjf (\<lambda> (b,j). simpfm (subst0 (Add b (C j)) q)) 
  1820                                [(b,j). b\<leftarrow>B,j\<leftarrow>js]
  1812                                [(b,j). b\<leftarrow>B,j\<leftarrow>js]
  1825 proof-
  1817 proof-
  1826   let ?I = "\<lambda> x p. Ifm bbs (x#bs) p"
  1818   let ?I = "\<lambda> x p. Ifm bbs (x#bs) p"
  1827   let ?q = "fst (unit p)"
  1819   let ?q = "fst (unit p)"
  1828   let ?B = "fst (snd(unit p))"
  1820   let ?B = "fst (snd(unit p))"
  1829   let ?d = "snd (snd (unit p))"
  1821   let ?d = "snd (snd (unit p))"
  1830   let ?js = "iupt 1 ?d"
  1822   let ?js = "[1..?d]"
  1831   let ?mq = "minusinf ?q"
  1823   let ?mq = "minusinf ?q"
  1832   let ?smq = "simpfm ?mq"
  1824   let ?smq = "simpfm ?mq"
  1833   let ?md = "evaldjf (\<lambda> j. simpfm (subst0 (C j) ?smq)) ?js"
  1825   let ?md = "evaldjf (\<lambda> j. simpfm (subst0 (C j) ?smq)) ?js"
  1834   fix i
  1826   fix i
  1835   let ?N = "\<lambda> t. Inum (i#bs) t"
  1827   let ?N = "\<lambda> t. Inum (i#bs) t"
  1864   have "?lhs = (\<exists> j\<in> {1.. ?d}. ?I j ?mq \<or> (\<exists> b\<in> ?N ` set ?B. Ifm bbs ((b+ j)#bs) ?q))" by auto
  1856   have "?lhs = (\<exists> j\<in> {1.. ?d}. ?I j ?mq \<or> (\<exists> b\<in> ?N ` set ?B. Ifm bbs ((b+ j)#bs) ?q))" by auto
  1865   also have "\<dots> = (\<exists> j\<in> {1.. ?d}. ?I j ?mq \<or> (\<exists> b\<in> set ?B. Ifm bbs ((?N b+ j)#bs) ?q))" by simp
  1857   also have "\<dots> = (\<exists> j\<in> {1.. ?d}. ?I j ?mq \<or> (\<exists> b\<in> set ?B. Ifm bbs ((?N b+ j)#bs) ?q))" by simp
  1866   also have "\<dots> = ((\<exists> j\<in> {1.. ?d}. ?I j ?mq ) \<or> (\<exists> j\<in> {1.. ?d}. \<exists> b\<in> set ?B. Ifm bbs ((?N (Add b (C j)))#bs) ?q))" by (simp only: Inum.simps) blast
  1858   also have "\<dots> = ((\<exists> j\<in> {1.. ?d}. ?I j ?mq ) \<or> (\<exists> j\<in> {1.. ?d}. \<exists> b\<in> set ?B. Ifm bbs ((?N (Add b (C j)))#bs) ?q))" by (simp only: Inum.simps) blast
  1867   also have "\<dots> = ((\<exists> j\<in> {1.. ?d}. ?I j ?smq ) \<or> (\<exists> j\<in> {1.. ?d}. \<exists> b\<in> set ?B. Ifm bbs ((?N (Add b (C j)))#bs) ?q))" by (simp add: simpfm) 
  1859   also have "\<dots> = ((\<exists> j\<in> {1.. ?d}. ?I j ?smq ) \<or> (\<exists> j\<in> {1.. ?d}. \<exists> b\<in> set ?B. Ifm bbs ((?N (Add b (C j)))#bs) ?q))" by (simp add: simpfm) 
  1868   also have "\<dots> = ((\<exists> j\<in> set ?js. (\<lambda> j. ?I i (simpfm (subst0 (C j) ?smq))) j) \<or> (\<exists> j\<in> set ?js. \<exists> b\<in> set ?B. Ifm bbs ((?N (Add b (C j)))#bs) ?q))"
  1860   also have "\<dots> = ((\<exists> j\<in> set ?js. (\<lambda> j. ?I i (simpfm (subst0 (C j) ?smq))) j) \<or> (\<exists> j\<in> set ?js. \<exists> b\<in> set ?B. Ifm bbs ((?N (Add b (C j)))#bs) ?q))"
  1869     by (simp only: simpfm subst0_I[OF qfmq] iupt_set) auto
  1861     by (simp only: simpfm subst0_I[OF qfmq] set_upto) auto
  1870   also have "\<dots> = (?I i (evaldjf (\<lambda> j. simpfm (subst0 (C j) ?smq)) ?js) \<or> (\<exists> j\<in> set ?js. \<exists> b\<in> set ?B. ?I i (subst0 (Add b (C j)) ?q)))" 
  1862   also have "\<dots> = (?I i (evaldjf (\<lambda> j. simpfm (subst0 (C j) ?smq)) ?js) \<or> (\<exists> j\<in> set ?js. \<exists> b\<in> set ?B. ?I i (subst0 (Add b (C j)) ?q)))" 
  1871    by (simp only: evaldjf_ex subst0_I[OF qfq])
  1863    by (simp only: evaldjf_ex subst0_I[OF qfq])
  1872  also have "\<dots>= (?I i ?md \<or> (\<exists> (b,j) \<in> set ?Bjs. (\<lambda> (b,j). ?I i (simpfm (subst0 (Add b (C j)) ?q))) (b,j)))"
  1864  also have "\<dots>= (?I i ?md \<or> (\<exists> (b,j) \<in> set ?Bjs. (\<lambda> (b,j). ?I i (simpfm (subst0 (Add b (C j)) ?q))) (b,j)))"
  1873    by (simp only: simpfm set_concat set_map concat_map_singleton UN_simps) blast
  1865    by (simp only: simpfm set_concat set_map concat_map_singleton UN_simps) blast
  1874  also have "\<dots> = (?I i ?md \<or> (?I i (evaldjf (\<lambda> (b,j). simpfm (subst0 (Add b (C j)) ?q)) ?Bjs)))"
  1866  also have "\<dots> = (?I i ?md \<or> (?I i (evaldjf (\<lambda> (b,j). simpfm (subst0 (Add b (C j)) ?q)) ?Bjs)))"