54 val derive_induct_iters_thms_for_types: BNF_Def.bnf list -> term list list -> |
54 val derive_induct_iters_thms_for_types: BNF_Def.bnf list -> term list list -> |
55 (typ list list * typ list list list list * term list list * term list list list list) list -> |
55 (typ list list * typ list list list list * term list list * term list list list list) list -> |
56 thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list -> typ list -> |
56 thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list -> typ list -> |
57 typ list -> typ list list list -> term list list -> thm list list -> term list list -> |
57 typ list -> typ list list list -> term list list -> thm list list -> term list list -> |
58 thm list list -> local_theory -> |
58 thm list list -> local_theory -> |
59 (thm * thm list * Args.src list) * (thm list list * Args.src list) |
59 (thm list * thm * Args.src list) * (thm list list * Args.src list) |
60 * (thm list list * Args.src list) |
60 * (thm list list * Args.src list) |
61 val derive_coinduct_coiters_thms_for_types: BNF_Def.bnf list -> term list list -> |
61 val derive_coinduct_coiters_thms_for_types: BNF_Def.bnf list -> term list list -> |
62 term list * term list list |
62 term list * term list list |
63 * ((term list list * term list list list list * term list list list list) * 'a) list -> |
63 * ((term list list * term list list list list * term list list list list) * 'a) list -> |
64 thm list -> thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list -> |
64 thm list -> thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list -> |
65 typ list -> typ list -> int list list -> int list list -> int list -> thm list list -> |
65 typ list -> typ list -> int list list -> int list list -> int list -> thm list list -> |
66 BNF_Ctr_Sugar.ctr_sugar list -> term list list -> thm list list -> local_theory -> |
66 BNF_Ctr_Sugar.ctr_sugar list -> term list list -> thm list list -> local_theory -> |
67 (thm * thm list * thm * thm list * Args.src list) |
67 ((thm list * thm) list * Args.src list) |
68 * (thm list list * thm list list * Args.src list) |
68 * (thm list list * thm list list * Args.src list) |
69 * (thm list list * thm list list) * (thm list list * thm list list * Args.src list) |
69 * (thm list list * thm list list) * (thm list list * thm list list * Args.src list) |
70 * (thm list list * thm list list * Args.src list) |
70 * (thm list list * thm list list * Args.src list) |
71 * (thm list list * thm list list * Args.src list) |
71 * (thm list list * thm list list * Args.src list) |
72 |
72 |
673 end; |
673 end; |
674 |
674 |
675 val fold_thmss = mk_iter_thmss fold_args_types folds fold_defs (map un_fold_of ctor_iter_thmss); |
675 val fold_thmss = mk_iter_thmss fold_args_types folds fold_defs (map un_fold_of ctor_iter_thmss); |
676 val rec_thmss = mk_iter_thmss rec_args_types recs rec_defs (map co_rec_of ctor_iter_thmss); |
676 val rec_thmss = mk_iter_thmss rec_args_types recs rec_defs (map co_rec_of ctor_iter_thmss); |
677 in |
677 in |
678 ((induct_thm, induct_thms, [induct_case_names_attr]), |
678 ((induct_thms, induct_thm, [induct_case_names_attr]), |
679 (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs)) |
679 (fold_thmss, code_simp_attrs), (rec_thmss, code_simp_attrs)) |
680 end; |
680 end; |
681 |
681 |
682 fun derive_coinduct_coiters_thms_for_types pre_bnfs (dtor_coiters1 :: _) |
682 fun derive_coinduct_coiters_thms_for_types pre_bnfs (dtor_coiters1 :: _) |
683 (cs, cpss, |
683 (cs, cpss, |
725 |
725 |
726 val vs = map2 (curry Free) vs' fpTs; |
726 val vs = map2 (curry Free) vs' fpTs; |
727 val vdiscss = map2 (map o rapp) vs discss; |
727 val vdiscss = map2 (map o rapp) vs discss; |
728 val vselsss = map2 (map o map o rapp) vs selsss; |
728 val vselsss = map2 (map o map o rapp) vs selsss; |
729 |
729 |
730 val ((coinduct_thms, coinduct_thm), (strong_coinduct_thms, strong_coinduct_thm)) = |
730 val coinduct_thms_pairs = |
731 let |
731 let |
732 val uvrs = map3 (fn r => fn u => fn v => r $ u $ v) rs us vs; |
732 val uvrs = map3 (fn r => fn u => fn v => r $ u $ v) rs us vs; |
733 val uv_eqs = map2 (curry HOLogic.mk_eq) us vs; |
733 val uv_eqs = map2 (curry HOLogic.mk_eq) us vs; |
734 val strong_rs = |
734 val strong_rs = |
735 map4 (fn u => fn v => fn uvr => fn uv_eq => |
735 map4 (fn u => fn v => fn uvr => fn uv_eq => |
776 |
776 |
777 fun mk_goal rs' = |
777 fun mk_goal rs' = |
778 Logic.list_implies (map8 (mk_prem rs') uvrs us vs ns udiscss uselsss vdiscss vselsss, |
778 Logic.list_implies (map8 (mk_prem rs') uvrs us vs ns udiscss uselsss vdiscss vselsss, |
779 concl); |
779 concl); |
780 |
780 |
781 val goal = mk_goal rs; |
781 val goals = map mk_goal [rs, strong_rs]; |
782 val strong_goal = mk_goal strong_rs; |
|
783 |
782 |
784 fun prove dtor_coinduct' goal = |
783 fun prove dtor_coinduct' goal = |
785 Goal.prove_sorry lthy [] [] goal (fn {context = ctxt, ...} => |
784 Goal.prove_sorry lthy [] [] goal (fn {context = ctxt, ...} => |
786 mk_coinduct_tac ctxt nesting_rel_eqs nn ns dtor_coinduct' pre_rel_defs dtor_ctors |
785 mk_coinduct_tac ctxt nesting_rel_eqs nn ns dtor_coinduct' pre_rel_defs dtor_ctors |
787 exhausts ctr_defss disc_thmsss sel_thmsss) |
786 exhausts ctr_defss disc_thmsss sel_thmsss) |
792 Thm.permute_prems 0 nn |
791 Thm.permute_prems 0 nn |
793 (if nn = 1 then thm RS mp else funpow nn (fn thm => reassoc_conjs (thm RS mp_conj)) thm) |
792 (if nn = 1 then thm RS mp else funpow nn (fn thm => reassoc_conjs (thm RS mp_conj)) thm) |
794 |> Drule.zero_var_indexes |
793 |> Drule.zero_var_indexes |
795 |> `(conj_dests nn); |
794 |> `(conj_dests nn); |
796 in |
795 in |
797 (postproc nn (prove (co_induct_of dtor_coinducts) goal), |
796 map2 (postproc nn oo prove) dtor_coinducts goals |
798 postproc nn (prove (strong_co_induct_of dtor_coinducts) strong_goal)) |
|
799 end; |
797 end; |
800 |
798 |
801 fun mk_coinduct_concls ms discs ctrs = |
799 fun mk_coinduct_concls ms discs ctrs = |
802 let |
800 let |
803 fun mk_disc_concl disc = [name_of_disc disc]; |
801 fun mk_disc_concl disc = [name_of_disc disc]; |
947 Attrib.internal (K (Rule_Cases.case_conclusion (casex, concls)))) |
945 Attrib.internal (K (Rule_Cases.case_conclusion (casex, concls)))) |
948 coinduct_cases coinduct_conclss; |
946 coinduct_cases coinduct_conclss; |
949 val coinduct_case_attrs = |
947 val coinduct_case_attrs = |
950 coinduct_consumes_attr :: coinduct_case_names_attr :: coinduct_case_concl_attrs; |
948 coinduct_consumes_attr :: coinduct_case_names_attr :: coinduct_case_concl_attrs; |
951 in |
949 in |
952 ((coinduct_thm, coinduct_thms, strong_coinduct_thm, strong_coinduct_thms, coinduct_case_attrs), |
950 ((coinduct_thms_pairs, coinduct_case_attrs), |
953 (unfold_thmss, corec_thmss, []), |
951 (unfold_thmss, corec_thmss, []), |
954 (safe_unfold_thmss, safe_corec_thmss), |
952 (safe_unfold_thmss, safe_corec_thmss), |
955 (disc_unfold_thmss, disc_corec_thmss, simp_attrs), |
953 (disc_unfold_thmss, disc_corec_thmss, simp_attrs), |
956 (disc_unfold_iff_thmss, disc_corec_iff_thmss, simp_attrs), |
954 (disc_unfold_iff_thmss, disc_corec_iff_thmss, simp_attrs), |
957 (sel_unfold_thmss, sel_corec_thmss, simp_attrs)) |
955 (sel_unfold_thmss, sel_corec_thmss, simp_attrs)) |
1108 |
1106 |
1109 val ((xtor_co_iterss, iters_args_types, coiters_args_types), lthy) = |
1107 val ((xtor_co_iterss, iters_args_types, coiters_args_types), lthy) = |
1110 mk_co_iters_prelims fp fpTs Cs ns mss xtor_co_iterss0 lthy; |
1108 mk_co_iters_prelims fp fpTs Cs ns mss xtor_co_iterss0 lthy; |
1111 |
1109 |
1112 fun define_ctrs_case_for_type ((((((((((((((((((((((((fp_bnf, fp_b), fpT), C), ctor), dtor), |
1110 fun define_ctrs_case_for_type ((((((((((((((((((((((((fp_bnf, fp_b), fpT), C), ctor), dtor), |
1113 xtor_co_iters), ctor_dtor), dtor_ctor), ctor_inject), pre_map_def), pre_set_defs), |
1111 xtor_co_iters), ctor_dtor), dtor_ctor), ctor_inject), pre_map_def), pre_set_defs), |
1114 pre_rel_def), fp_map_thm), fp_set_thms), fp_rel_thm), n), ks), ms), ctr_bindings), |
1112 pre_rel_def), fp_map_thm), fp_set_thms), fp_rel_thm), n), ks), ms), ctr_bindings), |
1115 ctr_mixfixes), ctr_Tss), disc_bindings), sel_bindingss), raw_sel_defaultss) no_defs_lthy = |
1113 ctr_mixfixes), ctr_Tss), disc_bindings), sel_bindingss), raw_sel_defaultss) no_defs_lthy = |
1116 let |
1114 let |
1117 val fp_b_name = Binding.name_of fp_b; |
1115 val fp_b_name = Binding.name_of fp_b; |
1118 |
1116 |
1119 val dtorT = domain_type (fastype_of ctor); |
1117 val dtorT = domain_type (fastype_of ctor); |
1120 val ctr_prod_Ts = map HOLogic.mk_tupleT ctr_Tss; |
1118 val ctr_prod_Ts = map HOLogic.mk_tupleT ctr_Tss; |
1319 |
1317 |
1320 fun derive_and_note_induct_iters_thms_for_types |
1318 fun derive_and_note_induct_iters_thms_for_types |
1321 ((((mapsx, rel_injects, rel_distincts, setss), (ctrss, _, ctr_defss, ctr_sugars)), |
1319 ((((mapsx, rel_injects, rel_distincts, setss), (ctrss, _, ctr_defss, ctr_sugars)), |
1322 (iterss, iter_defss)), lthy) = |
1320 (iterss, iter_defss)), lthy) = |
1323 let |
1321 let |
1324 val ((induct_thm, induct_thms, induct_attrs), (fold_thmss, fold_attrs), |
1322 val ((induct_thms, induct_thm, induct_attrs), (fold_thmss, fold_attrs), |
1325 (rec_thmss, rec_attrs)) = |
1323 (rec_thmss, rec_attrs)) = |
1326 derive_induct_iters_thms_for_types pre_bnfs xtor_co_iterss (the iters_args_types) |
1324 derive_induct_iters_thms_for_types pre_bnfs xtor_co_iterss (the iters_args_types) |
1327 xtor_co_inducts xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs Xs ctrXs_Tsss ctrss |
1325 xtor_co_inducts xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs Xs ctrXs_Tsss ctrss |
1328 ctr_defss iterss iter_defss lthy; |
1326 ctr_defss iterss iter_defss lthy; |
1329 |
1327 |
1351 |
1349 |
1352 fun derive_and_note_coinduct_coiters_thms_for_types |
1350 fun derive_and_note_coinduct_coiters_thms_for_types |
1353 ((((mapsx, rel_injects, rel_distincts, setss), (_, _, ctr_defss, ctr_sugars)), |
1351 ((((mapsx, rel_injects, rel_distincts, setss), (_, _, ctr_defss, ctr_sugars)), |
1354 (coiterss, coiter_defss)), lthy) = |
1352 (coiterss, coiter_defss)), lthy) = |
1355 let |
1353 let |
1356 val ((coinduct_thm, coinduct_thms, strong_coinduct_thm, strong_coinduct_thms, |
1354 val (([(coinduct_thms, coinduct_thm), (strong_coinduct_thms, strong_coinduct_thm)], |
1357 coinduct_attrs), |
1355 coinduct_attrs), |
1358 (unfold_thmss, corec_thmss, coiter_attrs), |
1356 (unfold_thmss, corec_thmss, coiter_attrs), |
1359 (safe_unfold_thmss, safe_corec_thmss), |
1357 (safe_unfold_thmss, safe_corec_thmss), |
1360 (disc_unfold_thmss, disc_corec_thmss, disc_coiter_attrs), |
1358 (disc_unfold_thmss, disc_corec_thmss, disc_coiter_attrs), |
1361 (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_coiter_iff_attrs), |
1359 (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_coiter_iff_attrs), |