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 |