347 |
347 |
348 val (mor_image_thms, morE_thms) = |
348 val (mor_image_thms, morE_thms) = |
349 let |
349 let |
350 val prem = HOLogic.mk_Trueprop (mk_mor Bs ss B's s's fs); |
350 val prem = HOLogic.mk_Trueprop (mk_mor Bs ss B's s's fs); |
351 fun mk_image_goal f B1 B2 = fold_rev Logic.all (Bs @ ss @ B's @ s's @ fs) |
351 fun mk_image_goal f B1 B2 = fold_rev Logic.all (Bs @ ss @ B's @ s's @ fs) |
352 (Logic.mk_implies (prem, HOLogic.mk_Trueprop (mk_subset (mk_image f $ B1) B2))); |
352 (Logic.mk_implies (prem, HOLogic.mk_Trueprop (mk_leq (mk_image f $ B1) B2))); |
353 val image_goals = map3 mk_image_goal fs Bs B's; |
353 val image_goals = map3 mk_image_goal fs Bs B's; |
354 fun mk_elim_prem sets x T = HOLogic.mk_Trueprop |
354 fun mk_elim_prem sets x T = HOLogic.mk_Trueprop |
355 (HOLogic.mk_mem (x, mk_in (passive_UNIVs @ Bs) sets T)); |
355 (HOLogic.mk_mem (x, mk_in (passive_UNIVs @ Bs) sets T)); |
356 fun mk_elim_goal sets mapAsBs f s s' x T = |
356 fun mk_elim_goal sets mapAsBs f s s' x T = |
357 fold_rev Logic.all (x :: Bs @ ss @ B's @ s's @ fs) |
357 fold_rev Logic.all (x :: Bs @ ss @ B's @ s's @ fs) |
670 sum_Card_order sum_Cnotzero suc_bd_Card_order suc_bd_Cinfinite suc_bd_Cnotzero |
670 sum_Card_order sum_Cnotzero suc_bd_Card_order suc_bd_Cinfinite suc_bd_Cnotzero |
671 suc_bd_Asuc_bd Asuc_bd_Cinfinite))) |
671 suc_bd_Asuc_bd Asuc_bd_Cinfinite))) |
672 |> Thm.close_derivation; |
672 |> Thm.close_derivation; |
673 |
673 |
674 val least_prem = HOLogic.mk_Trueprop (mk_alg As Bs ss); |
674 val least_prem = HOLogic.mk_Trueprop (mk_alg As Bs ss); |
675 val least_conjunction = Library.foldr1 HOLogic.mk_conj (map2 mk_subset min_algss Bs); |
675 val least_conjunction = Library.foldr1 HOLogic.mk_conj (map2 mk_leq min_algss Bs); |
676 val least_cT = certifyT lthy suc_bdT; |
676 val least_cT = certifyT lthy suc_bdT; |
677 val least_ct = certify lthy (Term.absfree idx' least_conjunction); |
677 val least_ct = certify lthy (Term.absfree idx' least_conjunction); |
678 |
678 |
679 val least = singleton (Proof_Context.export names_lthy lthy) |
679 val least = singleton (Proof_Context.export names_lthy lthy) |
680 (Goal.prove_sorry lthy [] [] |
680 (Goal.prove_sorry lthy [] [] |
1693 val set_bd_tacss = map (map (fn thm => K (rtac thm 1))) (transpose set_bd_thmss); |
1693 val set_bd_tacss = map (map (fn thm => K (rtac thm 1))) (transpose set_bd_thmss); |
1694 val in_bd_tacs = map2 (K oo mk_in_bd_tac sum_Card_order suc_bd_Cnotzero) |
1694 val in_bd_tacs = map2 (K oo mk_in_bd_tac sum_Card_order suc_bd_Cnotzero) |
1695 in_incl_min_alg_thms card_of_min_alg_thms; |
1695 in_incl_min_alg_thms card_of_min_alg_thms; |
1696 val map_wpull_tacs = map (K o mk_wpull_tac) map_wpull_thms; |
1696 val map_wpull_tacs = map (K o mk_wpull_tac) map_wpull_thms; |
1697 |
1697 |
1698 val srel_O_Gr_tacs = replicate n (simple_srel_O_Gr_tac o #context); |
1698 val rel_OO_Grp_tacs = replicate n (K (rtac refl 1)); |
1699 |
1699 |
1700 val tacss = map10 zip_axioms map_id_tacs map_comp_tacs map_cong0_tacs set_nat_tacss |
1700 val tacss = map10 zip_axioms map_id_tacs map_comp_tacs map_cong0_tacs set_nat_tacss |
1701 bd_co_tacs bd_cinf_tacs set_bd_tacss in_bd_tacs map_wpull_tacs srel_O_Gr_tacs; |
1701 bd_co_tacs bd_cinf_tacs set_bd_tacss in_bd_tacs map_wpull_tacs rel_OO_Grp_tacs; |
1702 |
1702 |
1703 val ctor_witss = |
1703 val ctor_witss = |
1704 let |
1704 let |
1705 val witss = map2 (fn Ds => fn bnf => mk_wits_of_bnf |
1705 val witss = map2 (fn Ds => fn bnf => mk_wits_of_bnf |
1706 (replicate (nwits_of_bnf bnf) Ds) |
1706 (replicate (nwits_of_bnf bnf) Ds) |
1743 val fold_sets = fold_thms lthy (maps (fn bnf => |
1743 val fold_sets = fold_thms lthy (maps (fn bnf => |
1744 map (fn thm => thm RS meta_eq_to_obj_eq) (set_defs_of_bnf bnf)) Ibnfs); |
1744 map (fn thm => thm RS meta_eq_to_obj_eq) (set_defs_of_bnf bnf)) Ibnfs); |
1745 |
1745 |
1746 val timer = time (timer "registered new datatypes as BNFs"); |
1746 val timer = time (timer "registered new datatypes as BNFs"); |
1747 |
1747 |
1748 val srels = map2 (fn Ds => mk_srel_of_bnf Ds (passiveAs @ Ts) (passiveBs @ Ts')) Dss bnfs; |
|
1749 val Isrels = map (mk_srel_of_bnf deads passiveAs passiveBs) Ibnfs; |
|
1750 val rels = map2 (fn Ds => mk_rel_of_bnf Ds (passiveAs @ Ts) (passiveBs @ Ts')) Dss bnfs; |
1748 val rels = map2 (fn Ds => mk_rel_of_bnf Ds (passiveAs @ Ts) (passiveBs @ Ts')) Dss bnfs; |
1751 val Irels = map (mk_rel_of_bnf deads passiveAs passiveBs) Ibnfs; |
1749 val Irels = map (mk_rel_of_bnf deads passiveAs passiveBs) Ibnfs; |
1752 |
1750 |
1753 val IsrelRs = map (fn Isrel => Term.list_comb (Isrel, IRs)) Isrels; |
1751 val Irelphis = map (fn Irel => Term.list_comb (Irel, Iphis)) Irels; |
1754 val srelRs = map (fn srel => Term.list_comb (srel, IRs @ IsrelRs)) srels; |
1752 val relphis = map (fn rel => Term.list_comb (rel, Iphis @ Irelphis)) rels; |
1755 val Irelphis = map (fn Isrel => Term.list_comb (Isrel, Iphis)) Irels; |
1753 |
1756 val relphis = map (fn srel => Term.list_comb (srel, Iphis @ Irelphis)) rels; |
1754 val in_rels = map in_rel_of_bnf bnfs; |
1757 |
1755 val in_Irels = map in_rel_of_bnf Ibnfs; |
1758 val in_srels = map in_srel_of_bnf bnfs; |
1756 val rel_defs = map rel_def_of_bnf bnfs; |
1759 val in_Isrels = map in_srel_of_bnf Ibnfs; |
|
1760 val srel_defs = map srel_def_of_bnf bnfs; |
|
1761 val Isrel_defs = map srel_def_of_bnf Ibnfs; |
|
1762 val Irel_defs = map rel_def_of_bnf Ibnfs; |
1757 val Irel_defs = map rel_def_of_bnf Ibnfs; |
1763 |
1758 |
1764 val ctor_set_incl_thmss = map (map (fold_sets o hd)) Fset_set_thmsss; |
1759 val ctor_set_incl_thmss = map (map (fold_sets o hd)) Fset_set_thmsss; |
1765 val ctor_set_set_incl_thmsss = map (transpose o map (map fold_sets o tl)) Fset_set_thmsss; |
1760 val ctor_set_set_incl_thmsss = map (transpose o map (map fold_sets o tl)) Fset_set_thmsss; |
1766 val folded_ctor_map_thms = map fold_maps ctor_map_thms; |
1761 val folded_ctor_map_thms = map fold_maps ctor_map_thms; |
1767 val folded_ctor_set_thmss = map (map fold_sets) ctor_set_thmss; |
1762 val folded_ctor_set_thmss = map (map fold_sets) ctor_set_thmss; |
1768 val folded_ctor_set_thmss' = transpose folded_ctor_set_thmss; |
1763 val folded_ctor_set_thmss' = transpose folded_ctor_set_thmss; |
1769 |
1764 |
1770 val ctor_Isrel_thms = |
1765 val ctor_Irel_thms = |
1771 let |
1766 let |
1772 fun mk_goal xF yF ctor ctor' IsrelR srelR = fold_rev Logic.all (xF :: yF :: IRs) |
1767 fun mk_goal xF yF ctor ctor' Irelphi relphi = fold_rev Logic.all (xF :: yF :: Iphis) |
1773 (mk_Trueprop_eq (HOLogic.mk_mem (HOLogic.mk_prod (ctor $ xF, ctor' $ yF), IsrelR), |
1768 (mk_Trueprop_eq (Irelphi $ (ctor $ xF) $ (ctor' $ yF), relphi $ xF $ yF)); |
1774 HOLogic.mk_mem (HOLogic.mk_prod (xF, yF), srelR))); |
1769 val goals = map6 mk_goal xFs yFs ctors ctor's Irelphis relphis; |
1775 val goals = map6 mk_goal xFs yFs ctors ctor's IsrelRs srelRs; |
|
1776 in |
1770 in |
1777 map12 (fn i => fn goal => fn in_srel => fn map_comp => fn map_cong0 => |
1771 map12 (fn i => fn goal => fn in_rel => fn map_comp => fn map_cong0 => |
1778 fn ctor_map => fn ctor_sets => fn ctor_inject => fn ctor_dtor => |
1772 fn ctor_map => fn ctor_sets => fn ctor_inject => fn ctor_dtor => |
1779 fn set_maps => fn ctor_set_incls => fn ctor_set_set_inclss => |
1773 fn set_maps => fn ctor_set_incls => fn ctor_set_set_inclss => |
1780 Goal.prove_sorry lthy [] [] goal |
1774 Goal.prove_sorry lthy [] [] goal |
1781 (K (mk_ctor_srel_tac lthy in_Isrels i in_srel map_comp map_cong0 ctor_map ctor_sets |
1775 (K (mk_ctor_rel_tac lthy in_Irels i in_rel map_comp map_cong0 ctor_map ctor_sets |
1782 ctor_inject ctor_dtor set_maps ctor_set_incls ctor_set_set_inclss)) |
1776 ctor_inject ctor_dtor set_maps ctor_set_incls ctor_set_set_inclss)) |
1783 |> Thm.close_derivation) |
1777 |> Thm.close_derivation) |
1784 ks goals in_srels map_comp's map_cong0s folded_ctor_map_thms folded_ctor_set_thmss' |
1778 ks goals in_rels map_comp's map_cong0s folded_ctor_map_thms folded_ctor_set_thmss' |
1785 ctor_inject_thms ctor_dtor_thms set_map'ss ctor_set_incl_thmss |
1779 ctor_inject_thms ctor_dtor_thms set_map'ss ctor_set_incl_thmss |
1786 ctor_set_set_incl_thmsss |
1780 ctor_set_set_incl_thmsss |
1787 end; |
|
1788 |
|
1789 val ctor_Irel_thms = |
|
1790 let |
|
1791 fun mk_goal xF yF ctor ctor' Ipredphi predphi = fold_rev Logic.all (xF :: yF :: Iphis) |
|
1792 (mk_Trueprop_eq (Ipredphi $ (ctor $ xF) $ (ctor' $ yF), predphi $ xF $ yF)); |
|
1793 val goals = map6 mk_goal xFs yFs ctors ctor's Irelphis relphis; |
|
1794 in |
|
1795 map3 (fn goal => fn srel_def => fn ctor_Isrel => |
|
1796 Goal.prove_sorry lthy [] [] goal |
|
1797 (mk_ctor_or_dtor_rel_tac srel_def Irel_defs Isrel_defs ctor_Isrel) |
|
1798 |> Thm.close_derivation) |
|
1799 goals srel_defs ctor_Isrel_thms |
|
1800 end; |
1781 end; |
1801 |
1782 |
1802 val timer = time (timer "additional properties"); |
1783 val timer = time (timer "additional properties"); |
1803 |
1784 |
1804 val ls' = if m = 1 then [0] else ls |
1785 val ls' = if m = 1 then [0] else ls |
1811 val Ibnf_notes = |
1792 val Ibnf_notes = |
1812 [(ctor_mapN, map single folded_ctor_map_thms), |
1793 [(ctor_mapN, map single folded_ctor_map_thms), |
1813 (ctor_relN, map single ctor_Irel_thms), |
1794 (ctor_relN, map single ctor_Irel_thms), |
1814 (ctor_set_inclN, ctor_set_incl_thmss), |
1795 (ctor_set_inclN, ctor_set_incl_thmss), |
1815 (ctor_set_set_inclN, map flat ctor_set_set_incl_thmsss)] @ |
1796 (ctor_set_set_inclN, map flat ctor_set_set_incl_thmsss)] @ |
1816 (if note_all then |
|
1817 [(ctor_srelN, map single ctor_Isrel_thms)] |
|
1818 else |
|
1819 []) @ |
|
1820 map2 (fn i => fn thms => (mk_ctor_setN i, map single thms)) ls' folded_ctor_set_thmss |
1797 map2 (fn i => fn thms => (mk_ctor_setN i, map single thms)) ls' folded_ctor_set_thmss |
1821 |> maps (fn (thmN, thmss) => |
1798 |> maps (fn (thmN, thmss) => |
1822 map2 (fn b => fn thms => |
1799 map2 (fn b => fn thms => |
1823 ((Binding.qualify true (Binding.name_of b) (Binding.name thmN), []), [(thms, [])])) |
1800 ((Binding.qualify true (Binding.name_of b) (Binding.name thmN), []), [(thms, [])])) |
1824 bs thmss) |
1801 bs thmss) |