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.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
⊢ Principal (fun x x_1 => x + x_1) (a * b)
state_after: case inl
b : Ordinal.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
⊢ Principal (fun x x_1 => x + x_1) (0 * b)

case inr
a b : Ordinal.{u}
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 [zero_mul]
state_before: case inl
b : Ordinal.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
⊢ Principal (fun x x_1 => x + x_1) (0 * b)
state_after: case inl
b : Ordinal.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
⊢ Principal (fun x x_1 => x + x_1) 0

tactic: exact principal_zero
state_before: case inl
b : Ordinal.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
⊢ Principal (fun x x_1 => x + x_1) 0
state_after: no goals

tactic: rcases eq_zero_or_pos b with (rfl | hb₁')
state_before: case inr
a b : Ordinal.{u}
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)
state_after: case inr.inl
a : Ordinal.{u}
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)

case inr.inr
a b : Ordinal.{u}
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: rw [mul_zero]
state_before: case inr.inl
a : Ordinal.{u}
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)
state_after: case inr.inl
a : Ordinal.{u}
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: exact principal_zero
state_before: case inr.inl
a : Ordinal.{u}
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
state_after: no goals

tactic: rw [← succ_le_iff, succ_zero] at hb₁'
state_before: case inr.inr
a b : Ordinal.{u}
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)
state_after: case inr.inr
a b : Ordinal.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 1 ≤ 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.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 1 ≤ b
⊢ Principal (fun x x_1 => x + x_1) (a * b)
state_after: case inr.inr
a b : Ordinal.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 1 ≤ b
c d : Ordinal.{u}
hc : c < a * b
hd : d < a * b
⊢ (fun x x_1 => x + x_1) c d < 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.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 1 ≤ b
c d : Ordinal.{u}
hc : c < a * b
hd : d < a * b
⊢ (fun x x_1 => x + x_1) c d < a * b
state_after: case inr.inr
a b : Ordinal.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 1 ≤ b
c d : Ordinal.{u}
hc : ∃ c' < b, c < a * c'
hd : ∃ c' < b, d < a * c'
⊢ ∃ c' < b, (fun x x_1 => x + x_1) c d < a * c'

tactic: rcases hc with ⟨x, hx, hx'⟩
state_before: case inr.inr
a b : Ordinal.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 1 ≤ b
c d : Ordinal.{u}
hc : ∃ c' < b, c < a * c'
hd : ∃ c' < b, d < a * c'
⊢ ∃ c' < b, (fun x x_1 => x + x_1) c d < a * c'
state_after: case inr.inr.intro.intro
a b : Ordinal.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 1 ≤ b
c d : Ordinal.{u}
hd : ∃ c' < b, d < a * c'
x : Ordinal.{u}
hx : x < b
hx' : c < a * x
⊢ ∃ 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.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 1 ≤ b
c d : Ordinal.{u}
hd : ∃ c' < b, d < a * c'
x : Ordinal.{u}
hx : x < b
hx' : c < a * x
⊢ ∃ c' < b, (fun x x_1 => x + x_1) c d < a * c'
state_after: case inr.inr.intro.intro.intro.intro
a b : Ordinal.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 1 ≤ b
c d x : Ordinal.{u}
hx : x < b
hx' : c < a * x
y : Ordinal.{u}
hy : y < b
hy' : d < a * y
⊢ ∃ 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.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 1 ≤ b
c d x : Ordinal.{u}
hx : x < b
hx' : c < a * x
y : Ordinal.{u}
hy : y < b
hy' : d < a * y
⊢ ∃ c' < b, (fun x x_1 => x + x_1) c d < a * c'
state_after: case right
a b : Ordinal.{u}
hb₁ : b ≠ 1
hb : Principal (fun x x_1 => x + x_1) b
h✝ : 0 < a
hb₁' : 1 ≤ b
c d x : Ordinal.{u}
hx : x < b
hx' : c < a * x
y : Ordinal.{u}
hy : y < b
hy' : d < a * y
⊢ (fun x x_1 => x + x_1) c d < a * (x + y)

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

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