Skip to content

Commit e969f2c

Browse files
committed
reprove
1 parent 1558ff3 commit e969f2c

9 files changed

Lines changed: 309 additions & 208 deletions

File tree

Mathlib/Order/Club.lean

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ Authors: Violeta Hernández Palacios
55
-/
66
module
77

8-
public import Mathlib.SetTheory.Cardinal.Cofinality
8+
public import Mathlib.SetTheory.Cardinal.Regular
99
public 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 (α := α)) :=
5457
theorem 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.
5865
proof_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+
7182
section WellFoundedLT
7283

7384
variable [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+
104121
theorem 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+
167188
end WellFoundedLT
168189

169190
/-! ### Stationary sets -/
@@ -187,6 +208,11 @@ theorem isStationary_univ_iff : IsStationary (.univ (α := α)) ↔ Nonempty α
187208
theorem 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+
190216
theorem 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
199225
proof_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
203235
cardinal, `s` is a stationary set, and `f : s → α` is a regressive function, there exists some
204236
stationary 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

Mathlib/Order/DirSupClosed.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,14 @@ lemma dirSupClosedOn_Iic (a : α) : DirSupClosedOn D (Iic a) :=
210210
lemma dirSupClosed_Iic (a : α) : DirSupClosed (Iic a) := by
211211
simpa using dirSupClosedOn_Iic a (D := .univ)
212212

213+
lemma dirSupClosedOn_Ioi (a : α) : DirSupClosedOn D (Ioi a) := by
214+
intro s _ hs hs' _ b hb
215+
rcases hs' with ⟨c, hc⟩
216+
exact (hs hc).trans_le (hb.1 hc)
217+
218+
lemma dirSupClosed_Ioi (a : α) : DirSupClosed (Ioi a) := by
219+
simpa using dirSupClosedOn_Ioi a (D := .univ)
220+
213221
lemma dirSupInaccOn_Iic (a : α) : DirSupInaccOn D (Iic a) :=
214222
(isLowerSet_Iic a).dirSupInaccOn
215223

Mathlib/SetTheory/Cardinal/Arithmetic.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -803,12 +803,12 @@ theorem mk_bounded_set_le_powerlt (α : Type u) (c : Cardinal) :
803803
apply mk_iUnion_le_sum_mk_lift.trans
804804
apply (sum_le_lift_mk_mul_iSup_lift _).trans
805805
simp only [mk_Iio_ordinal, card_ord, lift_lift, coe_setOf]
806-
rw [← lift_iSup (bddAbove_of_small _), ← lift_mul, lift_le]
806+
rw [← lift_iSup bddAbove_of_small, ← lift_mul, lift_le]
807807
apply mul_le_mul_right
808808
rw [powerlt]
809809
refine ciSup_le' fun ⟨i, hi⟩ => ?_
810810
simp only [mem_Iio, lt_ord] at hi
811-
refine le_ciSup_of_le (bddAbove_of_small _) ⟨i.card, hi⟩ ?_
811+
refine le_ciSup_of_le bddAbove_of_small ⟨i.card, hi⟩ ?_
812812
apply mk_bounded_set_le
813813

814814
theorem mk_bounded_subset_le_powerlt {α : Type u} (s : Set α) (c : Cardinal.{u}) :

Mathlib/SetTheory/Cardinal/Basic.lean

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,6 +1042,10 @@ theorem powerlt_le_powerlt_right {a b c : Cardinal} (h : a ≤ b) : a ^< c ≤ b
10421042

10431043
theorem powerlt_mono_right (a) : Monotone fun c => c ^< a := fun _ _ => powerlt_le_powerlt_right
10441044

1045+
@[gcongr]
1046+
theorem powerlt_le_powerlt {a b c d : Cardinal} (h₁ : a ≤ b) (h₂ : c ≤ d) : a ^< c ≤ b ^< d :=
1047+
(powerlt_le_powerlt_right h₁).trans (powerlt_le_powerlt_left h₂)
1048+
10451049
theorem powerlt_succ {a b : Cardinal} (h : a ≠ 0) : a ^< succ b = a ^ b :=
10461050
(powerlt_le.2 fun _ h' => power_le_power_left h <| le_of_lt_succ h').antisymm <|
10471051
le_powerlt a (lt_succ b)
@@ -1075,6 +1079,19 @@ theorem powerlt_eq_zero_iff {a b : Cardinal} : a ^< b = 0 ↔ b = 0 := by
10751079
rw [← powerlt_one ha.ne']
10761080
exact powerlt_le_powerlt_left hb
10771081

1082+
@[simp]
1083+
theorem lift_powerlt (a b : Cardinal.{u}) : lift.{v} (a ^< b) = lift.{v} a ^< lift.{v} b := by
1084+
conv_lhs => simp only [powerlt, lift_iSup, bddAbove_of_small]
1085+
apply le_antisymm
1086+
· refine ciSup_le' fun c => ?_
1087+
rw [lift_power]
1088+
exact le_powerlt _ (lift_lt.2 c.2)
1089+
· simp_rw [powerlt_le, lt_lift_iff]
1090+
rintro _ ⟨c, hc, rfl⟩
1091+
haveI := Small.trans_univLE.{u, max u v} (Iio b)
1092+
refine le_ciSup_of_le bddAbove_of_small ⟨c, hc⟩ ?_
1093+
simp
1094+
10781095
/-- The cardinality of a set is an upper-bound for the amount of elements before the set's mex
10791096
(minimum excluded value) -/
10801097
theorem _root_.WellFounded.cardinalMk_subtype_lt_min_compl_le {r : α → α → Prop}

Mathlib/SetTheory/Cardinal/Cofinality.lean

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,34 @@ theorem _root_.Cardinal.iSup_lt_of_lt_cof_ord {f : α → Cardinal.{u}} {a : Car
502502
rw [← ord_lt_ord, iSup_ord]
503503
apply Ordinal.iSup_lt_of_lt_cof <;> simpa
504504

505+
theorem bddAbove_Iio_of_lt_cof {o : Ordinal.{u}} {s : Set (Iio o)}
506+
(hs : #s < Cardinal.lift.{u + 1} o.cof) : BddAbove s := by
507+
refine ⟨⟨sSup ((↑) '' s), ?_⟩, ?_⟩
508+
· apply sSup_lt_of_lt_cof
509+
· rwa [mk_image_eq Subtype.val_injective, ← lift_cof]
510+
· grind
511+
· simp only [mem_upperBounds, ← Subtype.coe_le_coe]
512+
intro x hx
513+
apply le_csSup bddAbove_of_small
514+
grind
515+
516+
theorem bddAbove_toType_of_lt_cof {o : Ordinal.{u}} {s : Set o.ToType} (hs : #s < o.cof) :
517+
BddAbove s := by
518+
rw [← ToType.mk.bddAbove_preimage]
519+
apply bddAbove_Iio_of_lt_cof
520+
rwa [← Cardinal.lift_id'.{u, u + 1} #_, ← EquivLike.coe_coe, mk_preimage_equiv_lift,
521+
Cardinal.lift_lt]
522+
523+
theorem bddAbove_range_Iio_of_lt_cof {o : Ordinal.{u}} {ι : Type v} {f : ι → Iio o}
524+
(hι : Cardinal.lift.{u} #ι < Cardinal.lift.{v} o.cof) : BddAbove (Set.range f) :=
525+
bddAbove_Iio_of_lt_cof (by
526+
grw [← Cardinal.lift_lt.{_, v}, mk_range_le_lift]
527+
simpa using Cardinal.lift_lt.{_, u + 1}.2 hι)
528+
529+
theorem bddAbove_range_toType_of_lt_cof {o : Ordinal.{u}} {ι : Type v} {f : ι → o.ToType}
530+
(hι : Cardinal.lift.{u} #ι < Cardinal.lift.{v} o.cof) : BddAbove (Set.range f) :=
531+
bddAbove_toType_of_lt_cof (by grw [← Cardinal.lift_lt.{_, v}, mk_range_le_lift]; exact hι)
532+
505533
set_option linter.deprecated false in
506534
/-- The set in the `lsub` characterization of `cof` is nonempty. -/
507535
@[deprecated "to build an increasing function with limit o, use the fundamental sequence API."

0 commit comments

Comments
 (0)