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

tactic: rcases zero_or_succ_or_limit c with (rfl | ⟨c, rfl⟩ | l)
state_before: a b c : Ordinal.{u_1}
c0 : 0 < c
ha : a < ω ^ c
hb : b < ω
⊢ a * b < ω ^ c
state_after: case inl
a b : Ordinal.{u_1}
hb : b < ω
c0 : 0 < 0
ha : a < ω ^ 0
⊢ a * b < ω ^ 0

case inr.inl.intro
a b : Ordinal.{u_1}
hb : b < ω
c : Ordinal.{u_1}
c0 : 0 < succ c
ha : a < ω ^ succ c
⊢ a * b < ω ^ succ c

case inr.inr
a b c : Ordinal.{u_1}
c0 : 0 < c
ha : a < ω ^ c
hb : b < ω
l : c.IsLimit
⊢ a * b < ω ^ c

tactic: exact (lt_irrefl _).elim c0
state_before: case inl
a b : Ordinal.{u_1}
hb : b < ω
c0 : 0 < 0
ha : a < ω ^ 0
⊢ a * b < ω ^ 0
state_after: no goals

tactic: rw [opow_succ] at ha
state_before: case inr.inl.intro
a b : Ordinal.{u_1}
hb : b < ω
c : Ordinal.{u_1}
c0 : 0 < succ c
ha : a < ω ^ succ c
⊢ a * b < ω ^ succ c
state_after: case inr.inl.intro
a b : Ordinal.{u_1}
hb : b < ω
c : Ordinal.{u_1}
c0 : 0 < succ c
ha : a < ω ^ c * ω
⊢ a * b < ω ^ succ c

tactic: rcases ((mul_isNormal <| opow_pos _ omega_pos).limit_lt omega_isLimit).1 ha with ⟨n, hn, an⟩
state_before: case inr.inl.intro
a b : Ordinal.{u_1}
hb : b < ω
c : Ordinal.{u_1}
c0 : 0 < succ c
ha : a < ω ^ c * ω
⊢ a * b < ω ^ succ c
state_after: case inr.inl.intro.intro.intro
a b : Ordinal.{u_1}
hb : b < ω
c : Ordinal.{u_1}
c0 : 0 < succ c
ha : a < ω ^ c * ω
n : Ordinal.{u_1}
hn : n < ω
an : a < ω ^ c * n
⊢ a * b < ω ^ succ c

tactic: apply (mul_le_mul_right' (le_of_lt an) _).trans_lt
state_before: case inr.inl.intro.intro.intro
a b : Ordinal.{u_1}
hb : b < ω
c : Ordinal.{u_1}
c0 : 0 < succ c
ha : a < ω ^ c * ω
n : Ordinal.{u_1}
hn : n < ω
an : a < ω ^ c * n
⊢ a * b < ω ^ succ c
state_after: case inr.inl.intro.intro.intro
a b : Ordinal.{u_1}
hb : b < ω
c : Ordinal.{u_1}
c0 : 0 < succ c
ha : a < ω ^ c * ω
n : Ordinal.{u_1}
hn : n < ω
an : a < ω ^ c * n
⊢ ω ^ c * n * b < ω ^ succ c

tactic: rw [opow_succ, mul_assoc, mul_lt_mul_iff_left (opow_pos _ omega_pos)]
state_before: case inr.inl.intro.intro.intro
a b : Ordinal.{u_1}
hb : b < ω
c : Ordinal.{u_1}
c0 : 0 < succ c
ha : a < ω ^ c * ω
n : Ordinal.{u_1}
hn : n < ω
an : a < ω ^ c * n
⊢ ω ^ c * n * b < ω ^ succ c
state_after: case inr.inl.intro.intro.intro
a b : Ordinal.{u_1}
hb : b < ω
c : Ordinal.{u_1}
c0 : 0 < succ c
ha : a < ω ^ c * ω
n : Ordinal.{u_1}
hn : n < ω
an : a < ω ^ c * n
⊢ n * b < ω

tactic: exact principal_mul_omega hn hb
state_before: case inr.inl.intro.intro.intro
a b : Ordinal.{u_1}
hb : b < ω
c : Ordinal.{u_1}
c0 : 0 < succ c
ha : a < ω ^ c * ω
n : Ordinal.{u_1}
hn : n < ω
an : a < ω ^ c * n
⊢ n * b < ω
state_after: no goals

tactic: rcases ((opow_isNormal one_lt_omega).limit_lt l).1 ha with ⟨x, hx, ax⟩
state_before: case inr.inr
a b c : Ordinal.{u_1}
c0 : 0 < c
ha : a < ω ^ c
hb : b < ω
l : c.IsLimit
⊢ a * b < ω ^ c
state_after: case inr.inr.intro.intro
a b c : Ordinal.{u_1}
c0 : 0 < c
ha : a < ω ^ c
hb : b < ω
l : c.IsLimit
x : Ordinal.{u_1}
hx : x < c
ax : a < ω ^ x
⊢ a * b < ω ^ c

tactic: refine (mul_le_mul' (le_of_lt ax) (le_of_lt hb)).trans_lt ?_
state_before: case inr.inr.intro.intro
a b c : Ordinal.{u_1}
c0 : 0 < c
ha : a < ω ^ c
hb : b < ω
l : c.IsLimit
x : Ordinal.{u_1}
hx : x < c
ax : a < ω ^ x
⊢ a * b < ω ^ c
state_after: case inr.inr.intro.intro
a b c : Ordinal.{u_1}
c0 : 0 < c
ha : a < ω ^ c
hb : b < ω
l : c.IsLimit
x : Ordinal.{u_1}
hx : x < c
ax : a < ω ^ x
⊢ ω ^ x * ω < ω ^ c

tactic: rw [← opow_succ, opow_lt_opow_iff_right one_lt_omega]
state_before: case inr.inr.intro.intro
a b c : Ordinal.{u_1}
c0 : 0 < c
ha : a < ω ^ c
hb : b < ω
l : c.IsLimit
x : Ordinal.{u_1}
hx : x < c
ax : a < ω ^ x
⊢ ω ^ x * ω < ω ^ c
state_after: case inr.inr.intro.intro
a b c : Ordinal.{u_1}
c0 : 0 < c
ha : a < ω ^ c
hb : b < ω
l : c.IsLimit
x : Ordinal.{u_1}
hx : x < c
ax : a < ω ^ x
⊢ succ x < c

tactic: exact l.2 _ hx
state_before: case inr.inr.intro.intro
a b c : Ordinal.{u_1}
c0 : 0 < c
ha : a < ω ^ c
hb : b < ω
l : c.IsLimit
x : Ordinal.{u_1}
hx : x < c
ax : a < ω ^ x
⊢ succ x < c
state_after: no goals