src/HOL/Codatatype/Tools/bnf_def.ML
changeset 49458 9321a9465021
parent 49456 fa8302c8dea1
child 49459 3f8e2b5249ec
equal deleted inserted replaced
49457:1d2825673cec 49458:9321a9465021
   750 
   750 
   751     fun mk_bnf_pred QTs CA' CB' = normalize_pred lthy3 QTs CA' CB' bnf_pred;
   751     fun mk_bnf_pred QTs CA' CB' = normalize_pred lthy3 QTs CA' CB' bnf_pred;
   752 
   752 
   753     val pred = mk_bnf_pred QTs CA' CB';
   753     val pred = mk_bnf_pred QTs CA' CB';
   754 
   754 
   755     val goal_map_id =
   755     val map_id_goal =
   756       let
   756       let
   757         val bnf_map_app_id = Term.list_comb (bnf_map_AsAs, map HOLogic.id_const As');
   757         val bnf_map_app_id = Term.list_comb (bnf_map_AsAs, map HOLogic.id_const As');
   758       in
   758       in
   759         HOLogic.mk_Trueprop
   759         HOLogic.mk_Trueprop
   760           (HOLogic.mk_eq (bnf_map_app_id, HOLogic.id_const CA'))
   760           (HOLogic.mk_eq (bnf_map_app_id, HOLogic.id_const CA'))
   761       end;
   761       end;
   762 
   762 
   763     val goal_map_comp =
   763     val map_comp_goal =
   764       let
   764       let
   765         val bnf_map_app_comp = Term.list_comb (bnf_map_AsCs, map2 (curry HOLogic.mk_comp) gs fs);
   765         val bnf_map_app_comp = Term.list_comb (bnf_map_AsCs, map2 (curry HOLogic.mk_comp) gs fs);
   766         val comp_bnf_map_app = HOLogic.mk_comp
   766         val comp_bnf_map_app = HOLogic.mk_comp
   767           (Term.list_comb (bnf_map_BsCs, gs),
   767           (Term.list_comb (bnf_map_BsCs, gs),
   768            Term.list_comb (bnf_map_AsBs, fs));
   768            Term.list_comb (bnf_map_AsBs, fs));
   769       in
   769       in
   770         fold_rev Logic.all (fs @ gs) (mk_Trueprop_eq (bnf_map_app_comp, comp_bnf_map_app))
   770         fold_rev Logic.all (fs @ gs) (mk_Trueprop_eq (bnf_map_app_comp, comp_bnf_map_app))
   771       end;
   771       end;
   772 
   772 
   773     val goal_map_cong =
   773     val map_cong_goal =
   774       let
   774       let
   775         fun mk_prem z set f f_copy =
   775         fun mk_prem z set f f_copy =
   776           Logic.all z (Logic.mk_implies
   776           Logic.all z (Logic.mk_implies
   777             (HOLogic.mk_Trueprop (HOLogic.mk_mem (z, set $ x)),
   777             (HOLogic.mk_Trueprop (HOLogic.mk_mem (z, set $ x)),
   778             mk_Trueprop_eq (f $ z, f_copy $ z)));
   778             mk_Trueprop_eq (f $ z, f_copy $ z)));
   782       in
   782       in
   783         fold_rev Logic.all (x :: fs @ fs_copy)
   783         fold_rev Logic.all (x :: fs @ fs_copy)
   784           (Logic.list_implies (prems, HOLogic.mk_Trueprop eq))
   784           (Logic.list_implies (prems, HOLogic.mk_Trueprop eq))
   785       end;
   785       end;
   786 
   786 
   787     val goal_set_naturals =
   787     val set_naturals_goal =
   788       let
   788       let
   789         fun mk_goal setA setB f =
   789         fun mk_goal setA setB f =
   790           let
   790           let
   791             val set_comp_map =
   791             val set_comp_map =
   792               HOLogic.mk_comp (setB, Term.list_comb (bnf_map_AsBs, fs));
   792               HOLogic.mk_comp (setB, Term.list_comb (bnf_map_AsBs, fs));
   796           end;
   796           end;
   797       in
   797       in
   798         map3 mk_goal bnf_sets_As bnf_sets_Bs fs
   798         map3 mk_goal bnf_sets_As bnf_sets_Bs fs
   799       end;
   799       end;
   800 
   800 
   801     val goal_card_order_bd = HOLogic.mk_Trueprop (mk_card_order bnf_bd_As);
   801     val card_order_bd_goal = HOLogic.mk_Trueprop (mk_card_order bnf_bd_As);
   802 
   802 
   803     val goal_cinfinite_bd = HOLogic.mk_Trueprop (mk_cinfinite bnf_bd_As);
   803     val cinfinite_bd_goal = HOLogic.mk_Trueprop (mk_cinfinite bnf_bd_As);
   804 
   804 
   805     val goal_set_bds =
   805     val set_bds_goal =
   806       let
   806       let
   807         fun mk_goal set =
   807         fun mk_goal set =
   808           Logic.all x (HOLogic.mk_Trueprop (mk_ordLeq (mk_card_of (set $ x)) bnf_bd_As));
   808           Logic.all x (HOLogic.mk_Trueprop (mk_ordLeq (mk_card_of (set $ x)) bnf_bd_As));
   809       in
   809       in
   810         map mk_goal bnf_sets_As
   810         map mk_goal bnf_sets_As
   811       end;
   811       end;
   812 
   812 
   813     val goal_in_bd =
   813     val in_bd_goal =
   814       let
   814       let
   815         val bd = mk_cexp
   815         val bd = mk_cexp
   816           (if live = 0 then ctwo
   816           (if live = 0 then ctwo
   817             else mk_csum (Library.foldr1 (uncurry mk_csum) (map mk_card_of As)) ctwo)
   817             else mk_csum (Library.foldr1 (uncurry mk_csum) (map mk_card_of As)) ctwo)
   818           bnf_bd_As;
   818           bnf_bd_As;
   819       in
   819       in
   820         fold_rev Logic.all As
   820         fold_rev Logic.all As
   821           (HOLogic.mk_Trueprop (mk_ordLeq (mk_card_of (mk_in As bnf_sets_As CA')) bd))
   821           (HOLogic.mk_Trueprop (mk_ordLeq (mk_card_of (mk_in As bnf_sets_As CA')) bd))
   822       end;
   822       end;
   823 
   823 
   824     val goal_map_wpull =
   824     val map_wpull_goal =
   825       let
   825       let
   826         val prems = map HOLogic.mk_Trueprop
   826         val prems = map HOLogic.mk_Trueprop
   827           (map8 mk_wpull Xs B1s B2s f1s f2s (replicate live NONE) p1s p2s);
   827           (map8 mk_wpull Xs B1s B2s f1s f2s (replicate live NONE) p1s p2s);
   828         val CX = mk_bnf_T domTs CA;
   828         val CX = mk_bnf_T domTs CA;
   829         val CB1 = mk_bnf_T B1Ts CA;
   829         val CB1 = mk_bnf_T B1Ts CA;
   842       in
   842       in
   843         fold_rev Logic.all (Xs @ B1s @ B2s @ f1s @ f2s @ p1s @ p2s)
   843         fold_rev Logic.all (Xs @ B1s @ B2s @ f1s @ f2s @ p1s @ p2s)
   844           (Logic.list_implies (prems, HOLogic.mk_Trueprop map_wpull))
   844           (Logic.list_implies (prems, HOLogic.mk_Trueprop map_wpull))
   845       end;
   845       end;
   846 
   846 
   847     val goal_rel_O_Gr =
   847     val rel_O_Gr_goal =
   848       let
   848       let
   849         val map1 = Term.list_comb (mk_bnf_map RTs As', map fst_const RTs);
   849         val map1 = Term.list_comb (mk_bnf_map RTs As', map fst_const RTs);
   850         val map2 = Term.list_comb (mk_bnf_map RTs Bs', map snd_const RTs);
   850         val map2 = Term.list_comb (mk_bnf_map RTs Bs', map snd_const RTs);
   851         val bnf_in = mk_in Rs (map (mk_bnf_t RTs) bnf_sets) CRs';
   851         val bnf_in = mk_in Rs (map (mk_bnf_t RTs) bnf_sets) CRs';
   852         (*Gr (in R1 .. Rn) (map fst .. fst)^-1 O Gr (in R1 .. Rn) (map snd .. snd)*)
   852         (*Gr (in R1 .. Rn) (map fst .. fst)^-1 O Gr (in R1 .. Rn) (map snd .. snd)*)
   853         val rhs = mk_rel_comp (mk_converse (mk_Gr bnf_in map1), mk_Gr bnf_in map2);
   853         val rhs = mk_rel_comp (mk_converse (mk_Gr bnf_in map1), mk_Gr bnf_in map2);
   854       in
   854       in
   855         fold_rev Logic.all Rs (mk_Trueprop_eq (Term.list_comb (relAsBs, Rs), rhs))
   855         fold_rev Logic.all Rs (mk_Trueprop_eq (Term.list_comb (relAsBs, Rs), rhs))
   856       end;
   856       end;
   857 
   857 
   858     val goals = zip_goals goal_map_id goal_map_comp goal_map_cong goal_set_naturals
   858     val goals = zip_goals map_id_goal map_comp_goal map_cong_goal set_naturals_goal
   859       goal_card_order_bd goal_cinfinite_bd goal_set_bds goal_in_bd goal_map_wpull goal_rel_O_Gr;
   859       card_order_bd_goal cinfinite_bd_goal set_bds_goal in_bd_goal map_wpull_goal rel_O_Gr_goal;
   860 
   860 
   861     fun mk_wit_goals (I, wit) =
   861     fun mk_wit_goals (I, wit) =
   862       let
   862       let
   863         val xs = map (nth bs) I;
   863         val xs = map (nth bs) I;
   864         fun wit_goal i =
   864         fun wit_goal i =
   908         val collect_set_natural = mk_lazy mk_collect_set_natural;
   908         val collect_set_natural = mk_lazy mk_collect_set_natural;
   909 
   909 
   910         fun mk_in_mono () =
   910         fun mk_in_mono () =
   911           let
   911           let
   912             val prems_mono = map2 (HOLogic.mk_Trueprop oo mk_subset) As As_copy;
   912             val prems_mono = map2 (HOLogic.mk_Trueprop oo mk_subset) As As_copy;
   913             val goal_in_mono =
   913             val in_mono_goal =
   914               fold_rev Logic.all (As @ As_copy)
   914               fold_rev Logic.all (As @ As_copy)
   915                 (Logic.list_implies (prems_mono, HOLogic.mk_Trueprop
   915                 (Logic.list_implies (prems_mono, HOLogic.mk_Trueprop
   916                   (mk_subset (mk_in As bnf_sets_As CA') (mk_in As_copy bnf_sets_As CA'))));
   916                   (mk_subset (mk_in As bnf_sets_As CA') (mk_in As_copy bnf_sets_As CA'))));
   917           in
   917           in
   918             Skip_Proof.prove lthy [] [] goal_in_mono (K (mk_in_mono_tac live))
   918             Skip_Proof.prove lthy [] [] in_mono_goal (K (mk_in_mono_tac live))
   919             |> Thm.close_derivation
   919             |> Thm.close_derivation
   920           end;
   920           end;
   921 
   921 
   922         val in_mono = mk_lazy mk_in_mono;
   922         val in_mono = mk_lazy mk_in_mono;
   923 
   923 
   924         fun mk_in_cong () =
   924         fun mk_in_cong () =
   925           let
   925           let
   926             val prems_cong = map2 (HOLogic.mk_Trueprop oo curry HOLogic.mk_eq) As As_copy;
   926             val prems_cong = map2 (HOLogic.mk_Trueprop oo curry HOLogic.mk_eq) As As_copy;
   927             val goal_in_cong =
   927             val in_cong_goal =
   928               fold_rev Logic.all (As @ As_copy)
   928               fold_rev Logic.all (As @ As_copy)
   929                 (Logic.list_implies (prems_cong, HOLogic.mk_Trueprop
   929                 (Logic.list_implies (prems_cong, HOLogic.mk_Trueprop
   930                   (HOLogic.mk_eq (mk_in As bnf_sets_As CA', mk_in As_copy bnf_sets_As CA'))));
   930                   (HOLogic.mk_eq (mk_in As bnf_sets_As CA', mk_in As_copy bnf_sets_As CA'))));
   931           in
   931           in
   932             Skip_Proof.prove lthy [] [] goal_in_cong (K ((TRY o hyp_subst_tac THEN' rtac refl) 1))
   932             Skip_Proof.prove lthy [] [] in_cong_goal (K ((TRY o hyp_subst_tac THEN' rtac refl) 1))
   933             |> Thm.close_derivation
   933             |> Thm.close_derivation
   934           end;
   934           end;
   935 
   935 
   936         val in_cong = mk_lazy mk_in_cong;
   936         val in_cong = mk_lazy mk_in_cong;
   937 
   937