equal
deleted
inserted
replaced
113 (Binding.prefix_name rec_split_N (Binding.name b_name)); |
113 (Binding.prefix_name rec_split_N (Binding.name b_name)); |
114 |
114 |
115 val bs = map mk_binding b_names; |
115 val bs = map mk_binding b_names; |
116 val rhss = mk_split_rec_rhs lthy fpTs Cs recs; |
116 val rhss = mk_split_rec_rhs lthy fpTs Cs recs; |
117 in |
117 in |
118 fold_map3 (define_co_rec_as Least_FP Cs) fpTs bs rhss lthy |
118 @{fold_map 3} (define_co_rec_as Least_FP Cs) fpTs bs rhss lthy |
119 end; |
119 end; |
120 |
120 |
121 fun mk_split_rec_thmss ctxt Xs ctrXs_Tsss ctrss rec0_thmss (recs as rec1 :: _) rec_defs = |
121 fun mk_split_rec_thmss ctxt Xs ctrXs_Tsss ctrss rec0_thmss (recs as rec1 :: _) rec_defs = |
122 let |
122 let |
123 val f_Ts = binder_fun_types (fastype_of rec1); |
123 val f_Ts = binder_fun_types (fastype_of rec1); |
147 in |
147 in |
148 fold_rev (fold_rev Logic.all) [fs, gs] |
148 fold_rev (fold_rev Logic.all) [fs, gs] |
149 (mk_Trueprop_eq (frec $ gctr, Term.list_comb (f, fgs))) |
149 (mk_Trueprop_eq (frec $ gctr, Term.list_comb (f, fgs))) |
150 end; |
150 end; |
151 |
151 |
152 val goalss = map4 (map3 o mk_goal) frecs ctrXs_Tsss ctrss fss; |
152 val goalss = @{map 4} (@{map 3} o mk_goal) frecs ctrXs_Tsss ctrss fss; |
153 |
153 |
154 fun tac ctxt = |
154 fun tac ctxt = |
155 unfold_thms_tac ctxt (@{thms o_apply fst_conv snd_conv} @ rec_defs @ flat rec0_thmss) THEN |
155 unfold_thms_tac ctxt (@{thms o_apply fst_conv snd_conv} @ rec_defs @ flat rec0_thmss) THEN |
156 HEADGOAL (rtac refl); |
156 HEADGOAL (rtac refl); |
157 |
157 |
235 fun mk_ctr_descr Ts = mk_ctr Ts #> dest_Const ##> (binder_types #> map mk_dtyp); |
235 fun mk_ctr_descr Ts = mk_ctr Ts #> dest_Const ##> (binder_types #> map mk_dtyp); |
236 fun mk_typ_descr index (Type (T_name, Ts)) ({ctrs, ...} : ctr_sugar) = |
236 fun mk_typ_descr index (Type (T_name, Ts)) ({ctrs, ...} : ctr_sugar) = |
237 (index, (T_name, map mk_dtyp Ts, map (mk_ctr_descr Ts) ctrs)); |
237 (index, (T_name, map mk_dtyp Ts, map (mk_ctr_descr Ts) ctrs)); |
238 |
238 |
239 val fp_ctr_sugars = map (#ctr_sugar o #fp_ctr_sugar o checked_fp_sugar_of) fpT_names; |
239 val fp_ctr_sugars = map (#ctr_sugar o #fp_ctr_sugar o checked_fp_sugar_of) fpT_names; |
240 val orig_descr = map3 mk_typ_descr (0 upto nn_fp - 1) fpTs fp_ctr_sugars; |
240 val orig_descr = @{map 3} mk_typ_descr (0 upto nn_fp - 1) fpTs fp_ctr_sugars; |
241 val all_infos = Old_Datatype_Data.get_all thy; |
241 val all_infos = Old_Datatype_Data.get_all thy; |
242 val (orig_descr' :: nested_descrs) = |
242 val (orig_descr' :: nested_descrs) = |
243 if member (op =) prefs Keep_Nesting then [orig_descr] |
243 if member (op =) prefs Keep_Nesting then [orig_descr] |
244 else fst (Old_Datatype_Aux.unfold_datatypes lthy orig_descr all_infos orig_descr nn_fp); |
244 else fst (Old_Datatype_Aux.unfold_datatypes lthy orig_descr all_infos orig_descr nn_fp); |
245 |
245 |