-- Mathlib/Algebra/Order/Group/Abs.lean
@[to_additive] private lemma mabs_mul_eq_mul_mabs_le (hab : a ≤ b) :
    |a * b|ₘ = |a|ₘ * |b|ₘ ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1

Proof state:
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

Tactic:
exact (lt_irrefl (1 : α) <| ha.trans_lt <| hab.trans_lt hb).elim

Result:
no goals

Proof state:
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:
rw [mabs_of_one_lt ab, mul_left_inj] at h

Result:
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 : a = a⁻¹
ab : 1 < a * b
⊢ b ≤ 1

Proof state:
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:
obtain ab | ab := le_or_lt (a * b) 1

Result:
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

Proof state:
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 : a = a⁻¹
ab : 1 < a * b
⊢ b ≤ 1

Tactic:
rw [eq_one_of_inv_eq' h.symm] at ha

Result:
case inr.inl.inr
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : 1 < 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 : a = a⁻¹
ab : 1 < a * b
⊢ b ≤ 1

Proof state:
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:
swap

Result:
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

Proof state:
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:
simp [ha.le, hb.le, mabs_of_le_one, mul_le_one', mul_comm]

Result:
no goals

Proof state:
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:
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]

Result:
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

Proof state:
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⁻¹ = b

Tactic:
rwa [mabs_of_le_one ab, mul_inv_rev, mul_comm, mul_right_inj] at h

Result:
no goals

Proof state:
α : 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 : b ≤ 1
⊢ mabs (a * b) = a⁻¹ * b

Tactic:
simp only [h.antisymm hb, mabs_of_lt_one ha, mul_one]

Result:
no goals

Proof state:
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

Tactic:
simp [ha, hb, mabs_of_one_le, one_le_mul ha hb]

Result:
no goals

Proof state:
case inr.inl.inr
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : 1 < 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 : a = a⁻¹
ab : 1 < a * b
⊢ b ≤ 1

Tactic:
cases ha.false

Result:
no goals

Proof state:
α : 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

Tactic:
obtain ha | ha := le_or_lt 1 a <;> obtain hb | hb := le_or_lt 1 b

Result:
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

Proof state:
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

Tactic:
refine (eq_one_of_inv_eq' ?_).le

Result:
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⁻¹ = b

Proof state:
α : Type u_1
inst✝ : LinearOrderedCommGroup α
a b : α
hab : a ≤ b
ha : a < 1
hb : 1 ≤ b
⊢ (mabs (a * b) = a⁻¹ * b ↔ b ≤ 1) ↔ (mabs (a * b) = mabs a * mabs b ↔ 1 ≤ a ∧ 1 ≤ b ∨ a ≤ 1 ∧ b ≤ 1)

Tactic:
simp [ha.le, ha.not_le, hb, mabs_of_le_one, mabs_of_one_le]

Result:
no goals

Proof state:
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:
refine this.mp ⟨fun h ↦ ?_, fun h ↦ by simp only [h.antisymm hb, mabs_of_lt_one ha, mul_one]⟩

Result:
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