@@ -5,9 +5,12 @@ Authors: Violeta Hernández Palacios
55-/
66module
77
8- public import Mathlib.SetTheory.Cardinal.Cofinality
8+ public import Mathlib.SetTheory.Cardinal.Regular
99public import Mathlib.Order.DirSupClosed
1010
11+ import Mathlib.Data.Set.Monotone
12+ import Mathlib.Order.CompleteLatticeIntervals
13+
1114/-!
1215# Club sets and stationary sets
1316
@@ -54,6 +57,10 @@ theorem IsClub.univ : IsClub (.univ (α := α)) :=
5457theorem isClub_empty_iff : IsClub (α := α) ∅ ↔ IsEmpty α :=
5558 ⟨fun h ↦ isCofinal_empty_iff.1 h.isCofinal, fun _ ↦ IsClub.of_isEmpty _⟩
5659
60+ theorem IsClub.nonempty [Nonempty α] (hs : IsClub s) : s.Nonempty := by
61+ by_contra!
62+ simp [isClub_empty_iff, this] at hs
63+
5764-- Depends on #37304.
5865proof_wanted IsClub.union (hs : IsClub s) (ht : IsClub t) : IsClub (s ∪ t)
5966
@@ -68,6 +75,10 @@ theorem IsClub.ciSup_mem {α} [ConditionallyCompleteLinearOrder α] {ι} {f : ι
6875 {s : Set α} (hs : IsClub s) (ht : .range f ⊆ s) (ht' : BddAbove (.range f)) : ⨆ i, f i ∈ s :=
6976 hs.csSup_mem ht (Set.range_nonempty _) ht'
7077
78+ theorem isClub_Ioi [NoMaxOrder α] (x : α) : IsClub (Set.Ioi x) where
79+ dirSupClosed := dirSupClosed_Ioi x
80+ isCofinal := .of_not_bddAbove (not_bddAbove_Ioi x)
81+
7182section WellFoundedLT
7283
7384variable [WellFoundedLT α]
@@ -101,6 +112,12 @@ theorem IsClub.iInter {ι : Type u} {f : ι → Set α} (hα : ℵ₀ < Order.co
101112 rw [← Cardinal.lift_lt]
102113 exact mk_range_le_lift.trans_lt hι
103114
115+ theorem IsClub.biInter {ι : Type u} {s : Set ι} {f : ι → Set α} (hα : ℵ₀ < Order.cof α)
116+ (hs : Cardinal.lift.{v} #s < Cardinal.lift.{u} (Order.cof α)) (hf : ∀ i ∈ s, IsClub (f i)) :
117+ IsClub (⋂ i ∈ s, f i) := by
118+ rw [Set.biInter_eq_iInter]
119+ exact iInter hα hs (by simpa)
120+
104121theorem IsClub.inter {s t : Set α} (hα : ℵ₀ < Order.cof α) (hs : IsClub s) (ht : IsClub t) :
105122 IsClub (s ∩ t) := by
106123 rw [← Set.sInter_pair]
@@ -164,6 +181,10 @@ theorem Order.IsNormal.isClub_fixedPoints {f : α → α} (hα : ℵ₀ < cof α
164181 refine .of_not_isCofinal fun h ↦ (Order.cof_le h).not_gt (hα.trans_le' ?_)
165182 simpa using mk_range_le_lift (f := fun n : ℕ ↦ f^[n] a)
166183
184+ lemma isClub_almost_fixed_points [NoMaxOrder α] {f : α → α} (hα' : ℵ₀ < Order.cof α)
185+ (hα : typeLT α ≤ (Order.cof α).ord) : IsClub {x : α | ∀ y < x, f y < x} :=
186+ IsClub.diag hα' hα fun x => isClub_Ioi (f x)
187+
167188end WellFoundedLT
168189
169190/-! ### Stationary sets -/
@@ -187,6 +208,11 @@ theorem isStationary_univ_iff : IsStationary (.univ (α := α)) ↔ Nonempty α
187208theorem IsStationary.univ [Nonempty α] : IsStationary (.univ (α := α)) :=
188209 isStationary_univ_iff.2 ‹_›
189210
211+ theorem IsStationary.not_bddAbove [NoMaxOrder α] (hs : IsStationary s) : ¬ BddAbove s := by
212+ by_contra ⟨a, ha⟩
213+ apply (hs (isClub_Ioi a)).ne_empty
214+ simpa [Set.eq_empty_iff_forall_notMem, mem_upperBounds] using ha
215+
190216theorem IsStationary.of_not_isCofinal_compl (hs : ¬ IsCofinal (sᶜ)) : IsStationary s := by
191217 rw [not_isCofinal_iff] at hs
192218 intro t ht
@@ -199,6 +225,12 @@ theorem IsStationary.of_not_isCofinal_compl (hs : ¬ IsCofinal (sᶜ)) : IsStati
199225proof_wanted isStationary_iff_not_isCofinal_compl (hα : Order.cof α ≤ ℵ₀) :
200226 IsStationary s ↔ ¬ IsCofinal (sᶜ)
201227
228+ theorem IsStationary.inter_isClub [WellFoundedLT α] (hα : ℵ₀ < Order.cof α) (hs : IsStationary s)
229+ (ht : IsClub t) : IsStationary (s ∩ t) := by
230+ intro t' ht'
231+ rw [Set.inter_assoc]
232+ exact hs (ht.inter hα ht')
233+
202234/-- **Fodor's lemma,** or the **pressing down lemma:** if `α` has the order type of a regular
203235cardinal, `s` is a stationary set, and `f : s → α` is a regressive function, there exists some
204236stationary subset of `s` which is constant on `f`. -/
@@ -213,3 +245,86 @@ theorem exists_isStationary_preimage_singleton [WellFoundedLT α] {f : s → α}
213245 obtain ⟨a, hs, ha⟩ := hs <| .diag hα' hα fun a ↦ (hg a).1
214246 apply (hg (f ⟨a, hs⟩)).2 a
215247 simpa using ⟨hs, ha _ (hf ⟨a, hs⟩)⟩
248+
249+ lemma exists_isStationary_preimage_singleton_of_cardinalMk_range_lt_cof [WellFoundedLT α]
250+ {f : s → Set α} (hα : ℵ₀ < Order.cof α) (hs : IsStationary s)
251+ (hf : #(Set.range f) < Order.cof α) : ∃ a, IsStationary (Subtype.val '' (f ⁻¹' {a})) := by
252+ unfold IsStationary
253+ by_contra!
254+ choose g hg using this
255+ apply (hs (.biInter hα (by simpa) fun i _ => (hg i).1 )).ne_empty
256+ rw [Set.eq_empty_iff_forall_notMem]
257+ intro x hx
258+ rw [Set.mem_inter_iff, Set.mem_iInter₂] at hx
259+ apply Set.not_nonempty_iff_eq_empty.2 (hg (f ⟨x, hx.1 ⟩)).2
260+ exists x
261+ grind [Subtype.exists]
262+
263+ /-- For regular cardinals `α < κ`, the set `{o < κ | cof o = α}` is stationary in `κ`. -/
264+ lemma Cardinal.IsRegular.isStationary_setOf_cof_eq {α κ : Cardinal.{u}} (hκ : κ.IsRegular)
265+ (hα : α.IsRegular) (h : α < κ) : IsStationary {o : Set.Iio κ.ord | cof o = α} := by
266+ intro C hC
267+ haveI : NoMaxOrder (Set.Iio κ.ord) := noMaxOrder_Iio_ord hκ.aleph0_le
268+ haveI : Fact (¬ IsMin κ.ord) := ⟨by simp [pos_iff_ne_zero.1 hκ.pos]⟩
269+ rcases hC.nonempty with ⟨a, ha⟩
270+ have := not_bddAbove_iff_isCofinal.2 hC.isCofinal
271+ simp only [bddAbove_def, not_exists, not_forall, exists_prop, not_le] at this
272+ choose! f hf₁ hf₂ using this
273+ let g : Ordinal.{u} → Set.Iio κ.ord := fun x =>
274+ Ordinal.limitRecOn x a (fun _ => f) fun x _ ih => ⨆ y : Set.Iio x, ih y.1 y.2
275+ have hg0 : g 0 = a := by simp [g]
276+ have hg_succ : ∀ x, g (Order.succ x) = f (g x) := by simp [g, -Order.succ_eq_add_one]
277+ have hg_limit : ∀ x, Order.IsSuccLimit x → g x = ⨆ y : Set.Iio x, g y := by
278+ simp +contextual [g, Ordinal.limitRecOn_limit]
279+ have hg₁ : ∀ x < κ.ord, g x ∈ C := by
280+ intro x hx
281+ induction x using Ordinal.limitRecOn with
282+ | zero => simpa [hg0]
283+ | succ x ih =>
284+ grind [Order.lt_succ]
285+ | limit x hx' ih =>
286+ simp only [hx', hg_limit]
287+ haveI : Nonempty (Set.Iio x) := ⟨0 , by simpa using hx'.bot_lt⟩
288+ apply hC.ciSup_mem
289+ · grind
290+ · apply bddAbove_range_Iio_of_lt_cof
291+ rwa [hκ.cof_ord, mk_Iio_ordinal, lift_lift, lift_lt, ← lt_ord]
292+ have hg₂ : StrictMonoOn g (Set.Iio κ.ord) := by
293+ intro x hx y hy h
294+ simp only [Set.mem_Iio] at hx hy
295+ induction y using Ordinal.limitRecOn generalizing x with
296+ | zero => simp at h
297+ | succ y ih =>
298+ simp only [hg_succ]
299+ apply (hf₂ _).trans_le'
300+ rw [Order.lt_succ_iff, le_iff_lt_or_eq] at h
301+ grind [Order.lt_succ]
302+ | limit y hy' ih =>
303+ simp only [hy', hg_limit]
304+ apply (hf₂ _).trans_le
305+ rw [← hg_succ]
306+ refine le_ciSup_of_le ?_ (⟨Order.succ x, ?_⟩ : Set.Iio y) le_rfl
307+ · apply bddAbove_range_Iio_of_lt_cof
308+ rwa [hκ.cof_ord, mk_Iio_ordinal, lift_lift, lift_lt, ← lt_ord]
309+ · simpa [-Order.succ_eq_add_one] using hy'.succ_lt h
310+ simp only [Set.nonempty_def, Set.mem_inter_iff, Set.mem_setOf_eq]
311+ refine ⟨g α.ord, ?_, ?_⟩
312+ · rw [hg_limit _ (Cardinal.isSuccLimit_ord hα.aleph0_le),
313+ Set.Iio.coe_iSup (bddAbove_range_Iio_of_lt_cof (by simpa [hκ.cof_ord])),
314+ Ordinal.cof_iSup_Iio, hα.cof_ord]
315+ · exact (hg₂.mono (Set.Iio_subset_Iio (Cardinal.ord_le_ord.2 h.le))).strictMono
316+ · exact (Cardinal.isSuccLimit_ord hα.aleph0_le).isSuccPrelimit
317+ · grind [Cardinal.ord_lt_ord]
318+
319+ lemma Cardinal.IsRegular.card_eq_of_isStationary {c : Cardinal.{u}} (hc : c.IsRegular)
320+ {s : Set (Set.Iio c.ord)} (hs : IsStationary s) : #s = Cardinal.lift.{u + 1 } c := by
321+ apply le_antisymm
322+ · grw [mk_set_le]
323+ simp
324+ conv_lhs => rw [← hc.cof_ord, lift_cof, ← cof_Iio]
325+ by_contra! h
326+ haveI : NoMaxOrder (Set.Iio c.ord) := noMaxOrder_Iio_ord hc.aleph0_le
327+ apply hs.not_bddAbove
328+ contrapose! h
329+ rw [not_bddAbove_iff_isCofinal] at h
330+ exact Order.cof_le h
0 commit comments