Skip to content

Commit e252c59

Browse files
committed
chore: use x + 1 instead of succ x in Ordinal.limitRecOn (leanprover-community#39648)
The idea is to phase out the use of `Order.succ` on ordinals. See also [Zulip](https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/why.20is.20Order.2Esucc_eq_add_one.20simp.3F/near/596561918).
1 parent a35f477 commit e252c59

6 files changed

Lines changed: 40 additions & 39 deletions

File tree

Mathlib/SetTheory/Cardinal/Ordinal.lean

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,9 @@ theorem card_sSup_le {c : Cardinal} {s : Set Ordinal.{u}}
124124

125125
theorem card_opow_le_of_omega0_le_left {a : Ordinal} (ha : ω ≤ a) (b : Ordinal) :
126126
(a ^ b).card ≤ max a.card b.card := by
127-
refine limitRecOn b ?_ ?_ ?_
128-
· simpa using one_lt_omega0.le.trans ha
129-
· intro b IH
130-
simp_rw [Order.succ_eq_add_one]
127+
induction b using limitRecOn with
128+
| zero => simpa using one_lt_omega0.le.trans ha
129+
| add_one b IH =>
131130
rw [opow_add_one, card_mul, card_add_one, Cardinal.mul_eq_max_of_aleph0_le_right, max_comm]
132131
· grw [IH]
133132
rw [← max_assoc, max_self]
@@ -136,7 +135,7 @@ theorem card_opow_le_of_omega0_le_left {a : Ordinal} (ha : ω ≤ a) (b : Ordina
136135
rintro ⟨rfl, -⟩
137136
cases omega0_pos.not_ge ha
138137
· rwa [aleph0_le_card]
139-
· intro b hb IH
138+
| limit b hb IH =>
140139
rw [(isNormal_opow (one_lt_omega0.trans_le ha)).apply_of_isSuccLimit hb]
141140
exact card_iSup_Iio_le (le_max_right ..) fun i ↦
142141
(IH i i.2).trans (max_le_max_left _ (card_le_card i.2.le))

Mathlib/SetTheory/Cardinal/Regular.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,9 @@ theorem derivFamily_lt_ord_lift {ι : Type u} {f : ι → Ordinal → Ordinal} {
266266
| zero =>
267267
rw [derivFamily_zero]
268268
exact nfpFamily_lt_ord_lift hω (by rwa [hc.cof_ord]) hf
269-
| succ b hb =>
269+
| add_one b hb =>
270270
intro hb'
271-
rw [derivFamily_succ]
271+
rw [derivFamily_add_one]
272272
exact
273273
nfpFamily_lt_ord_lift hω (by rwa [hc.cof_ord]) hf
274274
((isSuccLimit_ord hc.1).succ_lt (hb ((lt_succ b).trans hb')))

Mathlib/SetTheory/Ordinal/Arithmetic.lean

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -156,18 +156,23 @@ Note that this is just a special (though sometimes convenient) case of the more
156156
well-founded recursion `WellFoundedLT.fix`. -/
157157
@[elab_as_elim]
158158
def limitRecOn {motive : Ordinal → Sort*} (o : Ordinal)
159-
(zero : motive 0) (succ : ∀ o, motive o → motive (succ o))
159+
(zero : motive 0) (add_one : ∀ o, motive o → motive (o + 1))
160160
(limit : ∀ o, IsSuccLimit o → (∀ o' < o, motive o') → motive o) : motive o :=
161-
SuccOrder.limitRecOn o (fun _a ha ↦ ha.eq_bot ▸ zero) (fun a _ ↦ succ a) limit
161+
SuccOrder.limitRecOn o (fun _a ha ↦ ha.eq_bot ▸ zero) (fun a _ ↦ add_one a) limit
162162

163163
@[simp]
164164
theorem limitRecOn_zero {motive} (H₁ H₂ H₃) : @limitRecOn motive 0 H₁ H₂ H₃ = H₁ :=
165165
SuccOrder.limitRecOn_isMin _ _ _ isMin_bot
166166

167167
@[simp]
168+
theorem limitRecOn_add_one {motive} (o H₁ H₂ H₃) :
169+
@limitRecOn motive (o + 1) H₁ H₂ H₃ = H₂ o (@limitRecOn motive o H₁ H₂ H₃) :=
170+
SuccOrder.limitRecOn_succ ..
171+
172+
@[deprecated limitRecOn_add_one (since := "2026-05-21")]
168173
theorem limitRecOn_succ {motive} (o H₁ H₂ H₃) :
169174
@limitRecOn motive (succ o) H₁ H₂ H₃ = H₂ o (@limitRecOn motive o H₁ H₂ H₃) :=
170-
SuccOrder.limitRecOn_succ ..
175+
limitRecOn_add_one ..
171176

172177
@[simp]
173178
theorem limitRecOn_limit {motive} (o H₁ H₂ H₃ h) :
@@ -184,7 +189,7 @@ def boundedLimitRecOn {l : Ordinal} (lLim : IsSuccLimit l) {motive : Iio l → S
184189
obtain ⟨o, ho⟩ := o
185190
induction o using limitRecOn with
186191
| zero => exact zero
187-
| succ o IH =>
192+
| add_one o IH =>
188193
have ho' : o < l := (lt_succ o).trans ho
189194
exact succ ⟨o, ho'⟩ (IH ho')
190195
| limit o ho' IH => exact limit _ ho' fun a ha ↦ IH a.1 ha (ha.trans (c := l) ho)
@@ -678,13 +683,16 @@ private theorem add_mul_limit_aux {a b c : Ordinal} (ba : b + a = a) (l : IsSucc
678683
grw [le_succ c', IH _ h, le_self_add (a := b), ba, ← mul_succ, succ_le_of_lt <| l.succ_lt h])
679684
(by grw [← le_self_add])
680685

681-
theorem add_mul_succ {a b : Ordinal} (c) (ba : b + a = a) : (a + b) * succ c = a * succ c + b := by
686+
theorem add_mul_add_one {a b : Ordinal} (c) (ba : b + a = a) :
687+
(a + b) * (c + 1) = a * (c + 1) + b := by
682688
induction c using limitRecOn with
683689
| zero => simp
684-
| succ c IH =>
685-
rw [mul_succ, IH, ← add_assoc, add_assoc _ b, ba, ← mul_succ]
686-
| limit c l IH =>
687-
rw [mul_succ, add_mul_limit_aux ba l IH, mul_succ, add_assoc]
690+
| add_one c IH => rw [mul_add_one, IH, ← add_assoc, add_assoc _ b, ba, ← mul_add_one]
691+
| limit c l IH => rw [mul_add_one, add_mul_limit_aux ba l IH, mul_add_one, add_assoc]
692+
693+
-- TODO: deprecate
694+
theorem add_mul_succ {a b : Ordinal} (c) (ba : b + a = a) : (a + b) * succ c = a * succ c + b :=
695+
add_mul_add_one c ba
688696

689697
theorem add_mul_of_isSuccLimit {a b c : Ordinal} (ba : b + a = a) (l : IsSuccLimit c) :
690698
(a + b) * c = a * c :=

Mathlib/SetTheory/Ordinal/Exponential.lean

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ theorem opow_add_one (a b : Ordinal) : a ^ (b + 1) = a ^ b * a := by
6060
obtain rfl | h := eq_or_ne a 0
6161
· rw [zero_opow (add_pos_of_right zero_lt_one b).ne', mul_zero]
6262
· rw [opow_of_ne_zero h, opow_of_ne_zero h]
63-
exact limitRecOn_succ ..
63+
exact limitRecOn_add_one ..
6464

6565
-- TODO: deprecate
6666
theorem opow_succ (a b : Ordinal) : a ^ succ b = a ^ b * a :=
@@ -86,23 +86,19 @@ theorem opow_one (a : Ordinal) : a ^ (1 : Ordinal) = a := by
8686
@[simp]
8787
theorem one_opow (a : Ordinal) : (1 : Ordinal) ^ a = 1 := by
8888
induction a using limitRecOn with
89-
| zero => simp only [opow_zero]
90-
| succ _ ih =>
91-
simp only [opow_succ, ih, mul_one]
89+
| zero => simp
90+
| add_one _ IH => simp [IH, mul_one]
9291
| limit b l IH =>
9392
refine eq_of_forall_ge_iff fun c => ?_
9493
rw [opow_le_of_isSuccLimit one_ne_zero l]
9594
exact ⟨fun H => by simpa only [opow_zero] using H 0 l.bot_lt, fun H b' h => by rwa [IH _ h]⟩
9695

9796
theorem opow_pos {a : Ordinal} (b : Ordinal) (a0 : 0 < a) : 0 < a ^ b := by
98-
have h0 : 0 < a ^ (0 : Ordinal) := by simp only [opow_zero, zero_lt_one]
97+
have h0 : 0 < a ^ (0 : Ordinal) := by simp
9998
induction b using limitRecOn with
10099
| zero => exact h0
101-
| succ b IH =>
102-
rw [opow_succ]
103-
exact mul_pos IH a0
104-
| limit b l _ =>
105-
exact (lt_opow_of_isSuccLimit (pos_iff_ne_zero.1 a0) l).20, l.bot_lt, h0⟩
100+
| add_one b IH => simpa using mul_pos IH a0
101+
| limit b l _ => exact (lt_opow_of_isSuccLimit (pos_iff_ne_zero.1 a0) l).20, l.pos, h0⟩
106102

107103
theorem opow_ne_zero {a : Ordinal} (b : Ordinal) (a0 : a ≠ 0) : a ^ b ≠ 0 :=
108104
pos_iff_ne_zero.1 <| opow_pos b <| pos_iff_ne_zero.2 a0
@@ -184,7 +180,7 @@ theorem opow_le_opow_left {a b : Ordinal} (c : Ordinal) (ab : a ≤ b) : a ^ c
184180
· by_cases c = 0 <;> simp_all
185181
· induction c using limitRecOn with
186182
| zero => simp
187-
| succ c IH => simpa using mul_le_mul' IH ab
183+
| add_one c IH => simpa using mul_le_mul' IH ab
188184
| limit c l IH =>
189185
exact (opow_le_of_isSuccLimit ha l).2 fun b' h ↦
190186
(IH _ h).trans (opow_le_opow_right ((pos_iff_ne_zero.2 ha).trans_le ab) h.le)
@@ -223,7 +219,7 @@ theorem opow_add (a b c : Ordinal) : a ^ (b + c) = a ^ b * a ^ c := by
223219
obtain rfl | ha' := (one_le_iff_ne_zero.2 ha.ne').eq_or_lt; · simp
224220
induction c using limitRecOn with
225221
| zero => simp
226-
| succ c IH => rw [succ_eq_add_one, ← add_assoc, opow_add_one, IH, opow_add_one, mul_assoc]
222+
| add_one c IH => rw [← add_assoc, opow_add_one, IH, opow_add_one, mul_assoc]
227223
| limit c l IH =>
228224
refine eq_of_forall_ge_iff fun d ↦
229225
(((isNormal_opow ha').comp (isNormal_add_right b)).le_iff_forall_le l).trans ?_
@@ -251,7 +247,7 @@ theorem opow_mul (a b c : Ordinal) : a ^ (b * c) = (a ^ b) ^ c := by
251247
obtain rfl | ha' := (one_le_iff_ne_zero.2 ha).eq_or_lt; · simp
252248
induction c using limitRecOn with
253249
| zero => simp
254-
| succ c IH => rw [mul_succ, opow_add, IH, opow_succ]
250+
| add_one c IH => rw [mul_add_one, opow_add, IH, opow_add_one]
255251
| limit c l IH =>
256252
refine eq_of_forall_ge_iff fun d ↦
257253
(((isNormal_opow ha').comp (isNormal_mul_right hb)).le_iff_forall_le l).trans ?_

Mathlib/SetTheory/Ordinal/FixedPoint.lean

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ theorem derivFamily_zero (f : ι → Ordinal → Ordinal) :
141141
@[simp]
142142
theorem derivFamily_add_one (f : ι → Ordinal → Ordinal) (o) :
143143
derivFamily f (o + 1) = nfpFamily f (derivFamily f o + 1) :=
144-
limitRecOn_succ ..
144+
limitRecOn_add_one ..
145145

146146
-- TODO: deprecate
147147
theorem derivFamily_succ (f : ι → Ordinal → Ordinal) (o) :
@@ -171,8 +171,8 @@ theorem derivFamily_fp [Small.{u} ι] {i} (H : IsNormal (f i)) (o : Ordinal) :
171171
| zero =>
172172
rw [derivFamily_zero]
173173
exact nfpFamily_fp H 0
174-
| succ =>
175-
rw [derivFamily_succ]
174+
| add_one =>
175+
rw [derivFamily_add_one]
176176
exact nfpFamily_fp H _
177177
| limit o l IH =>
178178
have := l.nonempty_Iio.to_subtype
@@ -194,12 +194,12 @@ theorem le_iff_derivFamily [Small.{u} ι] (H : ∀ i, IsNormal (f i)) {a} :
194194
refine ⟨0, le_antisymm ?_ h₁⟩
195195
rw [derivFamily_zero]
196196
exact nfpFamily_le_fp (fun i => (H i).monotone) zero_le ha
197-
| succ o IH =>
197+
| add_one o IH =>
198198
intro h₁
199199
rcases le_or_gt a (derivFamily f o) with h | h
200200
· exact IH h
201-
refine ⟨succ o, le_antisymm ?_ h₁⟩
202-
rw [derivFamily_succ]
201+
refine ⟨o + 1, le_antisymm ?_ h₁⟩
202+
rw [derivFamily_add_one]
203203
exact nfpFamily_le_fp (fun i => (H i).monotone) (succ_le_of_lt h) ha
204204
| limit o l IH =>
205205
intro h₁

Mathlib/SetTheory/ZFC/VonNeumann.lean

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,8 @@ lemma _root_.Ordinal.card_le_card_vonNeumann (o : Ordinal) : o.card ≤ card (V_
140140
open Cardinal in
141141
theorem card_vonNeumann (o : Ordinal.{u}) : card (V_ o) = preBeth o := by
142142
induction o using Ordinal.limitRecOn with
143-
| zero =>
144-
rw [vonNeumann_zero, card_empty, preBeth_zero]
145-
| succ o ih =>
146-
rw [vonNeumann_succ, card_powerset, ih, preBeth_succ]
143+
| zero => simp
144+
| add_one o ih => simp [ih]
147145
| limit o ho ih =>
148146
simp_rw [preBeth_limit ho.isSuccPrelimit, ← fun i : Set.Iio o => ih i i.2,
149147
vonNeumann_of_isSuccPrelimit ho.isSuccPrelimit]

0 commit comments

Comments
 (0)