Theorem: Submonoid.LocalizationMap.map_injective_of_injective
File: Mathlib/GroupTheory/MonoidLocalization.lean

tactic: set i := map f (apply_coe_mem_map g S) k
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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
hizw : (f.map ⋯ k) z = (f.map ⋯ k) w
⊢ z = 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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
⊢ z = w

tactic: have ifkg (a : M) : i (f.toMap a) = k.toMap (g a) := map_eq f (apply_coe_mem_map g S) a
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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
⊢ z = 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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
⊢ z = w

tactic: let ⟨z', w', x, hxz, hxw⟩ := surj₂ f z 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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
⊢ z = 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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
z' w' : M
x : ↥S
hxz : z * f.toMap ↑x = f.toMap z'
hxw : w * f.toMap ↑x = f.toMap w'
⊢ z = w

tactic: have : k.toMap (g z') = k.toMap (g w') := by
  rw [← ifkg, ← ifkg, ← hxz, ← hxw, map_mul, map_mul, hizw]
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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
z' w' : M
x : ↥S
hxz : z * f.toMap ↑x = f.toMap z'
hxw : w * f.toMap ↑x = f.toMap w'
⊢ z = 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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
z' w' : M
x : ↥S
hxz : z * f.toMap ↑x = f.toMap z'
hxw : w * f.toMap ↑x = f.toMap w'
this : k.toMap (g z') = k.toMap (g w')
⊢ z = w

tactic: obtain ⟨⟨_, c, hc, rfl⟩, eq⟩ := k.exists_of_eq _ _ this
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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
z' w' : M
x : ↥S
hxz : z * f.toMap ↑x = f.toMap z'
hxw : w * f.toMap ↑x = f.toMap w'
this : k.toMap (g z') = k.toMap (g w')
⊢ z = w
state_after: case intro.mk.intro.intro
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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
z' w' : M
x : ↥S
hxz : z * f.toMap ↑x = f.toMap z'
hxw : w * f.toMap ↑x = f.toMap w'
this : k.toMap (g z') = k.toMap (g w')
c : M
hc : c ∈ ↑S
eq : ↑⟨g c, ⋯⟩ * g z' = ↑⟨g c, ⋯⟩ * g w'
⊢ z = w

tactic: simp_rw [← map_mul, hg.eq_iff] at eq
state_before: case intro.mk.intro.intro
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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
z' w' : M
x : ↥S
hxz : z * f.toMap ↑x = f.toMap z'
hxw : w * f.toMap ↑x = f.toMap w'
this : k.toMap (g z') = k.toMap (g w')
c : M
hc : c ∈ ↑S
eq : ↑⟨g c, ⋯⟩ * g z' = ↑⟨g c, ⋯⟩ * g w'
⊢ z = w
state_after: case intro.mk.intro.intro
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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
z' w' : M
x : ↥S
hxz : z * f.toMap ↑x = f.toMap z'
hxw : w * f.toMap ↑x = f.toMap w'
this : k.toMap (g z') = k.toMap (g w')
c : M
hc : c ∈ ↑S
eq : c * z' = c * w'
⊢ z = w

tactic: rw [← (f.map_units x).mul_left_inj, hxz, hxw, f.eq_iff_exists]
state_before: case intro.mk.intro.intro
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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
z' w' : M
x : ↥S
hxz : z * f.toMap ↑x = f.toMap z'
hxw : w * f.toMap ↑x = f.toMap w'
this : k.toMap (g z') = k.toMap (g w')
c : M
hc : c ∈ ↑S
eq : c * z' = c * w'
⊢ z = w
state_after: case intro.mk.intro.intro
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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
z' w' : M
x : ↥S
hxz : z * f.toMap ↑x = f.toMap z'
hxw : w * f.toMap ↑x = f.toMap w'
this : k.toMap (g z') = k.toMap (g w')
c : M
hc : c ∈ ↑S
eq : c * z' = c * w'
⊢ ∃ c, ↑c * z' = ↑c * w'

tactic: exact ⟨⟨c, hc⟩, eq⟩
state_before: case intro.mk.intro.intro
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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
z' w' : M
x : ↥S
hxz : z * f.toMap ↑x = f.toMap z'
hxw : w * f.toMap ↑x = f.toMap w'
this : k.toMap (g z') = k.toMap (g w')
c : M
hc : c ∈ ↑S
eq : c * z' = c * w'
⊢ ∃ c, ↑c * z' = ↑c * w'
state_after: no goals

tactic: rw [← ifkg, ← ifkg, ← hxz, ← hxw, map_mul, map_mul, hizw]
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
g : M →* P
hg✝ : ∀ (y : ↥S), IsUnit (g ↑y)
T : Submonoid P
hy : ∀ (y : ↥S), g ↑y ∈ T
Q : Type u_4
inst✝ : CommMonoid Q
k✝ : T.LocalizationMap Q
hg : Injective ⇑g
k : (Submonoid.map g S).LocalizationMap Q
z w : N
i : N →* Q := f.map ⋯ k
hizw : i z = i w
ifkg : ∀ (a : M), i (f.toMap a) = k.toMap (g a)
z' w' : M
x : ↥S
hxz : z * f.toMap ↑x = f.toMap z'
hxw : w * f.toMap ↑x = f.toMap w'
⊢ k.toMap (g z') = k.toMap (g w')
state_after: no goals