152 val typedefC = |
152 val typedefC = |
153 Const (type_definitionN, (newT --> oldT) --> (oldT --> newT) --> setT --> HOLogic.boolT); |
153 Const (type_definitionN, (newT --> oldT) --> (oldT --> newT) --> setT --> HOLogic.boolT); |
154 val typedef_prop = HOLogic.mk_Trueprop (typedefC $ RepC $ AbsC $ set'); |
154 val typedef_prop = HOLogic.mk_Trueprop (typedefC $ RepC $ AbsC $ set'); |
155 |
155 |
156 (*theory extender*) |
156 (*theory extender*) |
157 fun do_typedef theory = |
157 fun do_typedef super_theory theory = |
158 theory |
158 theory |
159 |> Theory.assert_super thy |
159 |> Theory.assert_super super_theory |
160 |> add_typedecls [(t, vs, mx)] |
160 |> add_typedecls [(t, vs, mx)] |
161 |> Theory.add_consts_i |
161 |> Theory.add_consts_i |
162 ((if no_def then [] else [(name, setT, NoSyn)]) @ |
162 ((if no_def then [] else [(name, setT, NoSyn)]) @ |
163 [(Rep_name, newT --> oldT, NoSyn), |
163 [(Rep_name, newT --> oldT, NoSyn), |
164 (Abs_name, oldT --> newT, NoSyn)]) |
164 (Abs_name, oldT --> newT, NoSyn)]) |
217 |
217 |
218 fun gen_add_typedef prep_term no_def name typ set names thms tac thy = |
218 fun gen_add_typedef prep_term no_def name typ set names thms tac thy = |
219 let |
219 let |
220 val (cset, _, do_typedef) = prepare_typedef prep_term no_def name typ set thy; |
220 val (cset, _, do_typedef) = prepare_typedef prep_term no_def name typ set thy; |
221 val result = prove_nonempty thy cset (names, thms, tac); |
221 val result = prove_nonempty thy cset (names, thms, tac); |
222 in check_nonempty cset result; thy |> do_typedef |> #1 end; |
222 in check_nonempty cset result; thy |> do_typedef thy |> #1 end; |
223 |
223 |
224 val add_typedef = gen_add_typedef read_term false; |
224 val add_typedef = gen_add_typedef read_term false; |
225 val add_typedef_i = gen_add_typedef cert_term false; |
225 val add_typedef_i = gen_add_typedef cert_term false; |
226 val add_typedef_i_no_def = gen_add_typedef cert_term true; |
226 val add_typedef_i_no_def = gen_add_typedef cert_term true; |
227 |
227 |
234 fun gen_typedef_proof prep_term ((name, typ, set), comment) int thy = |
234 fun gen_typedef_proof prep_term ((name, typ, set), comment) int thy = |
235 let |
235 let |
236 val (cset, cset_pat, do_typedef) = prepare_typedef prep_term false name typ set thy; |
236 val (cset, cset_pat, do_typedef) = prepare_typedef prep_term false name typ set thy; |
237 val goal = Thm.term_of (goal_nonempty true cset); |
237 val goal = Thm.term_of (goal_nonempty true cset); |
238 val goal_pat = Thm.term_of (goal_nonempty true cset_pat); |
238 val goal_pat = Thm.term_of (goal_nonempty true cset_pat); |
239 in |
239 val test_thy = Theory.copy thy; |
240 thy |
240 in |
241 |> IsarThy.theorem_i ((("", [typedef_attribute cset do_typedef]), |
241 test_thy |> do_typedef test_thy; (*preview errors!*) |
|
242 thy |> IsarThy.theorem_i ((("", [typedef_attribute cset (do_typedef thy)]), |
242 (goal, ([goal_pat], []))), comment) int |
243 (goal, ([goal_pat], []))), comment) int |
243 end; |
244 end; |
244 |
245 |
245 val typedef_proof = gen_typedef_proof read_term; |
246 val typedef_proof = gen_typedef_proof read_term; |
246 val typedef_proof_i = gen_typedef_proof cert_term; |
247 val typedef_proof_i = gen_typedef_proof cert_term; |