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