src/HOL/Tools/typedef_package.ML
changeset 12338 de0f4a63baa5
parent 12043 8c86683597a8
child 12624 9ed65232429c
equal deleted inserted replaced
12337:7c6a970f0808 12338:de0f4a63baa5
    56 fun add_typedecls decls thy =
    56 fun add_typedecls decls thy =
    57   let
    57   let
    58     val full = Sign.full_name (Theory.sign_of thy);
    58     val full = Sign.full_name (Theory.sign_of thy);
    59 
    59 
    60     fun arity_of (raw_name, args, mx) =
    60     fun arity_of (raw_name, args, mx) =
    61       (full (Syntax.type_name raw_name mx), replicate (length args) HOLogic.termS, HOLogic.termS);
    61       (full (Syntax.type_name raw_name mx), replicate (length args) HOLogic.typeS, HOLogic.typeS);
    62   in
    62   in
    63     if can (Theory.assert_super HOL.thy) thy then
    63     if can (Theory.assert_super HOL.thy) thy then
    64       thy
    64       thy
    65       |> PureThy.add_typedecls decls
    65       |> PureThy.add_typedecls decls
    66       |> Theory.add_arities_i (map arity_of decls)
    66       |> Theory.add_arities_i (map arity_of decls)
    95 
    95 
    96 
    96 
    97 (* prepare_typedef *)
    97 (* prepare_typedef *)
    98 
    98 
    99 fun read_term sg used s =
    99 fun read_term sg used s =
   100   #1 (Thm.read_def_cterm (sg, K None, K None) used true (s, HOLogic.termT));
   100   #1 (Thm.read_def_cterm (sg, K None, K None) used true (s, HOLogic.typeT));
   101 
   101 
   102 fun cert_term sg _ t = Thm.cterm_of sg t handle TERM (msg, _) => error msg;
   102 fun cert_term sg _ t = Thm.cterm_of sg t handle TERM (msg, _) => error msg;
   103 
   103 
   104 fun err_in_typedef name =
   104 fun err_in_typedef name =
   105   error ("The error(s) above occurred in typedef " ^ quote name);
   105   error ("The error(s) above occurred in typedef " ^ quote name);
   123     val vname = take_suffix Symbol.is_digit (Symbol.explode name)
   123     val vname = take_suffix Symbol.is_digit (Symbol.explode name)
   124       |> apfst implode |> apsnd (#1 o Term.read_int);
   124       |> apfst implode |> apsnd (#1 o Term.read_int);
   125     val goal_pat = mk_nonempty (Var (vname, setT));
   125     val goal_pat = mk_nonempty (Var (vname, setT));
   126 
   126 
   127     (*lhs*)
   127     (*lhs*)
   128     val lhs_tfrees = map (fn v => (v, if_none (assoc (rhs_tfrees, v)) HOLogic.termS)) vs;
   128     val lhs_tfrees = map (fn v => (v, if_none (assoc (rhs_tfrees, v)) HOLogic.typeS)) vs;
   129     val tname = Syntax.type_name t mx;
   129     val tname = Syntax.type_name t mx;
   130     val full_tname = full tname;
   130     val full_tname = full tname;
   131     val newT = Type (full_tname, map TFree lhs_tfrees);
   131     val newT = Type (full_tname, map TFree lhs_tfrees);
   132 
   132 
   133     val (Rep_name, Abs_name) = if_none opt_morphs ("Rep_" ^ name, "Abs_" ^ name);
   133     val (Rep_name, Abs_name) = if_none opt_morphs ("Rep_" ^ name, "Abs_" ^ name);
   160       |> (fn ((theory', [type_definition]), set_def) =>
   160       |> (fn ((theory', [type_definition]), set_def) =>
   161         let
   161         let
   162           fun make th = Drule.standard (th OF [type_definition]);
   162           fun make th = Drule.standard (th OF [type_definition]);
   163           val (theory'', [Rep, Rep_inverse, Abs_inverse, Rep_inject, Abs_inject,
   163           val (theory'', [Rep, Rep_inverse, Abs_inverse, Rep_inject, Abs_inject,
   164               Rep_cases, Abs_cases, Rep_induct, Abs_induct]) =
   164               Rep_cases, Abs_cases, Rep_induct, Abs_induct]) =
   165             theory' |> PureThy.add_thms
   165             theory'
       
   166             |> Theory.add_path name
       
   167             |> PureThy.add_thms
   166               ([((Rep_name, make Rep), []),
   168               ([((Rep_name, make Rep), []),
   167                 ((Rep_name ^ "_inverse", make Rep_inverse), []),
   169                 ((Rep_name ^ "_inverse", make Rep_inverse), []),
   168                 ((Abs_name ^ "_inverse", make Abs_inverse), []),
   170                 ((Abs_name ^ "_inverse", make Abs_inverse), []),
   169                 ((Rep_name ^ "_inject", make Rep_inject), []),
   171                 ((Rep_name ^ "_inject", make Rep_inject), []),
   170                 ((Abs_name ^ "_inject", make Abs_inject), []),
   172                 ((Abs_name ^ "_inject", make Abs_inject), []),
   173                 ((Abs_name ^ "_cases", make Abs_cases),
   175                 ((Abs_name ^ "_cases", make Abs_cases),
   174                   [RuleCases.case_names [Abs_name], InductAttrib.cases_type_global full_tname]),
   176                   [RuleCases.case_names [Abs_name], InductAttrib.cases_type_global full_tname]),
   175                 ((Rep_name ^ "_induct", make Rep_induct),
   177                 ((Rep_name ^ "_induct", make Rep_induct),
   176                   [RuleCases.case_names [Rep_name], InductAttrib.induct_set_global full_name]),
   178                   [RuleCases.case_names [Rep_name], InductAttrib.induct_set_global full_name]),
   177                 ((Abs_name ^ "_induct", make Abs_induct),
   179                 ((Abs_name ^ "_induct", make Abs_induct),
   178                   [RuleCases.case_names [Abs_name], InductAttrib.induct_type_global full_tname])]);
   180                   [RuleCases.case_names [Abs_name], InductAttrib.induct_type_global full_tname])])
       
   181             |>> Theory.parent_path;
   179           val result = {type_definition = type_definition, set_def = set_def,
   182           val result = {type_definition = type_definition, set_def = set_def,
   180             Rep = Rep, Rep_inverse = Rep_inverse, Abs_inverse = Abs_inverse,
   183             Rep = Rep, Rep_inverse = Rep_inverse, Abs_inverse = Abs_inverse,
   181             Rep_inject = Rep_inject, Abs_inject = Abs_inject, Rep_cases = Rep_cases,
   184             Rep_inject = Rep_inject, Abs_inject = Abs_inject, Rep_cases = Rep_cases,
   182             Abs_cases = Abs_cases, Rep_induct = Rep_induct, Abs_induct = Abs_induct};
   185             Abs_cases = Abs_cases, Rep_induct = Rep_induct, Abs_induct = Abs_induct};
   183         in ((theory'', type_definition), result) end);
   186         in ((theory'', type_definition), result) end);