src/HOL/Tools/typedef_package.ML
changeset 10615 163b265d3d83
parent 10463 474263d29057
child 10675 0b40c19f09f3
equal deleted inserted replaced
10614:d5c14e205c24 10615:163b265d3d83
   144     val RepC = Const (full Rep_name, newT --> oldT);
   144     val RepC = Const (full Rep_name, newT --> oldT);
   145     val AbsC = Const (full Abs_name, oldT --> newT);
   145     val AbsC = Const (full Abs_name, oldT --> newT);
   146     val x_new = Free ("x", newT);
   146     val x_new = Free ("x", newT);
   147     val y_old = Free ("y", oldT);
   147     val y_old = Free ("y", oldT);
   148 
   148 
   149     val set' = if no_def then set else setC;    (* FIXME !?? *)
   149     val set' = if no_def then set else setC;
   150 
   150 
   151     val typedef_name = "type_definition_" ^ name;
   151     val typedef_name = "type_definition_" ^ name;
   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');
   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           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             (if no_def then [] else
   175               ((Rep_name ^ "_inject", make Rep_inject), []),
   176              [((Rep_name ^ "_inject", make Rep_inject), []),
       
   177               ((Abs_name ^ "_inject", make Abs_inject), []),
   176               ((Abs_name ^ "_inject", make Abs_inject), []),
   178               ((Rep_name ^ "_cases", make Rep_cases),
   177               ((Rep_name ^ "_cases", make Rep_cases),
   179                 [RuleCases.case_names [Rep_name], InductAttrib.cases_set_global full_name]),
   178                 [RuleCases.case_names [Rep_name], InductAttrib.cases_set_global full_name]),
   180               ((Abs_name ^ "_cases", make Abs_cases),
   179               ((Abs_name ^ "_cases", make Abs_cases),
   181                 [RuleCases.case_names [Abs_name], InductAttrib.cases_type_global full_tname]),
   180                 [RuleCases.case_names [Abs_name], InductAttrib.cases_type_global full_tname]),
   182               ((Rep_name ^ "_induct", make Rep_induct),
   181               ((Rep_name ^ "_induct", make Rep_induct),
   183                 [RuleCases.case_names [Rep_name], InductAttrib.induct_set_global full_name]),
   182                 [RuleCases.case_names [Rep_name], InductAttrib.induct_set_global full_name]),
   184               ((Abs_name ^ "_induct", make Abs_induct),
   183               ((Abs_name ^ "_induct", make Abs_induct),
   185                 [RuleCases.case_names [Abs_name], InductAttrib.induct_type_global full_tname])]))
   184                 [RuleCases.case_names [Abs_name], InductAttrib.induct_type_global full_tname])])
   186         end)
   185         end)
   187       handle ERROR => err_in_typedef name;
   186       handle ERROR => err_in_typedef name;
   188 
   187 
   189 
   188 
   190     (* errors *)
   189     (* errors *)