| author | Cezary Kaliszyk <kaliszyk@in.tum.de> | 
| Wed, 28 Oct 2009 18:08:38 +0100 | |
| changeset 228 | 268a727b0f10 | 
| parent 226 | 2a28e7ef3048 | 
| child 232 | 38810e1df801 | 
| permissions | -rw-r--r-- | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 1 | theory FSet | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 2 | imports QuotMain | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 3 | begin | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 4 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 5 | inductive | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 6 | list_eq (infix "\<approx>" 50) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 7 | where | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 8 | "a#b#xs \<approx> b#a#xs" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 9 | | "[] \<approx> []" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 10 | | "xs \<approx> ys \<Longrightarrow> ys \<approx> xs" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 11 | | "a#a#xs \<approx> a#xs" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 12 | | "xs \<approx> ys \<Longrightarrow> a#xs \<approx> a#ys" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 13 | | "\<lbrakk>xs1 \<approx> xs2; xs2 \<approx> xs3\<rbrakk> \<Longrightarrow> xs1 \<approx> xs3" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 14 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 15 | lemma list_eq_refl: | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 16 | shows "xs \<approx> xs" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 17 | apply (induct xs) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 18 | apply (auto intro: list_eq.intros) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 19 | done | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 20 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 21 | lemma equiv_list_eq: | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 22 | shows "EQUIV list_eq" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 23 | unfolding EQUIV_REFL_SYM_TRANS REFL_def SYM_def TRANS_def | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 24 | apply(auto intro: list_eq.intros list_eq_refl) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 25 | done | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 26 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 27 | quotient fset = "'a list" / "list_eq" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 28 | apply(rule equiv_list_eq) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 29 | done | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 30 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 31 | print_theorems | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 32 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 33 | typ "'a fset" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 34 | thm "Rep_fset" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 35 | thm "ABS_fset_def" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 36 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 37 | ML {* @{term "Abs_fset"} *}
 | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 38 | local_setup {*
 | 
| 218 
df05cd030d2f
added infrastructure for defining lifted constants
 Christian Urban <urbanc@in.tum.de> parents: 
215diff
changeset | 39 |   old_make_const_def @{binding EMPTY} @{term "[]"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
 | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 40 | *} | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 41 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 42 | term Nil | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 43 | term EMPTY | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 44 | thm EMPTY_def | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 45 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 46 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 47 | local_setup {*
 | 
| 218 
df05cd030d2f
added infrastructure for defining lifted constants
 Christian Urban <urbanc@in.tum.de> parents: 
215diff
changeset | 48 |   old_make_const_def @{binding INSERT} @{term "op #"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
 | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 49 | *} | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 50 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 51 | term Cons | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 52 | term INSERT | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 53 | thm INSERT_def | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 54 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 55 | local_setup {*
 | 
| 218 
df05cd030d2f
added infrastructure for defining lifted constants
 Christian Urban <urbanc@in.tum.de> parents: 
215diff
changeset | 56 |   old_make_const_def @{binding UNION} @{term "op @"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
 | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 57 | *} | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 58 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 59 | term append | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 60 | term UNION | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 61 | thm UNION_def | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 62 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 63 | thm QUOTIENT_fset | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 64 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 65 | thm QUOT_TYPE_I_fset.thm11 | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 66 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 67 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 68 | fun | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 69 | membship :: "'a \<Rightarrow> 'a list \<Rightarrow> bool" (infix "memb" 100) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 70 | where | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 71 | m1: "(x memb []) = False" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 72 | | m2: "(x memb (y#xs)) = ((x=y) \<or> (x memb xs))" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 73 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 74 | fun | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 75 | card1 :: "'a list \<Rightarrow> nat" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 76 | where | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 77 | card1_nil: "(card1 []) = 0" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 78 | | card1_cons: "(card1 (x # xs)) = (if (x memb xs) then (card1 xs) else (Suc (card1 xs)))" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 79 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 80 | local_setup {*
 | 
| 218 
df05cd030d2f
added infrastructure for defining lifted constants
 Christian Urban <urbanc@in.tum.de> parents: 
215diff
changeset | 81 |   old_make_const_def @{binding card} @{term "card1"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
 | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 82 | *} | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 83 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 84 | term card1 | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 85 | term card | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 86 | thm card_def | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 87 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 88 | (* text {*
 | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 89 | Maybe make_const_def should require a theorem that says that the particular lifted function | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 90 | respects the relation. With it such a definition would be impossible: | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 91 |  make_const_def @{binding CARD} @{term "length"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
 | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 92 | *}*) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 93 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 94 | lemma card1_0: | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 95 | fixes a :: "'a list" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 96 | shows "(card1 a = 0) = (a = [])" | 
| 214 | 97 | by (induct a) auto | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 98 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 99 | lemma not_mem_card1: | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 100 | fixes x :: "'a" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 101 | fixes xs :: "'a list" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 102 | shows "~(x memb xs) \<Longrightarrow> card1 (x # xs) = Suc (card1 xs)" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 103 | by simp | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 104 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 105 | lemma mem_cons: | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 106 | fixes x :: "'a" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 107 | fixes xs :: "'a list" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 108 | assumes a : "x memb xs" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 109 | shows "x # xs \<approx> xs" | 
| 214 | 110 | using a by (induct xs) (auto intro: list_eq.intros ) | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 111 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 112 | lemma card1_suc: | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 113 | fixes xs :: "'a list" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 114 | fixes n :: "nat" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 115 | assumes c: "card1 xs = Suc n" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 116 | shows "\<exists>a ys. ~(a memb ys) \<and> xs \<approx> (a # ys)" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 117 | using c | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 118 | apply(induct xs) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 119 | apply (metis Suc_neq_Zero card1_0) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 120 | apply (metis QUOT_TYPE_I_fset.R_trans card1_cons list_eq_refl mem_cons) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 121 | done | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 122 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 123 | primrec | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 124 | fold1 | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 125 | where | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 126 | "fold1 f (g :: 'a \<Rightarrow> 'b) (z :: 'b) [] = z" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 127 | | "fold1 f g z (a # A) = | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 128 | (if ((!u v. (f u v = f v u)) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 129 | \<and> (!u v w. ((f u (f v w) = f (f u v) w)))) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 130 | then ( | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 131 | if (a memb A) then (fold1 f g z A) else (f (g a) (fold1 f g z A)) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 132 | ) else z)" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 133 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 134 | (* fold1_def is not usable, but: *) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 135 | thm fold1.simps | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 136 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 137 | lemma fs1_strong_cases: | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 138 | fixes X :: "'a list" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 139 | shows "(X = []) \<or> (\<exists>a. \<exists> Y. (~(a memb Y) \<and> (X \<approx> a # Y)))" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 140 | apply (induct X) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 141 | apply (simp) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 142 | apply (metis QUOT_TYPE_I_fset.thm11 list_eq_refl mem_cons m1) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 143 | done | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 144 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 145 | local_setup {*
 | 
| 218 
df05cd030d2f
added infrastructure for defining lifted constants
 Christian Urban <urbanc@in.tum.de> parents: 
215diff
changeset | 146 |   old_make_const_def @{binding IN} @{term "membship"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
 | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 147 | *} | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 148 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 149 | term membship | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 150 | term IN | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 151 | thm IN_def | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 152 | |
| 194 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 153 | local_setup {*
 | 
| 218 
df05cd030d2f
added infrastructure for defining lifted constants
 Christian Urban <urbanc@in.tum.de> parents: 
215diff
changeset | 154 |   old_make_const_def @{binding fold} @{term "fold1::('b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a \<Rightarrow> 'b) \<Rightarrow> 'b \<Rightarrow> 'a list \<Rightarrow> 'b"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
 | 
| 194 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 155 | *} | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 156 | |
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 157 | term fold1 | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 158 | term fold | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 159 | thm fold_def | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 160 | |
| 225 | 161 | quotient_def (for "'a fset") | 
| 162 |   fmap::"('a \<Rightarrow> 'a) \<Rightarrow> 'a fset \<Rightarrow> 'a fset"
 | |
| 163 | where | |
| 164 |   "fmap \<equiv> (map::('a \<Rightarrow> 'a) \<Rightarrow> 'a list \<Rightarrow> 'a list)"
 | |
| 194 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 165 | |
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 166 | term map | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 167 | term fmap | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 168 | thm fmap_def | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 169 | |
| 164 
4f00ca4f5ef4
Stronger tactic, simpler proof.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
163diff
changeset | 170 | lemma memb_rsp: | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 171 | fixes z | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 172 | assumes a: "list_eq x y" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 173 | shows "(z memb x) = (z memb y)" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 174 | using a by induct auto | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 175 | |
| 164 
4f00ca4f5ef4
Stronger tactic, simpler proof.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
163diff
changeset | 176 | lemma ho_memb_rsp: | 
| 
4f00ca4f5ef4
Stronger tactic, simpler proof.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
163diff
changeset | 177 | "(op = ===> (op \<approx> ===> op =)) (op memb) (op memb)" | 
| 214 | 178 | by (simp add: memb_rsp) | 
| 164 
4f00ca4f5ef4
Stronger tactic, simpler proof.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
163diff
changeset | 179 | |
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 180 | lemma card1_rsp: | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 181 | fixes a b :: "'a list" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 182 | assumes e: "a \<approx> b" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 183 | shows "card1 a = card1 b" | 
| 214 | 184 | using e by induct (simp_all add:memb_rsp) | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 185 | |
| 228 
268a727b0f10
disambiguate ===> syntax
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
226diff
changeset | 186 | lemma ho_card1_rsp: "(op \<approx> ===> op =) card1 card1" | 
| 214 | 187 | by (simp add: card1_rsp) | 
| 171 
13aab4c59096
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
168diff
changeset | 188 | |
| 164 
4f00ca4f5ef4
Stronger tactic, simpler proof.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
163diff
changeset | 189 | lemma cons_rsp: | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 190 | fixes z | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 191 | assumes a: "xs \<approx> ys" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 192 | shows "(z # xs) \<approx> (z # ys)" | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 193 | using a by (rule list_eq.intros(5)) | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 194 | |
| 164 
4f00ca4f5ef4
Stronger tactic, simpler proof.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
163diff
changeset | 195 | lemma ho_cons_rsp: | 
| 228 
268a727b0f10
disambiguate ===> syntax
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
226diff
changeset | 196 | "(op = ===> op \<approx> ===> op \<approx>) op # op #" | 
| 214 | 197 | by (simp add: cons_rsp) | 
| 164 
4f00ca4f5ef4
Stronger tactic, simpler proof.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
163diff
changeset | 198 | |
| 175 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 199 | lemma append_rsp_fst: | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 200 | assumes a : "list_eq l1 l2" | 
| 214 | 201 | shows "(l1 @ s) \<approx> (l2 @ s)" | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 202 | using a | 
| 214 | 203 | by (induct) (auto intro: list_eq.intros list_eq_refl) | 
| 204 | ||
| 205 | lemma append_end: | |
| 206 | shows "(e # l) \<approx> (l @ [e])" | |
| 207 | apply (induct l) | |
| 208 | apply (auto intro: list_eq.intros list_eq_refl) | |
| 209 | done | |
| 210 | ||
| 211 | lemma rev_rsp: | |
| 212 | shows "a \<approx> rev a" | |
| 213 | apply (induct a) | |
| 214 | apply simp | |
| 215 | apply (rule list_eq_refl) | |
| 216 | apply simp_all | |
| 217 | apply (rule list_eq.intros(6)) | |
| 218 | prefer 2 | |
| 219 | apply (rule append_rsp_fst) | |
| 220 | apply assumption | |
| 221 | apply (rule append_end) | |
| 222 | done | |
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 223 | |
| 214 | 224 | lemma append_sym_rsp: | 
| 225 | shows "(a @ b) \<approx> (b @ a)" | |
| 226 | apply (rule list_eq.intros(6)) | |
| 227 | apply (rule append_rsp_fst) | |
| 228 | apply (rule rev_rsp) | |
| 229 | apply (rule list_eq.intros(6)) | |
| 230 | apply (rule rev_rsp) | |
| 231 | apply (simp) | |
| 232 | apply (rule append_rsp_fst) | |
| 233 | apply (rule list_eq.intros(3)) | |
| 234 | apply (rule rev_rsp) | |
| 235 | done | |
| 236 | ||
| 237 | lemma append_rsp: | |
| 238 | assumes a : "list_eq l1 r1" | |
| 239 | assumes b : "list_eq l2 r2 " | |
| 240 | shows "(l1 @ l2) \<approx> (r1 @ r2)" | |
| 241 | apply (rule list_eq.intros(6)) | |
| 242 | apply (rule append_rsp_fst) | |
| 243 | using a apply (assumption) | |
| 244 | apply (rule list_eq.intros(6)) | |
| 245 | apply (rule append_sym_rsp) | |
| 246 | apply (rule list_eq.intros(6)) | |
| 247 | apply (rule append_rsp_fst) | |
| 248 | using b apply (assumption) | |
| 249 | apply (rule append_sym_rsp) | |
| 250 | done | |
| 175 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 251 | |
| 194 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 252 | lemma ho_append_rsp: | 
| 228 
268a727b0f10
disambiguate ===> syntax
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
226diff
changeset | 253 | "(op \<approx> ===> op \<approx> ===> op \<approx>) op @ op @" | 
| 214 | 254 | by (simp add: append_rsp) | 
| 175 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 255 | |
| 194 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 256 | lemma map_rsp: | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 257 | assumes a: "a \<approx> b" | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 258 | shows "map f a \<approx> map f b" | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 259 | using a | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 260 | apply (induct) | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 261 | apply(auto intro: list_eq.intros) | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 262 | done | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 263 | |
| 215 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 264 | lemma fun_rel_id: | 
| 228 
268a727b0f10
disambiguate ===> syntax
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
226diff
changeset | 265 | "(op = ===> op =) \<equiv> op =" | 
| 215 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 266 | apply (rule eq_reflection) | 
| 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 267 | apply (rule ext) | 
| 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 268 | apply (rule ext) | 
| 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 269 | apply (simp) | 
| 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 270 | apply (auto) | 
| 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 271 | apply (rule ext) | 
| 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 272 | apply (simp) | 
| 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 273 | done | 
| 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 274 | |
| 194 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 275 | lemma ho_map_rsp: | 
| 228 
268a727b0f10
disambiguate ===> syntax
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
226diff
changeset | 276 | "((op = ===> op =) ===> op \<approx> ===> op \<approx>) map map" | 
| 215 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 277 | by (simp add: fun_rel_id map_rsp) | 
| 194 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 278 | |
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 279 | lemma map_append : | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 280 | "(map f ((a::'a list) @ b)) \<approx> | 
| 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 281 | ((map f a) ::'a list) @ (map f b)" | 
| 215 
89a2ff3f82c7
More finshed proofs and cleaning
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
214diff
changeset | 282 | by simp (rule list_eq_refl) | 
| 194 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 283 | |
| 226 | 284 | ML {* val rty = @{typ "'a list"} *}
 | 
| 285 | ML {* val qty = @{typ "'a fset"} *}
 | |
| 286 | ML {* val rel = @{term "list_eq"} *}
 | |
| 287 | ML {* val rel_eqv = (#equiv_thm o hd) (quotdata_lookup @{context}) *}
 | |
| 288 | ML {* val rel_refl = @{thm list_eq_refl} *}
 | |
| 289 | ML {* val quot = @{thm QUOTIENT_fset} *}
 | |
| 290 | ML {* val rsp_thms =
 | |
| 291 |   @{thms ho_memb_rsp ho_cons_rsp ho_card1_rsp ho_map_rsp ho_append_rsp}
 | |
| 292 |   @ @{thms ho_all_prs ho_ex_prs} *}
 | |
| 293 | ML {* val trans2 = @{thm QUOT_TYPE_I_fset.R_trans2} *}
 | |
| 294 | ML {* val reps_same = @{thm QUOT_TYPE_I_fset.REPS_same} *}
 | |
| 295 | ML {* val defs = @{thms EMPTY_def IN_def UNION_def card_def INSERT_def fmap_def fold_def} *}
 | |
| 296 | (* ML {* val consts = map (fst o dest_Const o fst o Logic.dest_equals o concl_of) fset_defs *} *)
 | |
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 297 | ML {*
 | 
| 226 | 298 |   val consts = [@{const_name "Nil"}, @{const_name "Cons"},
 | 
| 299 |                 @{const_name "membship"}, @{const_name "card1"},
 | |
| 300 |                 @{const_name "append"}, @{const_name "fold1"},
 | |
| 301 |                 @{const_name "map"}];
 | |
| 206 
1e227c9ee915
Fixed APPLY_RSP vs Cong in the InjRepAbs tactic.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
202diff
changeset | 302 | *} | 
| 
1e227c9ee915
Fixed APPLY_RSP vs Cong in the InjRepAbs tactic.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
202diff
changeset | 303 | |
| 226 | 304 | ML {* fun lift_thm_fset lthy t =
 | 
| 305 | lift_thm lthy consts rty qty rel rel_eqv rel_refl quot rsp_thms trans2 reps_same defs t | |
| 172 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 306 | *} | 
| 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 307 | |
| 226 | 308 | lemma eq_r: "a = b \<Longrightarrow> a \<approx> b" | 
| 309 | by (simp add: list_eq_refl) | |
| 171 
13aab4c59096
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
168diff
changeset | 310 | |
| 226 | 311 | ML {* lift_thm_fset @{context} @{thm m1} *}
 | 
| 312 | ML {* lift_thm_fset @{context} @{thm m2} *}
 | |
| 313 | ML {* lift_thm_fset @{context} @{thm list_eq.intros(4)} *}
 | |
| 314 | ML {* lift_thm_fset @{context} @{thm list_eq.intros(5)} *}
 | |
| 315 | ML {* lift_thm_fset @{context} @{thm card1_suc} *}
 | |
| 316 | ML {* lift_thm_fset @{context} @{thm map_append} *}
 | |
| 317 | ML {* lift_thm_fset @{context} @{thm eq_r[OF append_assoc]} *}
 | |
| 171 
13aab4c59096
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
168diff
changeset | 318 | |
| 172 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 319 | thm fold1.simps(2) | 
| 173 
7cf227756e2a
Finally completely lift the previously lifted theorems + clean some old stuff
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
172diff
changeset | 320 | thm list.recs(2) | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 321 | |
| 209 
1e8e1b736586
map_append lifted automatically.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
208diff
changeset | 322 | ML {* val ind_r_a = atomize_thm @{thm list.induct} *}
 | 
| 175 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 323 | (*  prove {* build_regularize_goal ind_r_a @{typ "'a List.list"} @{term "op \<approx>"} @{context} *}
 | 
| 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 324 |   ML_prf {*  fun tac ctxt =
 | 
| 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 325 | (asm_full_simp_tac ((Simplifier.context ctxt HOL_ss) addsimps | 
| 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 326 |         [(@{thm equiv_res_forall} OF [@{thm equiv_list_eq}]),
 | 
| 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 327 |          (@{thm equiv_res_exists} OF [@{thm equiv_list_eq}])])) THEN_ALL_NEW
 | 
| 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 328 |          (((rtac @{thm RIGHT_RES_FORALL_REGULAR}) THEN' (RANGE [fn _ => all_tac, atac]) THEN'
 | 
| 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 329 | (MetisTools.metis_tac ctxt [])) ORELSE' (MetisTools.metis_tac ctxt [])); *} | 
| 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 330 |   apply (tactic {* tac @{context} 1 *}) *)
 | 
| 172 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 331 | ML {* val ind_r_r = regularize ind_r_a @{typ "'a List.list"} @{term "op \<approx>"} @{thm equiv_list_eq} @{context} *}
 | 
| 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 332 | ML {*
 | 
| 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 333 |   val rt = build_repabs_term @{context} ind_r_r consts @{typ "'a list"} @{typ "'a fset"}
 | 
| 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 334 | val rg = Logic.mk_equals ((Thm.prop_of ind_r_r), rt); | 
| 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 335 | *} | 
| 226 | 336 | (*prove rg | 
| 172 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 337 | apply(atomize(full)) | 
| 194 
03c03e88efa9
Simplifying Int and Working on map
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
190diff
changeset | 338 | apply (tactic {* REPEAT_ALL_NEW (r_mk_comb_tac_fset @{context}) 1 *})
 | 
| 226 | 339 | done*) | 
| 210 
f88ea69331bf
Simplfied interface to repabs_injection.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
209diff
changeset | 340 | ML {* val ind_r_t =
 | 
| 172 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 341 | Toplevel.program (fn () => | 
| 210 
f88ea69331bf
Simplfied interface to repabs_injection.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
209diff
changeset | 342 |   repabs @{context} ind_r_r consts @{typ "'a list"} @{typ "'a fset"}
 | 
| 172 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 343 |    @{thm QUOTIENT_fset} @{thm list_eq_refl} @{thm QUOT_TYPE_I_fset.R_trans2}
 | 
| 202 
8ca1150f34d0
Simplifying FSet with new functions.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
194diff
changeset | 344 |    (@{thms ho_memb_rsp ho_cons_rsp ho_card1_rsp ho_map_rsp ho_append_rsp} @ @{thms ho_all_prs ho_ex_prs})
 | 
| 172 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 345 | ) | 
| 
da38ce2711a6
More infrastructure for automatic lifting of theorems lifted before
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
171diff
changeset | 346 | *} | 
| 226 | 347 | ML {* val abs = findabs rty (prop_of (atomize_thm @{thm list.induct})) *}
 | 
| 348 | ML {* val simp_lam_prs_thms = map (make_simp_lam_prs_thm @{context} quot) abs *}
 | |
| 349 | ML {* val ind_r_l = repeat_eqsubst_thm @{context} simp_lam_prs_thms ind_r_t *}
 | |
| 175 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 350 | lemma app_prs_for_induct: "(ABS_fset ---> id) f (REP_fset T1) = f T1" | 
| 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 351 | apply (simp add: fun_map.simps QUOT_TYPE_I_fset.thm10) | 
| 
f7602653dddd
Preparing infrastructire for LAMBDA_PRS
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
173diff
changeset | 352 | done | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 353 | |
| 209 
1e8e1b736586
map_append lifted automatically.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
208diff
changeset | 354 | ML {* val ind_r_l1 = eqsubst_thm @{context} @{thms app_prs_for_induct} ind_r_l *}
 | 
| 178 
945786a68ec6
Finally lifted induction, with some manually added simplification lemmas.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
176diff
changeset | 355 | ML {* val ind_r_l2 = eqsubst_thm @{context} @{thms app_prs_for_induct} ind_r_l1 *}
 | 
| 
945786a68ec6
Finally lifted induction, with some manually added simplification lemmas.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
176diff
changeset | 356 | ML {* val ind_r_l3 = eqsubst_thm @{context} @{thms app_prs_for_induct} ind_r_l2 *}
 | 
| 209 
1e8e1b736586
map_append lifted automatically.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
208diff
changeset | 357 | ML {* val ind_r_l4 = eqsubst_thm @{context} @{thms app_prs_for_induct} ind_r_l3 *}
 | 
| 
1e8e1b736586
map_append lifted automatically.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
208diff
changeset | 358 | ML {* val ind_r_a = simp_allex_prs @{context} quot ind_r_l4 *}
 | 
| 
1e8e1b736586
map_append lifted automatically.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
208diff
changeset | 359 | ML {* val thm = @{thm FORALL_PRS[OF FUN_QUOTIENT[OF QUOTIENT_fset IDENTITY_QUOTIENT], symmetric]} *}
 | 
| 
1e8e1b736586
map_append lifted automatically.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
208diff
changeset | 360 | ML {* val ind_r_a1 = eqsubst_thm @{context} [thm] ind_r_a *}
 | 
| 226 | 361 | ML {* val defs_sym = add_lower_defs @{context} defs *}
 | 
| 362 | ML {* val ind_r_d = repeat_eqsubst_thm @{context} defs_sym ind_r_a1 *}
 | |
| 178 
945786a68ec6
Finally lifted induction, with some manually added simplification lemmas.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
176diff
changeset | 363 | ML {* val ind_r_s = MetaSimplifier.rewrite_rule @{thms QUOT_TYPE_I_fset.REPS_same} ind_r_d *}
 | 
| 209 
1e8e1b736586
map_append lifted automatically.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
208diff
changeset | 364 | ML {* ObjectLogic.rulify ind_r_s *}
 | 
| 178 
945786a68ec6
Finally lifted induction, with some manually added simplification lemmas.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
176diff
changeset | 365 | |
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 366 | ML {*
 | 
| 226 | 367 | fun lift_thm_fset_note name thm lthy = | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 368 | let | 
| 226 | 369 | val lifted_thm = lift_thm_fset lthy thm; | 
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 370 | val (_, lthy2) = note (name, lifted_thm) lthy; | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 371 | in | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 372 | lthy2 | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 373 | end; | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 374 | *} | 
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 375 | |
| 226 | 376 | local_setup {*
 | 
| 377 |   lift_thm_fset_note @{binding "m1l"} @{thm m1} #>
 | |
| 378 |   lift_thm_fset_note @{binding "m2l"} @{thm m2} #>
 | |
| 379 |   lift_thm_fset_note @{binding "leqi4l"} @{thm list_eq.intros(4)} #>
 | |
| 380 |   lift_thm_fset_note @{binding "leqi5l"} @{thm list_eq.intros(5)}
 | |
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 381 | *} | 
| 226 | 382 | thm m1l | 
| 383 | thm m2l | |
| 384 | thm leqi4l | |
| 385 | thm leqi5l | |
| 163 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 386 | |
| 
3da18bf6886c
Split Finite Set example into separate file
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 387 | end |