Theorem: Ordinal.add_omega_opow
File: Mathlib/SetTheory/Ordinal/Principal.lean

tactic: refine le_antisymm ?_ (le_add_left _ _)
state_before: a b : Ordinal.{u_1}
h : a < ω ^ b
⊢ a + ω ^ b = ω ^ b
state_after: a b : Ordinal.{u_1}
h : a < ω ^ b
⊢ a + ω ^ b ≤ ω ^ b

tactic: induction' b using limitRecOn with b _ b l IH
state_before: a b : Ordinal.{u_1}
h : a < ω ^ b
⊢ a + ω ^ b ≤ ω ^ b
state_after: case H₁
a : Ordinal.{u_1}
h : a < ω ^ 0
⊢ a + ω ^ 0 ≤ ω ^ 0

case H₂
a b : Ordinal.{u_1}
a✝ : a < ω ^ b → a + ω ^ b ≤ ω ^ b
h : a < ω ^ succ b
⊢ a + ω ^ succ b ≤ ω ^ succ b

case H₃
a b : Ordinal.{u_1}
l : b.IsLimit
IH : ∀ o' < b, a < ω ^ o' → a + ω ^ o' ≤ ω ^ o'
h : a < ω ^ b
⊢ a + ω ^ b ≤ ω ^ b

tactic: rw [opow_zero, ← succ_zero, lt_succ_iff, Ordinal.le_zero] at h
state_before: case H₁
a : Ordinal.{u_1}
h : a < ω ^ 0
⊢ a + ω ^ 0 ≤ ω ^ 0
state_after: case H₁
a : Ordinal.{u_1}
h : a = 0
⊢ a + ω ^ 0 ≤ ω ^ 0

tactic: rw [h, zero_add]
state_before: case H₁
a : Ordinal.{u_1}
h : a = 0
⊢ a + ω ^ 0 ≤ ω ^ 0
state_after: no goals

tactic: rw [opow_succ] at h
state_before: case H₂
a b : Ordinal.{u_1}
a✝ : a < ω ^ b → a + ω ^ b ≤ ω ^ b
h : a < ω ^ succ b
⊢ a + ω ^ succ b ≤ ω ^ succ b
state_after: case H₂
a b : Ordinal.{u_1}
a✝ : a < ω ^ b → a + ω ^ b ≤ ω ^ b
h : a < ω ^ b * ω
⊢ a + ω ^ succ b ≤ ω ^ succ b

tactic: rcases (lt_mul_of_limit omega_isLimit).1 h with ⟨x, xo, ax⟩
state_before: case H₂
a b : Ordinal.{u_1}
a✝ : a < ω ^ b → a + ω ^ b ≤ ω ^ b
h : a < ω ^ b * ω
⊢ a + ω ^ succ b ≤ ω ^ succ b
state_after: case H₂.intro.intro
a b : Ordinal.{u_1}
a✝ : a < ω ^ b → a + ω ^ b ≤ ω ^ b
h : a < ω ^ b * ω
x : Ordinal.{u_1}
xo : x < ω
ax : a < ω ^ b * x
⊢ a + ω ^ succ b ≤ ω ^ succ b

tactic: refine le_trans (add_le_add_right (le_of_lt ax) _) ?_
state_before: case H₂.intro.intro
a b : Ordinal.{u_1}
a✝ : a < ω ^ b → a + ω ^ b ≤ ω ^ b
h : a < ω ^ b * ω
x : Ordinal.{u_1}
xo : x < ω
ax : a < ω ^ b * x
⊢ a + ω ^ succ b ≤ ω ^ succ b
state_after: case H₂.intro.intro
a b : Ordinal.{u_1}
a✝ : a < ω ^ b → a + ω ^ b ≤ ω ^ b
h : a < ω ^ b * ω
x : Ordinal.{u_1}
xo : x < ω
ax : a < ω ^ b * x
⊢ ω ^ b * x + ω ^ succ b ≤ ω ^ succ b

tactic: rw [opow_succ, ← mul_add, add_omega xo]
state_before: case H₂.intro.intro
a b : Ordinal.{u_1}
a✝ : a < ω ^ b → a + ω ^ b ≤ ω ^ b
h : a < ω ^ b * ω
x : Ordinal.{u_1}
xo : x < ω
ax : a < ω ^ b * x
⊢ ω ^ b * x + ω ^ succ b ≤ ω ^ succ b
state_after: no goals

tactic: rcases (lt_opow_of_limit omega_ne_zero l).1 h with ⟨x, xb, ax⟩
state_before: case H₃
a b : Ordinal.{u_1}
l : b.IsLimit
IH : ∀ o' < b, a < ω ^ o' → a + ω ^ o' ≤ ω ^ o'
h : a < ω ^ b
⊢ a + ω ^ b ≤ ω ^ b
state_after: case H₃.intro.intro
a b : Ordinal.{u_1}
l : b.IsLimit
IH : ∀ o' < b, a < ω ^ o' → a + ω ^ o' ≤ ω ^ o'
h : a < ω ^ b
x : Ordinal.{u_1}
xb : x < b
ax : a < ω ^ x
⊢ a + ω ^ b ≤ ω ^ b

tactic: exact
  (((add_isNormal a).trans (opow_isNormal one_lt_omega)).limit_le l).2 fun y yb =>
    (add_le_add_left (opow_le_opow_right omega_pos (le_max_right _ _)) _).trans
      (le_trans
        (IH _ (max_lt xb yb) (ax.trans_le <| opow_le_opow_right omega_pos (le_max_left _ _)))
        (opow_le_opow_right omega_pos <| le_of_lt <| max_lt xb yb))
state_before: case H₃.intro.intro
a b : Ordinal.{u_1}
l : b.IsLimit
IH : ∀ o' < b, a < ω ^ o' → a + ω ^ o' ≤ ω ^ o'
h : a < ω ^ b
x : Ordinal.{u_1}
xb : x < b
ax : a < ω ^ x
⊢ a + ω ^ b ≤ ω ^ b
state_after: no goals