equal
deleted
inserted
replaced
569 val fp_b_names = map base_name_of_typ fpTs; |
569 val fp_b_names = map base_name_of_typ fpTs; |
570 |
570 |
571 val ctor_fold_fun_Ts = mk_fp_iter_fun_types (hd ctor_folds); |
571 val ctor_fold_fun_Ts = mk_fp_iter_fun_types (hd ctor_folds); |
572 val ctor_rec_fun_Ts = mk_fp_iter_fun_types (hd ctor_recs); |
572 val ctor_rec_fun_Ts = mk_fp_iter_fun_types (hd ctor_recs); |
573 |
573 |
574 val (((_, y_Tssss, gss, _), (_, z_Tssss, hss, _)), names_lthy0) = |
574 val ((fold_only, rec_only), names_lthy0) = |
575 mk_fold_rec_args_types Cs ns mss ctor_fold_fun_Ts ctor_rec_fun_Ts lthy; |
575 mk_fold_rec_args_types Cs ns mss ctor_fold_fun_Ts ctor_rec_fun_Ts lthy; |
576 |
576 |
577 val ((((ps, ps'), xsss), us'), names_lthy) = |
577 val ((((ps, ps'), xsss), us'), names_lthy) = |
578 names_lthy0 |
578 names_lthy0 |
579 |> mk_Frees' "P" (map mk_pred1T fpTs) |
579 |> mk_Frees' "P" (map mk_pred1T fpTs) |
664 val induct_cases = quasi_unambiguous_case_names (maps (map name_of_ctr) ctrss); |
664 val induct_cases = quasi_unambiguous_case_names (maps (map name_of_ctr) ctrss); |
665 val induct_case_names_attr = Attrib.internal (K (Rule_Cases.case_names induct_cases)); |
665 val induct_case_names_attr = Attrib.internal (K (Rule_Cases.case_names induct_cases)); |
666 |
666 |
667 val xctrss = map2 (map2 (curry Term.list_comb)) ctrss xsss; |
667 val xctrss = map2 (map2 (curry Term.list_comb)) ctrss xsss; |
668 |
668 |
669 fun mk_iter_thmss x_Tssss fss iters iter_defs ctor_iter_thms = |
669 fun mk_iter_thmss (_, x_Tssss, fss, _) iters iter_defs ctor_iter_thms = |
670 let |
670 let |
671 val fiters = map (lists_bmoc fss) iters; |
671 val fiters = map (lists_bmoc fss) iters; |
672 |
672 |
673 fun mk_goal fss fiter xctr f xs fxs = |
673 fun mk_goal fss fiter xctr f xs fxs = |
674 fold_rev (fold_rev Logic.all) (xs :: fss) |
674 fold_rev (fold_rev Logic.all) (xs :: fss) |
685 build_map lthy (indexify (perhaps (try (snd o HOLogic.dest_prodT)) o snd) Cs |
685 build_map lthy (indexify (perhaps (try (snd o HOLogic.dest_prodT)) o snd) Cs |
686 (fn kk => fn TU => maybe_tick TU (nth us kk) (nth fiters kk))) (T, U) $ x); |
686 (fn kk => fn TU => maybe_tick TU (nth us kk) (nth fiters kk))) (T, U) $ x); |
687 |
687 |
688 val fxsss = map2 (map2 (flat_rec oo map2 unzip_iters)) xsss x_Tssss; |
688 val fxsss = map2 (map2 (flat_rec oo map2 unzip_iters)) xsss x_Tssss; |
689 |
689 |
690 val goalss = map5 (map4 o mk_goal gss) fiters xctrss fss xsss fxsss; |
690 val goalss = map5 (map4 o mk_goal fss) fiters xctrss fss xsss fxsss; |
691 |
691 |
692 val tacss = |
692 val tacss = |
693 map2 (map o mk_iter_tac pre_map_defs (nested_map_ids'' @ nesting_map_ids'') iter_defs) |
693 map2 (map o mk_iter_tac pre_map_defs (nested_map_ids'' @ nesting_map_ids'') iter_defs) |
694 ctor_iter_thms ctr_defss; |
694 ctor_iter_thms ctr_defss; |
695 |
695 |
698 |> Thm.close_derivation; |
698 |> Thm.close_derivation; |
699 in |
699 in |
700 map2 (map2 prove) goalss tacss |
700 map2 (map2 prove) goalss tacss |
701 end; |
701 end; |
702 |
702 |
703 val fold_thmss = mk_iter_thmss y_Tssss gss folds fold_defs ctor_fold_thms; |
703 val fold_thmss = mk_iter_thmss fold_only folds fold_defs ctor_fold_thms; |
704 val rec_thmss = mk_iter_thmss z_Tssss hss recs rec_defs ctor_rec_thms; |
704 val rec_thmss = mk_iter_thmss rec_only recs rec_defs ctor_rec_thms; |
705 in |
705 in |
706 ((induct_thm, induct_thms, [induct_case_names_attr]), |
706 ((induct_thm, induct_thms, [induct_case_names_attr]), |
707 (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs)) |
707 (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs)) |
708 end; |
708 end; |
709 |
709 |