Theorem: mabs_mul_eq_mul_mabs_le
File: Mathlib/Algebra/Order/Group/Abs.lean

tactic: obtain ha | ha := le_or_lt 1 a <;> obtain hb | hb := le_or_lt 1 b
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: 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

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: 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
⊢ 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: 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)
⊢ 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: obtain ab | ab := le_or_lt (a * b) 1
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: simp [ha, hb, mabs_of_one_le, one_le_mul ha hb]
state_before: 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
state_after: no goals

tactic: exact (lt_irrefl (1 : α) <| ha.trans_lt <| hab.trans_lt hb).elim
state_before: 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
state_after: no goals

tactic: simp [ha.le, hb.le, mabs_of_le_one, mul_le_one', mul_comm]
state_before: 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: no goals

tactic: simp [ha.le, ha.not_le, hb, mabs_of_le_one, mabs_of_one_le]
state_before: α : 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)
state_after: no goals

tactic: simp only [h.antisymm hb, mabs_of_lt_one ha, mul_one]
state_before: α : 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
state_after: no goals

tactic: refine (eq_one_of_inv_eq' ?_).le
state_before: 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
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⁻¹ = b

tactic: rwa [mabs_of_le_one ab, mul_inv_rev, mul_comm, mul_right_inj] at h
state_before: 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
state_after: no goals

tactic: rw [mabs_of_one_lt ab, mul_left_inj] at h
state_before: 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
state_after: 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
state_before: 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
state_after: 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
state_before: 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
state_after: no goals