Theorem: _private.Mathlib.Algebra.Order.Group.Abs.0.abs_add_eq_add_abs_le
File: Mathlib/Algebra/Order/Group/Abs.lean

Proof steps:
state_before: α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1
state_after: case inl.inl
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : 1 ≤ a
hb : 1 ≤ b
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1

case inl.inr
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : 1 ≤ a
hb : b < 1
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1

case inr.inl
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : 1 ≤ b
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1

case inr.inr
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : b < 1
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1
tactic: obtain ha | ha := le_or_lt 1 a <;> obtain hb | hb := le_or_lt 1 b
state_before: case inr.inl
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : 1 ≤ b
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1

case inr.inr
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : b < 1
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1
state_after: case inr.inr
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : b < 1
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1

case inr.inl
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : 1 ≤ b
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1
tactic: swap
state_before: case inr.inl
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : 1 ≤ b
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1
state_after: case inr.inl
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : 1 ≤ b
this : (mabs (a * b) = a⁻¹ * b ↔ b ≤ 1) ↔ (mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1)
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1
tactic: have : (|a * b|ₘ = a⁻¹ * b ↔ b ≤ 1) ↔
    (|a * b|ₘ = |a|ₘ * |b|ₘ ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1) := by
    simp [ha.le, ha.not_le, hb, mabs_of_le_one, mabs_of_one_le]
state_before: case inr.inl
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : 1 ≤ b
this : (mabs (a * b) = a⁻¹ * b ↔ b ≤ 1) ↔ (mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1)
⊢ mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1
state_after: case inr.inl
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : 1 ≤ b
this : (mabs (a * b) = a⁻¹ * b ↔ b ≤ 1) ↔ (mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1)
h : mabs (a * b) = a⁻¹ * b
⊢ b ≤ 1
tactic: refine this.mp ⟨fun h ↦ ?_, fun h ↦ by simp only [h.antisymm hb, mabs_of_lt_one ha, mul_one]⟩
state_before: case inr.inl
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : 1 ≤ b
this : (mabs (a * b) = a⁻¹ * b ↔ b ≤ 1) ↔ (mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1)
h : mabs (a * b) = a⁻¹ * b
⊢ b ≤ 1
state_after: case inr.inl.inl
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : 1 ≤ b
this : (mabs (a * b) = a⁻¹ * b ↔ b ≤ 1) ↔ (mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1)
h : mabs (a * b) = a⁻¹ * b
ab : a * b ≤ 1
⊢ b ≤ 1

case inr.inl.inr
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : 1 ≤ b
this : (mabs (a * b) = a⁻¹ * b ↔ b ≤ 1) ↔ (mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1)
h : mabs (a * b) = a⁻¹ * b
ab : 1 < a * b
⊢ b ≤ 1
tactic: obtain ab | ab := le_or_lt (a * b) 1