src/HOL/Tools/BNF/bnf_def.ML
changeset 58108 1c8541513acb
parent 58106 c8cba801c483
child 58116 1a9ac371e5a0
equal deleted inserted replaced
58107:f3c5360711e9 58108:1c8541513acb
  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