Skip to content

Commit 44e2cb5

Browse files
committed
union
1 parent 34a6cf9 commit 44e2cb5

1 file changed

Lines changed: 142 additions & 0 deletions

File tree

  • Mathlib/SetTheory/Cardinal/Cofinality
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
/-
2+
Copyright (c) 2026 Violeta Hernández Palacios. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Violeta Hernández Palacios
5+
-/
6+
module
7+
8+
public import Mathlib.SetTheory.Cardinal.Cofinality.Basic
9+
public import Mathlib.Order.DirSupClosed
10+
11+
/-!
12+
# Club sets
13+
14+
A subset of a well-ordered type `α` is called a club set when it is closed in the order topology and
15+
cofinal. If `α` has no maximum, then an equivalent condition is that `α` is closed and unbounded;
16+
hence the name.
17+
18+
## Implementation notes
19+
20+
To avoid importing topology in the ordinals, we spell out the closure property using `DirSupClosed`.
21+
For any type equipped with the Scott-Hausdorff topology (which includes well-orders with the order
22+
topology), `DirSupClosed s` and `IsClosed s` are equivalent predicates.
23+
-/
24+
25+
@[expose] public section
26+
27+
universe u v
28+
29+
open Cardinal Order
30+
31+
/-- A club set is closed under suprema and cofinal. -/
32+
structure IsClub {α : Type*} [LinearOrder α] (s : Set α) where
33+
/-- Club sets are closed under suprema. If `α` is a well-order with the order topology, this
34+
condition is equivalent to `IsClosed s`. -/
35+
dirSupClosed : DirSupClosed s
36+
/-- Club sets are cofinal. If `α` has no maximum, this condition is equivalent to `¬ BddAbove s`.
37+
See `not_bddAbove_iff_isCofinal`. -/
38+
isCofinal : IsCofinal s
39+
40+
variable {α : Type v} {s t : Set α} {x : α} [LinearOrder α]
41+
42+
@[simp]
43+
theorem IsClub.of_isEmpty [IsEmpty α] (s : Set α) : IsClub s :=
44+
⟨.of_isEmpty s, .of_isEmpty s⟩
45+
46+
@[simp]
47+
theorem IsClub.univ : IsClub (.univ (α := α)) :=
48+
⟨.univ, .univ⟩
49+
50+
theorem IsClub.union (hs : IsClub s) (ht : IsClub t) : IsClub (s ∪ t) :=
51+
⟨hs.dirSupClosed.union ht.dirSupClosed, hs.isCofinal.mono Set.subset_union_left⟩
52+
53+
theorem IsClub.isLUB_mem (hs : IsClub s) (ht : t ⊆ s) (ht₀ : t.Nonempty) (hx : IsLUB t x) : x ∈ s :=
54+
hs.dirSupClosed ht ht₀ (Std.Total.directedOn _) hx
55+
56+
theorem IsClub.csSup_mem {α} [ConditionallyCompleteLinearOrder α] {s t : Set α}
57+
(hs : IsClub s) (ht : t ⊆ s) (ht₀ : t.Nonempty) (ht₁ : BddAbove t) : sSup t ∈ s :=
58+
hs.isLUB_mem ht ht₀ (isLUB_csSup ht₀ ht₁)
59+
60+
theorem IsClub.sInter_of_orderTop {s : Set (Set α)} [OrderTop α]
61+
(hs : ∀ x ∈ s, IsClub x) : IsClub (⋂₀ s) := by
62+
refine ⟨.sInter fun x hx ↦ (hs x hx).dirSupClosed, ?_⟩
63+
rw [isCofinal_iff_top_mem, Set.mem_sInter]
64+
exact fun x hx ↦ (hs x hx).isCofinal.top_mem
65+
66+
theorem IsClub.iInter_of_orderTop {ι : Type*} {f : ι → Set α} [OrderTop α]
67+
(hs : ∀ i, IsClub (f i)) : IsClub (⋂ i, f i) := by
68+
rw [← Set.sInter_range]
69+
exact .sInter_of_orderTop (by simpa)
70+
71+
theorem IsClub.sInter_of_cof_le_one {s : Set (Set α)} (hα : cof α ≤ 1)
72+
(hs : ∀ x ∈ s, IsClub x) : IsClub (⋂₀ s) := by
73+
cases isEmpty_or_nonempty α; · simp
74+
cases topOrderOrNoTopOrder α
75+
· exact .sInter_of_orderTop hs
76+
· cases one_lt_cof.not_ge hα
77+
78+
theorem IsClub.iInter_of_cof_le_one {ι : Type*} {f : ι → Set α} (hα : cof α ≤ 1)
79+
(hs : ∀ i, IsClub (f i)) : IsClub (⋂ i, f i) := by
80+
rw [← Set.sInter_range]
81+
exact .sInter_of_cof_le_one hα (by simpa)
82+
83+
section WellFoundedLT
84+
85+
variable [WellFoundedLT α]
86+
87+
attribute [local instance]
88+
WellFoundedLT.toOrderBot WellFoundedLT.conditionallyCompleteLinearOrderBot
89+
90+
theorem IsClub.sInter {s : Set (Set α)} (hα : cof α ≠ ℵ₀) (hsα : #s < cof α)
91+
(hs : ∀ x ∈ s, IsClub x) : IsClub (⋂₀ s) := by
92+
cases isEmpty_or_nonempty α; · simp
93+
obtain hα | hα := hα.lt_or_gt
94+
· exact .sInter_of_cof_le_one (cof_lt_aleph0_iff.1 hα) hs
95+
refine ⟨.sInter fun x hx ↦ (hs x hx).dirSupClosed, fun a ↦ ?_⟩
96+
choose f hf using fun x : s ↦ (hs _ x.2).isCofinal
97+
let g : ℕ → α := Nat.rec a fun _ IH ↦ sSup (.range (f · IH))
98+
have hg : BddAbove (.range g) := by
99+
refine .of_not_isCofinal fun hg ↦ (cof_le hg).not_gt (hα.trans_le' ?_)
100+
simpa using mk_range_le_lift (f := g)
101+
refine ⟨_, fun t ht ↦ ?_, le_csSup hg ⟨0, rfl⟩⟩
102+
apply (hs t ht).isLUB_mem (t := .range fun n ↦ f ⟨t, ht⟩ (g n)) _ (Set.range_nonempty _)
103+
· refine ⟨?_, fun b hb ↦ csSup_le' ?_⟩ <;> rintro _ ⟨n, rfl⟩
104+
· apply (le_csSup (.of_not_isCofinal _) _).trans (le_csSup hg ⟨n + 1, rfl⟩)
105+
· exact fun hg' ↦ (cof_le hg').not_gt (mk_range_le.trans_lt hsα)
106+
· use ⟨t, ht⟩
107+
· exact (hf ⟨t, ht⟩ _).2.trans <| hb ⟨_, rfl⟩
108+
· grind
109+
110+
theorem IsClub.iInter {ι : Type u} {f : ι → Set α} (hα : cof α ≠ ℵ₀)
111+
(hι : Cardinal.lift.{v} #ι < Cardinal.lift.{u} (cof α)) (hf : ∀ i, IsClub (f i)) :
112+
IsClub (⋂ i, f i) := by
113+
rw [← Set.sInter_range]
114+
refine IsClub.sInter hα ?_ (by simpa)
115+
rw [← Cardinal.lift_lt]
116+
exact mk_range_le_lift.trans_lt hι
117+
118+
theorem IsClub.inter {s t : Set α} (hα : cof α ≠ ℵ₀) (hs : IsClub s) (ht : IsClub t) :
119+
IsClub (s ∩ t) := by
120+
rw [← Set.sInter_pair]
121+
have H : ∀ x ∈ ({s, t} : Set _), IsClub x := by simpa [hs]
122+
obtain hα | hα' := hα.lt_or_gt
123+
· rw [cof_lt_aleph0_iff] at hα
124+
exact .sInter_of_cof_le_one hα H
125+
· exact .sInter hα (hα'.trans_le' <| by simp) H
126+
127+
theorem Order.IsNormal.isClub_fixedPoints {f : α → α} (hα : cof α ≠ ℵ₀) (hf : IsNormal f) :
128+
IsClub f.fixedPoints := by
129+
cases isEmpty_or_nonempty α; · simp
130+
refine ⟨fun s hs hs₀ _ a ha ↦ (hf.map_isLUB ha hs₀).unique ?_, fun a ↦ ?_⟩
131+
· rwa [Set.image_congr hs, Set.image_id']
132+
· cases topOrderOrNoTopOrder α with
133+
| inl => use ⊤; simpa using hf.strictMono.id_le ⊤
134+
| inr h =>
135+
rw [noTopOrder_iff_noMaxOrder] at h
136+
suffices BddAbove (.range fun n ↦ f^[n] a) from
137+
⟨_, hf.iSup_iterate_mem_fixedPoints a this, le_csSup this ⟨0, rfl⟩⟩
138+
refine .of_not_isCofinal fun h ↦ (cof_le h).not_gt
139+
((aleph0_le_cof.lt_of_ne' hα).trans_le' ?_)
140+
simpa using mk_range_le_lift (f := fun n : ℕ ↦ f^[n] a)
141+
142+
end WellFoundedLT

0 commit comments

Comments
 (0)