165 |> (if no_def then I else (#1 oo (PureThy.add_defs_i false o map Thm.no_attributes)) |
165 |> (if no_def then I else (#1 oo (PureThy.add_defs_i false o map Thm.no_attributes)) |
166 [Logic.mk_defpair (setC, set)]) |
166 [Logic.mk_defpair (setC, set)]) |
167 |> PureThy.add_axioms_i [((typedef_name, typedef_prop), [])] |
167 |> PureThy.add_axioms_i [((typedef_name, typedef_prop), [])] |
168 |> (fn (theory', typedef_ax) => |
168 |> (fn (theory', typedef_ax) => |
169 let fun make th = standard (th OF typedef_ax) in |
169 let fun make th = standard (th OF typedef_ax) in |
170 theory' |
170 rpair (hd typedef_ax) (theory' |
171 |> (#1 oo PureThy.add_thms) |
171 |> (#1 oo PureThy.add_thms) |
172 ([((Rep_name, make Rep), []), |
172 ([((Rep_name, make Rep), []), |
173 ((Rep_name ^ "_inverse", make Rep_inverse), []), |
173 ((Rep_name ^ "_inverse", make Rep_inverse), []), |
174 ((Abs_name ^ "_inverse", make Abs_inverse), []), |
174 ((Abs_name ^ "_inverse", make Abs_inverse), []), |
175 ((Rep_name ^ "_inject", make Rep_inject), []), |
175 ((Rep_name ^ "_inject", make Rep_inject), []), |
179 ((Abs_name ^ "_cases", make Abs_cases), |
179 ((Abs_name ^ "_cases", make Abs_cases), |
180 [RuleCases.case_names [Abs_name], InductAttrib.cases_type_global full_tname]), |
180 [RuleCases.case_names [Abs_name], InductAttrib.cases_type_global full_tname]), |
181 ((Rep_name ^ "_induct", make Rep_induct), |
181 ((Rep_name ^ "_induct", make Rep_induct), |
182 [RuleCases.case_names [Rep_name], InductAttrib.induct_set_global full_name]), |
182 [RuleCases.case_names [Rep_name], InductAttrib.induct_set_global full_name]), |
183 ((Abs_name ^ "_induct", make Abs_induct), |
183 ((Abs_name ^ "_induct", make Abs_induct), |
184 [RuleCases.case_names [Abs_name], InductAttrib.induct_type_global full_tname])]) |
184 [RuleCases.case_names [Abs_name], InductAttrib.induct_type_global full_tname])])) |
185 end) |
185 end) |
186 handle ERROR => err_in_typedef name; |
186 handle ERROR => err_in_typedef name; |
187 |
187 |
188 |
188 |
189 (* errors *) |
189 (* errors *) |
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 end; |
222 in check_nonempty cset result; thy |> do_typedef |> #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 |
228 |
228 |
229 (* typedef_proof interface *) |
229 (* typedef_proof interface *) |
230 |
230 |
231 fun typedef_attribute cset do_typedef (thy, thm) = |
231 fun typedef_attribute cset do_typedef (thy, thm) = |
232 (check_nonempty cset (thm RS (some_eq_ex RS iffD2)); (thy |> do_typedef, thm)); |
232 (check_nonempty cset (thm RS (some_eq_ex RS iffD2)); (thy |> do_typedef)); |
233 |
233 |
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); |