Skip to content

Commit 914b89d

Browse files
committed
feat: stationary sets (#39727)
We define stationary sets as sets intersecting all club sets, and prove basic theorems about them.
1 parent 2ddd05d commit 914b89d

2 files changed

Lines changed: 154 additions & 22 deletions

File tree

Mathlib/Order/Cofinal.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ theorem IsCofinal.mono {s t : Set α} (h : s ⊆ t) (hs : IsCofinal s) : IsCofin
5252
obtain ⟨b, hb, hb'⟩ := hs a
5353
exact ⟨b, h hb, hb'⟩
5454

55+
theorem IsCofinal.nonempty [Nonempty α] {s : Set α} (h : IsCofinal s) : s.Nonempty := by
56+
inhabit α
57+
obtain ⟨x, hx, _⟩ := h default
58+
exact ⟨x, hx⟩
59+
5560
end LE
5661

5762
section Preorder

Mathlib/SetTheory/Cardinal/Cofinality/Club.lean

Lines changed: 149 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ public import Mathlib.Order.IsNormal
1010
public 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

2830
universe 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. -/
3337
structure IsClub {α : Type*} [LinearOrder α] (s : Set α) where
@@ -40,8 +44,6 @@ structure IsClub {α : Type*} [LinearOrder α] (s : Set α) where
4044

4145
namespace IsClub
4246

43-
variable {α : Type v} {s t : Set α} {x : α} [LinearOrder α]
44-
4547
@[simp]
4648
theorem of_isEmpty [IsEmpty α] {s : Set α} : IsClub s :=
4749
⟨.of_isEmpty, .of_isEmpty⟩
@@ -50,6 +52,12 @@ theorem of_isEmpty [IsEmpty α] {s : Set α} : IsClub s :=
5052
protected 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+
5361
protected 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 α}
6371
theorem 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

6977
theorem 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

7482
theorem 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

8189
theorem 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

8694
section WellFoundedLT
87-
8895
variable [WellFoundedLT α]
8996

9097
attribute [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
113120
protected 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

130145
theorem _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

148163
end WellFoundedLT
149164
end 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

Comments
 (0)