40 co_rec_discs: thm list, |
40 co_rec_discs: thm list, |
41 co_rec_disc_iffs: thm list, |
41 co_rec_disc_iffs: thm list, |
42 co_rec_selss: thm list list, |
42 co_rec_selss: thm list list, |
43 co_rec_codes: thm list, |
43 co_rec_codes: thm list, |
44 co_rec_transfers: thm list, |
44 co_rec_transfers: thm list, |
|
45 rec_o_maps: thm list, |
45 common_rel_co_inducts: thm list, |
46 common_rel_co_inducts: thm list, |
46 rel_co_inducts: thm list, |
47 rel_co_inducts: thm list, |
47 common_set_inducts: thm list, |
48 common_set_inducts: thm list, |
48 set_inducts: thm list} |
49 set_inducts: thm list} |
49 |
50 |
174 val sel_transferN = "sel_transfer"; |
175 val sel_transferN = "sel_transfer"; |
175 val corec_codeN = "corec_code"; |
176 val corec_codeN = "corec_code"; |
176 val corec_transferN = "corec_transfer"; |
177 val corec_transferN = "corec_transfer"; |
177 val map_disc_iffN = "map_disc_iff"; |
178 val map_disc_iffN = "map_disc_iff"; |
178 val map_selN = "map_sel"; |
179 val map_selN = "map_sel"; |
|
180 val rec_o_mapN = "rec_o_map"; |
179 val rec_transferN = "rec_transfer"; |
181 val rec_transferN = "rec_transfer"; |
180 val set_casesN = "set_cases"; |
182 val set_casesN = "set_cases"; |
181 val set_introsN = "set_intros"; |
183 val set_introsN = "set_intros"; |
182 val set_inductN = "set_induct"; |
184 val set_inductN = "set_induct"; |
183 val set_selN = "set_sel"; |
185 val set_selN = "set_sel"; |
214 co_rec_discs: thm list, |
216 co_rec_discs: thm list, |
215 co_rec_disc_iffs: thm list, |
217 co_rec_disc_iffs: thm list, |
216 co_rec_selss: thm list list, |
218 co_rec_selss: thm list list, |
217 co_rec_codes: thm list, |
219 co_rec_codes: thm list, |
218 co_rec_transfers: thm list, |
220 co_rec_transfers: thm list, |
|
221 rec_o_maps: thm list, |
219 common_rel_co_inducts: thm list, |
222 common_rel_co_inducts: thm list, |
220 rel_co_inducts: thm list, |
223 rel_co_inducts: thm list, |
221 common_set_inducts: thm list, |
224 common_set_inducts: thm list, |
222 set_inducts: thm list}; |
225 set_inducts: thm list}; |
223 |
226 |
252 set_selssss = map (map (map (map (Morphism.thm phi)))) set_selssss, |
255 set_selssss = map (map (map (map (Morphism.thm phi)))) set_selssss, |
253 set_introssss = map (map (map (map (Morphism.thm phi)))) set_introssss, |
256 set_introssss = map (map (map (map (Morphism.thm phi)))) set_introssss, |
254 set_cases = map (Morphism.thm phi) set_cases}; |
257 set_cases = map (Morphism.thm phi) set_cases}; |
255 |
258 |
256 fun morph_fp_co_induct_sugar phi ({co_rec, common_co_inducts, co_inducts, co_rec_def, co_rec_thms, |
259 fun morph_fp_co_induct_sugar phi ({co_rec, common_co_inducts, co_inducts, co_rec_def, co_rec_thms, |
257 co_rec_discs, co_rec_disc_iffs, co_rec_selss, co_rec_codes, co_rec_transfers, |
260 co_rec_discs, co_rec_disc_iffs, co_rec_selss, co_rec_codes, co_rec_transfers, rec_o_maps, |
258 common_rel_co_inducts, rel_co_inducts, common_set_inducts, set_inducts} : fp_co_induct_sugar) = |
261 common_rel_co_inducts, rel_co_inducts, common_set_inducts, set_inducts} : fp_co_induct_sugar) = |
259 {co_rec = Morphism.term phi co_rec, |
262 {co_rec = Morphism.term phi co_rec, |
260 common_co_inducts = map (Morphism.thm phi) common_co_inducts, |
263 common_co_inducts = map (Morphism.thm phi) common_co_inducts, |
261 co_inducts = map (Morphism.thm phi) co_inducts, |
264 co_inducts = map (Morphism.thm phi) co_inducts, |
262 co_rec_def = Morphism.thm phi co_rec_def, |
265 co_rec_def = Morphism.thm phi co_rec_def, |
264 co_rec_discs = map (Morphism.thm phi) co_rec_discs, |
267 co_rec_discs = map (Morphism.thm phi) co_rec_discs, |
265 co_rec_disc_iffs = map (Morphism.thm phi) co_rec_disc_iffs, |
268 co_rec_disc_iffs = map (Morphism.thm phi) co_rec_disc_iffs, |
266 co_rec_selss = map (map (Morphism.thm phi)) co_rec_selss, |
269 co_rec_selss = map (map (Morphism.thm phi)) co_rec_selss, |
267 co_rec_codes = map (Morphism.thm phi) co_rec_codes, |
270 co_rec_codes = map (Morphism.thm phi) co_rec_codes, |
268 co_rec_transfers = map (Morphism.thm phi) co_rec_transfers, |
271 co_rec_transfers = map (Morphism.thm phi) co_rec_transfers, |
|
272 rec_o_maps = map (Morphism.thm phi) rec_o_maps, |
269 common_rel_co_inducts = map (Morphism.thm phi) common_rel_co_inducts, |
273 common_rel_co_inducts = map (Morphism.thm phi) common_rel_co_inducts, |
270 rel_co_inducts = map (Morphism.thm phi) rel_co_inducts, |
274 rel_co_inducts = map (Morphism.thm phi) rel_co_inducts, |
271 common_set_inducts = map (Morphism.thm phi) common_set_inducts, |
275 common_set_inducts = map (Morphism.thm phi) common_set_inducts, |
272 set_inducts = map (Morphism.thm phi) set_inducts}; |
276 set_inducts = map (Morphism.thm phi) set_inducts}; |
273 |
277 |
346 live_nesting_bnfs fp_res ctrXs_Tsss ctr_defss ctr_sugars co_recs co_rec_defs map_thmss |
350 live_nesting_bnfs fp_res ctrXs_Tsss ctr_defss ctr_sugars co_recs co_rec_defs map_thmss |
347 common_co_inducts co_inductss co_rec_thmss co_rec_discss co_rec_selsss rel_injectss |
351 common_co_inducts co_inductss co_rec_thmss co_rec_discss co_rec_selsss rel_injectss |
348 rel_distinctss map_disc_iffss map_selsss rel_selss rel_intross rel_casess set_thmss set_selsssss |
352 rel_distinctss map_disc_iffss map_selsss rel_selss rel_intross rel_casess set_thmss set_selsssss |
349 set_introsssss set_casess ctr_transferss case_transferss disc_transferss co_rec_disc_iffss |
353 set_introsssss set_casess ctr_transferss case_transferss disc_transferss co_rec_disc_iffss |
350 co_rec_codess co_rec_transferss common_rel_co_inducts rel_co_inductss common_set_inducts |
354 co_rec_codess co_rec_transferss common_rel_co_inducts rel_co_inductss common_set_inducts |
351 set_inductss sel_transferss noted = |
355 set_inductss sel_transferss rec_o_mapss noted = |
352 let |
356 let |
353 val fp_sugars = |
357 val fp_sugars = |
354 map_index (fn (kk, T) => |
358 map_index (fn (kk, T) => |
355 {T = T, BT = nth BTs kk, X = nth Xs kk, fp = fp, fp_res = fp_res, fp_res_index = kk, |
359 {T = T, BT = nth BTs kk, X = nth Xs kk, fp = fp, fp_res = fp_res, fp_res_index = kk, |
356 pre_bnf = nth pre_bnfs kk, absT_info = nth absT_infos kk, |
360 pre_bnf = nth pre_bnfs kk, absT_info = nth absT_infos kk, |
386 co_rec_discs = nth co_rec_discss kk, |
390 co_rec_discs = nth co_rec_discss kk, |
387 co_rec_disc_iffs = nth co_rec_disc_iffss kk, |
391 co_rec_disc_iffs = nth co_rec_disc_iffss kk, |
388 co_rec_selss = nth co_rec_selsss kk, |
392 co_rec_selss = nth co_rec_selsss kk, |
389 co_rec_codes = nth co_rec_codess kk, |
393 co_rec_codes = nth co_rec_codess kk, |
390 co_rec_transfers = nth co_rec_transferss kk, |
394 co_rec_transfers = nth co_rec_transferss kk, |
|
395 rec_o_maps = nth rec_o_mapss kk, |
391 common_rel_co_inducts = common_rel_co_inducts, |
396 common_rel_co_inducts = common_rel_co_inducts, |
392 rel_co_inducts = nth rel_co_inductss kk, |
397 rel_co_inducts = nth rel_co_inductss kk, |
393 common_set_inducts = common_set_inducts, |
398 common_set_inducts = common_set_inducts, |
394 set_inducts = nth set_inductss kk}} |
399 set_inducts = nth set_inductss kk}} |
395 |> morph_fp_sugar (substitute_noted_thm noted)) Ts; |
400 |> morph_fp_sugar (substitute_noted_thm noted)) Ts; |
1997 |
2002 |
1998 val ((pre_bnfs, absT_infos), (fp_res as {bnfs = fp_bnfs as any_fp_bnf :: _, ctors = ctors0, |
2003 val ((pre_bnfs, absT_infos), (fp_res as {bnfs = fp_bnfs as any_fp_bnf :: _, ctors = ctors0, |
1999 dtors = dtors0, xtor_co_recs = xtor_co_recs0, xtor_co_induct, dtor_ctors, |
2004 dtors = dtors0, xtor_co_recs = xtor_co_recs0, xtor_co_induct, dtor_ctors, |
2000 ctor_dtors, ctor_injects, dtor_injects, xtor_maps, xtor_setss, xtor_rels, |
2005 ctor_dtors, ctor_injects, dtor_injects, xtor_maps, xtor_setss, xtor_rels, |
2001 xtor_co_rec_thms, xtor_rel_co_induct, dtor_set_inducts, |
2006 xtor_co_rec_thms, xtor_rel_co_induct, dtor_set_inducts, |
2002 xtor_co_rec_transfers, ...}, |
2007 xtor_co_rec_transfers, xtor_co_rec_o_maps, ...}, |
2003 lthy)) = |
2008 lthy)) = |
2004 fp_bnf (construct_fp mixfixes map_bs rel_bs set_bss) fp_bs (map dest_TFree unsorted_As) |
2009 fp_bnf (construct_fp mixfixes map_bs rel_bs set_bss) fp_bs (map dest_TFree unsorted_As) |
2005 (map dest_TFree killed_As) fp_eqs no_defs_lthy |
2010 (map dest_TFree killed_As) fp_eqs no_defs_lthy |
2006 handle BAD_DEAD (X, X_backdrop) => |
2011 handle BAD_DEAD (X, X_backdrop) => |
2007 (case X_backdrop of |
2012 (case X_backdrop of |
2046 val pre_map_defs = map map_def_of_bnf pre_bnfs; |
2051 val pre_map_defs = map map_def_of_bnf pre_bnfs; |
2047 val pre_set_defss = map set_defs_of_bnf pre_bnfs; |
2052 val pre_set_defss = map set_defs_of_bnf pre_bnfs; |
2048 val pre_rel_defs = map rel_def_of_bnf pre_bnfs; |
2053 val pre_rel_defs = map rel_def_of_bnf pre_bnfs; |
2049 val fp_nesting_set_maps = maps set_map_of_bnf fp_nesting_bnfs; |
2054 val fp_nesting_set_maps = maps set_map_of_bnf fp_nesting_bnfs; |
2050 val live_nesting_map_id0s = map map_id0_of_bnf live_nesting_bnfs; |
2055 val live_nesting_map_id0s = map map_id0_of_bnf live_nesting_bnfs; |
|
2056 val live_nesting_map_ident0s = map map_ident0_of_bnf live_nesting_bnfs; |
2051 val live_nesting_set_maps = maps set_map_of_bnf live_nesting_bnfs; |
2057 val live_nesting_set_maps = maps set_map_of_bnf live_nesting_bnfs; |
2052 val live_nesting_rel_eqs = map rel_eq_of_bnf live_nesting_bnfs; |
2058 val live_nesting_rel_eqs = map rel_eq_of_bnf live_nesting_bnfs; |
2053 |
2059 |
2054 val live = live_of_bnf any_fp_bnf; |
2060 val live = live_of_bnf any_fp_bnf; |
2055 val _ = |
2061 val _ = |
2062 @{map 3} (fn alive => fn A as TFree (_, S) => fn B => |
2068 @{map 3} (fn alive => fn A as TFree (_, S) => fn B => |
2063 if alive then resort_tfree_or_tvar S B else A) |
2069 if alive then resort_tfree_or_tvar S B else A) |
2064 (liveness_of_fp_bnf num_As any_fp_bnf) As Bs0; |
2070 (liveness_of_fp_bnf num_As any_fp_bnf) As Bs0; |
2065 |
2071 |
2066 val B_ify_T = Term.typ_subst_atomic (As ~~ Bs); |
2072 val B_ify_T = Term.typ_subst_atomic (As ~~ Bs); |
|
2073 val live_AsBs = filter (op <>) (As ~~ Bs); |
2067 |
2074 |
2068 val ctors = map (mk_ctor As) ctors0; |
2075 val ctors = map (mk_ctor As) ctors0; |
2069 val dtors = map (mk_dtor As) dtors0; |
2076 val dtors = map (mk_dtor As) dtors0; |
2070 |
2077 |
2071 val fpTs = map (domain_type o fastype_of) dtors; |
2078 val fpTs = map (domain_type o fastype_of) dtors; |
2206 injects @ distincts @ case_thms @ co_recs @ map_thms @ rel_injects @ rel_distincts @ |
2213 injects @ distincts @ case_thms @ co_recs @ map_thms @ rel_injects @ rel_distincts @ |
2207 set_thmss; |
2214 set_thmss; |
2208 |
2215 |
2209 fun mk_co_rec_transfer_goals lthy co_recs = |
2216 fun mk_co_rec_transfer_goals lthy co_recs = |
2210 let |
2217 let |
2211 val liveAsBs = filter (op <>) (As ~~ Bs); |
2218 val B_ify = Term.subst_atomic_types (live_AsBs @ (Cs ~~ Es)); |
2212 val B_ify = Term.subst_atomic_types (liveAsBs @ (Cs ~~ Es)); |
|
2213 |
2219 |
2214 val ((Rs, Ss), names_lthy) = lthy |
2220 val ((Rs, Ss), names_lthy) = lthy |
2215 |> mk_Frees "R" (map (uncurry mk_pred2T) liveAsBs) |
2221 |> mk_Frees "R" (map (uncurry mk_pred2T) live_AsBs) |
2216 ||>> mk_Frees "S" (map2 mk_pred2T Cs Es); |
2222 ||>> mk_Frees "S" (map2 mk_pred2T Cs Es); |
2217 |
2223 |
2218 val co_recBs = map B_ify co_recs; |
2224 val co_recBs = map B_ify co_recs; |
2219 in |
2225 in |
2220 (Rs, Ss, map2 (mk_parametricity_goal lthy (Rs @ Ss)) co_recs co_recBs, names_lthy) |
2226 (Rs, Ss, map2 (mk_parametricity_goal lthy (Rs @ Ss)) co_recs co_recBs, names_lthy) |
2228 xtor_co_rec_transfers pre_rel_defs live_nesting_rel_eqs) |
2234 xtor_co_rec_transfers pre_rel_defs live_nesting_rel_eqs) |
2229 |> Conjunction.elim_balanced nn |
2235 |> Conjunction.elim_balanced nn |
2230 |> Proof_Context.export names_lthy lthy |
2236 |> Proof_Context.export names_lthy lthy |
2231 |> map Thm.close_derivation |
2237 |> map Thm.close_derivation |
2232 end; |
2238 end; |
|
2239 |
|
2240 fun derive_rec_o_map_thmss lthy recs rec_defs = |
|
2241 if live = 0 then replicate nn [] |
|
2242 else |
|
2243 let |
|
2244 fun variant_names n pre = fst (Variable.variant_fixes (replicate n pre) lthy); |
|
2245 |
|
2246 val maps0 = map map_of_bnf fp_bnfs; |
|
2247 val ABs = As ~~ Bs |
|
2248 val liveness = map (op <>) ABs; |
|
2249 val f_names = variant_names num_As "f"; |
|
2250 val fs = map2 (curry Free) f_names (map (op -->) ABs); |
|
2251 val live_gs = AList.find (op =) (fs ~~ liveness) true; |
|
2252 |
|
2253 val gmaps = map (fn map0 => Term.list_comb (mk_map live As Bs map0, live_gs)) maps0; |
|
2254 |
|
2255 val rec_Ts as rec_T1 :: _ = map fastype_of recs; |
|
2256 val rec_arg_Ts = binder_fun_types rec_T1; |
|
2257 |
|
2258 val B_ify_T = Term.typ_subst_atomic (As ~~ Bs); |
|
2259 |
|
2260 val num_rec_args = length rec_arg_Ts; |
|
2261 val g_Ts = map B_ify_T rec_arg_Ts; |
|
2262 val g_names = variant_names num_rec_args "g"; |
|
2263 val gs = map2 (curry Free) g_names g_Ts; |
|
2264 val grecs = map (fn recx => Term.list_comb (Term.map_types B_ify_T recx, gs)) recs; |
|
2265 |
|
2266 val rec_o_map_lhss = map2 (curry HOLogic.mk_comp) grecs gmaps; |
|
2267 |
|
2268 val ABfs = ABs ~~ fs; |
|
2269 |
|
2270 fun mk_rec_arg_arg (x as Free (_, T)) = |
|
2271 let val U = B_ify_T T in |
|
2272 if T = U then x else build_map lthy [] (the o AList.lookup (op =) ABfs) (T, U) $ x |
|
2273 end; |
|
2274 |
|
2275 fun mk_rec_o_map_arg rec_arg_T h = |
|
2276 let |
|
2277 val x_Ts = binder_types rec_arg_T; |
|
2278 val m = length x_Ts; |
|
2279 val x_names = variant_names m "x"; |
|
2280 val xs = map2 (curry Free) x_names x_Ts; |
|
2281 val xs' = map mk_rec_arg_arg xs; |
|
2282 in |
|
2283 fold_rev Term.lambda xs (Term.list_comb (h, xs')) |
|
2284 end; |
|
2285 |
|
2286 fun mk_rec_o_map_rhs recx = |
|
2287 let val args = map2 mk_rec_o_map_arg rec_arg_Ts gs in |
|
2288 Term.list_comb (recx, args) |
|
2289 end; |
|
2290 |
|
2291 val rec_o_map_rhss = map mk_rec_o_map_rhs recs; |
|
2292 |
|
2293 val rec_o_map_goals = |
|
2294 map2 (fold_rev (fold_rev Logic.all) [fs, gs] o HOLogic.mk_Trueprop oo |
|
2295 curry HOLogic.mk_eq) rec_o_map_lhss rec_o_map_rhss; |
|
2296 val rec_o_map_thms = |
|
2297 @{map 3} (fn goal => fn rec_def => fn ctor_rec_o_map => |
|
2298 Goal.prove_sorry lthy [] [] goal (fn {context = ctxt, ...} => |
|
2299 mk_rec_o_map_tac ctxt rec_def pre_map_defs live_nesting_map_ident0s abs_inverses |
|
2300 ctor_rec_o_map) |
|
2301 |> Thm.close_derivation) |
|
2302 rec_o_map_goals rec_defs xtor_co_rec_o_maps; |
|
2303 in |
|
2304 map single rec_o_map_thms |
|
2305 end; |
2233 |
2306 |
2234 fun derive_note_induct_recs_thms_for_types |
2307 fun derive_note_induct_recs_thms_for_types |
2235 ((((map_thmss, map_disc_iffss, map_selsss, rel_injectss, rel_distinctss, rel_selss, |
2308 ((((map_thmss, map_disc_iffss, map_selsss, rel_injectss, rel_distinctss, rel_selss, |
2236 rel_intross, rel_casess, set_thmss, set_selsssss, set_introsssss, |
2309 rel_intross, rel_casess, set_thmss, set_selsssss, set_introsssss, |
2237 set_casess, ctr_transferss, case_transferss, disc_transferss, sel_transferss), |
2310 set_casess, ctr_transferss, case_transferss, disc_transferss, sel_transferss), |
2277 |> massage_simple_notes fp_common_name; |
2352 |> massage_simple_notes fp_common_name; |
2278 |
2353 |
2279 val notes = |
2354 val notes = |
2280 [(inductN, map single induct_thms, fn T_name => induct_attrs @ [induct_type_attr T_name]), |
2355 [(inductN, map single induct_thms, fn T_name => induct_attrs @ [induct_type_attr T_name]), |
2281 (recN, rec_thmss, K rec_attrs), |
2356 (recN, rec_thmss, K rec_attrs), |
|
2357 (rec_o_mapN, rec_o_map_thmss, K []), |
2282 (rec_transferN, rec_transfer_thmss, K []), |
2358 (rec_transferN, rec_transfer_thmss, K []), |
2283 (rel_inductN, rel_induct_thmss, K (rel_induct_attrs @ [induct_pred_attr ""])), |
2359 (rel_inductN, rel_induct_thmss, K (rel_induct_attrs @ [induct_pred_attr ""])), |
2284 (simpsN, simp_thmss, K [])] |
2360 (simpsN, simp_thmss, K [])] |
2285 |> massage_multi_notes fp_b_names fpTs; |
2361 |> massage_multi_notes fp_b_names fpTs; |
2286 in |
2362 in |
2295 map_thmss [induct_thm] (map single induct_thms) rec_thmss (replicate nn []) |
2371 map_thmss [induct_thm] (map single induct_thms) rec_thmss (replicate nn []) |
2296 (replicate nn []) rel_injectss rel_distinctss map_disc_iffss map_selsss rel_selss |
2372 (replicate nn []) rel_injectss rel_distinctss map_disc_iffss map_selsss rel_selss |
2297 rel_intross rel_casess set_thmss set_selsssss set_introsssss set_casess ctr_transferss |
2373 rel_intross rel_casess set_thmss set_selsssss set_introsssss set_casess ctr_transferss |
2298 case_transferss disc_transferss (replicate nn []) (replicate nn []) rec_transfer_thmss |
2374 case_transferss disc_transferss (replicate nn []) (replicate nn []) rec_transfer_thmss |
2299 common_rel_induct_thms rel_induct_thmss [] (replicate nn []) sel_transferss |
2375 common_rel_induct_thms rel_induct_thmss [] (replicate nn []) sel_transferss |
|
2376 rec_o_map_thmss |
2300 end; |
2377 end; |
2301 |
2378 |
2302 fun derive_corec_transfer_thms lthy corecs corec_defs = |
2379 fun derive_corec_transfer_thms lthy corecs corec_defs = |
2303 let |
2380 let |
2304 val (Rs, Ss, goals, names_lthy) = mk_co_rec_transfer_goals lthy corecs; |
2381 val (Rs, Ss, goals, names_lthy) = mk_co_rec_transfer_goals lthy corecs; |
2414 (transpose [coinduct_thms, coinduct_strong_thms]) corec_thmss corec_disc_thmss |
2491 (transpose [coinduct_thms, coinduct_strong_thms]) corec_thmss corec_disc_thmss |
2415 corec_sel_thmsss rel_injectss rel_distinctss map_disc_iffss map_selsss rel_selss |
2492 corec_sel_thmsss rel_injectss rel_distinctss map_disc_iffss map_selsss rel_selss |
2416 rel_intross rel_casess set_thmss set_selsssss set_introsssss set_casess ctr_transferss |
2493 rel_intross rel_casess set_thmss set_selsssss set_introsssss set_casess ctr_transferss |
2417 case_transferss disc_transferss corec_disc_iff_thmss (map single corec_code_thms) |
2494 case_transferss disc_transferss corec_disc_iff_thmss (map single corec_code_thms) |
2418 corec_transfer_thmss common_rel_coinduct_thms rel_coinduct_thmss set_induct_thms |
2495 corec_transfer_thmss common_rel_coinduct_thms rel_coinduct_thmss set_induct_thms |
2419 (replicate nn (if nn = 1 then set_induct_thms else [])) sel_transferss |
2496 (replicate nn (if nn = 1 then set_induct_thms else [])) sel_transferss (replicate nn []) |
2420 end; |
2497 end; |
2421 |
2498 |
2422 val lthy'' = lthy' |
2499 val lthy'' = lthy' |
2423 |> live > 0 ? fold2 (fn Type (s, _) => fn bnf => register_bnf_raw s bnf) fpTs fp_bnfs |
2500 |> live > 0 ? fold2 (fn Type (s, _) => fn bnf => register_bnf_raw s bnf) fpTs fp_bnfs |
2424 |> fold_map (define_ctrs_dtrs_for_type fp) (fp_bnfs ~~ fp_bs ~~ fpTs ~~ ctors ~~ dtors ~~ |
2501 |> fold_map (define_ctrs_dtrs_for_type fp) (fp_bnfs ~~ fp_bs ~~ fpTs ~~ ctors ~~ dtors ~~ |