src/HOL/BNF/Tools/bnf_fp_def_sugar.ML
changeset 51830 403f7ecd061f
parent 51829 3cc93eeac8cc
child 51831 a5137cd2c2c2
equal deleted inserted replaced
51829:3cc93eeac8cc 51830:403f7ecd061f
   345     val mss = map (map length) ctr_Tsss;
   345     val mss = map (map length) ctr_Tsss;
   346     val Css = map2 replicate ns Cs;
   346     val Css = map2 replicate ns Cs;
   347 
   347 
   348     val pre_map_defs = map map_def_of_bnf pre_bnfs;
   348     val pre_map_defs = map map_def_of_bnf pre_bnfs;
   349     val pre_set_defss = map set_defs_of_bnf pre_bnfs;
   349     val pre_set_defss = map set_defs_of_bnf pre_bnfs;
       
   350     val nesting_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nesting_bnfs;
   350     val nested_map_comp's = map map_comp'_of_bnf nested_bnfs;
   351     val nested_map_comp's = map map_comp'_of_bnf nested_bnfs;
   351     val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs;
   352     val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs;
   352     val nested_set_map's = maps set_map'_of_bnf nested_bnfs;
   353     val nested_set_map's = maps set_map'_of_bnf nested_bnfs;
   353     val nesting_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nesting_bnfs;
       
   354 
   354 
   355     val fp_b_names = map base_name_of_typ fpTs;
   355     val fp_b_names = map base_name_of_typ fpTs;
   356 
   356 
   357     val (_, ctor_fold_fun_Ts) = mk_fp_rec_like true As Cs ctor_folds0;
   357     val (_, ctor_fold_fun_Ts) = mk_fp_rec_like true As Cs ctor_folds0;
   358     val (_, ctor_rec_fun_Ts) = mk_fp_rec_like true As Cs ctor_recs0;
   358     val (_, ctor_rec_fun_Ts) = mk_fp_rec_like true As Cs ctor_recs0;
   512   let
   512   let
   513     val nn = length pre_bnfs;
   513     val nn = length pre_bnfs;
   514 
   514 
   515     val pre_map_defs = map map_def_of_bnf pre_bnfs;
   515     val pre_map_defs = map map_def_of_bnf pre_bnfs;
   516     val pre_rel_defs = map rel_def_of_bnf pre_bnfs;
   516     val pre_rel_defs = map rel_def_of_bnf pre_bnfs;
       
   517     val nesting_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nesting_bnfs;
       
   518     val nesting_rel_eqs = map rel_eq_of_bnf nesting_bnfs;
   517     val nested_map_comp's = map map_comp'_of_bnf nested_bnfs;
   519     val nested_map_comp's = map map_comp'_of_bnf nested_bnfs;
   518     val nested_map_comps'' = map ((fn thm => thm RS sym) o map_comp_of_bnf) nested_bnfs;
   520     val nested_map_comps'' = map ((fn thm => thm RS sym) o map_comp_of_bnf) nested_bnfs;
   519     val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs;
   521     val nested_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nested_bnfs;
   520     val nesting_map_ids'' = map (unfold_thms lthy @{thms id_def} o map_id_of_bnf) nesting_bnfs;
       
   521     val nesting_rel_eqs = map rel_eq_of_bnf nesting_bnfs;
       
   522 
   522 
   523     val fp_b_names = map base_name_of_typ fpTs;
   523     val fp_b_names = map base_name_of_typ fpTs;
   524 
   524 
   525     val (_, dtor_unfold_fun_Ts) = mk_fp_rec_like false As Cs dtor_unfolds0;
   525     val (_, dtor_unfold_fun_Ts) = mk_fp_rec_like false As Cs dtor_unfolds0;
   526     val (_, dtor_corec_fun_Ts) = mk_fp_rec_like false As Cs dtor_corecs0;
   526     val (_, dtor_corec_fun_Ts) = mk_fp_rec_like false As Cs dtor_corecs0;
   536       lthy
   536       lthy
   537       |> mk_Frees "R" (map (fn T => mk_pred2T T T) fpTs)
   537       |> mk_Frees "R" (map (fn T => mk_pred2T T T) fpTs)
   538       ||>> Variable.variant_fixes fp_b_names
   538       ||>> Variable.variant_fixes fp_b_names
   539       ||>> Variable.variant_fixes (map (suffix "'") fp_b_names);
   539       ||>> Variable.variant_fixes (map (suffix "'") fp_b_names);
   540 
   540 
   541     val (p_Tss, (r_Tssss, g_sum_prod_Ts, g_Tsss, g_Tssss, pg_Tss),
   541     val (p_Tss, (r_Tssss, _, _, g_Tssss, _), (s_Tssss, _, _, h_Tssss, _)) =
   542          (s_Tssss, h_sum_prod_Ts, h_Tsss, h_Tssss, ph_Tss)) =
       
   543       mk_unfold_corec_types fpTs Cs ns mss dtor_unfold_fun_Ts dtor_corec_fun_Ts;
   542       mk_unfold_corec_types fpTs Cs ns mss dtor_unfold_fun_Ts dtor_corec_fun_Ts;
   544 
   543 
   545     val ((cs, pss, (gssss, rssss), (hssss, sssss)), names_lthy) =
   544     val ((cs, pss, (gssss, rssss), (hssss, sssss)), names_lthy) =
   546       mk_unfold_corec_vars Cs p_Tss g_Tssss r_Tssss h_Tssss s_Tssss names_lthy;
   545       mk_unfold_corec_vars Cs p_Tss g_Tssss r_Tssss h_Tssss s_Tssss names_lthy;
   547 
   546 
   909     val nested_bnfs = nesty_bnfs Xs;
   908     val nested_bnfs = nesty_bnfs Xs;
   910 
   909 
   911     val pre_map_defs = map map_def_of_bnf pre_bnfs;
   910     val pre_map_defs = map map_def_of_bnf pre_bnfs;
   912     val pre_set_defss = map set_defs_of_bnf pre_bnfs;
   911     val pre_set_defss = map set_defs_of_bnf pre_bnfs;
   913     val pre_rel_defs = map rel_def_of_bnf pre_bnfs;
   912     val pre_rel_defs = map rel_def_of_bnf pre_bnfs;
       
   913     val nesting_set_map's = maps set_map'_of_bnf nesting_bnfs;
   914     val nested_set_map's = maps set_map'_of_bnf nested_bnfs;
   914     val nested_set_map's = maps set_map'_of_bnf nested_bnfs;
   915     val nesting_set_map's = maps set_map'_of_bnf nesting_bnfs;
       
   916 
   915 
   917     val live = live_of_bnf any_fp_bnf;
   916     val live = live_of_bnf any_fp_bnf;
   918 
   917 
   919     val Bs =
   918     val Bs =
   920       map3 (fn alive => fn A as TFree (_, S) => fn B => if alive then resort_tfree S B else A)
   919       map3 (fn alive => fn A as TFree (_, S) => fn B => if alive then resort_tfree S B else A)
   949 
   948 
   950     val (fp_folds, fp_fold_fun_Ts) = mk_fp_rec_like lfp As Cs fp_folds0;
   949     val (fp_folds, fp_fold_fun_Ts) = mk_fp_rec_like lfp As Cs fp_folds0;
   951     val (fp_recs, fp_rec_fun_Ts) = mk_fp_rec_like lfp As Cs fp_recs0;
   950     val (fp_recs, fp_rec_fun_Ts) = mk_fp_rec_like lfp As Cs fp_recs0;
   952 
   951 
   953     val (((fold_only, rec_only),
   952     val (((fold_only, rec_only),
   954           (cs, cpss, unfold_only as ((pgss, crssss, cgssss), (_, g_Tsss, _)),
   953           (cs, cpss, unfold_only as ((_, crssss, cgssss), (_, g_Tsss, _)),
   955            corec_only as ((phss, csssss, chssss), (_, h_Tsss, _)))), names_lthy0) =
   954            corec_only as ((_, csssss, chssss), (_, h_Tsss, _)))), _) =
   956       if lfp then
   955       if lfp then
   957         let
   956         let
   958           val y_Tsss = map3 mk_rec_like_fun_arg_typess ns mss fp_fold_fun_Ts;
   957           val y_Tsss = map3 mk_rec_like_fun_arg_typess ns mss fp_fold_fun_Ts;
   959           val g_Tss = mk_fold_fun_typess y_Tsss Css;
   958           val g_Tss = mk_fold_fun_typess y_Tsss Css;
   960 
   959 
  1309              (rec_thmss, rec_attrs)) =
  1308              (rec_thmss, rec_attrs)) =
  1310           derive_induct_fold_rec_thms_for_types pre_bnfs fp_folds0 fp_recs0 fp_induct fp_fold_thms
  1309           derive_induct_fold_rec_thms_for_types pre_bnfs fp_folds0 fp_recs0 fp_induct fp_fold_thms
  1311             fp_rec_thms nesting_bnfs nested_bnfs fpTs Cs As ctrss ctr_defss folds recs fold_defs
  1310             fp_rec_thms nesting_bnfs nested_bnfs fpTs Cs As ctrss ctr_defss folds recs fold_defs
  1312             rec_defs lthy;
  1311             rec_defs lthy;
  1313 
  1312 
  1314         fun induct_type_attr T_name = Attrib.internal (K (Induct.induct_type T_name));
  1313         val induct_type_attr = Attrib.internal o K o Induct.induct_type;
  1315 
  1314 
  1316         val simp_thmss = mk_simp_thmss ctr_wrap_ress rec_thmss fold_thmss;
  1315         val simp_thmss = mk_simp_thmss ctr_wrap_ress rec_thmss fold_thmss;
  1317 
  1316 
  1318         val common_notes =
  1317         val common_notes =
  1319           (if nn > 1 then [(inductN, [induct_thm], induct_attrs)] else [])
  1318           (if nn > 1 then [(inductN, [induct_thm], induct_attrs)] else [])
  1343              (sel_unfold_thmss, sel_corec_thmss, sel_corec_like_attrs)) =
  1342              (sel_unfold_thmss, sel_corec_thmss, sel_corec_like_attrs)) =
  1344           derive_coinduct_unfold_corec_thms_for_types pre_bnfs fp_folds0 fp_recs0 fp_induct
  1343           derive_coinduct_unfold_corec_thms_for_types pre_bnfs fp_folds0 fp_recs0 fp_induct
  1345             fp_strong_induct dtor_ctors fp_fold_thms fp_rec_thms nesting_bnfs nested_bnfs fpTs Cs As
  1344             fp_strong_induct dtor_ctors fp_fold_thms fp_rec_thms nesting_bnfs nested_bnfs fpTs Cs As
  1346             kss mss ns ctrss ctr_defss ctr_wrap_ress unfolds corecs unfold_defs corec_defs lthy;
  1345             kss mss ns ctrss ctr_defss ctr_wrap_ress unfolds corecs unfold_defs corec_defs lthy;
  1347 
  1346 
  1348         fun coinduct_type_attr T_name = Attrib.internal (K (Induct.coinduct_type T_name));
  1347         val coinduct_type_attr = Attrib.internal o K o Induct.coinduct_type;
  1349 
  1348 
  1350         fun flat_corec_like_thms corec_likes disc_corec_likes sel_corec_likes =
  1349         fun flat_corec_like_thms corec_likes disc_corec_likes sel_corec_likes =
  1351           corec_likes @ disc_corec_likes @ sel_corec_likes;
  1350           corec_likes @ disc_corec_likes @ sel_corec_likes;
  1352 
  1351 
  1353         val simp_thmss =
  1352         val simp_thmss =