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

tactic: rcases eq_or_ne o 0 with (rfl | ho)
state_before: o : Ordinal.{u_1}
⊢ Principal (fun x x_1 => x + x_1) o ↔ o = 0 ∨ ∃ a, o = ω ^ a
state_after: case inl

⊢ Principal (fun x x_1 => x + x_1) 0 ↔ 0 = 0 ∨ ∃ a, 0 = ω ^ a

case inr
o : Ordinal.{u_1}
ho : o ≠ 0
⊢ Principal (fun x x_1 => x + x_1) o ↔ o = 0 ∨ ∃ a, o = ω ^ a

tactic: simp only [principal_zero, Or.inl]
state_before: case inl

⊢ Principal (fun x x_1 => x + x_1) 0 ↔ 0 = 0 ∨ ∃ a, 0 = ω ^ a
state_after: no goals

tactic: rw [principal_add_iff_add_left_eq_self]
state_before: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
⊢ Principal (fun x x_1 => x + x_1) o ↔ o = 0 ∨ ∃ a, o = ω ^ a
state_after: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
⊢ (∀ a < o, a + o = o) ↔ o = 0 ∨ ∃ a, o = ω ^ a

tactic: simp only [ho, false_or_iff]
state_before: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
⊢ (∀ a < o, a + o = o) ↔ o = 0 ∨ ∃ a, o = ω ^ a
state_after: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
⊢ (∀ a < o, a + o = o) ↔ ∃ a, o = ω ^ a

tactic: refine
  ⟨fun H => ⟨_, ((lt_or_eq_of_le (opow_log_le_self _ ho)).resolve_left fun h => ?_).symm⟩,
    fun ⟨b, e⟩ => e.symm ▸ fun a => add_omega_opow⟩
state_before: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
⊢ (∀ a < o, a + o = o) ↔ ∃ a, o = ω ^ a
state_after: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
⊢ False

tactic: have := H _ h
state_before: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
⊢ False
state_after: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
⊢ False

tactic: have := lt_opow_succ_log_self one_lt_omega o
state_before: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
⊢ False
state_after: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this✝ : ω ^ log ω o + o = o
this : o < ω ^ succ (log ω o)
⊢ False

tactic: rw [opow_succ, lt_mul_of_limit omega_isLimit] at this
state_before: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this✝ : ω ^ log ω o + o = o
this : o < ω ^ succ (log ω o)
⊢ False
state_after: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this✝ : ω ^ log ω o + o = o
this : ∃ c' < ω, o < ω ^ log ω o * c'
⊢ False

tactic: rcases this with ⟨a, ao, h'⟩
state_before: case inr
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this✝ : ω ^ log ω o + o = o
this : ∃ c' < ω, o < ω ^ log ω o * c'
⊢ False
state_after: case inr.intro.intro
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
a : Ordinal.{u_1}
ao : a < ω
h' : o < ω ^ log ω o * a
⊢ False

tactic: rcases lt_omega.1 ao with ⟨n, rfl⟩
state_before: case inr.intro.intro
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
a : Ordinal.{u_1}
ao : a < ω
h' : o < ω ^ log ω o * a
⊢ False
state_after: case inr.intro.intro.intro
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
ao : ↑n < ω
h' : o < ω ^ log ω o * ↑n
⊢ False

tactic: clear ao
state_before: case inr.intro.intro.intro
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
ao : ↑n < ω
h' : o < ω ^ log ω o * ↑n
⊢ False
state_after: case inr.intro.intro.intro
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
h' : o < ω ^ log ω o * ↑n
⊢ False

tactic: revert h'
state_before: case inr.intro.intro.intro
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
h' : o < ω ^ log ω o * ↑n
⊢ False
state_after: case inr.intro.intro.intro
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
⊢ o < ω ^ log ω o * ↑n → False

tactic: apply not_lt_of_le
state_before: case inr.intro.intro.intro
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
⊢ o < ω ^ log ω o * ↑n → False
state_after: case inr.intro.intro.intro.h
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
⊢ ω ^ log ω o * ↑n ≤ o

tactic: suffices e : (omega^log omega o) * ↑n + o = o by
  simpa only [e] using le_add_right ((omega^log omega o) * ↑n) o
state_before: case inr.intro.intro.intro.h
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
⊢ ω ^ log ω o * ↑n ≤ o
state_after: case inr.intro.intro.intro.h
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
⊢ ω ^ log ω o * ↑n + o = o

tactic: induction' n with n IH
state_before: case inr.intro.intro.intro.h
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
⊢ ω ^ log ω o * ↑n + o = o
state_after: case inr.intro.intro.intro.h.zero
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
⊢ ω ^ log ω o * ↑0 + o = o

case inr.intro.intro.intro.h.succ
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
IH : ω ^ log ω o * ↑n + o = o
⊢ ω ^ log ω o * ↑(n + 1) + o = o

tactic: simp only [Nat.cast_succ, mul_add_one, add_assoc, this, IH]
state_before: case inr.intro.intro.intro.h.succ
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
IH : ω ^ log ω o * ↑n + o = o
⊢ ω ^ log ω o * ↑(n + 1) + o = o
state_after: no goals

tactic: simpa only [e] using le_add_right ((omega^log omega o) * ↑n) o
state_before: o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
n : ℕ
e : ω ^ log ω o * ↑n + o = o
⊢ ω ^ log ω o * ↑n ≤ o
state_after: no goals

tactic: simp [Nat.cast_zero, mul_zero, zero_add]
state_before: case inr.intro.intro.intro.h.zero
o : Ordinal.{u_1}
ho : o ≠ 0
H : ∀ a < o, a + o = o
h : ω ^ log ω o < o
this : ω ^ log ω o + o = o
⊢ ω ^ log ω o * ↑0 + o = o
state_after: no goals