src/HOL/BNF/Tools/bnf_fp_def_sugar.ML
changeset 52306 0f5099b45171
parent 52305 3f7b92017d71
child 52309 f71d0a604e5a
equal deleted inserted replaced
52305:3f7b92017d71 52306:0f5099b45171
   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