src/HOL/Tools/typedef_package.ML
changeset 10675 0b40c19f09f3
parent 10615 163b265d3d83
child 10697 ec197510165a
equal deleted inserted replaced
10674:2cc6415c1801 10675:0b40c19f09f3
   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);