75 val big_rec_name = big_name ^ "_rep_set"; |
75 val big_rec_name = big_name ^ "_rep_set"; |
76 val rep_set_names' = |
76 val rep_set_names' = |
77 (if length descr' = 1 then [big_rec_name] else |
77 (if length descr' = 1 then [big_rec_name] else |
78 (map ((curry (op ^) (big_rec_name ^ "_")) o string_of_int) |
78 (map ((curry (op ^) (big_rec_name ^ "_")) o string_of_int) |
79 (1 upto (length descr')))); |
79 (1 upto (length descr')))); |
80 val rep_set_names = map (Sign.full_name thy1) rep_set_names'; |
80 val rep_set_names = map (Sign.full_bname thy1) rep_set_names'; |
81 |
81 |
82 val tyvars = map (fn (_, (_, Ts, _)) => map dest_DtTFree Ts) (hd descr); |
82 val tyvars = map (fn (_, (_, Ts, _)) => map dest_DtTFree Ts) (hd descr); |
83 val leafTs' = get_nonrec_types descr' sorts; |
83 val leafTs' = get_nonrec_types descr' sorts; |
84 val branchTs = get_branching_types descr' sorts; |
84 val branchTs = get_branching_types descr' sorts; |
85 val branchT = if null branchTs then HOLogic.unitT |
85 val branchT = if null branchTs then HOLogic.unitT |
182 ((1 upto (length constrs)) ~~ constrs)) (descr' ~~ rep_set_names'); |
182 ((1 upto (length constrs)) ~~ constrs)) (descr' ~~ rep_set_names'); |
183 |
183 |
184 val ({raw_induct = rep_induct, intrs = rep_intrs, ...}, thy2) = |
184 val ({raw_induct = rep_induct, intrs = rep_intrs, ...}, thy2) = |
185 InductivePackage.add_inductive_global (serial_string ()) |
185 InductivePackage.add_inductive_global (serial_string ()) |
186 {quiet_mode = ! quiet_mode, verbose = false, kind = Thm.internalK, |
186 {quiet_mode = ! quiet_mode, verbose = false, kind = Thm.internalK, |
187 alt_name = Name.binding big_rec_name, coind = false, no_elim = true, no_ind = false, |
187 alt_name = Binding.name big_rec_name, coind = false, no_elim = true, no_ind = false, |
188 skip_mono = true} |
188 skip_mono = true} |
189 (map (fn s => ((Name.binding s, UnivT'), NoSyn)) rep_set_names') [] |
189 (map (fn s => ((Binding.name s, UnivT'), NoSyn)) rep_set_names') [] |
190 (map (fn x => (Attrib.no_binding, x)) intr_ts) [] thy1; |
190 (map (fn x => (Attrib.empty_binding, x)) intr_ts) [] thy1; |
191 |
191 |
192 (********************************* typedef ********************************) |
192 (********************************* typedef ********************************) |
193 |
193 |
194 val (typedefs, thy3) = thy2 |> |
194 val (typedefs, thy3) = thy2 |> |
195 parent_path flat_names |> |
195 parent_path flat_names |> |
208 val big_rep_name = (space_implode "_" new_type_names) ^ "_Rep_"; |
208 val big_rep_name = (space_implode "_" new_type_names) ^ "_Rep_"; |
209 val rep_names = map (curry op ^ "Rep_") new_type_names; |
209 val rep_names = map (curry op ^ "Rep_") new_type_names; |
210 val rep_names' = map (fn i => big_rep_name ^ (string_of_int i)) |
210 val rep_names' = map (fn i => big_rep_name ^ (string_of_int i)) |
211 (1 upto (length (flat (tl descr)))); |
211 (1 upto (length (flat (tl descr)))); |
212 val all_rep_names = map (Sign.intern_const thy3) rep_names @ |
212 val all_rep_names = map (Sign.intern_const thy3) rep_names @ |
213 map (Sign.full_name thy3) rep_names'; |
213 map (Sign.full_bname thy3) rep_names'; |
214 |
214 |
215 (* isomorphism declarations *) |
215 (* isomorphism declarations *) |
216 |
216 |
217 val iso_decls = map (fn (T, s) => (s, T --> Univ_elT, NoSyn)) |
217 val iso_decls = map (fn (T, s) => (s, T --> Univ_elT, NoSyn)) |
218 (oldTs ~~ rep_names'); |
218 (oldTs ~~ rep_names'); |