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

tactic: rcases eq_zero_or_pos a with (rfl | _)
state_before: a b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
⊢ Principal (fun x x_1 => x + x_1) (a * b)

tactic: rw [zero_mul]
state_before: case inl
b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
⊢ Principal (fun x x_1 => x + x_1) (0 * b)

tactic: exact principal_zero
state_before: case inl
b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
⊢ Principal (fun x x_1 => x + x_1) 0

tactic: rcases eq_zero_or_pos b with (rfl | hb₁')
state_before: case inr
a b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
⊢ Principal (fun x x_1 => x + x_1) (a * b)

tactic: rw [mul_zero]
state_before: case inr.inl
a : Ordinal
h✝ : 0 < a
hb₁ : 0 ≠ 1
hb : Principal (fun x x_1 => x + x_1) 0
⊢ Principal (fun x x_1 => x + x_1) (a * 0)

tactic: exact principal_zero
state_before: case inr.inl
a : Ordinal
h✝ : 0 < a
hb₁ : 0 ≠ 1
hb : Principal (fun x x_1 => x + x_1) 0
⊢ Principal (fun x x_1 => x + x_1) 0

tactic: rw [← succ_le_iff, succ_zero] at hb₁'
state_before: case inr.inr
a b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 0 < b
⊢ Principal (fun x x_1 => x + x_1) (a * b)

tactic: intro c d hc hd
state_before: case inr.inr
a b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁'✝ : 0 < b
hb₁' : 1 ≤ b
⊢ Principal (fun x x_1 => x + x_1) (a * b)

tactic: rw [lt_mul_of_limit (principal_add_isLimit (lt_of_le_of_ne hb₁' hb₁.symm) hb)] at *
state_before: case inr.inr
a b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁'✝ : 0 < b
hb₁' : 1 ≤ b
c d : Ordinal
hc : c < a * b
hd : d < a * b
⊢ (fun x x_1 => x + x_1) c d < a * b

tactic: rcases hc with ⟨x, hx, hx'⟩
state_before: case inr.inr
a b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁'✝ : 0 < b
hb₁' : 1 ≤ b
c d : Ordinal
hc : ∃ c', c' < b ∧ c < a * c'
hd : ∃ c', c' < b ∧ d < a * c'
⊢ ∃ c', c' < b ∧ (fun x x_1 => x + x_1) c d < a * c'

tactic: rcases hd with ⟨y, hy, hy'⟩
state_before: case inr.inr.intro.intro
a b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁'✝ : 0 < b
hb₁' : 1 ≤ b
c d : Ordinal
hd : ∃ c', c' < b ∧ d < a * c'
x : Ordinal
hx : x < b
hx' : c < a * x
⊢ ∃ c', c' < b ∧ (fun x x_1 => x + x_1) c d < a * c'

tactic: use x + y, hb hx hy
state_before: case inr.inr.intro.intro.intro.intro
a b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁'✝ : 0 < b
hb₁' : 1 ≤ b
c d x : Ordinal
hx : x < b
hx' : c < a * x
y : Ordinal
hy : y < b
hy' : d < a * y
⊢ ∃ c', c' < b ∧ (fun x x_1 => x + x_1) c d < a * c'

tactic: rw [mul_add]
state_before: case inr.inr.intro.intro.intro.intro
a b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁'✝ : 0 < b
hb₁' : 1 ≤ b
c d x : Ordinal
hx : x < b
hx' : c < a * x
y : Ordinal
hy : y < b
hy' : d < a * y
⊢ (fun x x_1 => x + x_1) c d < a * (x + y)

tactic: exact Left.add_lt_add hx' hy'
state_before: case inr.inr.intro.intro.intro.intro
a b : Ordinal
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁'✝ : 0 < b
hb₁' : 1 ≤ b
c d x : Ordinal
hx : x < b
hx' : c < a * x
y : Ordinal
hy : y < b
hy' : d < a * y
⊢ (fun x x_1 => x + x_1) c d < a * x + a * y