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