60 val derive_coinduct_coiters_thms_for_types: BNF_Def.bnf list -> |
60 val derive_coinduct_coiters_thms_for_types: BNF_Def.bnf list -> |
61 string * term list * term list list * ((term list list * term list list list) |
61 string * term list * term list list * ((term list list * term list list list) |
62 * (typ list * typ list list)) list -> |
62 * (typ list * typ list list)) list -> |
63 thm list -> thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list -> |
63 thm list -> thm list -> thm list list -> BNF_Def.bnf list -> BNF_Def.bnf list -> typ list -> |
64 typ list -> typ list -> int list list -> int list list -> int list -> thm list list -> |
64 typ list -> typ list -> int list list -> int list list -> int list -> thm list list -> |
65 BNF_Ctr_Sugar.ctr_sugar list -> term list list -> thm list list -> local_theory -> |
65 BNF_Ctr_Sugar.ctr_sugar list -> term list list -> thm list list -> (thm list -> thm list) -> |
|
66 local_theory -> |
66 ((thm list * thm) list * Args.src list) |
67 ((thm list * thm) list * Args.src list) |
67 * (thm list list * thm list list * Args.src list) |
68 * (thm list list * thm list list * Args.src list) |
68 * (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) |
69 * (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) |
666 end; |
667 end; |
667 |
668 |
668 fun derive_coinduct_coiters_thms_for_types pre_bnfs (z, cs, cpss, |
669 fun derive_coinduct_coiters_thms_for_types pre_bnfs (z, cs, cpss, |
669 [(unfold_args as (pgss, crgsss), _), (corec_args as (phss, cshsss), _)]) |
670 [(unfold_args as (pgss, crgsss), _), (corec_args as (phss, cshsss), _)]) |
670 dtor_coinducts dtor_ctors dtor_coiter_thmss nesting_bnfs nested_bnfs fpTs Cs As kss mss ns |
671 dtor_coinducts dtor_ctors dtor_coiter_thmss nesting_bnfs nested_bnfs fpTs Cs As kss mss ns |
671 ctr_defss ctr_sugars coiterss coiter_defss lthy = |
672 ctr_defss ctr_sugars coiterss coiter_defss export_args lthy = |
672 let |
673 let |
673 val coiterss' = transpose coiterss; |
674 val coiterss' = transpose coiterss; |
674 val coiter_defss' = transpose coiter_defss; |
675 val coiter_defss' = transpose coiter_defss; |
675 |
676 |
676 val [unfold_defs, corec_defs] = coiter_defss'; |
677 val [unfold_defs, corec_defs] = coiter_defss'; |
898 val corec_tacss = |
899 val corec_tacss = |
899 map3 (map oo mk_disc_coiter_iff_tac) case_splitss' corec_thmss disc_thmsss; |
900 map3 (map oo mk_disc_coiter_iff_tac) case_splitss' corec_thmss disc_thmsss; |
900 |
901 |
901 fun prove goal tac = |
902 fun prove goal tac = |
902 Goal.prove_sorry lthy [] [] goal (tac o #context) |
903 Goal.prove_sorry lthy [] [] goal (tac o #context) |
|
904 |> singleton export_args |
903 |> singleton (Proof_Context.export names_lthy lthy) |
905 |> singleton (Proof_Context.export names_lthy lthy) |
904 |> Thm.close_derivation; |
906 |> Thm.close_derivation; |
905 |
907 |
906 fun proves [_] [_] = [] |
908 fun proves [_] [_] = [] |
907 | proves goals tacs = map2 prove goals tacs; |
909 | proves goals tacs = map2 prove goals tacs; |
1099 val ctr_Tsss = map (map (map (Term.typ_subst_atomic (Xs ~~ fpTs)))) ctrXs_Tsss; |
1101 val ctr_Tsss = map (map (map (Term.typ_subst_atomic (Xs ~~ fpTs)))) ctrXs_Tsss; |
1100 val ns = map length ctr_Tsss; |
1102 val ns = map length ctr_Tsss; |
1101 val kss = map (fn n => 1 upto n) ns; |
1103 val kss = map (fn n => 1 upto n) ns; |
1102 val mss = map (map length) ctr_Tsss; |
1104 val mss = map (map length) ctr_Tsss; |
1103 |
1105 |
|
1106 (* FIXME: names (lthyX, lthyY) *) |
|
1107 val lthyX = lthy; |
1104 val ((xtor_co_iterss, iters_args_types, coiters_args_types), lthy) = |
1108 val ((xtor_co_iterss, iters_args_types, coiters_args_types), lthy) = |
1105 mk_co_iters_prelims fp fpTs Cs ns mss xtor_co_iterss0 lthy; |
1109 mk_co_iters_prelims fp fpTs Cs ns mss xtor_co_iterss0 lthy; |
|
1110 val lthyY = lthy; |
1106 |
1111 |
1107 fun define_ctrs_case_for_type ((((((((((((((((((((((((fp_bnf, fp_b), fpT), C), ctor), dtor), |
1112 fun define_ctrs_case_for_type ((((((((((((((((((((((((fp_bnf, fp_b), fpT), C), ctor), dtor), |
1108 xtor_co_iters), ctor_dtor), dtor_ctor), ctor_inject), pre_map_def), pre_set_defs), |
1113 xtor_co_iters), ctor_dtor), dtor_ctor), ctor_inject), pre_map_def), pre_set_defs), |
1109 pre_rel_def), fp_map_thm), fp_set_thms), fp_rel_thm), n), ks), ms), ctr_bindings), |
1114 pre_rel_def), fp_map_thm), fp_set_thms), fp_rel_thm), n), ks), ms), ctr_bindings), |
1110 ctr_mixfixes), ctr_Tss), disc_bindings), sel_bindingss), raw_sel_defaultss) no_defs_lthy = |
1115 ctr_mixfixes), ctr_Tss), disc_bindings), sel_bindingss), raw_sel_defaultss) no_defs_lthy = |
1355 (disc_unfold_thmss, disc_corec_thmss, disc_coiter_attrs), |
1360 (disc_unfold_thmss, disc_corec_thmss, disc_coiter_attrs), |
1356 (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_coiter_iff_attrs), |
1361 (disc_unfold_iff_thmss, disc_corec_iff_thmss, disc_coiter_iff_attrs), |
1357 (sel_unfold_thmss, sel_corec_thmss, sel_coiter_attrs)) = |
1362 (sel_unfold_thmss, sel_corec_thmss, sel_coiter_attrs)) = |
1358 derive_coinduct_coiters_thms_for_types pre_bnfs (the coiters_args_types) xtor_co_inducts |
1363 derive_coinduct_coiters_thms_for_types pre_bnfs (the coiters_args_types) xtor_co_inducts |
1359 dtor_ctors xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs As kss mss ns ctr_defss |
1364 dtor_ctors xtor_co_iter_thmss nesting_bnfs nested_bnfs fpTs Cs As kss mss ns ctr_defss |
1360 ctr_sugars coiterss coiter_defss lthy; |
1365 ctr_sugars coiterss coiter_defss (Proof_Context.export lthyY lthyX) lthy; |
1361 |
1366 |
1362 val coinduct_type_attr = Attrib.internal o K o Induct.coinduct_type; |
1367 val coinduct_type_attr = Attrib.internal o K o Induct.coinduct_type; |
1363 |
1368 |
1364 fun flat_coiter_thms coiters disc_coiters sel_coiters = |
1369 fun flat_coiter_thms coiters disc_coiters sel_coiters = |
1365 coiters @ disc_coiters @ sel_coiters; |
1370 coiters @ disc_coiters @ sel_coiters; |