142 val phi = Morphism.term_morphism "BNF" (Term.subst_TVars rho); |
142 val phi = Morphism.term_morphism "BNF" (Term.subst_TVars rho); |
143 in |
143 in |
144 morph_ctr_sugar phi ctr_sugar |
144 morph_ctr_sugar phi ctr_sugar |
145 end; |
145 end; |
146 |
146 |
|
147 val ctor_iff_dtors = map (#ctor_iff_dtor o #fp_ctr_sugar) fp_sugars0; |
147 val ctr_defss = map (#ctr_defs o #fp_ctr_sugar) fp_sugars0; |
148 val ctr_defss = map (#ctr_defs o #fp_ctr_sugar) fp_sugars0; |
148 val mapss = map (#map_thms o #fp_bnf_sugar) fp_sugars0; |
149 val mapss = map (#map_thms o #fp_bnf_sugar) fp_sugars0; |
149 val ctr_sugars = map2 target_ctr_sugar_of_fp_sugar fpTs fp_sugars0; |
150 val ctr_sugars = map2 target_ctr_sugar_of_fp_sugar fpTs fp_sugars0; |
150 |
151 |
151 val ctrss = map #ctrs ctr_sugars; |
152 val ctrss = map #ctrs ctr_sugars; |
289 ||> (fn info => (NONE, SOME info)); |
290 ||> (fn info => (NONE, SOME info)); |
290 |
291 |
291 val names_lthy = lthy |> fold Variable.declare_typ (As @ Cs @ Xs); |
292 val names_lthy = lthy |> fold Variable.declare_typ (As @ Cs @ Xs); |
292 val phi = Proof_Context.export_morphism names_lthy lthy; |
293 val phi = Proof_Context.export_morphism names_lthy lthy; |
293 |
294 |
294 fun mk_target_fp_sugar T X kk pre_bnf absT_info ctrXs_Tss ctr_defs ctr_sugar co_rec |
295 fun mk_target_fp_sugar T X kk pre_bnf absT_info ctrXs_Tss ctor_iff_dtor ctr_defs ctr_sugar |
295 co_rec_def map_thms co_inducts co_rec_thms co_rec_disc_thms co_rec_sel_thmss |
296 co_rec co_rec_def map_thms co_inducts co_rec_thms co_rec_disc_thms co_rec_sel_thmss |
296 ({fp_ctr_sugar = {ctr_transfers, case_transfers, disc_transfers, sel_transfers, ...}, |
297 ({fp_ctr_sugar = {ctr_transfers, case_transfers, disc_transfers, sel_transfers, ...}, |
297 fp_bnf_sugar = {map_disc_iffs, map_selss, rel_injects, rel_distincts, rel_sels, |
298 fp_bnf_sugar = {map_disc_iffs, map_selss, rel_injects, rel_distincts, rel_sels, |
298 rel_intros, rel_cases, set_thms, set_selssss, set_introssss, set_cases, ...}, |
299 rel_intros, rel_cases, set_thms, set_selssss, set_introssss, set_cases, ...}, |
299 fp_co_induct_sugar = {co_rec_disc_iffs, co_rec_codes, co_rec_transfers, |
300 fp_co_induct_sugar = {co_rec_disc_iffs, co_rec_codes, co_rec_transfers, |
300 co_rec_o_maps, common_rel_co_inducts, rel_co_inducts, common_set_inducts, |
301 co_rec_o_maps, common_rel_co_inducts, rel_co_inducts, common_set_inducts, |
303 {T = T, BT = T (*wrong but harmless*), X = X, fp = fp, fp_res = fp_res, fp_res_index = kk, |
304 {T = T, BT = T (*wrong but harmless*), X = X, fp = fp, fp_res = fp_res, fp_res_index = kk, |
304 pre_bnf = pre_bnf, fp_bnf = nth (#bnfs fp_res) kk, absT_info = absT_info, |
305 pre_bnf = pre_bnf, fp_bnf = nth (#bnfs fp_res) kk, absT_info = absT_info, |
305 fp_nesting_bnfs = fp_nesting_bnfs, live_nesting_bnfs = live_nesting_bnfs, |
306 fp_nesting_bnfs = fp_nesting_bnfs, live_nesting_bnfs = live_nesting_bnfs, |
306 fp_ctr_sugar = |
307 fp_ctr_sugar = |
307 {ctrXs_Tss = ctrXs_Tss, |
308 {ctrXs_Tss = ctrXs_Tss, |
|
309 ctor_iff_dtor = ctor_iff_dtor, |
308 ctr_defs = ctr_defs, |
310 ctr_defs = ctr_defs, |
309 ctr_sugar = ctr_sugar, |
311 ctr_sugar = ctr_sugar, |
310 ctr_transfers = ctr_transfers, |
312 ctr_transfers = ctr_transfers, |
311 case_transfers = case_transfers, |
313 case_transfers = case_transfers, |
312 disc_transfers = disc_transfers, |
314 disc_transfers = disc_transfers, |
341 common_set_inducts = common_set_inducts, |
343 common_set_inducts = common_set_inducts, |
342 set_inducts = set_inducts}} |
344 set_inducts = set_inducts}} |
343 |> morph_fp_sugar phi; |
345 |> morph_fp_sugar phi; |
344 |
346 |
345 val target_fp_sugars = |
347 val target_fp_sugars = |
346 @{map 16} mk_target_fp_sugar fpTs Xs kks pre_bnfs absT_infos ctrXs_Tsss ctr_defss |
348 @{map 17} mk_target_fp_sugar fpTs Xs kks pre_bnfs absT_infos ctrXs_Tsss ctor_iff_dtors |
347 ctr_sugars co_recs co_rec_defs mapss (transpose co_inductss') co_rec_thmss |
349 ctr_defss ctr_sugars co_recs co_rec_defs mapss (transpose co_inductss') co_rec_thmss |
348 co_rec_disc_thmss co_rec_sel_thmsss fp_sugars0; |
350 co_rec_disc_thmss co_rec_sel_thmsss fp_sugars0; |
349 |
351 |
350 val n2m_sugar = (target_fp_sugars, fp_sugar_thms); |
352 val n2m_sugar = (target_fp_sugars, fp_sugar_thms); |
351 in |
353 in |
352 (n2m_sugar, lthy |> register_n2m_sugar key n2m_sugar) |
354 (n2m_sugar, lthy |> register_n2m_sugar key n2m_sugar) |