1043 in |
1043 in |
1044 fold_rev Logic.all (fs @ gs) (mk_Trueprop_eq (bnf_map_app_comp, comp_bnf_map_app)) |
1044 fold_rev Logic.all (fs @ gs) (mk_Trueprop_eq (bnf_map_app_comp, comp_bnf_map_app)) |
1045 end; |
1045 end; |
1046 |
1046 |
1047 fun mk_map_cong_prem mk_implies x z set f f_copy = |
1047 fun mk_map_cong_prem mk_implies x z set f f_copy = |
1048 Logic.all z (mk_implies |
1048 Logic.all z (mk_implies (mk_Trueprop_mem (z, set $ x), mk_Trueprop_eq (f $ z, f_copy $ z))); |
1049 (mk_Trueprop_mem (z, set $ x), mk_Trueprop_eq (f $ z, f_copy $ z))); |
|
1050 |
1049 |
1051 val map_cong0_goal = |
1050 val map_cong0_goal = |
1052 let |
1051 let |
1053 val prems = map4 (mk_map_cong_prem Logic.mk_implies x) zs bnf_sets_As fs fs_copy; |
1052 val prems = map4 (mk_map_cong_prem Logic.mk_implies x) zs bnf_sets_As fs fs_copy; |
1054 val eq = mk_Trueprop_eq (Term.list_comb (bnf_map_AsBs, fs) $ x, |
1053 val eq = mk_Trueprop_eq (Term.list_comb (bnf_map_AsBs, fs) $ x, |
1059 |
1058 |
1060 val set_map0s_goal = |
1059 val set_map0s_goal = |
1061 let |
1060 let |
1062 fun mk_goal setA setB f = |
1061 fun mk_goal setA setB f = |
1063 let |
1062 let |
1064 val set_comp_map = |
1063 val set_comp_map = HOLogic.mk_comp (setB, Term.list_comb (bnf_map_AsBs, fs)); |
1065 HOLogic.mk_comp (setB, Term.list_comb (bnf_map_AsBs, fs)); |
|
1066 val image_comp_set = HOLogic.mk_comp (mk_image f, setA); |
1064 val image_comp_set = HOLogic.mk_comp (mk_image f, setA); |
1067 in |
1065 in |
1068 fold_rev Logic.all fs (mk_Trueprop_eq (set_comp_map, image_comp_set)) |
1066 fold_rev Logic.all fs (mk_Trueprop_eq (set_comp_map, image_comp_set)) |
1069 end; |
1067 end; |
1070 in |
1068 in |
1103 fun wit_goal i = |
1101 fun wit_goal i = |
1104 let |
1102 let |
1105 val z = nth zs i; |
1103 val z = nth zs i; |
1106 val set_wit = nth bnf_sets_As i $ Term.list_comb (wit, xs); |
1104 val set_wit = nth bnf_sets_As i $ Term.list_comb (wit, xs); |
1107 val concl = HOLogic.mk_Trueprop |
1105 val concl = HOLogic.mk_Trueprop |
1108 (if member (op =) I i then HOLogic.mk_eq (z, nth bs i) |
1106 (if member (op =) I i then HOLogic.mk_eq (z, nth bs i) else @{term False}); |
1109 else @{term False}); |
1107 in |
1110 in |
1108 fold_rev Logic.all (z :: xs) (Logic.mk_implies (mk_Trueprop_mem (z, set_wit), concl)) |
1111 fold_rev Logic.all (z :: xs) |
|
1112 (Logic.mk_implies (mk_Trueprop_mem (z, set_wit), concl)) |
|
1113 end; |
1109 end; |
1114 in |
1110 in |
1115 map wit_goal (0 upto live - 1) |
1111 map wit_goal (0 upto live - 1) |
1116 end; |
1112 end; |
1117 |
1113 |
1129 val bd_Cnotzero = bd_Cinfinite RS @{thm Cinfinite_Cnotzero}; |
1125 val bd_Cnotzero = bd_Cinfinite RS @{thm Cinfinite_Cnotzero}; |
1130 |
1126 |
1131 fun mk_collect_set_map () = |
1127 fun mk_collect_set_map () = |
1132 let |
1128 let |
1133 val defT = mk_bnf_T Ts Calpha --> HOLogic.mk_setT T; |
1129 val defT = mk_bnf_T Ts Calpha --> HOLogic.mk_setT T; |
1134 val collect_map = HOLogic.mk_comp |
1130 val collect_map = HOLogic.mk_comp (mk_collect (map (mk_bnf_t Ts) bnf_sets) defT, |
1135 (mk_collect (map (mk_bnf_t Ts) bnf_sets) defT, |
|
1136 Term.list_comb (mk_bnf_map As' Ts, hs)); |
1131 Term.list_comb (mk_bnf_map As' Ts, hs)); |
1137 val image_collect = mk_collect |
1132 val image_collect = mk_collect |
1138 (map2 (fn h => fn set => HOLogic.mk_comp (mk_image h, set)) hs bnf_sets_As) |
1133 (map2 (fn h => fn set => HOLogic.mk_comp (mk_image h, set)) hs bnf_sets_As) defT; |
1139 defT; |
|
1140 (*collect {set1 ... setm} o map f1 ... fm = collect {f1` o set1 ... fm` o setm}*) |
1134 (*collect {set1 ... setm} o map f1 ... fm = collect {f1` o set1 ... fm` o setm}*) |
1141 val goal = fold_rev Logic.all hs (mk_Trueprop_eq (collect_map, image_collect)); |
1135 val goal = fold_rev Logic.all hs (mk_Trueprop_eq (collect_map, image_collect)); |
1142 in |
1136 in |
1143 Goal.prove_sorry lthy [] [] goal (K (mk_collect_set_map_tac (#set_map0 axioms))) |
1137 Goal.prove_sorry lthy [] [] goal (K (mk_collect_set_map_tac (#set_map0 axioms))) |
1144 |> Thm.close_derivation |
1138 |> Thm.close_derivation |