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 |