45 in |
45 in |
46 Const (@{const_name sum_map}, fT --> gT --> mk_sumT (fAT, gAT) --> mk_sumT (fBT, gBT)) $ f $ g |
46 Const (@{const_name sum_map}, fT --> gT --> mk_sumT (fAT, gAT) --> mk_sumT (fBT, gBT)) $ f $ g |
47 end; |
47 end; |
48 |
48 |
49 fun construct_mutualized_fp fp fpTs (fp_sugars : fp_sugar list) bs resBs (resDs, Dss) bnfs |
49 fun construct_mutualized_fp fp fpTs (fp_sugars : fp_sugar list) bs resBs (resDs, Dss) bnfs |
50 absT_infos lthy = |
50 (absT_infos : absT_info list) lthy = |
51 let |
51 let |
52 fun of_fp_res get = |
52 fun of_fp_res get = |
53 map (fn {fp_res, fp_res_index, ...} => nth (get fp_res) fp_res_index) fp_sugars; |
53 map (fn {fp_res, fp_res_index, ...} => nth (get fp_res) fp_res_index) fp_sugars; |
54 |
54 |
55 fun mk_co_algT T U = fp_case fp (T --> U) (U --> T); |
55 fun mk_co_algT T U = fp_case fp (T --> U) (U --> T); |
120 val absATs = map (domain_type o fastype_of) ctors; |
120 val absATs = map (domain_type o fastype_of) ctors; |
121 val absBTs = map (Term.typ_subst_atomic thetaBs) absATs; |
121 val absBTs = map (Term.typ_subst_atomic thetaBs) absATs; |
122 val xTs = map (domain_type o fastype_of) xtors; |
122 val xTs = map (domain_type o fastype_of) xtors; |
123 val yTs = map (domain_type o fastype_of) xtor's; |
123 val yTs = map (domain_type o fastype_of) xtor's; |
124 |
124 |
125 fun abs_of allAs Ds bnf = mk_abs (mk_T_of_bnf Ds allAs bnf) o #abs; |
125 val absAs = map3 (fn Ds => mk_abs o mk_T_of_bnf Ds allAs) Dss bnfs abss; |
126 fun rep_of absAT = mk_rep absAT o #rep; |
126 val absBs = map3 (fn Ds => mk_abs o mk_T_of_bnf Ds allBs) Dss bnfs abss; |
127 |
127 val fp_repAs = map2 mk_rep absATs fp_reps; |
128 val absAs = map3 (abs_of allAs) Dss bnfs absT_infos; |
128 val fp_repBs = map2 mk_rep absBTs fp_reps; |
129 val absBs = map3 (abs_of allBs) Dss bnfs absT_infos; |
|
130 val fp_repAs = map2 rep_of absATs fp_absT_infos; |
|
131 val fp_repBs = map2 rep_of absBTs fp_absT_infos; |
|
132 |
129 |
133 val (((((phis, phis'), pre_phis), xs), ys), names_lthy) = names_lthy |
130 val (((((phis, phis'), pre_phis), xs), ys), names_lthy) = names_lthy |
134 |> mk_Frees' "R" phiTs |
131 |> mk_Frees' "R" phiTs |
135 ||>> mk_Frees "S" pre_phiTs |
132 ||>> mk_Frees "S" pre_phiTs |
136 ||>> mk_Frees "x" xTs |
133 ||>> mk_Frees "x" xTs |