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 = |