Theorem: Submonoid.LocalizationMap.surj₂
File: Mathlib/GroupTheory/MonoidLocalization.lean

tactic: let ⟨a, ha⟩ := surj f z
state_before: M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
⊢ ∃ z' w' d, z * f.toMap ↑d = f.toMap z' ∧ w * f.toMap ↑d = f.toMap w'
state_after: M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
⊢ ∃ z' w' d, z * f.toMap ↑d = f.toMap z' ∧ w * f.toMap ↑d = f.toMap w'

tactic: let ⟨b, hb⟩ := surj f w
state_before: M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
⊢ ∃ z' w' d, z * f.toMap ↑d = f.toMap z' ∧ w * f.toMap ↑d = f.toMap w'
state_after: M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
b : M × ↥S
hb : w * f.toMap ↑b.2 = f.toMap b.1
⊢ ∃ z' w' d, z * f.toMap ↑d = f.toMap z' ∧ w * f.toMap ↑d = f.toMap w'

tactic: refine ⟨a.1 * b.2, a.2 * b.1, a.2 * b.2, ?_, ?_⟩
state_before: M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
b : M × ↥S
hb : w * f.toMap ↑b.2 = f.toMap b.1
⊢ ∃ z' w' d, z * f.toMap ↑d = f.toMap z' ∧ w * f.toMap ↑d = f.toMap w'
state_after: case refine_1
M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
b : M × ↥S
hb : w * f.toMap ↑b.2 = f.toMap b.1
⊢ z * f.toMap ↑(a.2 * b.2) = f.toMap (a.1 * ↑b.2)

case refine_2
M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
b : M × ↥S
hb : w * f.toMap ↑b.2 = f.toMap b.1
⊢ w * f.toMap ↑(a.2 * b.2) = f.toMap (↑a.2 * b.1)

tactic: simp_rw [mul_def, map_mul, ← ha]
state_before: case refine_1
M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
b : M × ↥S
hb : w * f.toMap ↑b.2 = f.toMap b.1
⊢ z * f.toMap ↑(a.2 * b.2) = f.toMap (a.1 * ↑b.2)
state_after: case refine_1
M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
b : M × ↥S
hb : w * f.toMap ↑b.2 = f.toMap b.1
⊢ z * (f.toMap ↑a.2 * f.toMap ↑b.2) = z * f.toMap ↑a.2 * f.toMap ↑b.2

tactic: exact (mul_assoc z _ _).symm
state_before: case refine_1
M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
b : M × ↥S
hb : w * f.toMap ↑b.2 = f.toMap b.1
⊢ z * (f.toMap ↑a.2 * f.toMap ↑b.2) = z * f.toMap ↑a.2 * f.toMap ↑b.2
state_after: no goals

tactic: simp_rw [mul_def, map_mul, ← hb]
state_before: case refine_2
M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
b : M × ↥S
hb : w * f.toMap ↑b.2 = f.toMap b.1
⊢ w * f.toMap ↑(a.2 * b.2) = f.toMap (↑a.2 * b.1)
state_after: case refine_2
M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
b : M × ↥S
hb : w * f.toMap ↑b.2 = f.toMap b.1
⊢ w * (f.toMap ↑a.2 * f.toMap ↑b.2) = f.toMap ↑a.2 * (w * f.toMap ↑b.2)

tactic: exact mul_left_comm w _ _
state_before: case refine_2
M : Type u_1
inst✝² : CommMonoid M
S : Submonoid M
N : Type u_2
inst✝¹ : CommMonoid N
P : Type u_3
inst✝ : CommMonoid P
f : S.LocalizationMap N
z w : N
a : M × ↥S
ha : z * f.toMap ↑a.2 = f.toMap a.1
b : M × ↥S
hb : w * f.toMap ↑b.2 = f.toMap b.1
⊢ w * (f.toMap ↑a.2 * f.toMap ↑b.2) = f.toMap ↑a.2 * (w * f.toMap ↑b.2)
state_after: no goals