diff -r 7a6301d01199 -r 22d1c5f2b9f4 src/HOL/BNF_Cardinal_Order_Relation.thy --- a/src/HOL/BNF_Cardinal_Order_Relation.thy Sat Jun 25 09:50:40 2022 +0000 +++ b/src/HOL/BNF_Cardinal_Order_Relation.thy Mon Jun 27 15:54:18 2022 +0200 @@ -1,6 +1,7 @@ (* Title: HOL/BNF_Cardinal_Order_Relation.thy Author: Andrei Popescu, TU Muenchen - Copyright 2012 + Author: Jan van Brügge, TU Muenchen + Copyright 2012, 2022 Cardinal-order relations as needed by bounded natural functors. *) @@ -1425,6 +1426,66 @@ thus ?thesis by (simp only: card_of_cardSuc_finite) qed +lemma Field_cardSuc_not_empty: +assumes "Card_order r" +shows "Field (cardSuc r) \ {}" +proof + assume "Field(cardSuc r) = {}" + then have "|Field(cardSuc r)| \o r" using assms Card_order_empty[of r] by auto + then have "cardSuc r \o r" using assms card_of_Field_ordIso + cardSuc_Card_order ordIso_symmetric ordIso_ordLeq_trans by blast + then show False using cardSuc_greater not_ordLess_ordLeq assms by blast +qed + +typedef 'a suc = "Field (cardSuc |UNIV :: 'a set| )" + using Field_cardSuc_not_empty card_of_Card_order by blast + +definition card_suc :: "'a rel \ 'a suc rel" where + "card_suc \ \_. map_prod Abs_suc Abs_suc ` cardSuc |UNIV :: 'a set|" + +lemma Field_card_suc: "Field (card_suc r) = UNIV" +proof - + let ?r = "cardSuc |UNIV|" + let ?ar = "\x. Abs_suc (Rep_suc x)" + have 1: "\P. (\x\Field ?r. P x) = (\x. P (Rep_suc x))" using Rep_suc_induct Rep_suc by blast + have 2: "\P. (\x\Field ?r. P x) = (\x. P (Rep_suc x))" using Rep_suc_cases Rep_suc by blast + have 3: "\A a b. (a, b) \ A \ (Abs_suc a, Abs_suc b) \ map_prod Abs_suc Abs_suc ` A" unfolding map_prod_def by auto + have "\x\Field ?r. (\b\Field ?r. (x, b) \ ?r) \ (\a\Field ?r. (a, x) \ ?r)" + unfolding Field_def Range.simps Domain.simps Un_iff by blast + then have "\x. (\b. (Rep_suc x, Rep_suc b) \ ?r) \ (\a. (Rep_suc a, Rep_suc x) \ ?r)" unfolding 1 2 . + then have "\x. (\b. (?ar x, ?ar b) \ map_prod Abs_suc Abs_suc ` ?r) \ (\a. (?ar a, ?ar x) \ map_prod Abs_suc Abs_suc ` ?r)" using 3 by fast + then have "\x. (\b. (x, b) \ card_suc r) \ (\a. (a, x) \ card_suc r)" unfolding card_suc_def Rep_suc_inverse . + then show ?thesis unfolding Field_def Domain.simps Range.simps set_eq_iff Un_iff eqTrueI[OF UNIV_I] ex_simps simp_thms . +qed + +lemma card_suc_alt: "card_suc r = dir_image (cardSuc |UNIV :: 'a set| ) Abs_suc" + unfolding card_suc_def dir_image_def by auto + +lemma cardSuc_Well_order: "Card_order r \ Well_order(cardSuc r)" + using cardSuc_Card_order unfolding card_order_on_def by blast + +lemma cardSuc_ordIso_card_suc: + assumes "card_order r" + shows "cardSuc r =o card_suc (r :: 'a rel)" +proof - + have "cardSuc (r :: 'a rel) =o cardSuc |UNIV :: 'a set|" + using cardSuc_invar_ordIso[THEN iffD2, OF _ card_of_Card_order card_of_unique[OF assms]] assms + by (simp add: card_order_on_Card_order) + also have "cardSuc |UNIV :: 'a set| =o card_suc (r :: 'a rel)" + unfolding card_suc_alt + by (rule dir_image_ordIso) (simp_all add: inj_on_def Abs_suc_inject cardSuc_Well_order card_of_Card_order) + finally show ?thesis . +qed + +lemma Card_order_card_suc: "card_order r \ Card_order (card_suc r)" + using cardSuc_Card_order[THEN Card_order_ordIso2[OF _ cardSuc_ordIso_card_suc]] card_order_on_Card_order by blast + +lemma card_order_card_suc: "card_order r \ card_order (card_suc r)" + using Card_order_card_suc arg_cong2[OF Field_card_suc refl, of "card_order_on"] by blast + +lemma card_suc_greater: "card_order r \ r finite C" and LESS1: "|A| finite C" and + LESS1: "|A| B| finite (Field r)" and r: "Card_order r" and + LESS1: "|A| |?C| =o r" using r card_of_Field_ordIso + ordIso_symmetric by blast + hence "|A| Regular cardinals\ @@ -1689,4 +1771,228 @@ thus ?thesis using card_of_ordIso by blast qed +subsection \Regular vs. stable cardinals\ + +definition stable :: "'a rel \ bool" +where +"stable r \ \(A::'a set) (F :: 'a \ 'a set). + |A| (\a \ A. |F a| |SIGMA a : A. F a| finite (Field r)" and reg: "regularCard r" + shows "stable r" + unfolding stable_def proof safe + fix A :: "'a set" and F :: "'a \ 'a set" assume A: "|A| a\A. |F a| o |Sigma A F|" + hence "|Field r| \o |Sigma A F|" using card_of_Field_ordIso[OF cr] ordIso_ordLeq_trans by blast + moreover have Fi: "Field r \ {}" using ir by auto + ultimately have "\f. f ` Sigma A F = Field r" using card_of_ordLeq2[OF Fi] by blast + then obtain f where f: "f ` Sigma A F = Field r" by blast + have r: "wo_rel r" using cr unfolding card_order_on_def wo_rel_def by auto + {fix a assume a: "a \ A" + define L where "L = {(a,u) | u. u \ F a}" + have fL: "f ` L \ Field r" using f a unfolding L_def by auto + have "|L| =o |F a|" unfolding L_def card_of_ordIso[symmetric] + apply(rule exI[of _ snd]) unfolding bij_betw_def inj_on_def by (auto simp: image_def) + hence "|L| cofinal (f ` L) r" using reg fL unfolding regularCard_def + apply simp + apply (drule not_ordLess_ordIso) + by auto + then obtain k where k: "k \ Field r" and "\ l \ L. \ (f l \ k \ (k, f l) \ r)" + unfolding cofinal_def image_def by auto + hence "\ k \ Field r. \ l \ L. (f l, k) \ r" + using wo_rel.in_notinI[OF r _ _ \k \ Field r\] fL unfolding image_subset_iff by fast + hence "\ k \ Field r. \ u \ F a. (f (a,u), k) \ r" unfolding L_def by auto + } + then have x: "\a. a\A \ \k. k \ Field r \ (\u\F a. (f (a, u), k) \ r)" by blast + obtain gg where "\a. a\A \ gg a = (SOME k. k \ Field r \ (\u\F a. (f (a, u), k) \ r))" by simp + then have gg: "\a\A. \u\F a. (f (a, u), gg a) \ r" using someI_ex[OF x] by auto + obtain j0 where j0: "j0 \ Field r" using Fi by auto + define g where [abs_def]: "g a = (if F a \ {} then gg a else j0)" for a + have g: "\ a \ A. \ u \ F a. (f (a,u),g a) \ r" using gg unfolding g_def by auto + hence 1: "Field r \ (\a \ A. under r (g a))" + using f[symmetric] unfolding under_def image_def by auto + have gA: "g ` A \ Field r" using gg j0 unfolding Field_def g_def by auto + moreover have "cofinal (g ` A) r" unfolding cofinal_def proof safe + fix i assume "i \ Field r" + then obtain j where ij: "(i,j) \ r" "i \ j" using cr ir infinite_Card_order_limit by fast + hence "j \ Field r" using card_order_on_def cr well_order_on_domain by fast + then obtain a where a: "a \ A" and j: "(j, g a) \ r" using 1 unfolding under_def by auto + hence "(i, g a) \ r" using ij wo_rel.TRANS[OF r] unfolding trans_def by blast + moreover have "i \ g a" + using ij j r unfolding wo_rel_def unfolding well_order_on_def linear_order_on_def + partial_order_on_def antisym_def by auto + ultimately show "\j\g ` A. i \ j \ (i, j) \ r" using a by auto + qed + ultimately have "|g ` A| =o r" using reg unfolding regularCard_def by auto + moreover have "|g ` A| \o |A|" using card_of_image by blast + ultimately have False using A using not_ordLess_ordIso ordLeq_ordLess_trans by blast + } + thus "|Sigma A F| finite (Field r)" and st: "stable r" +shows "regularCard r" +unfolding regularCard_def proof safe + fix K assume K: "K \ Field r" and cof: "cofinal K r" + have "|K| \o r" using K card_of_Field_ordIso card_of_mono1 cr ordLeq_ordIso_trans by blast + moreover + {assume Kr: "|K| a. a \ Field r \ \b. b \ K \ a \ b \ (a, b) \ r" using cof unfolding cofinal_def by blast + then obtain f where "\a. a \ Field r \ f a = (SOME b. b \ K \ a \ b \ (a, b) \ r)" by simp + then have "\a\Field r. f a \ K \ a \ f a \ (a, f a) \ r" using someI_ex[OF x] by simp + hence "Field r \ (\a \ K. underS r a)" unfolding underS_def by auto + hence "r \o |\a \ K. underS r a|" + using cr Card_order_iff_ordLeq_card_of card_of_mono1 ordLeq_transitive by blast + also have "|\a \ K. underS r a| \o |SIGMA a: K. underS r a|" by (rule card_of_UNION_Sigma) + also + {have "\ a \ K. |underS r a| B < Field r. |A| =o |B| \ |B| |A| =o p \ p |Field p| B < Field r. |A| =o |B| \ |B| B < Field r. |A| =o |B| \ |B| i \ I. |A i| =o |B i|" +shows "|SIGMA i : I. A i| =o |SIGMA i : I. B i|" +using assms by (auto simp add: card_of_Sigma_mono1 ordIso_iff_ordLeq) + +lemma card_of_Sigma_cong2: +assumes "bij_betw f (I::'i set) (J::'j set)" +shows "|SIGMA i : I. (A::'j \ 'a set) (f i)| =o |SIGMA j : J. A j|" +proof- + let ?LEFT = "SIGMA i : I. A (f i)" + let ?RIGHT = "SIGMA j : J. A j" + obtain u where u_def: "u = (\(i::'i,a::'a). (f i,a))" by blast + have "bij_betw u ?LEFT ?RIGHT" + using assms unfolding u_def bij_betw_def inj_on_def by auto + thus ?thesis using card_of_ordIso by blast +qed + +lemma card_of_Sigma_cong: +assumes BIJ: "bij_betw f I J" and + ISO: "\j \ J. |A j| =o |B j|" +shows "|SIGMA i : I. A (f i)| =o |SIGMA j : J. B j|" +proof- + have "\i \ I. |A(f i)| =o |B(f i)|" + using ISO BIJ unfolding bij_betw_def by blast + hence "|SIGMA i : I. A (f i)| =o |SIGMA i : I. B (f i)|" by (rule card_of_Sigma_cong1) + moreover have "|SIGMA i : I. B (f i)| =o |SIGMA j : J. B j|" + using BIJ card_of_Sigma_cong2 by blast + ultimately show ?thesis using ordIso_transitive by blast +qed + +(* Note that below the types of A and F are now unconstrained: *) +lemma stable_elim: +assumes ST: "stable r" and A_LESS: "|A| a. a \ A \ |F a| |A'| A" + hence "\B'. B' \ Field r \ |F a| =o |B'| \ |B'| a \ A. F' a \ Field r \ |F a| =o |F' a| \ |F' a| a B'. B' \ Field r \ |F a| =o |B'| \ |B'| a \ A. F' a \ Field r \ |F' a| a \ A. |F' a| =o |F a|" using temp ordIso_symmetric by auto + (* *) + have "\a' \ A'. F'(G a') \ Field r \ |F'(G a')| 'a set" + assume "|A| a\A. |F a| (\a \ A. finite(F a))" + by (auto simp add: finite_iff_ordLess_natLeq) + hence "finite(Sigma A F)" by (simp only: finite_SigmaI[of A F]) + thus "|Sigma A F | 'b set" + assume "|A| a \ A. |F a| (\a \ A. |F a| a. a \ A \ |F a| a \ A. F a| a \ A. F a| \o |SIGMA a : A. F a|" + using card_of_UNION_Sigma by blast + thus ?thesis using assms stable_elim ordLeq_ordLess_trans by blast +qed + +corollary card_of_UNION_ordLess_infinite: +assumes INF: "stable |B|" and + LEQ_I: "|I| i \ I. |A i| i \ I. A i| i \ I. |A i| i \ I. A i| |?B| =o r" using r card_of_Field_ordIso + ordIso_symmetric by blast + hence "|I| i \ I. |A i| i \ I. A i|