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)))" |