448 else |
448 else |
449 sel)) (1 upto m) o pad_list Binding.empty m) ctrs0 ms raw_sel_bindingss; |
449 sel)) (1 upto m) o pad_list Binding.empty m) ctrs0 ms raw_sel_bindingss; |
450 |
450 |
451 val case_Ts = map (fn Ts => Ts ---> B) ctr_Tss; |
451 val case_Ts = map (fn Ts => Ts ---> B) ctr_Tss; |
452 |
452 |
453 val ((((((((([exh_y], (xss, xss')), yss), fs), gs), [h]), [u', v']), [w]), (p, p')), names_lthy) = |
453 val ((((((((([exh_y], (xss, xss')), yss), fs), gs), [h]), [u', v']), [w]), (p, p')), |
|
454 names_lthy) = |
454 no_defs_lthy |
455 no_defs_lthy |
455 |> mk_Frees "y" [fcT] (* for compatibility with "datatype_realizer.ML" *) |
456 |> mk_Frees "y" [fcT] (* for compatibility with "datatype_realizer.ML" *) |
456 ||>> mk_Freess' "x" ctr_Tss |
457 ||>> mk_Freess' "x" ctr_Tss |
457 ||>> mk_Freess "y" ctr_Tss |
458 ||>> mk_Freess "y" ctr_Tss |
458 ||>> mk_Frees "f" case_Ts |
459 ||>> mk_Frees "f" case_Ts |
667 map (map mk_goal) (mk_half_pairss (`I (xss ~~ xctrs))) |
668 map (map mk_goal) (mk_half_pairss (`I (xss ~~ xctrs))) |
668 end; |
669 end; |
669 |
670 |
670 val goalss = [exhaust_goal] :: inject_goalss @ half_distinct_goalss; |
671 val goalss = [exhaust_goal] :: inject_goalss @ half_distinct_goalss; |
671 |
672 |
672 fun after_qed thmss0 lthy = |
673 fun after_qed (thmss0 as [exhaust_thm] :: thmss) lthy = |
673 let |
674 let |
674 val [exhaust_thm] :: thmss = thmss0 |
|
675 val ((inject_thms, inject_thmss), half_distinct_thmss) = chop n thmss |>> `flat; |
675 val ((inject_thms, inject_thmss), half_distinct_thmss) = chop n thmss |>> `flat; |
676 |
676 |
677 val rho_As = map (apply2 (certifyT lthy)) (map Logic.varifyT_global As ~~ As); |
677 val rho_As = map (apply2 (certifyT lthy)) (map Logic.varifyT_global As ~~ As); |
678 |
678 |
679 fun inst_thm t thm = |
679 fun inst_thm t thm = |
1069 |
1069 |
1070 val ctr_sugar = |
1070 val ctr_sugar = |
1071 {kind = kind, T = fcT, ctrs = ctrs, casex = casex, discs = discs, selss = selss, |
1071 {kind = kind, T = fcT, ctrs = ctrs, casex = casex, discs = discs, selss = selss, |
1072 exhaust = exhaust_thm, nchotomy = nchotomy_thm, injects = inject_thms, |
1072 exhaust = exhaust_thm, nchotomy = nchotomy_thm, injects = inject_thms, |
1073 distincts = distinct_thms, case_thms = case_thms, case_cong = case_cong_thm, |
1073 distincts = distinct_thms, case_thms = case_thms, case_cong = case_cong_thm, |
1074 case_cong_weak = case_cong_weak_thm, case_distribs = [case_distrib_thm], split = split_thm, |
1074 case_cong_weak = case_cong_weak_thm, case_distribs = [case_distrib_thm], |
1075 split_asm = split_asm_thm, disc_defs = disc_defs, disc_thmss = disc_thmss, |
1075 split = split_thm, split_asm = split_asm_thm, disc_defs = disc_defs, |
1076 discIs = discI_thms, sel_defs = sel_defs, sel_thmss = sel_thmss, |
1076 disc_thmss = disc_thmss, discIs = discI_thms, sel_defs = sel_defs, sel_thmss = sel_thmss, |
1077 distinct_discsss = distinct_disc_thmsss, exhaust_discs = exhaust_disc_thms, |
1077 distinct_discsss = distinct_disc_thmsss, exhaust_discs = exhaust_disc_thms, |
1078 exhaust_sels = exhaust_sel_thms, collapses = all_collapse_thms, expands = expand_thms, |
1078 exhaust_sels = exhaust_sel_thms, collapses = all_collapse_thms, expands = expand_thms, |
1079 split_sels = split_sel_thms, split_sel_asms = split_sel_asm_thms, |
1079 split_sels = split_sel_thms, split_sel_asms = split_sel_asm_thms, |
1080 case_eq_ifs = case_eq_if_thms} |
1080 case_eq_ifs = case_eq_if_thms} |
1081 |> morph_ctr_sugar (substitute_noted_thm noted); |
1081 |> morph_ctr_sugar (substitute_noted_thm noted); |