equal
deleted
inserted
replaced
264 in project end; |
264 in project end; |
265 |
265 |
266 val project_recT = project_co_recT @{type_name prod}; |
266 val project_recT = project_co_recT @{type_name prod}; |
267 val project_corecT = project_co_recT @{type_name sum}; |
267 val project_corecT = project_co_recT @{type_name sum}; |
268 |
268 |
269 fun unzip_recT fpTs = meta_unzip_rec I (project_recT fpTs fst) (project_recT fpTs snd) I fpTs; |
269 fun unzip_recT fpTs (T as Type (@{type_name prod}, Ts as [T', _])) = |
|
270 if member (op =) fpTs T' then Ts else [T] |
|
271 | unzip_recT _ T = [T]; |
270 |
272 |
271 fun mk_fun_arg_typess n ms = map2 dest_tupleT ms o dest_sumTN_balanced n o domain_type; |
273 fun mk_fun_arg_typess n ms = map2 dest_tupleT ms o dest_sumTN_balanced n o domain_type; |
272 |
274 |
273 fun mk_iter_fun_arg_typessss fpTs ns mss = |
275 fun mk_iter_fun_arg_typessss fpTs ns mss = |
274 mk_fp_iter_fun_types |
276 mk_fp_iter_fun_types |
275 #> map3 mk_fun_arg_typess ns mss |
277 #> map3 mk_fun_arg_typess ns mss |
276 #> map (map (map (unzip_recT fpTs))); |
278 #> map (map (map (unzip_recT fpTs))); |
277 |
279 |
278 fun mk_fold_rec_args_types Cs ns mss ctor_fold_fun_Ts ctor_rec_fun_Ts lthy = |
280 fun mk_fold_rec_args_types fpTs Cs ns mss ctor_fold_fun_Ts ctor_rec_fun_Ts lthy = |
279 let |
281 let |
280 val Css = map2 replicate ns Cs; |
282 val Css = map2 replicate ns Cs; |
281 val y_Tsss = map3 mk_fun_arg_typess ns mss ctor_fold_fun_Ts; |
283 val y_Tsss = map3 mk_fun_arg_typess ns mss ctor_fold_fun_Ts; |
282 val g_Tss = map2 (fn C => map (fn y_Ts => y_Ts ---> C)) Cs y_Tsss; |
284 val g_Tss = map2 (fn C => map (fn y_Ts => y_Ts ---> C)) Cs y_Tsss; |
283 |
285 |
285 lthy |
287 lthy |
286 |> mk_Freess "f" g_Tss |
288 |> mk_Freess "f" g_Tss |
287 ||>> mk_Freesss "x" y_Tsss; |
289 ||>> mk_Freesss "x" y_Tsss; |
288 val yssss = map (map (map single)) ysss; |
290 val yssss = map (map (map single)) ysss; |
289 |
291 |
290 (* ### *) |
|
291 fun dest_rec_prodT (T as Type (@{type_name prod}, Us as [_, U])) = |
|
292 if member (op =) Cs U then Us else [T] |
|
293 | dest_rec_prodT T = [T]; |
|
294 |
|
295 val z_Tssss = |
292 val z_Tssss = |
296 map3 (fn n => fn ms => map2 (map dest_rec_prodT oo dest_tupleT) ms o |
293 map3 (fn n => fn ms => map2 (map (unzip_recT fpTs) oo dest_tupleT) ms o |
297 dest_sumTN_balanced n o domain_type) ns mss ctor_rec_fun_Ts; |
294 dest_sumTN_balanced n o domain_type) ns mss ctor_rec_fun_Ts; |
298 |
295 |
299 val z_Tsss = map3 mk_fun_arg_typess ns mss ctor_rec_fun_Ts; |
296 val z_Tsss = map3 mk_fun_arg_typess ns mss ctor_rec_fun_Ts; |
300 val z_Tsss' = map (map (flat_rec I)) z_Tssss; |
297 val z_Tsss' = map (map (flat_rec I)) z_Tssss; |
301 val h_Tss = map2 (map2 (curry (op --->))) z_Tsss' Css; |
298 val h_Tss = map2 (map2 (curry (op --->))) z_Tsss' Css; |
374 val (fp_rec_fun_Ts, fp_recs) = mk_co_iters thy fp fpTs Cs fp_recs0 |
371 val (fp_rec_fun_Ts, fp_recs) = mk_co_iters thy fp fpTs Cs fp_recs0 |
375 |> `(mk_fp_iter_fun_types o hd); |
372 |> `(mk_fp_iter_fun_types o hd); |
376 |
373 |
377 val ((fold_rec_args_types, unfold_corec_args_types), lthy') = |
374 val ((fold_rec_args_types, unfold_corec_args_types), lthy') = |
378 if fp = Least_FP then |
375 if fp = Least_FP then |
379 mk_fold_rec_args_types Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy |
376 mk_fold_rec_args_types fpTs Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy |
380 |>> (rpair NONE o SOME) |
377 |>> (rpair NONE o SOME) |
381 else |
378 else |
382 mk_unfold_corec_args_types fpTs Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy |
379 mk_unfold_corec_args_types fpTs Cs ns mss fp_fold_fun_Ts fp_rec_fun_Ts lthy |
383 |>> (pair NONE o SOME) |
380 |>> (pair NONE o SOME) |
384 in |
381 in |
579 |
576 |
580 val ctor_fold_fun_Ts = mk_fp_iter_fun_types (hd ctor_folds); |
577 val ctor_fold_fun_Ts = mk_fp_iter_fun_types (hd ctor_folds); |
581 val ctor_rec_fun_Ts = mk_fp_iter_fun_types (hd ctor_recs); |
578 val ctor_rec_fun_Ts = mk_fp_iter_fun_types (hd ctor_recs); |
582 |
579 |
583 val (((gss, _, _), (hss, _, _)), names_lthy0) = |
580 val (((gss, _, _), (hss, _, _)), names_lthy0) = |
584 mk_fold_rec_args_types Cs ns mss ctor_fold_fun_Ts ctor_rec_fun_Ts lthy; |
581 mk_fold_rec_args_types fpTs Cs ns mss ctor_fold_fun_Ts ctor_rec_fun_Ts lthy; |
585 |
582 |
586 val ((((ps, ps'), xsss), us'), names_lthy) = |
583 val ((((ps, ps'), xsss), us'), names_lthy) = |
587 names_lthy0 |
584 names_lthy0 |
588 |> mk_Frees' "P" (map mk_pred1T fpTs) |
585 |> mk_Frees' "P" (map mk_pred1T fpTs) |
589 ||>> mk_Freesss "x" ctr_Tsss |
586 ||>> mk_Freesss "x" ctr_Tsss |