Skip to content

Commit cfc99f1

Browse files
committed
feat(SetTheory/Ordinal/Arithmetic): prove isSuccPrelimit_iff_omega0_dvd (leanprover-community#34664)
Co-authored-by: Pavel Grigorenko <GrigorenkoPV@ya.ru>
1 parent a274af5 commit cfc99f1

File tree

3 files changed

+36
-15
lines changed

3 files changed

+36
-15
lines changed

Mathlib/SetTheory/Ordinal/Arithmetic.lean

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,8 @@ theorem isNormal_add_right (a : Ordinal) : IsNormal (a + ·) := by
517517
theorem isSuccLimit_add (a : Ordinal) {b : Ordinal} : IsSuccLimit b → IsSuccLimit (a + b) :=
518518
(isNormal_add_right a).map_isSuccLimit
519519

520-
theorem isSuccLimit_sub {a b : Ordinal} (ha : IsSuccLimit a) (h : b < a) : IsSuccLimit (a - b) := by
520+
theorem isSuccLimit_sub {a b : Ordinal} (ha : IsSuccPrelimit a) (h : b < a) :
521+
IsSuccLimit (a - b) := by
521522
rw [isSuccLimit_iff, Ordinal.sub_ne_zero_iff_lt, isSuccPrelimit_iff_succ_lt]
522523
refine ⟨h, fun c hc ↦ ?_⟩
523524
rw [lt_sub] at hc ⊢
@@ -722,16 +723,32 @@ theorem le_of_mul_le_mul_left {a b c : Ordinal} (h : c * a ≤ c * b) (h0 : 0 <
722723
theorem mul_right_inj {a b c : Ordinal} (a0 : 0 < a) : a * b = a * c ↔ b = c :=
723724
mul_left_cancel_iff_of_pos a0
724725

725-
theorem isSuccLimit_mul {a b : Ordinal} (a0 : 0 < a) : IsSuccLimit b → IsSuccLimit (a * b) :=
726-
(isNormal_mul_right a0).map_isSuccLimit
726+
theorem isSuccLimit_mul_right {a b : Ordinal} (a0 : 0 < a) (l : IsSuccLimit b) :
727+
IsSuccLimit (a * b) :=
728+
(isNormal_mul_right a0).map_isSuccLimit l
729+
730+
@[deprecated (since := "2026-02-01")]
731+
alias isSuccLimit_mul := isSuccLimit_mul_right
732+
733+
theorem isSuccPrelimit_mul_right {a b : Ordinal} (hb : IsSuccLimit b) : IsSuccPrelimit (a * b) := by
734+
obtain rfl | ha := eq_zero_or_pos a
735+
· rw [zero_mul]
736+
exact isSuccPrelimit_zero
737+
· exact (isSuccLimit_mul_right ha hb).isSuccPrelimit
727738

728739
theorem isSuccLimit_mul_left {a b : Ordinal} (l : IsSuccLimit a) (b0 : 0 < b) :
729740
IsSuccLimit (a * b) := by
730741
rcases zero_or_succ_or_isSuccLimit b with (rfl | ⟨b, rfl⟩ | lb)
731742
· exact b0.false.elim
732743
· rw [mul_succ]
733744
exact isSuccLimit_add _ l
734-
· exact isSuccLimit_mul l.bot_lt lb
745+
· exact isSuccLimit_mul_right l.bot_lt lb
746+
747+
theorem isSuccPrelimit_mul_left {a b : Ordinal} (ha : IsSuccLimit a) : IsSuccPrelimit (a * b) := by
748+
obtain rfl | hb := eq_zero_or_pos b
749+
· rw [mul_zero]
750+
exact isSuccPrelimit_zero
751+
· exact (isSuccLimit_mul_left ha hb).isSuccPrelimit
735752

736753
theorem smul_eq_mul : ∀ (n : ℕ) (a : Ordinal), n • a = a * n
737754
| 0, a => by rw [zero_nsmul, Nat.cast_zero, mul_zero]
@@ -878,7 +895,7 @@ theorem isSuccLimit_add_iff {a b : Ordinal} :
878895
exact ⟨h', h⟩
879896
left
880897
rw [← add_sub_cancel a b]
881-
apply isSuccLimit_sub h
898+
apply isSuccLimit_sub h.isSuccPrelimit
882899
suffices a + 0 < a + b by simpa only [add_zero] using this
883900
rwa [add_lt_add_iff_left, pos_iff_ne_zero]
884901
rcases h with (h | ⟨rfl, h⟩)
@@ -1114,9 +1131,8 @@ theorem one_add_of_omega0_le {o} (h : ω ≤ o) : 1 + o = o :=
11141131

11151132
open Ordinal
11161133

1117-
-- TODO: prove `IsSuccPrelimit a ↔ ω ∣ a`.
1118-
theorem isSuccLimit_iff_omega0_dvd {a : Ordinal} : IsSuccLimit a ↔ a ≠ 0 ∧ ω ∣ a := by
1119-
refine ⟨fun l => ⟨l.ne_bot, ⟨a / ω, le_antisymm ?_ (mul_div_le _ _)⟩⟩, fun h => ?_⟩
1134+
theorem isSuccPrelimit_iff_omega0_dvd {a : Ordinal} : IsSuccPrelimit a ↔ ω ∣ a := by
1135+
refine ⟨fun l => ⟨a / ω, le_antisymm ?_ (mul_div_le _ _)⟩, fun h => ?_⟩
11201136
· refine l.le_iff_forall_le.2 fun x hx => le_of_lt ?_
11211137
rw [← div_lt omega0_ne_zero, ← succ_le_iff, le_div omega0_ne_zero, mul_succ,
11221138
add_le_iff_of_isSuccLimit isSuccLimit_omega0]
@@ -1125,9 +1141,11 @@ theorem isSuccLimit_iff_omega0_dvd {a : Ordinal} : IsSuccLimit a ↔ a ≠ 0 ∧
11251141
grw [mul_div_le]
11261142
exact (lt_sub.1 <| natCast_lt_of_isSuccLimit (isSuccLimit_sub l hx) _).le
11271143
· rcases h with ⟨a0, b, rfl⟩
1128-
refine isSuccLimit_mul_left isSuccLimit_omega0 (pos_iff_ne_zero.2 <| mt ?_ a0)
1129-
intro e
1130-
simp only [e, mul_zero]
1144+
exact isSuccPrelimit_mul_left isSuccLimit_omega0
1145+
1146+
@[deprecated isSuccPrelimit_iff_omega0_dvd (since := "2026-02-01")]
1147+
theorem isSuccLimit_iff_omega0_dvd {a : Ordinal} : IsSuccLimit a ↔ a ≠ 0 ∧ ω ∣ a := by
1148+
rw [isSuccLimit_iff, isSuccPrelimit_iff_omega0_dvd]
11311149

11321150
@[simp]
11331151
theorem natCast_mod_omega0 (n : ℕ) : n % ω = n :=

Mathlib/SetTheory/Ordinal/Exponential.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ theorem isSuccLimit_opow_left {a b : Ordinal} (l : IsSuccLimit a) (hb : b ≠ 0)
139139
rcases zero_or_succ_or_isSuccLimit b with (e | ⟨b, rfl⟩ | l')
140140
· exact absurd e hb
141141
· rw [opow_succ]
142-
exact isSuccLimit_mul (opow_pos _ l.bot_lt) l
142+
exact isSuccLimit_mul_right (opow_pos _ l.bot_lt) l
143143
· exact isSuccLimit_opow (one_lt_of_isSuccLimit l) l'
144144

145145
theorem opow_le_opow_right {a b c : Ordinal} (h₁ : 0 < a) (h₂ : b ≤ c) : a ^ b ≤ a ^ c := by

Mathlib/SetTheory/Ordinal/Notation.lean

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -851,8 +851,11 @@ theorem repr_opow_aux₂ {a0 a'} [N0 : NF a0] [Na' : NF a'] (m : ℕ) (d : ω
851851
congr 1
852852
· have αd : ω ∣ α' :=
853853
dvd_add (dvd_mul_of_dvd_left (by simpa using opow_dvd_opow ω (one_le_iff_ne_zero.2 e0)) _) d
854+
have α0: ¬IsMin α' := by
855+
rw [isMin_iff_eq_bot]
856+
exact α0.ne'
854857
rw [mul_add (ω0 ^ (k : Ordinal)), add_assoc, ← mul_assoc, ← opow_succ,
855-
add_mul_of_isSuccLimit _ (isSuccLimit_iff_omega0_dvd.2 ⟨ne_of_gt α0, αd⟩), mul_assoc,
858+
add_mul_of_isSuccLimit _ α0, isSuccPrelimit_iff_omega0_dvd.2 αd⟩, mul_assoc,
856859
@mul_omega0_dvd n (Nat.cast_pos'.2 n.pos) (nat_lt_omega0 _) _ αd]
857860
apply @add_absorp _ (repr a0 * succ ↑k)
858861
· refine principal_add_omega0_opow _ ?_ Rl
@@ -1006,14 +1009,14 @@ theorem fundamentalSequence_has_prop (o) : FundamentalSequenceProp o (fundamenta
10061009
· exact ⟨rfl, inferInstance⟩
10071010
· have := opow_pos (repr a') omega0_pos
10081011
refine
1009-
isSuccLimit_mul this isSuccLimit_omega0, fun i =>
1012+
isSuccLimit_mul_right this isSuccLimit_omega0, fun i =>
10101013
⟨this, ?_, fun H => @NF.oadd_zero _ _ (iha.2 H.fst)⟩, exists_lt_mul_omega0'⟩
10111014
rw [← mul_succ, ← natCast_succ]
10121015
gcongr
10131016
apply nat_lt_omega0
10141017
· have := opow_pos (repr a') omega0_pos
10151018
refine
1016-
⟨isSuccLimit_add _ (isSuccLimit_mul this isSuccLimit_omega0), fun i => ⟨this, ?_, ?_⟩,
1019+
⟨isSuccLimit_add _ (isSuccLimit_mul_right this isSuccLimit_omega0), fun i => ⟨this, ?_, ?_⟩,
10171020
exists_lt_add exists_lt_mul_omega0'⟩
10181021
· rw [← mul_succ, ← natCast_succ]
10191022
gcongr

0 commit comments

Comments
 (0)