| author | wenzelm | 
| Fri, 17 Dec 2010 17:43:54 +0100 | |
| changeset 41229 | d797baa3d57c | 
| parent 40833 | 4f130bd9e17e | 
| child 41430 | 1aa23e9f2c87 | 
| permissions | -rw-r--r-- | 
| 37744 | 1 | (* Title: HOLCF/Tools/Domain/domain_take_proofs.ML | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 2 | Author: Brian Huffman | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 3 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 4 | Defines take functions for the given domain equation | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 5 | and proves related theorems. | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 6 | *) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 7 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 8 | signature DOMAIN_TAKE_PROOFS = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 9 | sig | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 10 | type iso_info = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 11 |     {
 | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 12 | absT : typ, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 13 | repT : typ, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 14 | abs_const : term, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 15 | rep_const : term, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 16 | abs_inverse : thm, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 17 | rep_inverse : thm | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 18 | } | 
| 35651 | 19 | type take_info = | 
| 35659 | 20 |     {
 | 
| 21 | take_consts : term list, | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 22 | take_defs : thm list, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 23 | chain_take_thms : thm list, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 24 | take_0_thms : thm list, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 25 | take_Suc_thms : thm list, | 
| 35515 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 26 | deflation_take_thms : thm list, | 
| 40015 | 27 | take_strict_thms : thm list, | 
| 35515 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 28 | finite_consts : term list, | 
| 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 29 | finite_defs : thm list | 
| 35651 | 30 | } | 
| 35656 | 31 | type take_induct_info = | 
| 32 |     {
 | |
| 35659 | 33 | take_consts : term list, | 
| 34 | take_defs : thm list, | |
| 35 | chain_take_thms : thm list, | |
| 36 | take_0_thms : thm list, | |
| 37 | take_Suc_thms : thm list, | |
| 38 | deflation_take_thms : thm list, | |
| 40015 | 39 | take_strict_thms : thm list, | 
| 35659 | 40 | finite_consts : term list, | 
| 41 | finite_defs : thm list, | |
| 42 | lub_take_thms : thm list, | |
| 43 | reach_thms : thm list, | |
| 44 | take_lemma_thms : thm list, | |
| 45 | is_finite : bool, | |
| 46 | take_induct_thms : thm list | |
| 35656 | 47 | } | 
| 35651 | 48 | val define_take_functions : | 
| 49 | (binding * iso_info) list -> theory -> take_info * theory | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 50 | |
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 51 | val add_lub_take_theorems : | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 52 | (binding * iso_info) list -> take_info -> thm list -> | 
| 35656 | 53 | theory -> take_induct_info * theory | 
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 54 | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 55 | val map_of_typ : | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 56 | theory -> (typ * term) list -> typ -> term | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 57 | |
| 40737 
2037021f034f
remove map function names from domain package theory data
 huffman parents: 
40489diff
changeset | 58 | val add_rec_type : (string * bool list) -> theory -> theory | 
| 
2037021f034f
remove map function names from domain package theory data
 huffman parents: 
40489diff
changeset | 59 | val get_rec_tab : theory -> (bool list) Symtab.table | 
| 40216 
366309dfaf60
use Named_Thms instead of Theory_Data for some domain package theorems
 huffman parents: 
40016diff
changeset | 60 | val add_deflation_thm : thm -> theory -> theory | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 61 | val get_deflation_thms : theory -> thm list | 
| 40489 | 62 | val map_ID_add : attribute | 
| 63 | val get_map_ID_thms : theory -> thm list | |
| 40216 
366309dfaf60
use Named_Thms instead of Theory_Data for some domain package theorems
 huffman parents: 
40016diff
changeset | 64 | val setup : theory -> theory | 
| 40832 | 65 | end | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 66 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 67 | structure Domain_Take_Proofs : DOMAIN_TAKE_PROOFS = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 68 | struct | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 69 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 70 | type iso_info = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 71 |   {
 | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 72 | absT : typ, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 73 | repT : typ, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 74 | abs_const : term, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 75 | rep_const : term, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 76 | abs_inverse : thm, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 77 | rep_inverse : thm | 
| 40832 | 78 | } | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 79 | |
| 35651 | 80 | type take_info = | 
| 81 |   { take_consts : term list,
 | |
| 82 | take_defs : thm list, | |
| 83 | chain_take_thms : thm list, | |
| 84 | take_0_thms : thm list, | |
| 85 | take_Suc_thms : thm list, | |
| 86 | deflation_take_thms : thm list, | |
| 40015 | 87 | take_strict_thms : thm list, | 
| 35651 | 88 | finite_consts : term list, | 
| 89 | finite_defs : thm list | |
| 40832 | 90 | } | 
| 35651 | 91 | |
| 35656 | 92 | type take_induct_info = | 
| 93 |   {
 | |
| 35659 | 94 | take_consts : term list, | 
| 95 | take_defs : thm list, | |
| 96 | chain_take_thms : thm list, | |
| 97 | take_0_thms : thm list, | |
| 98 | take_Suc_thms : thm list, | |
| 99 | deflation_take_thms : thm list, | |
| 40015 | 100 | take_strict_thms : thm list, | 
| 35659 | 101 | finite_consts : term list, | 
| 102 | finite_defs : thm list, | |
| 103 | lub_take_thms : thm list, | |
| 104 | reach_thms : thm list, | |
| 105 | take_lemma_thms : thm list, | |
| 106 | is_finite : bool, | |
| 107 | take_induct_thms : thm list | |
| 40832 | 108 | } | 
| 35656 | 109 | |
| 40833 
4f130bd9e17e
internal domain package proofs use cont2cont simproc instead of a fixed list of cont rules
 huffman parents: 
40832diff
changeset | 110 | val beta_ss = | 
| 
4f130bd9e17e
internal domain package proofs use cont2cont simproc instead of a fixed list of cont rules
 huffman parents: 
40832diff
changeset | 111 |   HOL_basic_ss addsimps simp_thms addsimprocs [@{simproc beta_cfun_proc}]
 | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 112 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 113 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 114 | (******************************** theory data *********************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 115 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 116 | |
| 40737 
2037021f034f
remove map function names from domain package theory data
 huffman parents: 
40489diff
changeset | 117 | structure Rec_Data = Theory_Data | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 118 | ( | 
| 40737 
2037021f034f
remove map function names from domain package theory data
 huffman parents: 
40489diff
changeset | 119 | (* list indicates which type arguments allow indirect recursion *) | 
| 40832 | 120 | type T = (bool list) Symtab.table | 
| 121 | val empty = Symtab.empty | |
| 122 | val extend = I | |
| 123 | fun merge data = Symtab.merge (K true) data | |
| 124 | ) | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 125 | |
| 40216 
366309dfaf60
use Named_Thms instead of Theory_Data for some domain package theorems
 huffman parents: 
40016diff
changeset | 126 | structure DeflMapData = Named_Thms | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 127 | ( | 
| 40216 
366309dfaf60
use Named_Thms instead of Theory_Data for some domain package theorems
 huffman parents: 
40016diff
changeset | 128 | val name = "domain_deflation" | 
| 
366309dfaf60
use Named_Thms instead of Theory_Data for some domain package theorems
 huffman parents: 
40016diff
changeset | 129 | val description = "theorems like deflation a ==> deflation (foo_map$a)" | 
| 40832 | 130 | ) | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 131 | |
| 40489 | 132 | structure Map_Id_Data = Named_Thms | 
| 133 | ( | |
| 134 | val name = "domain_map_ID" | |
| 135 | val description = "theorems like foo_map$ID = ID" | |
| 40832 | 136 | ) | 
| 40489 | 137 | |
| 40737 
2037021f034f
remove map function names from domain package theory data
 huffman parents: 
40489diff
changeset | 138 | fun add_rec_type (tname, bs) = | 
| 40832 | 139 | Rec_Data.map (Symtab.insert (K true) (tname, bs)) | 
| 40216 
366309dfaf60
use Named_Thms instead of Theory_Data for some domain package theorems
 huffman parents: 
40016diff
changeset | 140 | |
| 
366309dfaf60
use Named_Thms instead of Theory_Data for some domain package theorems
 huffman parents: 
40016diff
changeset | 141 | fun add_deflation_thm thm = | 
| 40832 | 142 | Context.theory_map (DeflMapData.add_thm thm) | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 143 | |
| 40832 | 144 | val get_rec_tab = Rec_Data.get | 
| 145 | fun get_deflation_thms thy = DeflMapData.get (ProofContext.init_global thy) | |
| 40216 
366309dfaf60
use Named_Thms instead of Theory_Data for some domain package theorems
 huffman parents: 
40016diff
changeset | 146 | |
| 40832 | 147 | val map_ID_add = Map_Id_Data.add | 
| 148 | val get_map_ID_thms = Map_Id_Data.get o ProofContext.init_global | |
| 40489 | 149 | |
| 40832 | 150 | val setup = DeflMapData.setup #> Map_Id_Data.setup | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 151 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 152 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 153 | (************************** building types and terms **************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 154 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 155 | |
| 40832 | 156 | open HOLCF_Library | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 157 | |
| 40832 | 158 | infixr 6 ->> | 
| 159 | infix -->> | |
| 160 | infix 9 ` | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 161 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 162 | fun mapT (T as Type (_, Ts)) = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 163 | (map (fn T => T ->> T) Ts) -->> (T ->> T) | 
| 40832 | 164 | | mapT T = T ->> T | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 165 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 166 | fun mk_deflation t = | 
| 40832 | 167 |   Const (@{const_name deflation}, Term.fastype_of t --> boolT) $ t
 | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 168 | |
| 40832 | 169 | fun mk_eqs (t, u) = HOLogic.mk_Trueprop (HOLogic.mk_eq (t, u)) | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 170 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 171 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 172 | (****************************** isomorphism info ******************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 173 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 174 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 175 | fun deflation_abs_rep (info : iso_info) : thm = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 176 | let | 
| 40832 | 177 | val abs_iso = #abs_inverse info | 
| 178 | val rep_iso = #rep_inverse info | |
| 179 |     val thm = @{thm deflation_abs_rep} OF [abs_iso, rep_iso]
 | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 180 | in | 
| 36241 
2a4cec6bcae2
replace many uses of Drule.export_without_context with Drule.zero_var_indexes
 huffman parents: 
35773diff
changeset | 181 | Drule.zero_var_indexes thm | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 182 | end | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 183 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 184 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 185 | (********************* building map functions over types **********************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 186 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 187 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 188 | fun map_of_typ (thy : theory) (sub : (typ * term) list) (T : typ) : term = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 189 | let | 
| 40832 | 190 | val thms = get_map_ID_thms thy | 
| 191 | val rules = map (Thm.concl_of #> HOLogic.dest_Trueprop #> HOLogic.dest_eq) thms | |
| 192 | val rules' = map (apfst mk_ID) sub @ map swap rules | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 193 | in | 
| 40489 | 194 | mk_ID T | 
| 195 | |> Pattern.rewrite_term thy rules' [] | |
| 196 | |> Pattern.rewrite_term thy rules [] | |
| 40832 | 197 | end | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 198 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 199 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 200 | (********************* declaring definitions and theorems *********************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 201 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 202 | |
| 35773 | 203 | fun add_qualified_def name (dbind, eqn) = | 
| 39557 
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
 wenzelm parents: 
37744diff
changeset | 204 | yield_singleton (Global_Theory.add_defs false) | 
| 40832 | 205 | ((Binding.qualified true name dbind, eqn), []) | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 206 | |
| 35773 | 207 | fun add_qualified_thm name (dbind, thm) = | 
| 39557 
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
 wenzelm parents: 
37744diff
changeset | 208 | yield_singleton Global_Theory.add_thms | 
| 40832 | 209 | ((Binding.qualified true name dbind, thm), []) | 
| 35650 | 210 | |
| 35773 | 211 | fun add_qualified_simp_thm name (dbind, thm) = | 
| 39557 
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
 wenzelm parents: 
37744diff
changeset | 212 | yield_singleton Global_Theory.add_thms | 
| 40832 | 213 | ((Binding.qualified true name dbind, thm), [Simplifier.simp_add]) | 
| 35573 | 214 | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 215 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 216 | (************************** defining take functions ***************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 217 | (******************************************************************************) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 218 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 219 | fun define_take_functions | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 220 | (spec : (binding * iso_info) list) | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 221 | (thy : theory) = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 222 | let | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 223 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 224 | (* retrieve components of spec *) | 
| 40832 | 225 | val dbinds = map fst spec | 
| 226 | val iso_infos = map snd spec | |
| 227 | val dom_eqns = map (fn x => (#absT x, #repT x)) iso_infos | |
| 228 | val rep_abs_consts = map (fn x => (#rep_const x, #abs_const x)) iso_infos | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 229 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 230 | fun mk_projs [] t = [] | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 231 | | mk_projs (x::[]) t = [(x, t)] | 
| 40832 | 232 | | mk_projs (x::xs) t = (x, mk_fst t) :: mk_projs xs (mk_snd t) | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 233 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 234 | fun mk_cfcomp2 ((rep_const, abs_const), f) = | 
| 40832 | 235 | mk_cfcomp (abs_const, mk_cfcomp (f, rep_const)) | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 236 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 237 | (* define take functional *) | 
| 40832 | 238 | val newTs : typ list = map fst dom_eqns | 
| 239 | val copy_arg_type = mk_tupleT (map (fn T => T ->> T) newTs) | |
| 240 |     val copy_arg = Free ("f", copy_arg_type)
 | |
| 241 | val copy_args = map snd (mk_projs dbinds copy_arg) | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 242 | fun one_copy_rhs (rep_abs, (lhsT, rhsT)) = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 243 | let | 
| 40832 | 244 | val body = map_of_typ thy (newTs ~~ copy_args) rhsT | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 245 | in | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 246 | mk_cfcomp2 (rep_abs, body) | 
| 40832 | 247 | end | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 248 | val take_functional = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 249 | big_lambda copy_arg | 
| 40832 | 250 | (mk_tuple (map one_copy_rhs (rep_abs_consts ~~ dom_eqns))) | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 251 | val take_rhss = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 252 | let | 
| 40832 | 253 |         val n = Free ("n", HOLogic.natT)
 | 
| 254 | val rhs = mk_iterate (n, take_functional) | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 255 | in | 
| 35773 | 256 | map (lambda n o snd) (mk_projs dbinds rhs) | 
| 40832 | 257 | end | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 258 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 259 | (* define take constants *) | 
| 35773 | 260 | fun define_take_const ((dbind, take_rhs), (lhsT, rhsT)) thy = | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 261 | let | 
| 40832 | 262 | val take_type = HOLogic.natT --> lhsT ->> lhsT | 
| 263 | val take_bind = Binding.suffix_name "_take" dbind | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 264 | val (take_const, thy) = | 
| 40832 | 265 | Sign.declare_const ((take_bind, take_type), NoSyn) thy | 
| 266 | val take_eqn = Logic.mk_equals (take_const, take_rhs) | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 267 | val (take_def_thm, thy) = | 
| 40832 | 268 | add_qualified_def "take_def" (dbind, take_eqn) thy | 
| 269 | in ((take_const, take_def_thm), thy) end | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 270 | val ((take_consts, take_defs), thy) = thy | 
| 35773 | 271 | |> fold_map define_take_const (dbinds ~~ take_rhss ~~ dom_eqns) | 
| 40832 | 272 | |>> ListPair.unzip | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 273 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 274 | (* prove chain_take lemmas *) | 
| 35773 | 275 | fun prove_chain_take (take_const, dbind) thy = | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 276 | let | 
| 40832 | 277 | val goal = mk_trp (mk_chain take_const) | 
| 278 |         val rules = take_defs @ @{thms chain_iterate ch2ch_fst ch2ch_snd}
 | |
| 279 | val tac = simp_tac (HOL_basic_ss addsimps rules) 1 | |
| 280 | val thm = Goal.prove_global thy [] [] goal (K tac) | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 281 | in | 
| 35773 | 282 | add_qualified_simp_thm "chain_take" (dbind, thm) thy | 
| 40832 | 283 | end | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 284 | val (chain_take_thms, thy) = | 
| 40832 | 285 | fold_map prove_chain_take (take_consts ~~ dbinds) thy | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 286 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 287 | (* prove take_0 lemmas *) | 
| 35773 | 288 | fun prove_take_0 ((take_const, dbind), (lhsT, rhsT)) thy = | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 289 | let | 
| 40832 | 290 |         val lhs = take_const $ @{term "0::nat"}
 | 
| 291 | val goal = mk_eqs (lhs, mk_bottom (lhsT ->> lhsT)) | |
| 292 |         val rules = take_defs @ @{thms iterate_0 fst_strict snd_strict}
 | |
| 293 | val tac = simp_tac (HOL_basic_ss addsimps rules) 1 | |
| 294 | val take_0_thm = Goal.prove_global thy [] [] goal (K tac) | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 295 | in | 
| 40016 
2eff1cbc1ccb
remove function Domain_Theorems.theorems; bind theorem names directly from Domain_Constructors.add_domain_constructors
 huffman parents: 
40015diff
changeset | 296 | add_qualified_simp_thm "take_0" (dbind, take_0_thm) thy | 
| 40832 | 297 | end | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 298 | val (take_0_thms, thy) = | 
| 40832 | 299 | fold_map prove_take_0 (take_consts ~~ dbinds ~~ dom_eqns) thy | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 300 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 301 | (* prove take_Suc lemmas *) | 
| 40832 | 302 |     val n = Free ("n", natT)
 | 
| 303 | val take_is = map (fn t => t $ n) take_consts | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 304 | fun prove_take_Suc | 
| 35773 | 305 | (((take_const, rep_abs), dbind), (lhsT, rhsT)) thy = | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 306 | let | 
| 40832 | 307 |         val lhs = take_const $ (@{term Suc} $ n)
 | 
| 308 | val body = map_of_typ thy (newTs ~~ take_is) rhsT | |
| 309 | val rhs = mk_cfcomp2 (rep_abs, body) | |
| 310 | val goal = mk_eqs (lhs, rhs) | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 311 |         val simps = @{thms iterate_Suc fst_conv snd_conv}
 | 
| 40832 | 312 | val rules = take_defs @ simps | 
| 313 | val tac = simp_tac (beta_ss addsimps rules) 1 | |
| 314 | val take_Suc_thm = Goal.prove_global thy [] [] goal (K tac) | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 315 | in | 
| 35773 | 316 | add_qualified_thm "take_Suc" (dbind, take_Suc_thm) thy | 
| 40832 | 317 | end | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 318 | val (take_Suc_thms, thy) = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 319 | fold_map prove_take_Suc | 
| 40832 | 320 | (take_consts ~~ rep_abs_consts ~~ dbinds ~~ dom_eqns) thy | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 321 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 322 | (* prove deflation theorems for take functions *) | 
| 40832 | 323 | val deflation_abs_rep_thms = map deflation_abs_rep iso_infos | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 324 | val deflation_take_thm = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 325 | let | 
| 40832 | 326 |         val n = Free ("n", natT)
 | 
| 327 | fun mk_goal take_const = mk_deflation (take_const $ n) | |
| 328 | val goal = mk_trp (foldr1 mk_conj (map mk_goal take_consts)) | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 329 | val adm_rules = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 330 |           @{thms adm_conj adm_subst [OF _ adm_deflation]
 | 
| 40832 | 331 | cont2cont_fst cont2cont_snd cont_id} | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 332 | val bottom_rules = | 
| 40832 | 333 |           take_0_thms @ @{thms deflation_UU simp_thms}
 | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 334 | val deflation_rules = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 335 |           @{thms conjI deflation_ID}
 | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 336 | @ deflation_abs_rep_thms | 
| 40832 | 337 | @ get_deflation_thms thy | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 338 | in | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 339 | Goal.prove_global thy [] [] goal (fn _ => | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 340 | EVERY | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 341 |           [rtac @{thm nat.induct} 1,
 | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 342 | simp_tac (HOL_basic_ss addsimps bottom_rules) 1, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 343 | asm_simp_tac (HOL_basic_ss addsimps take_Suc_thms) 1, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 344 |            REPEAT (etac @{thm conjE} 1
 | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 345 | ORELSE resolve_tac deflation_rules 1 | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 346 | ORELSE atac 1)]) | 
| 40832 | 347 | end | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 348 | fun conjuncts [] thm = [] | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 349 | | conjuncts (n::[]) thm = [(n, thm)] | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 350 | | conjuncts (n::ns) thm = let | 
| 40832 | 351 |           val thmL = thm RS @{thm conjunct1}
 | 
| 352 |           val thmR = thm RS @{thm conjunct2}
 | |
| 353 | in (n, thmL):: conjuncts ns thmR end | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 354 | val (deflation_take_thms, thy) = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 355 | fold_map (add_qualified_thm "deflation_take") | 
| 36241 
2a4cec6bcae2
replace many uses of Drule.export_without_context with Drule.zero_var_indexes
 huffman parents: 
35773diff
changeset | 356 | (map (apsnd Drule.zero_var_indexes) | 
| 40832 | 357 | (conjuncts dbinds deflation_take_thm)) thy | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 358 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 359 | (* prove strictness of take functions *) | 
| 35773 | 360 | fun prove_take_strict (deflation_take, dbind) thy = | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 361 | let | 
| 35572 
44eeda8cb708
generate lemma take_below, declare chain_take [simp]
 huffman parents: 
35557diff
changeset | 362 | val take_strict_thm = | 
| 36241 
2a4cec6bcae2
replace many uses of Drule.export_without_context with Drule.zero_var_indexes
 huffman parents: 
35773diff
changeset | 363 | Drule.zero_var_indexes | 
| 40832 | 364 |               (@{thm deflation_strict} OF [deflation_take])
 | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 365 | in | 
| 40016 
2eff1cbc1ccb
remove function Domain_Theorems.theorems; bind theorem names directly from Domain_Constructors.add_domain_constructors
 huffman parents: 
40015diff
changeset | 366 | add_qualified_simp_thm "take_strict" (dbind, take_strict_thm) thy | 
| 40832 | 367 | end | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 368 | val (take_strict_thms, thy) = | 
| 35572 
44eeda8cb708
generate lemma take_below, declare chain_take [simp]
 huffman parents: 
35557diff
changeset | 369 | fold_map prove_take_strict | 
| 40832 | 370 | (deflation_take_thms ~~ dbinds) thy | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 371 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 372 | (* prove take/take rules *) | 
| 35773 | 373 | fun prove_take_take ((chain_take, deflation_take), dbind) thy = | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 374 | let | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 375 | val take_take_thm = | 
| 36241 
2a4cec6bcae2
replace many uses of Drule.export_without_context with Drule.zero_var_indexes
 huffman parents: 
35773diff
changeset | 376 | Drule.zero_var_indexes | 
| 40832 | 377 |               (@{thm deflation_chain_min} OF [chain_take, deflation_take])
 | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 378 | in | 
| 35773 | 379 | add_qualified_thm "take_take" (dbind, take_take_thm) thy | 
| 40832 | 380 | end | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 381 | val (take_take_thms, thy) = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 382 | fold_map prove_take_take | 
| 40832 | 383 | (chain_take_thms ~~ deflation_take_thms ~~ dbinds) thy | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 384 | |
| 35572 
44eeda8cb708
generate lemma take_below, declare chain_take [simp]
 huffman parents: 
35557diff
changeset | 385 | (* prove take_below rules *) | 
| 35773 | 386 | fun prove_take_below (deflation_take, dbind) thy = | 
| 35572 
44eeda8cb708
generate lemma take_below, declare chain_take [simp]
 huffman parents: 
35557diff
changeset | 387 | let | 
| 
44eeda8cb708
generate lemma take_below, declare chain_take [simp]
 huffman parents: 
35557diff
changeset | 388 | val take_below_thm = | 
| 36241 
2a4cec6bcae2
replace many uses of Drule.export_without_context with Drule.zero_var_indexes
 huffman parents: 
35773diff
changeset | 389 | Drule.zero_var_indexes | 
| 40832 | 390 |               (@{thm deflation.below} OF [deflation_take])
 | 
| 35572 
44eeda8cb708
generate lemma take_below, declare chain_take [simp]
 huffman parents: 
35557diff
changeset | 391 | in | 
| 35773 | 392 | add_qualified_thm "take_below" (dbind, take_below_thm) thy | 
| 40832 | 393 | end | 
| 35572 
44eeda8cb708
generate lemma take_below, declare chain_take [simp]
 huffman parents: 
35557diff
changeset | 394 | val (take_below_thms, thy) = | 
| 
44eeda8cb708
generate lemma take_below, declare chain_take [simp]
 huffman parents: 
35557diff
changeset | 395 | fold_map prove_take_below | 
| 40832 | 396 | (deflation_take_thms ~~ dbinds) thy | 
| 35572 
44eeda8cb708
generate lemma take_below, declare chain_take [simp]
 huffman parents: 
35557diff
changeset | 397 | |
| 35515 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 398 | (* define finiteness predicates *) | 
| 35773 | 399 | fun define_finite_const ((dbind, take_const), (lhsT, rhsT)) thy = | 
| 35515 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 400 | let | 
| 40832 | 401 | val finite_type = lhsT --> boolT | 
| 402 | val finite_bind = Binding.suffix_name "_finite" dbind | |
| 35515 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 403 | val (finite_const, thy) = | 
| 40832 | 404 | Sign.declare_const ((finite_bind, finite_type), NoSyn) thy | 
| 405 |         val x = Free ("x", lhsT)
 | |
| 406 |         val n = Free ("n", natT)
 | |
| 35515 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 407 | val finite_rhs = | 
| 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 408 | lambda x (HOLogic.exists_const natT $ | 
| 40832 | 409 | (lambda n (mk_eq (mk_capply (take_const $ n, x), x)))) | 
| 410 | val finite_eqn = Logic.mk_equals (finite_const, finite_rhs) | |
| 35515 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 411 | val (finite_def_thm, thy) = | 
| 40832 | 412 | add_qualified_def "finite_def" (dbind, finite_eqn) thy | 
| 413 | in ((finite_const, finite_def_thm), thy) end | |
| 35515 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 414 | val ((finite_consts, finite_defs), thy) = thy | 
| 35773 | 415 | |> fold_map define_finite_const (dbinds ~~ take_consts ~~ dom_eqns) | 
| 40832 | 416 | |>> ListPair.unzip | 
| 35515 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 417 | |
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 418 | val result = | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 419 |       {
 | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 420 | take_consts = take_consts, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 421 | take_defs = take_defs, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 422 | chain_take_thms = chain_take_thms, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 423 | take_0_thms = take_0_thms, | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 424 | take_Suc_thms = take_Suc_thms, | 
| 35515 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 425 | deflation_take_thms = deflation_take_thms, | 
| 40015 | 426 | take_strict_thms = take_strict_thms, | 
| 35515 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 427 | finite_consts = finite_consts, | 
| 
d631dc53ede0
move definition of finiteness predicate into domain_take_proofs.ML
 huffman parents: 
35514diff
changeset | 428 | finite_defs = finite_defs | 
| 40832 | 429 | } | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 430 | |
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 431 | in | 
| 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 432 | (result, thy) | 
| 40832 | 433 | end | 
| 35514 
a2cfa413eaab
move take-related definitions and proofs to new module; simplify map_of_typ functions
 huffman parents: diff
changeset | 434 | |
| 35655 | 435 | fun prove_finite_take_induct | 
| 436 | (spec : (binding * iso_info) list) | |
| 437 | (take_info : take_info) | |
| 438 | (lub_take_thms : thm list) | |
| 439 | (thy : theory) = | |
| 440 | let | |
| 40832 | 441 | val dbinds = map fst spec | 
| 442 | val iso_infos = map snd spec | |
| 443 | val absTs = map #absT iso_infos | |
| 444 |     val {take_consts, ...} = take_info
 | |
| 445 |     val {chain_take_thms, take_0_thms, take_Suc_thms, ...} = take_info
 | |
| 446 |     val {finite_consts, finite_defs, ...} = take_info
 | |
| 35655 | 447 | |
| 448 | val decisive_lemma = | |
| 449 | let | |
| 37165 | 450 | fun iso_locale (info : iso_info) = | 
| 40832 | 451 |             @{thm iso.intro} OF [#abs_inverse info, #rep_inverse info]
 | 
| 452 | val iso_locale_thms = map iso_locale iso_infos | |
| 35655 | 453 | val decisive_abs_rep_thms = | 
| 40832 | 454 |             map (fn x => @{thm decisive_abs_rep} OF [x]) iso_locale_thms
 | 
| 455 |         val n = Free ("n", @{typ nat})
 | |
| 35655 | 456 | fun mk_decisive t = | 
| 40832 | 457 |             Const (@{const_name decisive}, fastype_of t --> boolT) $ t
 | 
| 458 | fun f take_const = mk_decisive (take_const $ n) | |
| 459 | val goal = mk_trp (foldr1 mk_conj (map f take_consts)) | |
| 460 |         val rules0 = @{thm decisive_bottom} :: take_0_thms
 | |
| 35655 | 461 | val rules1 = | 
| 462 | take_Suc_thms @ decisive_abs_rep_thms | |
| 40832 | 463 |             @ @{thms decisive_ID decisive_ssum_map decisive_sprod_map}
 | 
| 35655 | 464 | val tac = EVERY [ | 
| 465 |             rtac @{thm nat.induct} 1,
 | |
| 466 | simp_tac (HOL_ss addsimps rules0) 1, | |
| 40832 | 467 | asm_simp_tac (HOL_ss addsimps rules1) 1] | 
| 468 | in Goal.prove_global thy [] [] goal (K tac) end | |
| 35655 | 469 | fun conjuncts 1 thm = [thm] | 
| 470 | | conjuncts n thm = let | |
| 40832 | 471 |           val thmL = thm RS @{thm conjunct1}
 | 
| 472 |           val thmR = thm RS @{thm conjunct2}
 | |
| 473 | in thmL :: conjuncts (n-1) thmR end | |
| 474 | val decisive_thms = conjuncts (length spec) decisive_lemma | |
| 35655 | 475 | |
| 476 | fun prove_finite_thm (absT, finite_const) = | |
| 477 | let | |
| 40832 | 478 |         val goal = mk_trp (finite_const $ Free ("x", absT))
 | 
| 35655 | 479 | val tac = | 
| 480 | EVERY [ | |
| 481 | rewrite_goals_tac finite_defs, | |
| 482 |             rtac @{thm lub_ID_finite} 1,
 | |
| 483 | resolve_tac chain_take_thms 1, | |
| 484 | resolve_tac lub_take_thms 1, | |
| 40832 | 485 | resolve_tac decisive_thms 1] | 
| 35655 | 486 | in | 
| 487 | Goal.prove_global thy [] [] goal (K tac) | |
| 40832 | 488 | end | 
| 35655 | 489 | val finite_thms = | 
| 40832 | 490 | map prove_finite_thm (absTs ~~ finite_consts) | 
| 35655 | 491 | |
| 492 | fun prove_take_induct ((ch_take, lub_take), decisive) = | |
| 493 | Drule.export_without_context | |
| 40832 | 494 |           (@{thm lub_ID_finite_take_induct} OF [ch_take, lub_take, decisive])
 | 
| 35655 | 495 | val take_induct_thms = | 
| 496 | map prove_take_induct | |
| 40832 | 497 | (chain_take_thms ~~ lub_take_thms ~~ decisive_thms) | 
| 35655 | 498 | |
| 499 | val thy = thy | |
| 500 | |> fold (snd oo add_qualified_thm "finite") | |
| 35773 | 501 | (dbinds ~~ finite_thms) | 
| 35655 | 502 | |> fold (snd oo add_qualified_thm "take_induct") | 
| 40832 | 503 | (dbinds ~~ take_induct_thms) | 
| 35655 | 504 | in | 
| 505 | ((finite_thms, take_induct_thms), thy) | |
| 40832 | 506 | end | 
| 35655 | 507 | |
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 508 | fun add_lub_take_theorems | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 509 | (spec : (binding * iso_info) list) | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 510 | (take_info : take_info) | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 511 | (lub_take_thms : thm list) | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 512 | (thy : theory) = | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 513 | let | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 514 | |
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 515 | (* retrieve components of spec *) | 
| 40832 | 516 | val dbinds = map fst spec | 
| 517 | val iso_infos = map snd spec | |
| 518 | val absTs = map #absT iso_infos | |
| 519 | val repTs = map #repT iso_infos | |
| 520 |     val {take_consts, take_0_thms, take_Suc_thms, ...} = take_info
 | |
| 521 |     val {chain_take_thms, deflation_take_thms, ...} = take_info
 | |
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 522 | |
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 523 | (* prove take lemmas *) | 
| 35773 | 524 | fun prove_take_lemma ((chain_take, lub_take), dbind) thy = | 
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 525 | let | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 526 | val take_lemma = | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 527 | Drule.export_without_context | 
| 40832 | 528 |               (@{thm lub_ID_take_lemma} OF [chain_take, lub_take])
 | 
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 529 | in | 
| 35773 | 530 | add_qualified_thm "take_lemma" (dbind, take_lemma) thy | 
| 40832 | 531 | end | 
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 532 | val (take_lemma_thms, thy) = | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 533 | fold_map prove_take_lemma | 
| 40832 | 534 | (chain_take_thms ~~ lub_take_thms ~~ dbinds) thy | 
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 535 | |
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 536 | (* prove reach lemmas *) | 
| 35773 | 537 | fun prove_reach_lemma ((chain_take, lub_take), dbind) thy = | 
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 538 | let | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 539 | val thm = | 
| 36241 
2a4cec6bcae2
replace many uses of Drule.export_without_context with Drule.zero_var_indexes
 huffman parents: 
35773diff
changeset | 540 | Drule.zero_var_indexes | 
| 40832 | 541 |               (@{thm lub_ID_reach} OF [chain_take, lub_take])
 | 
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 542 | in | 
| 35773 | 543 | add_qualified_thm "reach" (dbind, thm) thy | 
| 40832 | 544 | end | 
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 545 | val (reach_thms, thy) = | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 546 | fold_map prove_reach_lemma | 
| 40832 | 547 | (chain_take_thms ~~ lub_take_thms ~~ dbinds) thy | 
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 548 | |
| 35655 | 549 | (* test for finiteness of domain definitions *) | 
| 550 | local | |
| 40832 | 551 |       val types = [@{type_name ssum}, @{type_name sprod}]
 | 
| 36692 
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
 haftmann parents: 
36241diff
changeset | 552 | fun finite d T = if member (op =) absTs T then d else finite' d T | 
| 35655 | 553 | and finite' d (Type (c, Ts)) = | 
| 40832 | 554 | let val d' = d andalso member (op =) types c | 
| 35655 | 555 | in forall (finite d') Ts end | 
| 40832 | 556 | | finite' d _ = true | 
| 35655 | 557 | in | 
| 40832 | 558 | val is_finite = forall (finite true) repTs | 
| 559 | end | |
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 560 | |
| 35655 | 561 | val ((finite_thms, take_induct_thms), thy) = | 
| 562 | if is_finite | |
| 563 | then | |
| 564 | let | |
| 565 | val ((finites, take_inducts), thy) = | |
| 40832 | 566 | prove_finite_take_induct spec take_info lub_take_thms thy | 
| 35655 | 567 | in | 
| 568 | ((SOME finites, take_inducts), thy) | |
| 569 | end | |
| 570 | else | |
| 571 | let | |
| 572 | fun prove_take_induct (chain_take, lub_take) = | |
| 36241 
2a4cec6bcae2
replace many uses of Drule.export_without_context with Drule.zero_var_indexes
 huffman parents: 
35773diff
changeset | 573 | Drule.zero_var_indexes | 
| 40832 | 574 |                 (@{thm lub_ID_take_induct} OF [chain_take, lub_take])
 | 
| 35655 | 575 | val take_inducts = | 
| 40832 | 576 | map prove_take_induct (chain_take_thms ~~ lub_take_thms) | 
| 35655 | 577 | val thy = fold (snd oo add_qualified_thm "take_induct") | 
| 40832 | 578 | (dbinds ~~ take_inducts) thy | 
| 35655 | 579 | in | 
| 580 | ((NONE, take_inducts), thy) | |
| 40832 | 581 | end | 
| 35655 | 582 | |
| 35656 | 583 | val result = | 
| 584 |       {
 | |
| 35659 | 585 | take_consts = #take_consts take_info, | 
| 586 | take_defs = #take_defs take_info, | |
| 587 | chain_take_thms = #chain_take_thms take_info, | |
| 588 | take_0_thms = #take_0_thms take_info, | |
| 589 | take_Suc_thms = #take_Suc_thms take_info, | |
| 590 | deflation_take_thms = #deflation_take_thms take_info, | |
| 40015 | 591 | take_strict_thms = #take_strict_thms take_info, | 
| 35659 | 592 | finite_consts = #finite_consts take_info, | 
| 593 | finite_defs = #finite_defs take_info, | |
| 594 | lub_take_thms = lub_take_thms, | |
| 595 | reach_thms = reach_thms, | |
| 596 | take_lemma_thms = take_lemma_thms, | |
| 597 | is_finite = is_finite, | |
| 598 | take_induct_thms = take_induct_thms | |
| 40832 | 599 | } | 
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 600 | in | 
| 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 601 | (result, thy) | 
| 40832 | 602 | end | 
| 35654 
7a15e181bf3b
move proofs of reach and take lemmas to domain_take_proofs.ML
 huffman parents: 
35651diff
changeset | 603 | |
| 40832 | 604 | end |