243 val mss' = map (fn [0] => [1] | ms => ms) mss; |
243 val mss' = map (fn [0] => [1] | ms => ms) mss; |
244 |
244 |
245 val p_Tss = |
245 val p_Tss = |
246 map2 (fn C => fn n => replicate (Int.max (0, n - 1)) (C --> HOLogic.boolT)) Cs ns; |
246 map2 (fn C => fn n => replicate (Int.max (0, n - 1)) (C --> HOLogic.boolT)) Cs ns; |
247 |
247 |
248 fun popescu_zip [] [fs] = fs |
248 fun zip_preds_getters [] [fs] = fs |
249 | popescu_zip (p :: ps) (fs :: fss) = p :: fs @ popescu_zip ps fss; |
249 | zip_preds_getters (p :: ps) (fs :: fss) = p :: fs @ zip_preds_getters ps fss; |
250 |
250 |
251 fun mk_types fun_Ts = |
251 fun mk_types fun_Ts = |
252 let |
252 let |
253 val f_sum_prod_Ts = map range_type fun_Ts; |
253 val f_sum_prod_Ts = map range_type fun_Ts; |
254 val f_prod_Tss = map2 dest_sumTN ns f_sum_prod_Ts; |
254 val f_prod_Tss = map2 dest_sumTN ns f_sum_prod_Ts; |
255 val f_Tsss = |
255 val f_Tsss = |
256 map3 (fn C => map2 (map (curry (op -->) C) oo dest_tupleT)) Cs mss' f_prod_Tss; |
256 map3 (fn C => map2 (map (curry (op -->) C) oo dest_tupleT)) Cs mss' f_prod_Tss; |
257 val pf_Tss = map2 popescu_zip p_Tss f_Tsss |
257 val pf_Tss = map2 zip_preds_getters p_Tss f_Tsss |
258 in (f_sum_prod_Ts, f_prod_Tss, f_Tsss, pf_Tss) end; |
258 in (f_sum_prod_Ts, f_prod_Tss, f_Tsss, pf_Tss) end; |
259 |
259 |
260 val (g_sum_prod_Ts, g_prod_Tss, g_Tsss, pg_Tss) = mk_types fp_iter_fun_Ts; |
260 val (g_sum_prod_Ts, g_prod_Tss, g_Tsss, pg_Tss) = mk_types fp_iter_fun_Ts; |
261 val (h_sum_prod_Ts, h_prod_Tss, h_Tsss, ph_Tss) = mk_types fp_rec_fun_Ts; |
261 val (h_sum_prod_Ts, h_prod_Tss, h_Tsss, ph_Tss) = mk_types fp_rec_fun_Ts; |
262 |
262 |
271 |
271 |
272 val cpss = map2 (fn c => map (fn p => p $ c)) cs pss; |
272 val cpss = map2 (fn c => map (fn p => p $ c)) cs pss; |
273 |
273 |
274 fun mk_terms fsss = |
274 fun mk_terms fsss = |
275 let |
275 let |
276 val pfss = map2 popescu_zip pss fsss; |
276 val pfss = map2 zip_preds_getters pss fsss; |
277 val cfsss = map2 (fn c => map (map (fn f => f $ c))) cs fsss |
277 val cfsss = map2 (fn c => map (map (fn f => f $ c))) cs fsss |
278 in (pfss, cfsss) end; |
278 in (pfss, cfsss) end; |
279 in |
279 in |
280 ((([], [], []), ([], [], [])), |
280 ((([], [], []), ([], [], [])), |
281 ([z], cs, cpss, p_Tss, (mk_terms gsss, g_sum_prod_Ts, g_prod_Tss, pg_Tss), |
281 ([z], cs, cpss, p_Tss, (mk_terms gsss, g_sum_prod_Ts, g_prod_Tss, pg_Tss), |
407 let |
407 let |
408 val res_T = fold_rev (curry (op --->)) pf_Tss B_to_fpT; |
408 val res_T = fold_rev (curry (op --->)) pf_Tss B_to_fpT; |
409 |
409 |
410 val binder = Binding.suffix_name ("_" ^ suf) b; |
410 val binder = Binding.suffix_name ("_" ^ suf) b; |
411 |
411 |
412 fun mk_popescu_join c n cps sum_prod_T prod_Ts cfss = |
412 fun mk_preds_getters_join c n cps sum_prod_T prod_Ts cfss = |
413 Term.lambda c (mk_IfN sum_prod_T cps |
413 Term.lambda c (mk_IfN sum_prod_T cps |
414 (map2 (mk_InN prod_Ts) (map HOLogic.mk_tuple cfss) (1 upto n))); |
414 (map2 (mk_InN prod_Ts) (map HOLogic.mk_tuple cfss) (1 upto n))); |
415 |
415 |
416 val spec = |
416 val spec = |
417 mk_Trueprop_eq (lists_bmoc pfss (Free (Binding.name_of binder, res_T)), |
417 mk_Trueprop_eq (lists_bmoc pfss (Free (Binding.name_of binder, res_T)), |
418 Term.list_comb (fp_iter_like, |
418 Term.list_comb (fp_iter_like, |
419 map6 mk_popescu_join cs ns cpss f_sum_prod_Ts f_prod_Tss cfsss)); |
419 map6 mk_preds_getters_join cs ns cpss f_sum_prod_Ts f_prod_Tss cfsss)); |
420 in (binder, spec) end; |
420 in (binder, spec) end; |
421 |
421 |
422 val coiter_likes = |
422 val coiter_likes = |
423 [(coiterN, fp_iter, coiter_only), |
423 [(coiterN, fp_iter, coiter_only), |
424 (corecN, fp_rec, corec_only)]; |
424 (corecN, fp_rec, corec_only)]; |