@@ -10,11 +10,13 @@ public import Mathlib.Order.IsNormal
1010public import Mathlib.SetTheory.Cardinal.Cofinality.Basic
1111
1212/-!
13- # Club sets
13+ # Club sets and stationary sets
1414
15- A subset of a well-ordered type `α` is called a club set when it is closed in the order topology and
16- cofinal. If `α` has no maximum, then an equivalent condition is that `α` is closed and unbounded;
17- hence the name.
15+ A subset of a well-ordered type `α` is called a **club set** when it is closed in the order topology
16+ and cofinal. If `α` has no maximum, then an equivalent condition is that `α` is closed and
17+ unbounded; hence the name.
18+
19+ A **stationary set** is a set which intersects all club sets.
1820
1921## Implementation notes
2022
@@ -27,7 +29,9 @@ public section
2729
2830universe u v
2931
30- open Cardinal Order
32+ open Cardinal Order Set
33+
34+ variable {α : Type v} {s t : Set α} {x : α} [LinearOrder α]
3135
3236/-- A club set is closed under suprema and cofinal. -/
3337structure IsClub {α : Type *} [LinearOrder α] (s : Set α) where
@@ -40,8 +44,6 @@ structure IsClub {α : Type*} [LinearOrder α] (s : Set α) where
4044
4145namespace IsClub
4246
43- variable {α : Type v} {s t : Set α} {x : α} [LinearOrder α]
44-
4547@[simp]
4648theorem of_isEmpty [IsEmpty α] {s : Set α} : IsClub s :=
4749 ⟨.of_isEmpty, .of_isEmpty⟩
@@ -50,6 +52,12 @@ theorem of_isEmpty [IsEmpty α] {s : Set α} : IsClub s :=
5052protected theorem univ : IsClub (α := α) .univ :=
5153 ⟨.univ, .univ⟩
5254
55+ protected theorem nonempty [Nonempty α] (hs : IsClub s) : s.Nonempty :=
56+ hs.isCofinal.nonempty
57+
58+ theorem _root_.isClub_empty_iff : IsClub (α := α) ∅ ↔ IsEmpty α :=
59+ ⟨fun h ↦ isCofinal_empty_iff.1 h.isCofinal, fun _ ↦ .of_isEmpty⟩
60+
5361protected theorem union (hs : IsClub s) (ht : IsClub t) : IsClub (s ∪ t) :=
5462 ⟨hs.dirSupClosed.union ht.dirSupClosed, hs.isCofinal.mono Set.subset_union_left⟩
5563
@@ -63,12 +71,12 @@ theorem csSup_mem {α} [ConditionallyCompleteLinearOrder α] {s t : Set α}
6371theorem sInter_of_orderTop {s : Set (Set α)} [OrderTop α] (hs : ∀ x ∈ s, IsClub x) :
6472 IsClub (⋂₀ s) := by
6573 refine ⟨.sInter fun x hx ↦ (hs x hx).dirSupClosed, ?_⟩
66- rw [isCofinal_iff_top_mem, Set. mem_sInter]
74+ rw [isCofinal_iff_top_mem, mem_sInter]
6775 exact fun x hx ↦ (hs x hx).isCofinal.top_mem
6876
6977theorem iInter_of_orderTop {ι : Type *} {f : ι → Set α} [OrderTop α] (hs : ∀ i, IsClub (f i)) :
7078 IsClub (⋂ i, f i) := by
71- rw [← Set. sInter_range]
79+ rw [← sInter_range]
7280 exact .sInter_of_orderTop (by simpa)
7381
7482theorem sInter_of_cof_le_one {s : Set (Set α)} (hα : cof α ≤ 1 ) (hs : ∀ x ∈ s, IsClub x) :
@@ -80,11 +88,10 @@ theorem sInter_of_cof_le_one {s : Set (Set α)} (hα : cof α ≤ 1) (hs : ∀ x
8088
8189theorem iInter_of_cof_le_one {ι : Type *} {f : ι → Set α} (hα : cof α ≤ 1 ) (hs : ∀ i, IsClub (f i)) :
8290 IsClub (⋂ i, f i) := by
83- rw [← Set. sInter_range]
91+ rw [← sInter_range]
8492 exact .sInter_of_cof_le_one hα (by simpa)
8593
8694section WellFoundedLT
87-
8895variable [WellFoundedLT α]
8996
9097attribute [local instance ]
@@ -102,7 +109,7 @@ protected theorem sInter {s : Set (Set α)} (hα : cof α ≠ ℵ₀) (hsα : #s
102109 refine .of_not_isCofinal fun hg ↦ (cof_le hg).not_gt (hα.trans_le' ?_)
103110 simpa using mk_range_le_lift (f := g)
104111 refine ⟨_, fun t ht ↦ ?_, le_csSup hg ⟨0 , rfl⟩⟩
105- apply (hs t ht).isLUB_mem (t := .range fun n ↦ f ⟨t, ht⟩ (g n)) _ (Set. range_nonempty _)
112+ apply (hs t ht).isLUB_mem (t := .range fun n ↦ f ⟨t, ht⟩ (g n)) _ (range_nonempty _)
106113 · refine ⟨?_, fun b hb ↦ csSup_le' ?_⟩ <;> rintro _ ⟨n, rfl⟩
107114 · apply (le_csSup (.of_not_isCofinal _) _).trans (le_csSup hg ⟨n + 1 , rfl⟩)
108115 · exact fun hg' ↦ (cof_le hg').not_gt (mk_range_le.trans_lt hsα)
@@ -113,19 +120,27 @@ protected theorem sInter {s : Set (Set α)} (hα : cof α ≠ ℵ₀) (hsα : #s
113120protected theorem iInter {ι : Type u} {f : ι → Set α} (hα : cof α ≠ ℵ₀)
114121 (hι : Cardinal.lift.{v} #ι < Cardinal.lift.{u} (cof α)) (hf : ∀ i, IsClub (f i)) :
115122 IsClub (⋂ i, f i) := by
116- rw [← Set. sInter_range]
123+ rw [← sInter_range]
117124 refine IsClub.sInter hα ?_ (by simpa)
118125 rw [← Cardinal.lift_lt]
119126 exact mk_range_le_lift.trans_lt hι
120127
121- protected theorem inter {s t : Set α} (hα : cof α ≠ ℵ₀) (hs : IsClub s) (ht : IsClub t) :
122- IsClub (s ∩ t) := by
123- rw [← Set.sInter_pair]
124- have H : ∀ x ∈ ({s, t} : Set _), IsClub x := by simpa [hs]
125- obtain hα | hα' := hα.lt_or_gt
126- · rw [cof_lt_aleph0_iff] at hα
127- exact .sInter_of_cof_le_one hα H
128- · exact .sInter hα (hα'.trans_le' <| by simp) H
128+ theorem sInter_of_countable {s : Set (Set α)} (hα : cof α ≠ ℵ₀) (hsα : s.Countable)
129+ (hs : ∀ x ∈ s, IsClub x) : IsClub (⋂₀ s) := by
130+ obtain hα | hα := hα.lt_or_gt
131+ · apply IsClub.sInter_of_cof_le_one _ hs
132+ rwa [← cof_lt_aleph0_iff]
133+ · apply IsClub.sInter hα.ne' (hα.trans_le' _) hs
134+ rwa [le_aleph0_iff_set_countable]
135+
136+ theorem iInter_of_countable {ι : Sort *} {f : ι → Set α} [Countable ι] (hα : cof α ≠ ℵ₀)
137+ (hf : ∀ i, IsClub (f i)) : IsClub (⋂ i, f i) := by
138+ rw [← sInter_range]
139+ apply IsClub.sInter_of_countable hα (countable_range f)
140+ simpa
141+
142+ protected theorem inter (hα : cof α ≠ ℵ₀) (hs : IsClub s) (ht : IsClub t) : IsClub (s ∩ t) := by
143+ simpa [hs, ht] using IsClub.sInter_of_countable (s := {s, t}) hα
129144
130145theorem _root_.Order.IsNormal.isClub_range {f : α → α} (hf : IsNormal f) : IsClub (.range f) :=
131146 ⟨hf.dirSupClosed_range, fun x ↦ ⟨_, ⟨x, rfl⟩, hf.strictMono.le_apply⟩⟩
@@ -134,7 +149,7 @@ theorem _root_.Order.IsNormal.isClub_fixedPoints {f : α → α} (hα : cof α
134149 IsClub f.fixedPoints := by
135150 cases isEmpty_or_nonempty α; · simp
136151 refine ⟨fun s hs hs₀ _ a ha ↦ (hf.map_isLUB ha hs₀).unique ?_, fun a ↦ ?_⟩
137- · rwa [Set. image_congr hs, Set. image_id']
152+ · rwa [image_congr hs, image_id']
138153 · cases topOrderOrNoTopOrder α with
139154 | inl => use ⊤; simpa using ! hf.strictMono.id_le ⊤
140155 | inr h =>
@@ -147,3 +162,115 @@ theorem _root_.Order.IsNormal.isClub_fixedPoints {f : α → α} (hα : cof α
147162
148163end WellFoundedLT
149164end IsClub
165+
166+ /-! ### Stationary sets -/
167+
168+ /-- A set is called stationary when it intersects all club sets. -/
169+ @[expose]
170+ def IsStationary (s : Set α) : Prop :=
171+ ∀ ⦃t⦄, IsClub t → (s ∩ t).Nonempty
172+
173+ theorem not_isStationary_iff : ¬ IsStationary s ↔ ∃ t, IsClub t ∧ Disjoint s t := by
174+ simp [IsStationary, disjoint_iff, not_nonempty_iff_eq_empty]
175+
176+ @[gcongr]
177+ theorem IsStationary.mono (hs : IsStationary s) (h : s ⊆ t) : IsStationary t :=
178+ fun _u hu ↦ (hs hu).mono (inter_subset_inter_left _ h)
179+
180+ theorem IsStationary.nonempty (hs : IsStationary s) : s.Nonempty := by
181+ simpa using hs .univ
182+
183+ theorem isStationary_univ_iff : IsStationary (.univ (α := α)) ↔ Nonempty α := by
184+ simp [IsStationary, ← not_imp_not (b := IsClub _), not_nonempty_iff_eq_empty,
185+ isClub_empty_iff]
186+
187+ @[simp]
188+ protected theorem IsStationary.univ [Nonempty α] : IsStationary (.univ (α := α)) :=
189+ isStationary_univ_iff.2 ‹_›
190+
191+ @[simp]
192+ theorem not_isStationary_empty : ¬ IsStationary (∅ : Set α) := by
193+ intro h
194+ simpa using h .univ
195+
196+ @[simp]
197+ theorem not_isStationary_of_isEmpty [IsEmpty α] : ¬ IsStationary s :=
198+ s.eq_empty_of_isEmpty ▸ not_isStationary_empty
199+
200+ theorem IsStationary.of_not_isCofinal_compl (hs : ¬ IsCofinal sᶜ) : IsStationary s := by
201+ intro t ht
202+ obtain ⟨a, ha⟩ := not_isCofinal_iff.1 hs
203+ obtain ⟨b, hb, hb'⟩ := ht.isCofinal a
204+ refine ⟨b, ?_, hb⟩
205+ contrapose! ha
206+ exact ⟨b, ha, hb'⟩
207+
208+ theorem isStationary_sUnion_iff_of_cof_le_one {s : Set (Set α)} (hα : cof α ≤ 1 ) :
209+ IsStationary (⋃₀ s) ↔ ∃ x ∈ s, IsStationary x where
210+ mp h := by
211+ contrapose! h
212+ simp_rw [not_isStationary_iff] at h ⊢
213+ choose f hf hxf using h
214+ refine ⟨⋂ x : s, f _ x.2 , ?_, ?_⟩
215+ · apply IsClub.iInter_of_cof_le_one hα
216+ simpa
217+ · rw [disjoint_sUnion_left]
218+ exact fun x hx ↦ (hxf _ hx).mono_right (iInter_subset _ ⟨x, hx⟩)
219+ mpr := fun ⟨x, hxs, hx⟩ ↦ hx.mono (subset_sUnion_of_mem hxs)
220+
221+ theorem isStationary_iUnion_iff_of_cof_le_one {ι : Sort *} {f : ι → Set α} (hα : cof α ≤ 1 ) :
222+ IsStationary (⋃ i, f i) ↔ ∃ i, IsStationary (f i) := by
223+ rw [← sUnion_range, isStationary_sUnion_iff_of_cof_le_one hα]
224+ simp
225+
226+ theorem isStationary_sUnion_iff_of_orderTop [OrderTop α] {s : Set (Set α)} :
227+ IsStationary (⋃₀ s) ↔ ∃ x ∈ s, IsStationary x :=
228+ isStationary_sUnion_iff_of_cof_le_one (by simp)
229+
230+ theorem isStationary_iUnion_iff_of_orderTop [OrderTop α] {ι : Sort *} {f : ι → Set α} :
231+ IsStationary (⋃ i, f i) ↔ ∃ i, IsStationary (f i) :=
232+ isStationary_iUnion_iff_of_cof_le_one (by simp)
233+
234+ section WellFoundedLT
235+ variable [WellFoundedLT α]
236+
237+ theorem IsClub.isStationary [Nonempty α] (hα : cof α ≠ ℵ₀) (hs : IsClub s) : IsStationary s :=
238+ fun _ ht ↦ (hs.inter hα ht).nonempty
239+
240+ theorem isStationary_sUnion_iff {s : Set (Set α)} (hα : cof α ≠ ℵ₀) (hsα : #s < cof α) :
241+ IsStationary (⋃₀ s) ↔ ∃ x ∈ s, IsStationary x where
242+ mp h := by
243+ contrapose! h
244+ simp_rw [not_isStationary_iff] at h ⊢
245+ choose f hf hxf using h
246+ refine ⟨⋂ x : s, f _ x.2 , ?_, ?_⟩
247+ · apply IsClub.iInter hα <;> simpa
248+ · rw [disjoint_sUnion_left]
249+ exact fun x hx ↦ (hxf _ hx).mono_right (iInter_subset _ ⟨x, hx⟩)
250+ mpr := fun ⟨x, hxs, hx⟩ ↦ hx.mono (subset_sUnion_of_mem hxs)
251+
252+ theorem isStationary_iUnion_iff {ι : Type u} {f : ι → Set α} (hα : cof α ≠ ℵ₀)
253+ (hι : lift.{v} #ι < lift.{u} (cof α)) : IsStationary (⋃ i, f i) ↔ ∃ i, IsStationary (f i) := by
254+ rw [← sUnion_range, isStationary_sUnion_iff hα]
255+ · simp
256+ · rw [← Cardinal.lift_lt]
257+ exact mk_range_le_lift.trans_lt hι
258+
259+ theorem isStationary_sUnion_iff_of_countable {s : Set (Set α)} (hα : cof α ≠ ℵ₀)
260+ (hsα : s.Countable) : IsStationary (⋃₀ s) ↔ ∃ x ∈ s, IsStationary x := by
261+ obtain hα | hα := hα.lt_or_gt
262+ · apply isStationary_sUnion_iff_of_cof_le_one
263+ rwa [← cof_lt_aleph0_iff]
264+ · apply isStationary_sUnion_iff hα.ne' (hα.trans_le' _)
265+ rwa [le_aleph0_iff_set_countable]
266+
267+ theorem isStationary_iUnion_iff_of_countable {ι : Sort *} {f : ι → Set α} [Countable ι]
268+ (hα : cof α ≠ ℵ₀) : IsStationary (⋃ i, f i) ↔ ∃ i, IsStationary (f i) := by
269+ rw [← sUnion_range, isStationary_sUnion_iff_of_countable hα (countable_range f)]
270+ simp
271+
272+ theorem isStationary_union_iff (hα : cof α ≠ ℵ₀) :
273+ IsStationary (s ∪ t) ↔ IsStationary s ∨ IsStationary t := by
274+ simpa using isStationary_sUnion_iff_of_countable (s := {s, t}) hα
275+
276+ end WellFoundedLT
0 commit comments