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 *) |