src/HOL/Tools/typedef_package.ML
changeset 19473 d87a8838afa4
parent 19459 2041d472fc17
child 19510 29fc4e5a638c
equal deleted inserted replaced
19472:896eb8056e97 19473:d87a8838afa4
   117     val oldT = HOLogic.dest_setT setT handle TYPE _ =>
   117     val oldT = HOLogic.dest_setT setT handle TYPE _ =>
   118       error ("Not a set type: " ^ quote (Sign.string_of_typ thy setT));
   118       error ("Not a set type: " ^ quote (Sign.string_of_typ thy setT));
   119     fun mk_nonempty A =
   119     fun mk_nonempty A =
   120       HOLogic.mk_Trueprop (HOLogic.mk_exists ("x", oldT, HOLogic.mk_mem (Free ("x", oldT), A)));
   120       HOLogic.mk_Trueprop (HOLogic.mk_exists ("x", oldT, HOLogic.mk_mem (Free ("x", oldT), A)));
   121     val goal = mk_nonempty set;
   121     val goal = mk_nonempty set;
   122     val goal_pat = mk_nonempty (Var (if_none (Syntax.read_variable name) (name, 0), setT));
   122     val goal_pat = mk_nonempty (Var (the_default (name, 0) (Syntax.read_variable name), setT));
   123 
   123 
   124     (*lhs*)
   124     (*lhs*)
   125     val defS = Sign.defaultS thy;
   125     val defS = Sign.defaultS thy;
   126     val lhs_tfrees = map (fn v => (v, if_none (AList.lookup (op =) rhs_tfrees v) defS)) vs;
   126     val lhs_tfrees = map (fn v => (v, the_default defS (AList.lookup (op =) rhs_tfrees v))) vs;
   127     val args_setT = lhs_tfrees
   127     val args_setT = lhs_tfrees
   128       |> filter (member (op =) rhs_tfrees andf (not o member (op =) rhs_tfreesT))
   128       |> filter (member (op =) rhs_tfrees andf (not o member (op =) rhs_tfreesT))
   129       |> map TFree;
   129       |> map TFree;
   130 
   130 
   131     val tname = Syntax.type_name t mx;
   131     val tname = Syntax.type_name t mx;
   132     val full_tname = full tname;
   132     val full_tname = full tname;
   133     val newT = Type (full_tname, map TFree lhs_tfrees);
   133     val newT = Type (full_tname, map TFree lhs_tfrees);
   134 
   134 
   135     val (Rep_name, Abs_name) = if_none opt_morphs ("Rep_" ^ name, "Abs_" ^ name);
   135     val (Rep_name, Abs_name) = the_default ("Rep_" ^ name, "Abs_" ^ name) opt_morphs;
   136     val setT' = map Term.itselfT args_setT ---> setT;
   136     val setT' = map Term.itselfT args_setT ---> setT;
   137     val setC = Term.list_comb (Const (full_name, setT'), map Logic.mk_type args_setT);
   137     val setC = Term.list_comb (Const (full_name, setT'), map Logic.mk_type args_setT);
   138     val RepC = Const (full Rep_name, newT --> oldT);
   138     val RepC = Const (full Rep_name, newT --> oldT);
   139     val AbsC = Const (full Abs_name, oldT --> newT);
   139     val AbsC = Const (full Abs_name, oldT --> newT);
   140     val x_new = Free ("x", newT);
   140     val x_new = Free ("x", newT);
   301         --| P.$$$ ")") (true, NONE) --
   301         --| P.$$$ ")") (true, NONE) --
   302     (P.type_args -- P.name) -- P.opt_infix -- (P.$$$ "=" |-- P.term) --
   302     (P.type_args -- P.name) -- P.opt_infix -- (P.$$$ "=" |-- P.term) --
   303     Scan.option (P.$$$ "morphisms" |-- P.!!! (P.name -- P.name));
   303     Scan.option (P.$$$ "morphisms" |-- P.!!! (P.name -- P.name));
   304 
   304 
   305 fun mk_typedef ((((((def, opt_name), (vs, t)), mx), A), morphs)) =
   305 fun mk_typedef ((((((def, opt_name), (vs, t)), mx), A), morphs)) =
   306   typedef ((def, if_none opt_name (Syntax.type_name t mx)), (t, vs, mx), A, morphs);
   306   typedef ((def, the_default (Syntax.type_name t mx) opt_name), (t, vs, mx), A, morphs);
   307 
   307 
   308 val typedefP =
   308 val typedefP =
   309   OuterSyntax.command "typedef" "HOL type definition (requires non-emptiness proof)" K.thy_goal
   309   OuterSyntax.command "typedef" "HOL type definition (requires non-emptiness proof)" K.thy_goal
   310     (typedef_decl >> (Toplevel.print oo (Toplevel.theory_to_proof o mk_typedef)));
   310     (typedef_decl >> (Toplevel.print oo (Toplevel.theory_to_proof o mk_typedef)));
   311 
   311