126 val typedef_deps = Term.fold_aterms (fn Const c => insert (op =) c | _ => I) set' []; |
126 val typedef_deps = Term.fold_aterms (fn Const c => insert (op =) c | _ => I) set' []; |
127 |
127 |
128 fun add_def eq thy = |
128 fun add_def eq thy = |
129 if def then |
129 if def then |
130 thy |
130 thy |
131 |> PureThy.add_defs_i false [Thm.no_attributes eq] |
131 |> PureThy.add_defs false [Thm.no_attributes eq] |
132 |-> (fn [th] => pair (SOME th)) |
132 |-> (fn [th] => pair (SOME th)) |
133 else (NONE, thy); |
133 else (NONE, thy); |
134 |
134 |
135 fun typedef_result nonempty = |
135 fun typedef_result nonempty = |
136 ObjectLogic.typedecl (t, vs, mx) |
136 ObjectLogic.typedecl (t, vs, mx) |
138 #> Sign.add_consts_i |
138 #> Sign.add_consts_i |
139 ((if def then [(name, setT', NoSyn)] else []) @ |
139 ((if def then [(name, setT', NoSyn)] else []) @ |
140 [(Rep_name, newT --> oldT, NoSyn), |
140 [(Rep_name, newT --> oldT, NoSyn), |
141 (Abs_name, oldT --> newT, NoSyn)]) |
141 (Abs_name, oldT --> newT, NoSyn)]) |
142 #> add_def (PrimitiveDefs.mk_defpair (setC, set)) |
142 #> add_def (PrimitiveDefs.mk_defpair (setC, set)) |
143 ##>> PureThy.add_axioms_i [((typedef_name, typedef_prop), |
143 ##>> PureThy.add_axioms [((typedef_name, typedef_prop), |
144 [apsnd (fn cond_axm => nonempty RS cond_axm)])] |
144 [apsnd (fn cond_axm => nonempty RS cond_axm)])] |
145 ##> Theory.add_deps "" (dest_Const RepC) typedef_deps |
145 ##> Theory.add_deps "" (dest_Const RepC) typedef_deps |
146 ##> Theory.add_deps "" (dest_Const AbsC) typedef_deps |
146 ##> Theory.add_deps "" (dest_Const AbsC) typedef_deps |
147 #-> (fn (set_def, [type_definition]) => fn thy1 => |
147 #-> (fn (set_def, [type_definition]) => fn thy1 => |
148 let |
148 let |