[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x✝ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
⊢ 1 • (m, s).snd • (m, s).fst = 1 • (m, s).snd • (m, s).fst
[PROOFSTEP]
rw [one_smul]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x✝⁴ x✝³ x✝² : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
x✝¹ : r S M (m1, s1) (m2, s2)
m3 : M
s3 : { x // x ∈ S }
x✝ : r S M (m2, s2) (m3, s3)
u1 : { x // x ∈ S }
hu1 : u1 • (m2, s2).snd • (m1, s1).fst = u1 • (m1, s1).snd • (m2, s2).fst
u2 : { x // x ∈ S }
hu2 : u2 • (m3, s3).snd • (m2, s2).fst = u2 • (m2, s2).snd • (m3, s3).fst
⊢ r S M (m1, s1) (m3, s3)
[PROOFSTEP]
use u1 * u2 * s2
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x✝⁴ x✝³ x✝² : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
x✝¹ : r S M (m1, s1) (m2, s2)
m3 : M
s3 : { x // x ∈ S }
x✝ : r S M (m2, s2) (m3, s3)
u1 : { x // x ∈ S }
hu1 : u1 • (m2, s2).snd • (m1, s1).fst = u1 • (m1, s1).snd • (m2, s2).fst
u2 : { x // x ∈ S }
hu2 : u2 • (m3, s3).snd • (m2, s2).fst = u2 • (m2, s2).snd • (m3, s3).fst
⊢ (u1 * u2 * s2) • (m3, s3).snd • (m1, s1).fst = (u1 * u2 * s2) • (m1, s1).snd • (m3, s3).fst
[PROOFSTEP]
have hu1' := congr_arg ((· • ·) (u2 * s3)) hu1.symm
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x✝⁴ x✝³ x✝² : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
x✝¹ : r S M (m1, s1) (m2, s2)
m3 : M
s3 : { x // x ∈ S }
x✝ : r S M (m2, s2) (m3, s3)
u1 : { x // x ∈ S }
hu1 : u1 • (m2, s2).snd • (m1, s1).fst = u1 • (m1, s1).snd • (m2, s2).fst
u2 : { x // x ∈ S }
hu2 : u2 • (m3, s3).snd • (m2, s2).fst = u2 • (m2, s2).snd • (m3, s3).fst
hu1' :
  (fun x x_1 => x • x_1) (u2 * s3) (u1 • (m1, s1).snd • (m2, s2).fst) =
    (fun x x_1 => x • x_1) (u2 * s3) (u1 • (m2, s2).snd • (m1, s1).fst)
⊢ (u1 * u2 * s2) • (m3, s3).snd • (m1, s1).fst = (u1 * u2 * s2) • (m1, s1).snd • (m3, s3).fst
[PROOFSTEP]
have hu2' := congr_arg ((· • ·) (u1 * s1)) hu2.symm
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x✝⁴ x✝³ x✝² : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
x✝¹ : r S M (m1, s1) (m2, s2)
m3 : M
s3 : { x // x ∈ S }
x✝ : r S M (m2, s2) (m3, s3)
u1 : { x // x ∈ S }
hu1 : u1 • (m2, s2).snd • (m1, s1).fst = u1 • (m1, s1).snd • (m2, s2).fst
u2 : { x // x ∈ S }
hu2 : u2 • (m3, s3).snd • (m2, s2).fst = u2 • (m2, s2).snd • (m3, s3).fst
hu1' :
  (fun x x_1 => x • x_1) (u2 * s3) (u1 • (m1, s1).snd • (m2, s2).fst) =
    (fun x x_1 => x • x_1) (u2 * s3) (u1 • (m2, s2).snd • (m1, s1).fst)
hu2' :
  (fun x x_1 => x • x_1) (u1 * s1) (u2 • (m2, s2).snd • (m3, s3).fst) =
    (fun x x_1 => x • x_1) (u1 * s1) (u2 • (m3, s3).snd • (m2, s2).fst)
⊢ (u1 * u2 * s2) • (m3, s3).snd • (m1, s1).fst = (u1 * u2 * s2) • (m1, s1).snd • (m3, s3).fst
[PROOFSTEP]
simp only [← mul_smul, smul_assoc, mul_assoc, mul_comm, mul_left_comm] at hu1' hu2' ⊢
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x✝⁴ x✝³ x✝² : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
x✝¹ : r S M (m1, s1) (m2, s2)
m3 : M
s3 : { x // x ∈ S }
x✝ : r S M (m2, s2) (m3, s3)
u1 : { x // x ∈ S }
hu1 : u1 • (m2, s2).snd • (m1, s1).fst = u1 • (m1, s1).snd • (m2, s2).fst
u2 : { x // x ∈ S }
hu2 : u2 • (m3, s3).snd • (m2, s2).fst = u2 • (m2, s2).snd • (m3, s3).fst
hu1' : (s1 * (s3 * (u1 * u2))) • m2 = (s2 * (s3 * (u1 * u2))) • m1
hu2' : (s1 * (s2 * (u1 * u2))) • m3 = (s1 * (s3 * (u1 * u2))) • m2
⊢ (s2 * (s3 * (u1 * u2))) • m1 = (s1 * (s2 * (u1 * u2))) • m3
[PROOFSTEP]
rw [hu2', hu1']
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
β : LocalizedModule S M → Prop
h : ∀ (m : M) (s : { x // x ∈ S }), β (mk m s)
⊢ ∀ (x : LocalizedModule S M), β x
[PROOFSTEP]
rintro ⟨⟨m, s⟩⟩
[GOAL]
case mk.mk
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
β : LocalizedModule S M → Prop
h : ∀ (m : M) (s : { x // x ∈ S }), β (mk m s)
x✝ : LocalizedModule S M
m : M
s : { x // x ∈ S }
⊢ β (Quot.mk Setoid.r (m, s))
[PROOFSTEP]
exact h m s
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
β : LocalizedModule S M → LocalizedModule S M → Prop
h : ∀ (m m' : M) (s s' : { x // x ∈ S }), β (mk m s) (mk m' s')
⊢ ∀ (x y : LocalizedModule S M), β x y
[PROOFSTEP]
rintro ⟨⟨m, s⟩⟩ ⟨⟨m', s'⟩⟩
[GOAL]
case mk.mk.mk.mk
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
β : LocalizedModule S M → LocalizedModule S M → Prop
h : ∀ (m m' : M) (s s' : { x // x ∈ S }), β (mk m s) (mk m' s')
x✝ : LocalizedModule S M
m : M
s : { x // x ∈ S }
y✝ : LocalizedModule S M
m' : M
s' : { x // x ∈ S }
⊢ β (Quot.mk Setoid.r (m, s)) (Quot.mk Setoid.r (m', s'))
[PROOFSTEP]
exact h m m' s s'
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
α : Type u_1
f : M × { x // x ∈ S } → α
wd : ∀ (p p' : M × { x // x ∈ S }), p ≈ p' → f p = f p'
m : M
s : { x // x ∈ S }
⊢ liftOn (mk m s) f wd = f (m, s)
[PROOFSTEP]
convert Quotient.liftOn_mk f wd ⟨m, s⟩
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
α : Type u_1
f : M × { x // x ∈ S } → M × { x // x ∈ S } → α
wd : ∀ (p q p' q' : M × { x // x ∈ S }), p ≈ p' → q ≈ q' → f p q = f p' q'
m m' : M
s s' : { x // x ∈ S }
⊢ liftOn₂ (mk m s) (mk m' s') f wd = f (m, s) (m', s')
[PROOFSTEP]
convert Quotient.liftOn₂_mk f wd _ _
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
⊢ 1 • 1 • 0 = 1 • s • 0
[PROOFSTEP]
rw [one_smul, smul_zero, smul_zero, one_smul]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p1 p2 : LocalizedModule S M
x✝⁵ x✝⁴ x✝³ x✝² : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
m1' : M
s1' : { x // x ∈ S }
x✝¹ : (m1, s1) ≈ (m1', s1')
m2' : M
s2' : { x // x ∈ S }
x✝ : (m2, s2) ≈ (m2', s2')
u1 : { x // x ∈ S }
hu1 : u1 • (m1', s1').snd • (m1, s1).fst = u1 • (m1, s1).snd • (m1', s1').fst
u2 : { x // x ∈ S }
hu2 : u2 • (m2', s2').snd • (m2, s2).fst = u2 • (m2, s2).snd • (m2', s2').fst
⊢ (u1 * u2) • ((m1', s1').snd * (m2', s2').snd) • ((m2, s2).snd • (m1, s1).fst + (m1, s1).snd • (m2, s2).fst) =
    (u1 * u2) • ((m1, s1).snd * (m2, s2).snd) • ((m2', s2').snd • (m1', s1').fst + (m1', s1').snd • (m2', s2').fst)
[PROOFSTEP]
have hu1' := congr_arg ((· • ·) (u2 * s2 * s2')) hu1
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p1 p2 : LocalizedModule S M
x✝⁵ x✝⁴ x✝³ x✝² : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
m1' : M
s1' : { x // x ∈ S }
x✝¹ : (m1, s1) ≈ (m1', s1')
m2' : M
s2' : { x // x ∈ S }
x✝ : (m2, s2) ≈ (m2', s2')
u1 : { x // x ∈ S }
hu1 : u1 • (m1', s1').snd • (m1, s1).fst = u1 • (m1, s1).snd • (m1', s1').fst
u2 : { x // x ∈ S }
hu2 : u2 • (m2', s2').snd • (m2, s2).fst = u2 • (m2, s2).snd • (m2', s2').fst
hu1' :
  (fun x x_1 => x • x_1) (u2 * s2 * s2') (u1 • (m1', s1').snd • (m1, s1).fst) =
    (fun x x_1 => x • x_1) (u2 * s2 * s2') (u1 • (m1, s1).snd • (m1', s1').fst)
⊢ (u1 * u2) • ((m1', s1').snd * (m2', s2').snd) • ((m2, s2).snd • (m1, s1).fst + (m1, s1).snd • (m2, s2).fst) =
    (u1 * u2) • ((m1, s1).snd * (m2, s2).snd) • ((m2', s2').snd • (m1', s1').fst + (m1', s1').snd • (m2', s2').fst)
[PROOFSTEP]
have hu2' := congr_arg ((· • ·) (u1 * s1 * s1')) hu2
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p1 p2 : LocalizedModule S M
x✝⁵ x✝⁴ x✝³ x✝² : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
m1' : M
s1' : { x // x ∈ S }
x✝¹ : (m1, s1) ≈ (m1', s1')
m2' : M
s2' : { x // x ∈ S }
x✝ : (m2, s2) ≈ (m2', s2')
u1 : { x // x ∈ S }
hu1 : u1 • (m1', s1').snd • (m1, s1).fst = u1 • (m1, s1).snd • (m1', s1').fst
u2 : { x // x ∈ S }
hu2 : u2 • (m2', s2').snd • (m2, s2).fst = u2 • (m2, s2).snd • (m2', s2').fst
hu1' :
  (fun x x_1 => x • x_1) (u2 * s2 * s2') (u1 • (m1', s1').snd • (m1, s1).fst) =
    (fun x x_1 => x • x_1) (u2 * s2 * s2') (u1 • (m1, s1).snd • (m1', s1').fst)
hu2' :
  (fun x x_1 => x • x_1) (u1 * s1 * s1') (u2 • (m2', s2').snd • (m2, s2).fst) =
    (fun x x_1 => x • x_1) (u1 * s1 * s1') (u2 • (m2, s2).snd • (m2', s2').fst)
⊢ (u1 * u2) • ((m1', s1').snd * (m2', s2').snd) • ((m2, s2).snd • (m1, s1).fst + (m1, s1).snd • (m2, s2).fst) =
    (u1 * u2) • ((m1, s1).snd * (m2, s2).snd) • ((m2', s2').snd • (m1', s1').fst + (m1', s1').snd • (m2', s2').fst)
[PROOFSTEP]
simp only [smul_add, ← mul_smul, smul_assoc, mul_assoc, mul_comm, mul_left_comm] at hu1' hu2' ⊢
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
p1 p2 : LocalizedModule S M
x✝⁵ x✝⁴ x✝³ x✝² : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
m1' : M
s1' : { x // x ∈ S }
x✝¹ : (m1, s1) ≈ (m1', s1')
m2' : M
s2' : { x // x ∈ S }
x✝ : (m2, s2) ≈ (m2', s2')
u1 : { x // x ∈ S }
hu1 : u1 • (m1', s1').snd • (m1, s1).fst = u1 • (m1, s1).snd • (m1', s1').fst
u2 : { x // x ∈ S }
hu2 : u2 • (m2', s2').snd • (m2, s2).fst = u2 • (m2, s2).snd • (m2', s2').fst
hu1' : (s2 * (s1' * (s2' * (u1 * u2)))) • m1 = (s1 * (s2 * (s2' * (u1 * u2)))) • m1'
hu2' : (s1 * (s1' * (s2' * (u1 * u2)))) • m2 = (s1 * (s2 * (s1' * (u1 * u2)))) • m2'
⊢ (s2 * (s1' * (s2' * (u1 * u2)))) • m1 + (s1 * (s1' * (s2' * (u1 * u2)))) • m2 =
    (s1 * (s2 * (s2' * (u1 * u2)))) • m1' + (s1 * (s2 * (s1' * (u1 * u2)))) • m2'
[PROOFSTEP]
rw [hu1', hu2']
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x y z : LocalizedModule S M
⊢ x + y + z = x + (y + z)
[PROOFSTEP]
induction' x using LocalizedModule.induction_on with mx sx
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
y z : LocalizedModule S M
mx : M
sx : { x // x ∈ S }
⊢ mk mx sx + y + z = mk mx sx + (y + z)
[PROOFSTEP]
induction' y using LocalizedModule.induction_on with my sy
[GOAL]
case h.h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
z : LocalizedModule S M
mx : M
sx : { x // x ∈ S }
my : M
sy : { x // x ∈ S }
⊢ mk mx sx + mk my sy + z = mk mx sx + (mk my sy + z)
[PROOFSTEP]
induction' z using LocalizedModule.induction_on with mz sz
[GOAL]
case h.h.h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
mx : M
sx : { x // x ∈ S }
my : M
sy : { x // x ∈ S }
mz : M
sz : { x // x ∈ S }
⊢ mk mx sx + mk my sy + mk mz sz = mk mx sx + (mk my sy + mk mz sz)
[PROOFSTEP]
simp only [mk_add_mk, smul_add]
[GOAL]
case h.h.h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
mx : M
sx : { x // x ∈ S }
my : M
sy : { x // x ∈ S }
mz : M
sz : { x // x ∈ S }
⊢ mk (sz • sy • mx + sz • sx • my + (sx * sy) • mz) (sx * sy * sz) =
    mk ((sy * sz) • mx + (sx • sz • my + sx • sy • mz)) (sx * (sy * sz))
[PROOFSTEP]
refine' mk_eq.mpr ⟨1, _⟩
[GOAL]
case h.h.h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
mx : M
sx : { x // x ∈ S }
my : M
sy : { x // x ∈ S }
mz : M
sz : { x // x ∈ S }
⊢ 1 • (sx * (sy * sz)) • (sz • sy • mx + sz • sx • my + (sx * sy) • mz) =
    1 • (sx * sy * sz) • ((sy * sz) • mx + (sx • sz • my + sx • sy • mz))
[PROOFSTEP]
rw [one_smul, one_smul]
[GOAL]
case h.h.h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
mx : M
sx : { x // x ∈ S }
my : M
sy : { x // x ∈ S }
mz : M
sz : { x // x ∈ S }
⊢ (sx * (sy * sz)) • (sz • sy • mx + sz • sx • my + (sx * sy) • mz) =
    (sx * sy * sz) • ((sy * sz) • mx + (sx • sz • my + sx • sy • mz))
[PROOFSTEP]
congr 1
[GOAL]
case h.h.h.e_a
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
mx : M
sx : { x // x ∈ S }
my : M
sy : { x // x ∈ S }
mz : M
sz : { x // x ∈ S }
⊢ sx * (sy * sz) = sx * sy * sz
[PROOFSTEP]
rw [mul_assoc]
[GOAL]
case h.h.h.e_a
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
mx : M
sx : { x // x ∈ S }
my : M
sy : { x // x ∈ S }
mz : M
sz : { x // x ∈ S }
⊢ sz • sy • mx + sz • sx • my + (sx * sy) • mz = (sy * sz) • mx + (sx • sz • my + sx • sy • mz)
[PROOFSTEP]
rw [eq_comm, mul_comm, add_assoc, mul_smul, mul_smul, ← mul_smul sx sz, mul_comm, mul_smul]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x y : LocalizedModule S M
m m' : M
s s' : { x // x ∈ S }
⊢ mk m s + mk m' s' = mk m' s' + mk m s
[PROOFSTEP]
rw [mk_add_mk, mk_add_mk, add_comm, mul_comm]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x : LocalizedModule S M
m : M
s : { x // x ∈ S }
⊢ 0 + mk m s = mk m s
[PROOFSTEP]
rw [← zero_mk s, mk_add_mk, smul_zero, zero_add, mk_eq]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x : LocalizedModule S M
m : M
s : { x // x ∈ S }
⊢ ∃ u, u • s • s • m = u • (s * s) • m
[PROOFSTEP]
exact ⟨1, by rw [one_smul, mul_smul, one_smul]⟩
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x : LocalizedModule S M
m : M
s : { x // x ∈ S }
⊢ 1 • s • s • m = 1 • (s * s) • m
[PROOFSTEP]
rw [one_smul, mul_smul, one_smul]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x : LocalizedModule S M
m : M
s : { x // x ∈ S }
⊢ mk m s + 0 = mk m s
[PROOFSTEP]
rw [← zero_mk s, mk_add_mk, smul_zero, add_zero, mk_eq]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x : LocalizedModule S M
m : M
s : { x // x ∈ S }
⊢ ∃ u, u • s • s • m = u • (s * s) • m
[PROOFSTEP]
exact ⟨1, by rw [one_smul, mul_smul, one_smul]⟩
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x : LocalizedModule S M
m : M
s : { x // x ∈ S }
⊢ 1 • s • s • m = 1 • (s * s) • m
[PROOFSTEP]
rw [one_smul, mul_smul, one_smul]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M✝ : Type v
inst✝³ : AddCommMonoid M✝
inst✝² : Module R M✝
M : Type u_1
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ AddCommMonoid (LocalizedModule S M)
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M✝ : Type v
inst✝³ : AddCommMonoid M✝
inst✝² : Module R M✝
M : Type u_1
inst✝¹ : AddCommGroup M
inst✝ : Module R M
src✝ : AddCommMonoid (LocalizedModule S M) :=
  let_fun this := inferInstance;
  this
p : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
x✝ : (m1, s1) ≈ (m2, s2)
u : { x // x ∈ S }
hu : u • (m2, s2).snd • (m1, s1).fst = u • (m1, s1).snd • (m2, s2).fst
⊢ (fun x => mk (-x.fst) x.snd) (m1, s1) = (fun x => mk (-x.fst) x.snd) (m2, s2)
[PROOFSTEP]
rw [mk_eq]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M✝ : Type v
inst✝³ : AddCommMonoid M✝
inst✝² : Module R M✝
M : Type u_1
inst✝¹ : AddCommGroup M
inst✝ : Module R M
src✝ : AddCommMonoid (LocalizedModule S M) :=
  let_fun this := inferInstance;
  this
p : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
x✝ : (m1, s1) ≈ (m2, s2)
u : { x // x ∈ S }
hu : u • (m2, s2).snd • (m1, s1).fst = u • (m1, s1).snd • (m2, s2).fst
⊢ ∃ u, u • (m2, s2).snd • -(m1, s1).fst = u • (m1, s1).snd • -(m2, s2).fst
[PROOFSTEP]
exact ⟨u, by simpa⟩
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M✝ : Type v
inst✝³ : AddCommMonoid M✝
inst✝² : Module R M✝
M : Type u_1
inst✝¹ : AddCommGroup M
inst✝ : Module R M
src✝ : AddCommMonoid (LocalizedModule S M) :=
  let_fun this := inferInstance;
  this
p : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
x✝ : (m1, s1) ≈ (m2, s2)
u : { x // x ∈ S }
hu : u • (m2, s2).snd • (m1, s1).fst = u • (m1, s1).snd • (m2, s2).fst
⊢ u • (m2, s2).snd • -(m1, s1).fst = u • (m1, s1).snd • -(m2, s2).fst
[PROOFSTEP]
simpa
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M✝ : Type v
inst✝³ : AddCommMonoid M✝
inst✝² : Module R M✝
M : Type u_1
inst✝¹ : AddCommGroup M
inst✝ : Module R M
src✝ : AddCommMonoid (LocalizedModule S M) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (a : LocalizedModule S M), -a + a = 0
[PROOFSTEP]
rintro ⟨m, s⟩
[GOAL]
case mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M✝ : Type v
inst✝³ : AddCommMonoid M✝
inst✝² : Module R M✝
M : Type u_1
inst✝¹ : AddCommGroup M
inst✝ : Module R M
src✝ : AddCommMonoid (LocalizedModule S M) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S M
m : M
s : { x // x ∈ S }
⊢ -Quot.mk Setoid.r (m, s) + Quot.mk Setoid.r (m, s) = 0
[PROOFSTEP]
change
  (liftOn (mk m s) (fun x => mk (-x.1) x.2) fun ⟨m1, s1⟩ ⟨m2, s2⟩ ⟨u, hu⟩ =>
        by
        rw [mk_eq]
        exact ⟨u, by simpa⟩) +
      mk m s =
    0
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M✝ : Type v
inst✝³ : AddCommMonoid M✝
inst✝² : Module R M✝
M : Type u_1
inst✝¹ : AddCommGroup M
inst✝ : Module R M
src✝ : AddCommMonoid (LocalizedModule S M) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S M
m : M
s : { x // x ∈ S }
x✝² x✝¹ : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
x✝ : (m1, s1) ≈ (m2, s2)
u : { x // x ∈ S }
hu : u • (m2, s2).snd • (m1, s1).fst = u • (m1, s1).snd • (m2, s2).fst
⊢ (fun x => mk (-x.fst) x.snd) (m1, s1) = (fun x => mk (-x.fst) x.snd) (m2, s2)
[PROOFSTEP]
rw [mk_eq]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M✝ : Type v
inst✝³ : AddCommMonoid M✝
inst✝² : Module R M✝
M : Type u_1
inst✝¹ : AddCommGroup M
inst✝ : Module R M
src✝ : AddCommMonoid (LocalizedModule S M) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S M
m : M
s : { x // x ∈ S }
x✝² x✝¹ : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
x✝ : (m1, s1) ≈ (m2, s2)
u : { x // x ∈ S }
hu : u • (m2, s2).snd • (m1, s1).fst = u • (m1, s1).snd • (m2, s2).fst
⊢ ∃ u, u • (m2, s2).snd • -(m1, s1).fst = u • (m1, s1).snd • -(m2, s2).fst
[PROOFSTEP]
exact ⟨u, by simpa⟩
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M✝ : Type v
inst✝³ : AddCommMonoid M✝
inst✝² : Module R M✝
M : Type u_1
inst✝¹ : AddCommGroup M
inst✝ : Module R M
src✝ : AddCommMonoid (LocalizedModule S M) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S M
m : M
s : { x // x ∈ S }
x✝² x✝¹ : M × { x // x ∈ S }
m1 : M
s1 : { x // x ∈ S }
m2 : M
s2 : { x // x ∈ S }
x✝ : (m1, s1) ≈ (m2, s2)
u : { x // x ∈ S }
hu : u • (m2, s2).snd • (m1, s1).fst = u • (m1, s1).snd • (m2, s2).fst
⊢ u • (m2, s2).snd • -(m1, s1).fst = u • (m1, s1).snd • -(m2, s2).fst
[PROOFSTEP]
simpa
[GOAL]
case mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M✝ : Type v
inst✝³ : AddCommMonoid M✝
inst✝² : Module R M✝
M : Type u_1
inst✝¹ : AddCommGroup M
inst✝ : Module R M
src✝ : AddCommMonoid (LocalizedModule S M) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S M
m : M
s : { x // x ∈ S }
⊢ liftOn (mk m s) (fun x => mk (-x.fst) x.snd)
        (_ :
          ∀ (x x_1 : M × { x // x ∈ S }), x ≈ x_1 → (fun x => mk (-x.fst) x.snd) x = (fun x => mk (-x.fst) x.snd) x_1) +
      mk m s =
    0
[PROOFSTEP]
rw [liftOn_mk, mk_add_mk]
[GOAL]
case mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M✝ : Type v
inst✝³ : AddCommMonoid M✝
inst✝² : Module R M✝
M : Type u_1
inst✝¹ : AddCommGroup M
inst✝ : Module R M
src✝ : AddCommMonoid (LocalizedModule S M) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S M
m : M
s : { x // x ∈ S }
⊢ mk (s • -(m, s).fst + (m, s).snd • m) ((m, s).snd * s) = 0
[PROOFSTEP]
simp
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
⊢ AddCommMonoid (LocalizedModule S A)
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
⊢ ∀ (p q p' q' : A × { x // x ∈ S }),
    p ≈ p' →
      q ≈ q' →
        (fun x₁ x₂ => mk (x₁.fst * x₂.fst) (x₁.snd * x₂.snd)) p q =
          (fun x₁ x₂ => mk (x₁.fst * x₂.fst) (x₁.snd * x₂.snd)) p' q'
[PROOFSTEP]
rintro ⟨a₁, s₁⟩ ⟨a₂, s₂⟩ ⟨b₁, t₁⟩ ⟨b₂, t₂⟩ ⟨u₁, e₁⟩ ⟨u₂, e₂⟩
[GOAL]
case mk.mk.mk.mk.intro.intro
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • (b₁, t₁).snd • (a₁, s₁).fst = u₁ • (a₁, s₁).snd • (b₁, t₁).fst
u₂ : { x // x ∈ S }
e₂ : u₂ • (b₂, t₂).snd • (a₂, s₂).fst = u₂ • (a₂, s₂).snd • (b₂, t₂).fst
⊢ (fun x₁ x₂ => mk (x₁.fst * x₂.fst) (x₁.snd * x₂.snd)) (a₁, s₁) (a₂, s₂) =
    (fun x₁ x₂ => mk (x₁.fst * x₂.fst) (x₁.snd * x₂.snd)) (b₁, t₁) (b₂, t₂)
[PROOFSTEP]
rw [mk_eq]
[GOAL]
case mk.mk.mk.mk.intro.intro
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • (b₁, t₁).snd • (a₁, s₁).fst = u₁ • (a₁, s₁).snd • (b₁, t₁).fst
u₂ : { x // x ∈ S }
e₂ : u₂ • (b₂, t₂).snd • (a₂, s₂).fst = u₂ • (a₂, s₂).snd • (b₂, t₂).fst
⊢ ∃ u,
    u • ((b₁, t₁).snd * (b₂, t₂).snd) • ((a₁, s₁).fst * (a₂, s₂).fst) =
      u • ((a₁, s₁).snd * (a₂, s₂).snd) • ((b₁, t₁).fst * (b₂, t₂).fst)
[PROOFSTEP]
use u₁ * u₂
[GOAL]
case h
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • (b₁, t₁).snd • (a₁, s₁).fst = u₁ • (a₁, s₁).snd • (b₁, t₁).fst
u₂ : { x // x ∈ S }
e₂ : u₂ • (b₂, t₂).snd • (a₂, s₂).fst = u₂ • (a₂, s₂).snd • (b₂, t₂).fst
⊢ (u₁ * u₂) • ((b₁, t₁).snd * (b₂, t₂).snd) • ((a₁, s₁).fst * (a₂, s₂).fst) =
    (u₁ * u₂) • ((a₁, s₁).snd * (a₂, s₂).snd) • ((b₁, t₁).fst * (b₂, t₂).fst)
[PROOFSTEP]
dsimp only at e₁ e₂ ⊢
[GOAL]
case h
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ * u₂) • (t₁ * t₂) • (a₁ * a₂) = (u₁ * u₂) • (s₁ * s₂) • (b₁ * b₂)
[PROOFSTEP]
rw [eq_comm]
[GOAL]
case h
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ * u₂) • (s₁ * s₂) • (b₁ * b₂) = (u₁ * u₂) • (t₁ * t₂) • (a₁ * a₂)
[PROOFSTEP]
trans (u₁ • t₁ • a₁) • u₂ • t₂ • a₂
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ * u₂) • (s₁ * s₂) • (b₁ * b₂) = (u₁ • t₁ • a₁) • u₂ • t₂ • a₂
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ • t₁ • a₁) • u₂ • t₂ • a₂ = (u₁ * u₂) • (t₁ * t₂) • (a₁ * a₂)
[PROOFSTEP]
rw [e₁, e₂]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ * u₂) • (s₁ * s₂) • (b₁ * b₂) = (u₁ • s₁ • b₁) • u₂ • s₂ • b₂
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ • t₁ • a₁) • u₂ • t₂ • a₂ = (u₁ * u₂) • (t₁ * t₂) • (a₁ * a₂)
[PROOFSTEP]
swap
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ • t₁ • a₁) • u₂ • t₂ • a₂ = (u₁ * u₂) • (t₁ * t₂) • (a₁ * a₂)
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ * u₂) • (s₁ * s₂) • (b₁ * b₂) = (u₁ • s₁ • b₁) • u₂ • s₂ • b₂
[PROOFSTEP]
rw [eq_comm]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ * u₂) • (t₁ * t₂) • (a₁ * a₂) = (u₁ • t₁ • a₁) • u₂ • t₂ • a₂
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ * u₂) • (s₁ * s₂) • (b₁ * b₂) = (u₁ • s₁ • b₁) • u₂ • s₂ • b₂
[PROOFSTEP]
all_goals rw [smul_smul, mul_mul_mul_comm, ← smul_eq_mul, ← smul_eq_mul A, smul_smul_smul_comm, mul_smul, mul_smul]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ * u₂) • (t₁ * t₂) • (a₁ * a₂) = (u₁ • t₁ • a₁) • u₂ • t₂ • a₂
[PROOFSTEP]
rw [smul_smul, mul_mul_mul_comm, ← smul_eq_mul, ← smul_eq_mul A, smul_smul_smul_comm, mul_smul, mul_smul]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
m₁ m₂ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
b₁ : A
t₁ : { x // x ∈ S }
b₂ : A
t₂ u₁ : { x // x ∈ S }
e₁ : u₁ • t₁ • a₁ = u₁ • s₁ • b₁
u₂ : { x // x ∈ S }
e₂ : u₂ • t₂ • a₂ = u₂ • s₂ • b₂
⊢ (u₁ * u₂) • (s₁ * s₂) • (b₁ * b₂) = (u₁ • s₁ • b₁) • u₂ • s₂ • b₂
[PROOFSTEP]
rw [smul_smul, mul_mul_mul_comm, ← smul_eq_mul, ← smul_eq_mul A, smul_smul_smul_comm, mul_smul, mul_smul]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (a b c : LocalizedModule S A), a * (b + c) = a * b + a * c
[PROOFSTEP]
rintro ⟨a₁, s₁⟩ ⟨a₂, s₂⟩ ⟨a₃, s₃⟩
[GOAL]
case mk.mk.mk.mk.mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
c✝ : LocalizedModule S A
a₃ : A
s₃ : { x // x ∈ S }
⊢ Quot.mk Setoid.r (a₁, s₁) * (Quot.mk Setoid.r (a₂, s₂) + Quot.mk Setoid.r (a₃, s₃)) =
    Quot.mk Setoid.r (a₁, s₁) * Quot.mk Setoid.r (a₂, s₂) + Quot.mk Setoid.r (a₁, s₁) * Quot.mk Setoid.r (a₃, s₃)
[PROOFSTEP]
apply mk_eq.mpr _
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
c✝ : LocalizedModule S A
a₃ : A
s₃ : { x // x ∈ S }
⊢ ∃ u,
    u •
        (((a₁, s₁).fst * (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).snd *
            ((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).snd) •
          ((a₁, s₁).fst *
            ((a₃, s₃).snd • (a₂, s₂).fst + (a₂, s₂).snd • (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).fst) =
      u •
        ((a₁, s₁).snd * ((a₃, s₃).snd • (a₂, s₂).fst + (a₂, s₂).snd • (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).snd) •
          (((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).snd •
              ((a₁, s₁).fst * (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).fst +
            ((a₁, s₁).fst * (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).snd •
              ((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).fst)
[PROOFSTEP]
use 1
[GOAL]
case h
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
c✝ : LocalizedModule S A
a₃ : A
s₃ : { x // x ∈ S }
⊢ 1 •
      (((a₁, s₁).fst * (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).snd *
          ((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).snd) •
        ((a₁, s₁).fst * ((a₃, s₃).snd • (a₂, s₂).fst + (a₂, s₂).snd • (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).fst) =
    1 •
      ((a₁, s₁).snd * ((a₃, s₃).snd • (a₂, s₂).fst + (a₂, s₂).snd • (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).snd) •
        (((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).snd •
            ((a₁, s₁).fst * (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).fst +
          ((a₁, s₁).fst * (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).snd •
            ((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).fst)
[PROOFSTEP]
simp only [one_mul, smul_add, mul_add, mul_smul_comm, smul_smul, ← mul_assoc, mul_right_comm]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (a b c : LocalizedModule S A), (a + b) * c = a * c + b * c
[PROOFSTEP]
rintro ⟨a₁, s₁⟩ ⟨a₂, s₂⟩ ⟨a₃, s₃⟩
[GOAL]
case mk.mk.mk.mk.mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
c✝ : LocalizedModule S A
a₃ : A
s₃ : { x // x ∈ S }
⊢ (Quot.mk Setoid.r (a₁, s₁) + Quot.mk Setoid.r (a₂, s₂)) * Quot.mk Setoid.r (a₃, s₃) =
    Quot.mk Setoid.r (a₁, s₁) * Quot.mk Setoid.r (a₃, s₃) + Quot.mk Setoid.r (a₂, s₂) * Quot.mk Setoid.r (a₃, s₃)
[PROOFSTEP]
apply mk_eq.mpr _
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
c✝ : LocalizedModule S A
a₃ : A
s₃ : { x // x ∈ S }
⊢ ∃ u,
    u •
        (((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).snd *
            ((a₂, s₂).fst * (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).snd) •
          (((a₂, s₂).snd • (a₁, s₁).fst + (a₁, s₁).snd • (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).fst *
            (a₃, s₃).fst) =
      u •
        (((a₂, s₂).snd • (a₁, s₁).fst + (a₁, s₁).snd • (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).snd * (a₃, s₃).snd) •
          (((a₂, s₂).fst * (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).snd •
              ((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).fst +
            ((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).snd •
              ((a₂, s₂).fst * (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).fst)
[PROOFSTEP]
use 1
[GOAL]
case h
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
c✝ : LocalizedModule S A
a₃ : A
s₃ : { x // x ∈ S }
⊢ 1 •
      (((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).snd *
          ((a₂, s₂).fst * (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).snd) •
        (((a₂, s₂).snd • (a₁, s₁).fst + (a₁, s₁).snd • (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).fst * (a₃, s₃).fst) =
    1 •
      (((a₂, s₂).snd • (a₁, s₁).fst + (a₁, s₁).snd • (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).snd * (a₃, s₃).snd) •
        (((a₂, s₂).fst * (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).snd •
            ((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).fst +
          ((a₁, s₁).fst * (a₃, s₃).fst, (a₁, s₁).snd * (a₃, s₃).snd).snd •
            ((a₂, s₂).fst * (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).fst)
[PROOFSTEP]
simp only [one_mul, smul_add, add_mul, smul_smul, ← mul_assoc, smul_mul_assoc, mul_right_comm]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (a : LocalizedModule S A), 0 * a = 0
[PROOFSTEP]
rintro ⟨a, s⟩
[GOAL]
case mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a : A
s : { x // x ∈ S }
⊢ 0 * Quot.mk Setoid.r (a, s) = 0
[PROOFSTEP]
exact mk_eq.mpr ⟨1, by simp only [zero_mul, smul_zero]⟩
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a : A
s : { x // x ∈ S }
⊢ 1 • 1 • ((0, 1).fst * (a, s).fst) = 1 • ((0, 1).snd * (a, s).snd) • 0
[PROOFSTEP]
simp only [zero_mul, smul_zero]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (a : LocalizedModule S A), a * 0 = 0
[PROOFSTEP]
rintro ⟨a, s⟩
[GOAL]
case mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a : A
s : { x // x ∈ S }
⊢ Quot.mk Setoid.r (a, s) * 0 = 0
[PROOFSTEP]
exact mk_eq.mpr ⟨1, by simp only [mul_zero, smul_zero]⟩
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a : A
s : { x // x ∈ S }
⊢ 1 • 1 • ((a, s).fst * (0, 1).fst) = 1 • ((a, s).snd * (0, 1).snd) • 0
[PROOFSTEP]
simp only [mul_zero, smul_zero]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (a b c : LocalizedModule S A), a * b * c = a * (b * c)
[PROOFSTEP]
rintro ⟨a₁, s₁⟩ ⟨a₂, s₂⟩ ⟨a₃, s₃⟩
[GOAL]
case mk.mk.mk.mk.mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
c✝ : LocalizedModule S A
a₃ : A
s₃ : { x // x ∈ S }
⊢ Quot.mk Setoid.r (a₁, s₁) * Quot.mk Setoid.r (a₂, s₂) * Quot.mk Setoid.r (a₃, s₃) =
    Quot.mk Setoid.r (a₁, s₁) * (Quot.mk Setoid.r (a₂, s₂) * Quot.mk Setoid.r (a₃, s₃))
[PROOFSTEP]
apply mk_eq.mpr _
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
c✝ : LocalizedModule S A
a₃ : A
s₃ : { x // x ∈ S }
⊢ ∃ u,
    u •
        ((a₁, s₁).snd * ((a₂, s₂).fst * (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).snd) •
          (((a₁, s₁).fst * (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).fst * (a₃, s₃).fst) =
      u •
        (((a₁, s₁).fst * (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).snd * (a₃, s₃).snd) •
          ((a₁, s₁).fst * ((a₂, s₂).fst * (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).fst)
[PROOFSTEP]
use 1
[GOAL]
case h
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
c✝ : LocalizedModule S A
a₃ : A
s₃ : { x // x ∈ S }
⊢ 1 •
      ((a₁, s₁).snd * ((a₂, s₂).fst * (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).snd) •
        (((a₁, s₁).fst * (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).fst * (a₃, s₃).fst) =
    1 •
      (((a₁, s₁).fst * (a₂, s₂).fst, (a₁, s₁).snd * (a₂, s₂).snd).snd * (a₃, s₃).snd) •
        ((a₁, s₁).fst * ((a₂, s₂).fst * (a₃, s₃).fst, (a₂, s₂).snd * (a₃, s₃).snd).fst)
[PROOFSTEP]
simp only [one_mul, smul_smul, ← mul_assoc, mul_right_comm]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (a : LocalizedModule S A), 1 * a = a
[PROOFSTEP]
rintro ⟨a, s⟩
[GOAL]
case mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a : A
s : { x // x ∈ S }
⊢ 1 * Quot.mk Setoid.r (a, s) = Quot.mk Setoid.r (a, s)
[PROOFSTEP]
exact mk_eq.mpr ⟨1, by simp only [one_mul, one_smul]⟩
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a : A
s : { x // x ∈ S }
⊢ 1 • s • ((1, 1).fst * (a, s).fst) = 1 • ((1, 1).snd * (a, s).snd) • a
[PROOFSTEP]
simp only [one_mul, one_smul]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (a : LocalizedModule S A), a * 1 = a
[PROOFSTEP]
rintro ⟨a, s⟩
[GOAL]
case mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a : A
s : { x // x ∈ S }
⊢ Quot.mk Setoid.r (a, s) * 1 = Quot.mk Setoid.r (a, s)
[PROOFSTEP]
exact mk_eq.mpr ⟨1, by simp only [mul_one, one_smul]⟩
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.132539
inst✝¹ : Semiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : AddCommMonoid (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a : A
s : { x // x ∈ S }
⊢ 1 • s • ((a, s).fst * (1, 1).fst) = 1 • ((a, s).snd * (1, 1).snd) • a
[PROOFSTEP]
simp only [mul_one, one_smul]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : CommSemiring A
inst✝ : Algebra R A
S : Submonoid R
⊢ Semiring (LocalizedModule S A)
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : CommSemiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : Semiring (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (a b : LocalizedModule S A), a * b = b * a
[PROOFSTEP]
rintro ⟨a₁, s₁⟩ ⟨a₂, s₂⟩
[GOAL]
case mk.mk.mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : CommSemiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : Semiring (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
⊢ Quot.mk Setoid.r (a₁, s₁) * Quot.mk Setoid.r (a₂, s₂) = Quot.mk Setoid.r (a₂, s₂) * Quot.mk Setoid.r (a₁, s₁)
[PROOFSTEP]
exact mk_eq.mpr ⟨1, by simp only [one_smul, mul_comm]⟩
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : CommSemiring A
inst✝ : Algebra R A
S : Submonoid R
src✝ : Semiring (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
⊢ 1 • ((a₂, s₂).snd * (a₁, s₁).snd) • ((a₁, s₁).fst * (a₂, s₂).fst) =
    1 • ((a₁, s₁).snd * (a₂, s₂).snd) • ((a₂, s₂).fst * (a₁, s₁).fst)
[PROOFSTEP]
simp only [one_smul, mul_comm]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type ?u.187761
inst✝¹ : CommRing A
inst✝ : Algebra R A
S : Submonoid R
⊢ Ring (LocalizedModule S A)
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type
inst✝¹ : CommRing A
inst✝ : Algebra R A
S : Submonoid R
src✝ : Ring (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (a b : LocalizedModule S A), a * b = b * a
[PROOFSTEP]
rintro ⟨a₁, s₁⟩ ⟨a₂, s₂⟩
[GOAL]
case mk.mk.mk.mk
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type
inst✝¹ : CommRing A
inst✝ : Algebra R A
S : Submonoid R
src✝ : Ring (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
⊢ Quot.mk Setoid.r (a₁, s₁) * Quot.mk Setoid.r (a₂, s₂) = Quot.mk Setoid.r (a₂, s₂) * Quot.mk Setoid.r (a₁, s₁)
[PROOFSTEP]
exact mk_eq.mpr ⟨1, by simp only [one_smul, mul_comm]⟩
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S✝ : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type
inst✝¹ : CommRing A
inst✝ : Algebra R A
S : Submonoid R
src✝ : Ring (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
a✝ : LocalizedModule S A
a₁ : A
s₁ : { x // x ∈ S }
b✝ : LocalizedModule S A
a₂ : A
s₂ : { x // x ∈ S }
⊢ 1 • ((a₂, s₂).snd * (a₁, s₁).snd) • ((a₁, s₁).fst * (a₂, s₂).fst) =
    1 • ((a₁, s₁).snd * (a₂, s₂).snd) • ((a₂, s₂).fst * (a₁, s₁).fst)
[PROOFSTEP]
simp only [one_smul, mul_comm]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
x : LocalizedModule S M
r : R
s : { x // x ∈ S }
⊢ ∀ (p p' : M × { x // x ∈ S }),
    p ≈ p' → (fun p => mk (r • p.fst) (s * p.snd)) p = (fun p => mk (r • p.fst) (s * p.snd)) p'
[PROOFSTEP]
rintro ⟨m1, t1⟩ ⟨m2, t2⟩ ⟨u, h⟩
[GOAL]
case mk.mk.intro
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
x : LocalizedModule S M
r : R
s : { x // x ∈ S }
m1 : M
t1 : { x // x ∈ S }
m2 : M
t2 u : { x // x ∈ S }
h : u • (m2, t2).snd • (m1, t1).fst = u • (m1, t1).snd • (m2, t2).fst
⊢ (fun p => mk (r • p.fst) (s * p.snd)) (m1, t1) = (fun p => mk (r • p.fst) (s * p.snd)) (m2, t2)
[PROOFSTEP]
refine' mk_eq.mpr ⟨u, _⟩
[GOAL]
case mk.mk.intro
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
x : LocalizedModule S M
r : R
s : { x // x ∈ S }
m1 : M
t1 : { x // x ∈ S }
m2 : M
t2 u : { x // x ∈ S }
h : u • (m2, t2).snd • (m1, t1).fst = u • (m1, t1).snd • (m2, t2).fst
⊢ u • (s * (m2, t2).snd) • r • (m1, t1).fst = u • (s * (m1, t1).snd) • r • (m2, t2).fst
[PROOFSTEP]
have h' := congr_arg ((· • ·) (s • r)) h
[GOAL]
case mk.mk.intro
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
x : LocalizedModule S M
r : R
s : { x // x ∈ S }
m1 : M
t1 : { x // x ∈ S }
m2 : M
t2 u : { x // x ∈ S }
h : u • (m2, t2).snd • (m1, t1).fst = u • (m1, t1).snd • (m2, t2).fst
h' :
  (fun x x_1 => x • x_1) (s • r) (u • (m2, t2).snd • (m1, t1).fst) =
    (fun x x_1 => x • x_1) (s • r) (u • (m1, t1).snd • (m2, t2).fst)
⊢ u • (s * (m2, t2).snd) • r • (m1, t1).fst = u • (s * (m1, t1).snd) • r • (m2, t2).fst
[PROOFSTEP]
simp only [← mul_smul, smul_eq_mul, mul_comm, mul_left_comm, Submonoid.smul_def, Submonoid.coe_mul] at h' ⊢
[GOAL]
case mk.mk.intro
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
x : LocalizedModule S M
r : R
s : { x // x ∈ S }
m1 : M
t1 : { x // x ∈ S }
m2 : M
t2 u : { x // x ∈ S }
h : u • (m2, t2).snd • (m1, t1).fst = u • (m1, t1).snd • (m2, t2).fst
h' : (r * (↑s * (↑t2 * ↑u))) • m1 = (r * (↑s * (↑t1 * ↑u))) • m2
⊢ (r * (↑s * (↑t2 * ↑u))) • m1 = (r * (↑s * (↑t1 * ↑u))) • m2
[PROOFSTEP]
rw [h']
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
x : LocalizedModule S M
⊢ ∀ {a c : R} {b d : { x // x ∈ S }},
    ↑(Localization.r S) (a, b) (c, d) →
      (fun r s =>
            liftOn x (fun p => mk (r • p.fst) (s * p.snd))
              (_ :
                ∀ (p p' : M × { x // x ∈ S }),
                  p ≈ p' → (fun p => mk (r • p.fst) (s * p.snd)) p = (fun p => mk (r • p.fst) (s * p.snd)) p'))
          a b =
        (fun r s =>
            liftOn x (fun p => mk (r • p.fst) (s * p.snd))
              (_ :
                ∀ (p p' : M × { x // x ∈ S }),
                  p ≈ p' → (fun p => mk (r • p.fst) (s * p.snd)) p = (fun p => mk (r • p.fst) (s * p.snd)) p'))
          c d
[PROOFSTEP]
induction' x using LocalizedModule.induction_on with m t
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
m : M
t : { x // x ∈ S }
⊢ ∀ {a c : R} {b d : { x // x ∈ S }},
    ↑(Localization.r S) (a, b) (c, d) →
      (fun r s =>
            liftOn (mk m t) (fun p => mk (r • p.fst) (s * p.snd))
              (_ :
                ∀ (p p' : M × { x // x ∈ S }),
                  p ≈ p' → (fun p => mk (r • p.fst) (s * p.snd)) p = (fun p => mk (r • p.fst) (s * p.snd)) p'))
          a b =
        (fun r s =>
            liftOn (mk m t) (fun p => mk (r • p.fst) (s * p.snd))
              (_ :
                ∀ (p p' : M × { x // x ∈ S }),
                  p ≈ p' → (fun p => mk (r • p.fst) (s * p.snd)) p = (fun p => mk (r • p.fst) (s * p.snd)) p'))
          c d
[PROOFSTEP]
rintro r r' s s' h
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
m : M
t : { x // x ∈ S }
r r' : R
s s' : { x // x ∈ S }
h : ↑(Localization.r S) (r, s) (r', s')
⊢ (fun r s =>
        liftOn (mk m t) (fun p => mk (r • p.fst) (s * p.snd))
          (_ :
            ∀ (p p' : M × { x // x ∈ S }),
              p ≈ p' → (fun p => mk (r • p.fst) (s * p.snd)) p = (fun p => mk (r • p.fst) (s * p.snd)) p'))
      r s =
    (fun r s =>
        liftOn (mk m t) (fun p => mk (r • p.fst) (s * p.snd))
          (_ :
            ∀ (p p' : M × { x // x ∈ S }),
              p ≈ p' → (fun p => mk (r • p.fst) (s * p.snd)) p = (fun p => mk (r • p.fst) (s * p.snd)) p'))
      r' s'
[PROOFSTEP]
simp only [liftOn_mk, liftOn_mk, mk_eq]
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
m : M
t : { x // x ∈ S }
r r' : R
s s' : { x // x ∈ S }
h : ↑(Localization.r S) (r, s) (r', s')
⊢ ∃ u, u • (s' * t) • r • m = u • (s * t) • r' • m
[PROOFSTEP]
obtain ⟨u, eq1⟩ := Localization.r_iff_exists.mp h
[GOAL]
case h.intro
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
m : M
t : { x // x ∈ S }
r r' : R
s s' : { x // x ∈ S }
h : ↑(Localization.r S) (r, s) (r', s')
u : { x // x ∈ S }
eq1 : ↑u * (↑(r', s').snd * (r, s).fst) = ↑u * (↑(r, s).snd * (r', s').fst)
⊢ ∃ u, u • (s' * t) • r • m = u • (s * t) • r' • m
[PROOFSTEP]
use u
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
m : M
t : { x // x ∈ S }
r r' : R
s s' : { x // x ∈ S }
h : ↑(Localization.r S) (r, s) (r', s')
u : { x // x ∈ S }
eq1 : ↑u * (↑(r', s').snd * (r, s).fst) = ↑u * (↑(r, s).snd * (r', s').fst)
⊢ u • (s' * t) • r • m = u • (s * t) • r' • m
[PROOFSTEP]
have eq1' := congr_arg (· • t • m) eq1
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
m : M
t : { x // x ∈ S }
r r' : R
s s' : { x // x ∈ S }
h : ↑(Localization.r S) (r, s) (r', s')
u : { x // x ∈ S }
eq1 : ↑u * (↑(r', s').snd * (r, s).fst) = ↑u * (↑(r, s).snd * (r', s').fst)
eq1' :
  (fun x => x • t • m) (↑u * (↑(r', s').snd * (r, s).fst)) = (fun x => x • t • m) (↑u * (↑(r, s).snd * (r', s').fst))
⊢ u • (s' * t) • r • m = u • (s * t) • r' • m
[PROOFSTEP]
simp only [← mul_smul, smul_assoc, Submonoid.smul_def, Submonoid.coe_mul] at eq1' ⊢
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
m : M
t : { x // x ∈ S }
r r' : R
s s' : { x // x ∈ S }
h : ↑(Localization.r S) (r, s) (r', s')
u : { x // x ∈ S }
eq1 : ↑u * (↑(r', s').snd * (r, s).fst) = ↑u * (↑(r, s).snd * (r', s').fst)
eq1' : (↑u * (↑s' * r) * ↑t) • m = (↑u * (↑s * r') * ↑t) • m
⊢ (↑u * (↑s' * ↑t * r)) • m = (↑u * (↑s * ↑t * r')) • m
[PROOFSTEP]
ring_nf at eq1' ⊢
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
f : Localization S
m : M
t : { x // x ∈ S }
r r' : R
s s' : { x // x ∈ S }
h : ↑(Localization.r S) (r, s) (r', s')
u : { x // x ∈ S }
eq1 : ↑u * (↑(r', s').snd * (r, s).fst) = ↑u * (↑(r, s).snd * (r', s').fst)
eq1' : (↑u * ↑s' * r * ↑t) • m = (↑u * ↑t * ↑s * r') • m
⊢ (↑u * ↑s' * r * ↑t) • m = (↑u * ↑t * ↑s * r') • m
[PROOFSTEP]
rw [eq1']
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
r : R
m : M
s t : { x // x ∈ S }
⊢ Localization.mk r s • mk m t = mk (r • m) (s * t)
[PROOFSTEP]
dsimp only [HSMul.hSMul, SMul.smul]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
r : R
m : M
s t : { x // x ∈ S }
⊢ Localization.liftOn (Localization.mk r s)
      (fun r s =>
        liftOn (mk m t) (fun p => mk (SMul.smul r p.fst) (s * p.snd))
          (_ :
            ∀ (p p' : M × { x // x ∈ S }),
              p ≈ p' → (fun p => mk (r • p.fst) (s * p.snd)) p = (fun p => mk (r • p.fst) (s * p.snd)) p'))
      (_ :
        ∀ {a c : R} {b d : { x // x ∈ S }},
          ↑(Localization.r S) (a, b) (c, d) →
            (fun r s =>
                  liftOn (mk m t) (fun p => mk (r • p.fst) (s * p.snd))
                    (_ :
                      ∀ (p p' : M × { x // x ∈ S }),
                        p ≈ p' → (fun p => mk (r • p.fst) (s * p.snd)) p = (fun p => mk (r • p.fst) (s * p.snd)) p'))
                a b =
              (fun r s =>
                  liftOn (mk m t) (fun p => mk (r • p.fst) (s * p.snd))
                    (_ :
                      ∀ (p p' : M × { x // x ∈ S }),
                        p ≈ p' → (fun p => mk (r • p.fst) (s * p.snd)) p = (fun p => mk (r • p.fst) (s * p.snd)) p'))
                c d) =
    mk (SMul.smul r m) (s * t)
[PROOFSTEP]
rw [Localization.liftOn_mk, liftOn_mk]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : LocalizedModule S M
⊢ 1 • m = m
[PROOFSTEP]
induction' m using LocalizedModule.induction_on with m s
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : M
s : { x // x ∈ S }
⊢ 1 • mk m s = mk m s
[PROOFSTEP]
rw [← Localization.mk_one, mk_smul_mk, one_smul, one_mul]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x y : Localization S
m : LocalizedModule S M
⊢ (x * y) • m = x • y • m
[PROOFSTEP]
induction' x using Localization.induction_on with data
[GOAL]
case H
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
y : Localization S
m : LocalizedModule S M
data : R × { x // x ∈ S }
⊢ (Localization.mk data.fst data.snd * y) • m = Localization.mk data.fst data.snd • y • m
[PROOFSTEP]
induction' y using Localization.induction_on with data'
[GOAL]
case H.H
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : LocalizedModule S M
data data' : R × { x // x ∈ S }
⊢ (Localization.mk data.fst data.snd * Localization.mk data'.fst data'.snd) • m =
    Localization.mk data.fst data.snd • Localization.mk data'.fst data'.snd • m
[PROOFSTEP]
rcases data, data' with ⟨⟨r, s⟩, ⟨r', s'⟩⟩
[GOAL]
case H.H.mk.mk
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : LocalizedModule S M
r : R
s : { x // x ∈ S }
r' : R
s' : { x // x ∈ S }
⊢ (Localization.mk (r, s).fst (r, s).snd * Localization.mk (r', s').fst (r', s').snd) • m =
    Localization.mk (r, s).fst (r, s).snd • Localization.mk (r', s').fst (r', s').snd • m
[PROOFSTEP]
induction' m using LocalizedModule.induction_on with m t
[GOAL]
case H.H.mk.mk.h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
r : R
s : { x // x ∈ S }
r' : R
s' : { x // x ∈ S }
m : M
t : { x // x ∈ S }
⊢ (Localization.mk (r, s).fst (r, s).snd * Localization.mk (r', s').fst (r', s').snd) • mk m t =
    Localization.mk (r, s).fst (r, s).snd • Localization.mk (r', s').fst (r', s').snd • mk m t
[PROOFSTEP]
rw [Localization.mk_mul, mk_smul_mk, mk_smul_mk, mk_smul_mk, mul_smul, mul_assoc]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x : Localization S
y z : LocalizedModule S M
⊢ x • (y + z) = x • y + x • z
[PROOFSTEP]
induction' x using Localization.induction_on with data
[GOAL]
case H
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
y z : LocalizedModule S M
data : R × { x // x ∈ S }
⊢ Localization.mk data.fst data.snd • (y + z) =
    Localization.mk data.fst data.snd • y + Localization.mk data.fst data.snd • z
[PROOFSTEP]
rcases data with ⟨r, u⟩
[GOAL]
case H.mk
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
y z : LocalizedModule S M
r : R
u : { x // x ∈ S }
⊢ Localization.mk (r, u).fst (r, u).snd • (y + z) =
    Localization.mk (r, u).fst (r, u).snd • y + Localization.mk (r, u).fst (r, u).snd • z
[PROOFSTEP]
induction' y using LocalizedModule.induction_on with m s
[GOAL]
case H.mk.h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
z : LocalizedModule S M
r : R
u : { x // x ∈ S }
m : M
s : { x // x ∈ S }
⊢ Localization.mk (r, u).fst (r, u).snd • (mk m s + z) =
    Localization.mk (r, u).fst (r, u).snd • mk m s + Localization.mk (r, u).fst (r, u).snd • z
[PROOFSTEP]
induction' z using LocalizedModule.induction_on with n t
[GOAL]
case H.mk.h.h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
r : R
u : { x // x ∈ S }
m : M
s : { x // x ∈ S }
n : M
t : { x // x ∈ S }
⊢ Localization.mk (r, u).fst (r, u).snd • (mk m s + mk n t) =
    Localization.mk (r, u).fst (r, u).snd • mk m s + Localization.mk (r, u).fst (r, u).snd • mk n t
[PROOFSTEP]
rw [mk_smul_mk, mk_smul_mk, mk_add_mk, mk_smul_mk, mk_add_mk, mk_eq]
[GOAL]
case H.mk.h.h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
r : R
u : { x // x ∈ S }
m : M
s : { x // x ∈ S }
n : M
t : { x // x ∈ S }
⊢ ∃ u_1,
    u_1 • ((r, u).snd * s * ((r, u).snd * t)) • (r, u).fst • (t • m + s • n) =
      u_1 • ((r, u).snd * (s * t)) • (((r, u).snd * t) • (r, u).fst • m + ((r, u).snd * s) • (r, u).fst • n)
[PROOFSTEP]
use 1
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
r : R
u : { x // x ∈ S }
m : M
s : { x // x ∈ S }
n : M
t : { x // x ∈ S }
⊢ 1 • ((r, u).snd * s * ((r, u).snd * t)) • (r, u).fst • (t • m + s • n) =
    1 • ((r, u).snd * (s * t)) • (((r, u).snd * t) • (r, u).fst • m + ((r, u).snd * s) • (r, u).fst • n)
[PROOFSTEP]
simp only [one_smul, smul_add, ← mul_smul, Submonoid.smul_def, Submonoid.coe_mul]
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
r : R
u : { x // x ∈ S }
m : M
s : { x // x ∈ S }
n : M
t : { x // x ∈ S }
⊢ (↑u * ↑s * (↑u * ↑t) * (r * ↑t)) • m + (↑u * ↑s * (↑u * ↑t) * (r * ↑s)) • n =
    (↑u * (↑s * ↑t) * (↑u * ↑t * r)) • m + (↑u * (↑s * ↑t) * (↑u * ↑s * r)) • n
[PROOFSTEP]
ring_nf
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x : Localization S
⊢ x • 0 = 0
[PROOFSTEP]
induction' x using Localization.induction_on with data
[GOAL]
case H
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
data : R × { x // x ∈ S }
⊢ Localization.mk data.fst data.snd • 0 = 0
[PROOFSTEP]
rcases data with ⟨r, s⟩
[GOAL]
case H.mk
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
r : R
s : { x // x ∈ S }
⊢ Localization.mk (r, s).fst (r, s).snd • 0 = 0
[PROOFSTEP]
rw [← zero_mk s, mk_smul_mk, smul_zero, zero_mk, zero_mk]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x y : Localization S
z : LocalizedModule S M
⊢ (x + y) • z = x • z + y • z
[PROOFSTEP]
induction' x using Localization.induction_on with datax
[GOAL]
case H
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
y : Localization S
z : LocalizedModule S M
datax : R × { x // x ∈ S }
⊢ (Localization.mk datax.fst datax.snd + y) • z = Localization.mk datax.fst datax.snd • z + y • z
[PROOFSTEP]
induction' y using Localization.induction_on with datay
[GOAL]
case H.H
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
z : LocalizedModule S M
datax datay : R × { x // x ∈ S }
⊢ (Localization.mk datax.fst datax.snd + Localization.mk datay.fst datay.snd) • z =
    Localization.mk datax.fst datax.snd • z + Localization.mk datay.fst datay.snd • z
[PROOFSTEP]
induction' z using LocalizedModule.induction_on with m t
[GOAL]
case H.H.h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
datax datay : R × { x // x ∈ S }
m : M
t : { x // x ∈ S }
⊢ (Localization.mk datax.fst datax.snd + Localization.mk datay.fst datay.snd) • mk m t =
    Localization.mk datax.fst datax.snd • mk m t + Localization.mk datay.fst datay.snd • mk m t
[PROOFSTEP]
rcases datax, datay with ⟨⟨r, s⟩, ⟨r', s'⟩⟩
[GOAL]
case H.H.h.mk.mk
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : M
t : { x // x ∈ S }
r : R
s : { x // x ∈ S }
r' : R
s' : { x // x ∈ S }
⊢ (Localization.mk (r, s).fst (r, s).snd + Localization.mk (r', s').fst (r', s').snd) • mk m t =
    Localization.mk (r, s).fst (r, s).snd • mk m t + Localization.mk (r', s').fst (r', s').snd • mk m t
[PROOFSTEP]
rw [Localization.add_mk, mk_smul_mk, mk_smul_mk, mk_smul_mk, mk_add_mk, mk_eq]
[GOAL]
case H.H.h.mk.mk
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : M
t : { x // x ∈ S }
r : R
s : { x // x ∈ S }
r' : R
s' : { x // x ∈ S }
⊢ ∃ u,
    u • ((r, s).snd * t * ((r', s').snd * t)) • (↑(r, s).snd * (r', s').fst + ↑(r', s').snd * (r, s).fst) • m =
      u • ((r, s).snd * (r', s').snd * t) • (((r', s').snd * t) • (r, s).fst • m + ((r, s).snd * t) • (r', s').fst • m)
[PROOFSTEP]
use 1
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : M
t : { x // x ∈ S }
r : R
s : { x // x ∈ S }
r' : R
s' : { x // x ∈ S }
⊢ 1 • ((r, s).snd * t * ((r', s').snd * t)) • (↑(r, s).snd * (r', s').fst + ↑(r', s').snd * (r, s).fst) • m =
    1 • ((r, s).snd * (r', s').snd * t) • (((r', s').snd * t) • (r, s).fst • m + ((r, s).snd * t) • (r', s').fst • m)
[PROOFSTEP]
simp only [one_smul, add_smul, smul_add, ← mul_smul, Submonoid.smul_def, Submonoid.coe_mul, Submonoid.coe_one]
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : M
t : { x // x ∈ S }
r : R
s : { x // x ∈ S }
r' : R
s' : { x // x ∈ S }
⊢ (↑s * ↑t * (↑s' * ↑t) * (↑s * r')) • m + (↑s * ↑t * (↑s' * ↑t) * (↑s' * r)) • m =
    (↑s * ↑s' * ↑t * (↑s' * ↑t * r)) • m + (↑s * ↑s' * ↑t * (↑s * ↑t * r')) • m
[PROOFSTEP]
rw [add_comm]
  -- Commutativity of addition in the module is not applied by `Ring`.
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : M
t : { x // x ∈ S }
r : R
s : { x // x ∈ S }
r' : R
s' : { x // x ∈ S }
⊢ (↑s * ↑t * (↑s' * ↑t) * (↑s' * r)) • m + (↑s * ↑t * (↑s' * ↑t) * (↑s * r')) • m =
    (↑s * ↑s' * ↑t * (↑s' * ↑t * r)) • m + (↑s * ↑s' * ↑t * (↑s * ↑t * r')) • m
[PROOFSTEP]
ring_nf
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x : LocalizedModule S M
⊢ 0 • x = 0
[PROOFSTEP]
induction' x using LocalizedModule.induction_on with m s
[GOAL]
case h
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : M
s : { x // x ∈ S }
⊢ 0 • mk m s = 0
[PROOFSTEP]
rw [← Localization.mk_zero s, mk_smul_mk, zero_smul, zero_mk]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s' s : { x // x ∈ S }
m : M
⊢ 1 • s • s' • m = 1 • (s' * s) • m
[PROOFSTEP]
simp only [mul_smul, one_smul]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s' s : { x // x ∈ S }
m : M
⊢ s • s' • m = s' • s • m
[PROOFSTEP]
rw [smul_comm]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
m : M
⊢ 1 • 1 • s • m = 1 • s • m
[PROOFSTEP]
simp
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s s' : { x // x ∈ S }
m : M
⊢ 1 • s • s' • m = 1 • (s * s') • m
[PROOFSTEP]
simp [mul_smul]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
r : R
s : { x // x ∈ S }
m : M
⊢ r • mk m s = mk (r • m) s
[PROOFSTEP]
erw [mk_smul_mk r m 1 s, one_mul]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
⊢ ∀ (r : Localization S) (x y : LocalizedModule S A), r • x * y = r • (x * y)
[PROOFSTEP]
intro r x₁ x₂
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
r : Localization S
x₁ x₂ : LocalizedModule S A
⊢ r • x₁ * x₂ = r • (x₁ * x₂)
[PROOFSTEP]
obtain ⟨y, s, rfl : IsLocalization.mk' _ y s = r⟩ := IsLocalization.mk'_surjective S r
[GOAL]
case intro.intro
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x₁ x₂ : LocalizedModule S A
y : R
s : { x // x ∈ S }
⊢ IsLocalization.mk' (Localization S) y s • x₁ * x₂ = IsLocalization.mk' (Localization S) y s • (x₁ * x₂)
[PROOFSTEP]
obtain ⟨⟨a₁, s₁⟩, rfl : mk a₁ s₁ = x₁⟩ := Quotient.exists_rep x₁
[GOAL]
case intro.intro.intro.mk
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x₂ : LocalizedModule S A
y : R
s : { x // x ∈ S }
a₁ : A
s₁ : { x // x ∈ S }
⊢ IsLocalization.mk' (Localization S) y s • mk a₁ s₁ * x₂ = IsLocalization.mk' (Localization S) y s • (mk a₁ s₁ * x₂)
[PROOFSTEP]
obtain ⟨⟨a₂, s₂⟩, rfl : mk a₂ s₂ = x₂⟩ := Quotient.exists_rep x₂
[GOAL]
case intro.intro.intro.mk.intro.mk
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
y : R
s : { x // x ∈ S }
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
⊢ IsLocalization.mk' (Localization S) y s • mk a₁ s₁ * mk a₂ s₂ =
    IsLocalization.mk' (Localization S) y s • (mk a₁ s₁ * mk a₂ s₂)
[PROOFSTEP]
rw [mk_mul_mk, ← Localization.mk_eq_mk', mk_smul_mk, mk_smul_mk, mk_mul_mk, mul_assoc, smul_mul_assoc]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
⊢ ∀ (r : Localization S) (x y : LocalizedModule S A), x * r • y = r • (x * y)
[PROOFSTEP]
intro r x₁ x₂
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
r : Localization S
x₁ x₂ : LocalizedModule S A
⊢ x₁ * r • x₂ = r • (x₁ * x₂)
[PROOFSTEP]
obtain ⟨y, s, rfl : IsLocalization.mk' _ y s = r⟩ := IsLocalization.mk'_surjective S r
[GOAL]
case intro.intro
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x₁ x₂ : LocalizedModule S A
y : R
s : { x // x ∈ S }
⊢ x₁ * IsLocalization.mk' (Localization S) y s • x₂ = IsLocalization.mk' (Localization S) y s • (x₁ * x₂)
[PROOFSTEP]
obtain ⟨⟨a₁, s₁⟩, rfl : mk a₁ s₁ = x₁⟩ := Quotient.exists_rep x₁
[GOAL]
case intro.intro.intro.mk
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x₂ : LocalizedModule S A
y : R
s : { x // x ∈ S }
a₁ : A
s₁ : { x // x ∈ S }
⊢ mk a₁ s₁ * IsLocalization.mk' (Localization S) y s • x₂ = IsLocalization.mk' (Localization S) y s • (mk a₁ s₁ * x₂)
[PROOFSTEP]
obtain ⟨⟨a₂, s₂⟩, rfl : mk a₂ s₂ = x₂⟩ := Quotient.exists_rep x₂
[GOAL]
case intro.intro.intro.mk.intro.mk
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
y : R
s : { x // x ∈ S }
a₁ : A
s₁ : { x // x ∈ S }
a₂ : A
s₂ : { x // x ∈ S }
⊢ mk a₁ s₁ * IsLocalization.mk' (Localization S) y s • mk a₂ s₂ =
    IsLocalization.mk' (Localization S) y s • (mk a₁ s₁ * mk a₂ s₂)
[PROOFSTEP]
rw [mk_mul_mk, ← Localization.mk_eq_mk', mk_smul_mk, mk_smul_mk, mk_mul_mk, mul_left_comm, mul_smul_comm]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : R
s : { x // x ∈ S }
⊢ ↑(algebraMap (Localization S) (LocalizedModule S ((fun x => A) a))) (Localization.mk a s) = mk (↑(algebraMap R A) a) s
[PROOFSTEP]
rw [Algebra.algebraMap_eq_smul_one]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : R
s : { x // x ∈ S }
⊢ Localization.mk a s • 1 = mk (↑(algebraMap R A) a) s
[PROOFSTEP]
change _ • mk _ _ = _
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : R
s : { x // x ∈ S }
⊢ Localization.mk a s • mk 1 1 = mk (↑(algebraMap R A) a) s
[PROOFSTEP]
rw [mk_smul_mk, Algebra.algebraMap_eq_smul_one, mul_one]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
src✝ : R →+* LocalizedModule S A :=
  RingHom.comp (algebraMap (Localization S) (LocalizedModule S A)) (algebraMap R (Localization S))
⊢ Module R (LocalizedModule S A)
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
src✝¹ : R →+* LocalizedModule S A :=
  RingHom.comp (algebraMap (Localization S) (LocalizedModule S A)) (algebraMap R (Localization S))
src✝ : Module R (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (r : R) (x : (fun x => LocalizedModule S A) r),
    ↑{ toMonoidHom := ↑src✝¹, map_zero' := (_ : OneHom.toFun (↑↑src✝¹) 0 = 0),
              map_add' :=
                (_ :
                  ∀ (x y : R), OneHom.toFun (↑↑src✝¹) (x + y) = OneHom.toFun (↑↑src✝¹) x + OneHom.toFun (↑↑src✝¹) y) }
          r *
        x =
      x *
        ↑{ toMonoidHom := ↑src✝¹, map_zero' := (_ : OneHom.toFun (↑↑src✝¹) 0 = 0),
              map_add' :=
                (_ :
                  ∀ (x y : R), OneHom.toFun (↑↑src✝¹) (x + y) = OneHom.toFun (↑↑src✝¹) x + OneHom.toFun (↑↑src✝¹) y) }
          r
[PROOFSTEP]
intro r x
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
src✝¹ : R →+* LocalizedModule S A :=
  RingHom.comp (algebraMap (Localization S) (LocalizedModule S A)) (algebraMap R (Localization S))
src✝ : Module R (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
r : R
x : LocalizedModule S A
⊢ ↑{ toMonoidHom := ↑src✝¹, map_zero' := (_ : OneHom.toFun (↑↑src✝¹) 0 = 0),
            map_add' :=
              (_ : ∀ (x y : R), OneHom.toFun (↑↑src✝¹) (x + y) = OneHom.toFun (↑↑src✝¹) x + OneHom.toFun (↑↑src✝¹) y) }
        r *
      x =
    x *
      ↑{ toMonoidHom := ↑src✝¹, map_zero' := (_ : OneHom.toFun (↑↑src✝¹) 0 = 0),
            map_add' :=
              (_ : ∀ (x y : R), OneHom.toFun (↑↑src✝¹) (x + y) = OneHom.toFun (↑↑src✝¹) x + OneHom.toFun (↑↑src✝¹) y) }
        r
[PROOFSTEP]
obtain ⟨⟨a, s⟩, rfl : mk a s = x⟩ := Quotient.exists_rep x
[GOAL]
case intro.mk
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
src✝¹ : R →+* LocalizedModule S A :=
  RingHom.comp (algebraMap (Localization S) (LocalizedModule S A)) (algebraMap R (Localization S))
src✝ : Module R (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
r : R
a : A
s : { x // x ∈ S }
⊢ ↑{ toMonoidHom := ↑src✝¹, map_zero' := (_ : OneHom.toFun (↑↑src✝¹) 0 = 0),
            map_add' :=
              (_ : ∀ (x y : R), OneHom.toFun (↑↑src✝¹) (x + y) = OneHom.toFun (↑↑src✝¹) x + OneHom.toFun (↑↑src✝¹) y) }
        r *
      mk a s =
    mk a s *
      ↑{ toMonoidHom := ↑src✝¹, map_zero' := (_ : OneHom.toFun (↑↑src✝¹) 0 = 0),
            map_add' :=
              (_ : ∀ (x y : R), OneHom.toFun (↑↑src✝¹) (x + y) = OneHom.toFun (↑↑src✝¹) x + OneHom.toFun (↑↑src✝¹) y) }
        r
[PROOFSTEP]
dsimp
[GOAL]
case intro.mk
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
src✝¹ : R →+* LocalizedModule S A :=
  RingHom.comp (algebraMap (Localization S) (LocalizedModule S A)) (algebraMap R (Localization S))
src✝ : Module R (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
r : R
a : A
s : { x // x ∈ S }
⊢ ↑(algebraMap (Localization S) (LocalizedModule S A)) (↑(algebraMap R (Localization S)) r) * mk a s =
    mk a s * ↑(algebraMap (Localization S) (LocalizedModule S A)) (↑(algebraMap R (Localization S)) r)
[PROOFSTEP]
rw [← Localization.mk_one_eq_algebraMap, algebraMap_mk, mk_mul_mk, mk_mul_mk, mul_comm, Algebra.commutes]
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
src✝¹ : R →+* LocalizedModule S A :=
  RingHom.comp (algebraMap (Localization S) (LocalizedModule S A)) (algebraMap R (Localization S))
src✝ : Module R (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
⊢ ∀ (r : R) (x : (fun x => LocalizedModule S A) r),
    r • x =
      ↑{ toMonoidHom := ↑src✝¹, map_zero' := (_ : OneHom.toFun (↑↑src✝¹) 0 = 0),
              map_add' :=
                (_ :
                  ∀ (x y : R), OneHom.toFun (↑↑src✝¹) (x + y) = OneHom.toFun (↑↑src✝¹) x + OneHom.toFun (↑↑src✝¹) y) }
          r *
        x
[PROOFSTEP]
intro r x
[GOAL]
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
src✝¹ : R →+* LocalizedModule S A :=
  RingHom.comp (algebraMap (Localization S) (LocalizedModule S A)) (algebraMap R (Localization S))
src✝ : Module R (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
r : R
x : LocalizedModule S A
⊢ r • x =
    ↑{ toMonoidHom := ↑src✝¹, map_zero' := (_ : OneHom.toFun (↑↑src✝¹) 0 = 0),
            map_add' :=
              (_ : ∀ (x y : R), OneHom.toFun (↑↑src✝¹) (x + y) = OneHom.toFun (↑↑src✝¹) x + OneHom.toFun (↑↑src✝¹) y) }
        r *
      x
[PROOFSTEP]
obtain ⟨⟨a, s⟩, rfl : mk a s = x⟩ := Quotient.exists_rep x
[GOAL]
case intro.mk
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
src✝¹ : R →+* LocalizedModule S A :=
  RingHom.comp (algebraMap (Localization S) (LocalizedModule S A)) (algebraMap R (Localization S))
src✝ : Module R (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
r : R
a : A
s : { x // x ∈ S }
⊢ r • mk a s =
    ↑{ toMonoidHom := ↑src✝¹, map_zero' := (_ : OneHom.toFun (↑↑src✝¹) 0 = 0),
            map_add' :=
              (_ : ∀ (x y : R), OneHom.toFun (↑↑src✝¹) (x + y) = OneHom.toFun (↑↑src✝¹) x + OneHom.toFun (↑↑src✝¹) y) }
        r *
      mk a s
[PROOFSTEP]
dsimp
[GOAL]
case intro.mk
R : Type u
inst✝⁴ : CommSemiring R
S : Submonoid R
M : Type v
inst✝³ : AddCommMonoid M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
src✝¹ : R →+* LocalizedModule S A :=
  RingHom.comp (algebraMap (Localization S) (LocalizedModule S A)) (algebraMap R (Localization S))
src✝ : Module R (LocalizedModule S A) :=
  let_fun this := inferInstance;
  this
r : R
a : A
s : { x // x ∈ S }
⊢ r • mk a s = ↑(algebraMap (Localization S) (LocalizedModule S A)) (↑(algebraMap R (Localization S)) r) * mk a s
[PROOFSTEP]
rw [← Localization.mk_one_eq_algebraMap, algebraMap_mk, mk_mul_mk, smul'_mk, Algebra.smul_def, one_mul]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
x y : M
⊢ (fun m => mk m 1) (x + y) = (fun m => mk m 1) x + (fun m => mk m 1) y
[PROOFSTEP]
simp [mk_add_mk]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
a : M
b : { x // x ∈ S }
a' : M
b' : { x // x ∈ S }
x✝ : (a, b) ≈ (a', b')
c : { x // x ∈ S }
eq1 : c • (a', b').snd • (a, b).fst = c • (a, b).snd • (a', b').fst
⊢ c • (s * (a', b').snd) • (a, b).fst = c • (s * (a, b).snd) • (a', b').fst
[PROOFSTEP]
rw [mul_smul, mul_smul, smul_comm c, eq1, smul_comm s]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
x y : LocalizedModule S M
⊢ ∀ (m m' : M) (s_1 s' : { x // x ∈ S }),
    (fun p =>
          liftOn p (fun p => mk p.fst (s * p.snd))
            (_ :
              ∀ (x x_1 : M × { x // x ∈ S }),
                x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
        (mk m s_1 + mk m' s') =
      (fun p =>
            liftOn p (fun p => mk p.fst (s * p.snd))
              (_ :
                ∀ (x x_1 : M × { x // x ∈ S }),
                  x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
          (mk m s_1) +
        (fun p =>
            liftOn p (fun p => mk p.fst (s * p.snd))
              (_ :
                ∀ (x x_1 : M × { x // x ∈ S }),
                  x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
          (mk m' s')
[PROOFSTEP]
intro m₁ m₂ t₁ t₂
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
x y : LocalizedModule S M
m₁ m₂ : M
t₁ t₂ : { x // x ∈ S }
⊢ (fun p =>
        liftOn p (fun p => mk p.fst (s * p.snd))
          (_ :
            ∀ (x x_1 : M × { x // x ∈ S }),
              x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
      (mk m₁ t₁ + mk m₂ t₂) =
    (fun p =>
          liftOn p (fun p => mk p.fst (s * p.snd))
            (_ :
              ∀ (x x_1 : M × { x // x ∈ S }),
                x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
        (mk m₁ t₁) +
      (fun p =>
          liftOn p (fun p => mk p.fst (s * p.snd))
            (_ :
              ∀ (x x_1 : M × { x // x ∈ S }),
                x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
        (mk m₂ t₂)
[PROOFSTEP]
simp only [mk_add_mk, LocalizedModule.liftOn_mk, mul_smul, ← smul_add, mul_assoc, mk_cancel_common_left s]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
x y : LocalizedModule S M
m₁ m₂ : M
t₁ t₂ : { x // x ∈ S }
⊢ mk (t₂ • m₁ + t₁ • m₂) (s * (t₁ * t₂)) = mk (t₂ • m₁ + t₁ • m₂) (t₁ * (s * t₂))
[PROOFSTEP]
rw [show s * (t₁ * t₂) = t₁ * (s * t₂) by
    ext
    simp only [Submonoid.coe_mul]
    ring]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
x y : LocalizedModule S M
m₁ m₂ : M
t₁ t₂ : { x // x ∈ S }
⊢ s * (t₁ * t₂) = t₁ * (s * t₂)
[PROOFSTEP]
ext
[GOAL]
case a
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
x y : LocalizedModule S M
m₁ m₂ : M
t₁ t₂ : { x // x ∈ S }
⊢ ↑(s * (t₁ * t₂)) = ↑(t₁ * (s * t₂))
[PROOFSTEP]
simp only [Submonoid.coe_mul]
[GOAL]
case a
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
x y : LocalizedModule S M
m₁ m₂ : M
t₁ t₂ : { x // x ∈ S }
⊢ ↑s * (↑t₁ * ↑t₂) = ↑t₁ * (↑s * ↑t₂)
[PROOFSTEP]
ring
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
r : R
x : LocalizedModule S M
⊢ ∀ (a : M × { x // x ∈ S }),
    AddHom.toFun
        {
          toFun := fun p =>
            liftOn p (fun p => mk p.fst (s * p.snd))
              (_ :
                ∀ (x x_1 : M × { x // x ∈ S }),
                  x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1),
          map_add' :=
            (_ :
              ∀ (x y : LocalizedModule S M),
                (fun p =>
                      liftOn p (fun p => mk p.fst (s * p.snd))
                        (_ :
                          ∀ (x x_1 : M × { x // x ∈ S }),
                            x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                    (x + y) =
                  (fun p =>
                        liftOn p (fun p => mk p.fst (s * p.snd))
                          (_ :
                            ∀ (x x_1 : M × { x // x ∈ S }),
                              x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                      x +
                    (fun p =>
                        liftOn p (fun p => mk p.fst (s * p.snd))
                          (_ :
                            ∀ (x x_1 : M × { x // x ∈ S }),
                              x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                      y) }
        (r • Quotient.mk (r.setoid S M) a) =
      ↑(RingHom.id R) r •
        AddHom.toFun
          {
            toFun := fun p =>
              liftOn p (fun p => mk p.fst (s * p.snd))
                (_ :
                  ∀ (x x_1 : M × { x // x ∈ S }),
                    x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1),
            map_add' :=
              (_ :
                ∀ (x y : LocalizedModule S M),
                  (fun p =>
                        liftOn p (fun p => mk p.fst (s * p.snd))
                          (_ :
                            ∀ (x x_1 : M × { x // x ∈ S }),
                              x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                      (x + y) =
                    (fun p =>
                          liftOn p (fun p => mk p.fst (s * p.snd))
                            (_ :
                              ∀ (x x_1 : M × { x // x ∈ S }),
                                x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                        x +
                      (fun p =>
                          liftOn p (fun p => mk p.fst (s * p.snd))
                            (_ :
                              ∀ (x x_1 : M × { x // x ∈ S }),
                                x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                        y) }
          (Quotient.mk (r.setoid S M) a)
[PROOFSTEP]
intro
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
r : R
x : LocalizedModule S M
a✝ : M × { x // x ∈ S }
⊢ AddHom.toFun
      {
        toFun := fun p =>
          liftOn p (fun p => mk p.fst (s * p.snd))
            (_ :
              ∀ (x x_1 : M × { x // x ∈ S }),
                x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1),
        map_add' :=
          (_ :
            ∀ (x y : LocalizedModule S M),
              (fun p =>
                    liftOn p (fun p => mk p.fst (s * p.snd))
                      (_ :
                        ∀ (x x_1 : M × { x // x ∈ S }),
                          x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                  (x + y) =
                (fun p =>
                      liftOn p (fun p => mk p.fst (s * p.snd))
                        (_ :
                          ∀ (x x_1 : M × { x // x ∈ S }),
                            x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                    x +
                  (fun p =>
                      liftOn p (fun p => mk p.fst (s * p.snd))
                        (_ :
                          ∀ (x x_1 : M × { x // x ∈ S }),
                            x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                    y) }
      (r • Quotient.mk (r.setoid S M) a✝) =
    ↑(RingHom.id R) r •
      AddHom.toFun
        {
          toFun := fun p =>
            liftOn p (fun p => mk p.fst (s * p.snd))
              (_ :
                ∀ (x x_1 : M × { x // x ∈ S }),
                  x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1),
          map_add' :=
            (_ :
              ∀ (x y : LocalizedModule S M),
                (fun p =>
                      liftOn p (fun p => mk p.fst (s * p.snd))
                        (_ :
                          ∀ (x x_1 : M × { x // x ∈ S }),
                            x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                    (x + y) =
                  (fun p =>
                        liftOn p (fun p => mk p.fst (s * p.snd))
                          (_ :
                            ∀ (x x_1 : M × { x // x ∈ S }),
                              x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                      x +
                    (fun p =>
                        liftOn p (fun p => mk p.fst (s * p.snd))
                          (_ :
                            ∀ (x x_1 : M × { x // x ∈ S }),
                              x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1))
                      y) }
        (Quotient.mk (r.setoid S M) a✝)
[PROOFSTEP]
dsimp only
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
r : R
x : LocalizedModule S M
a✝ : M × { x // x ∈ S }
⊢ liftOn (r • Quotient.mk (r.setoid S M) a✝) (fun p => mk p.fst (s * p.snd))
      (_ : ∀ (x x_1 : M × { x // x ∈ S }), x ≈ x_1 → mk x.fst (s * x.snd) = mk x_1.fst (s * x_1.snd)) =
    ↑(RingHom.id R) r •
      liftOn (Quotient.mk (r.setoid S M) a✝) (fun p => mk p.fst (s * p.snd))
        (_ : ∀ (x x_1 : M × { x // x ∈ S }), x ≈ x_1 → mk x.fst (s * x.snd) = mk x_1.fst (s * x_1.snd))
[PROOFSTEP]
change liftOn (mk _ _) _ _ = r • (liftOn (mk _ _) _ _)
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
r : R
x : LocalizedModule S M
a✝ : M × { x // x ∈ S }
⊢ liftOn (mk ((↑(algebraMap R R) r, 1).fst • a✝.fst) ((↑(algebraMap R R) r, 1).snd * a✝.snd))
      (fun p => mk p.fst (s * p.snd))
      (_ : ∀ (x x_1 : M × { x // x ∈ S }), x ≈ x_1 → mk x.fst (s * x.snd) = mk x_1.fst (s * x_1.snd)) =
    r •
      liftOn (mk a✝.fst a✝.snd) (fun p => mk p.fst (s * p.snd))
        (_ : ∀ (x x_1 : M × { x // x ∈ S }), x ≈ x_1 → mk x.fst (s * x.snd) = mk x_1.fst (s * x_1.snd))
[PROOFSTEP]
simp [LocalizedModule.liftOn_mk, smul'_mk]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
⊢ ∀ (a : M × { x // x ∈ S }),
    ↑(divBy s) (↑(↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s) (Quotient.mk (r.setoid S M) a)) =
      Quotient.mk (r.setoid S M) a
[PROOFSTEP]
intro ⟨m, t⟩
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
m : M
t : { x // x ∈ S }
⊢ ↑(divBy s) (↑(↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s) (Quotient.mk (r.setoid S M) (m, t))) =
    Quotient.mk (r.setoid S M) (m, t)
[PROOFSTEP]
simp only [Module.algebraMap_end_apply, smul'_mk, divBy_apply]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
m : M
t : { x // x ∈ S }
⊢ liftOn (↑s • Quotient.mk (r.setoid S M) (m, t)) (fun p => mk p.fst (s * p.snd))
      (_ :
        ∀ (x x_1 : M × { x // x ∈ S }),
          x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1) =
    Quotient.mk (r.setoid S M) (m, t)
[PROOFSTEP]
erw [LocalizedModule.liftOn_mk]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
m : M
t : { x // x ∈ S }
⊢ mk ((↑(algebraMap R R) ↑s, 1).fst • (m, t).fst, (↑(algebraMap R R) ↑s, 1).snd * (m, t).snd).fst
      (s * ((↑(algebraMap R R) ↑s, 1).fst • (m, t).fst, (↑(algebraMap R R) ↑s, 1).snd * (m, t).snd).snd) =
    Quotient.mk (r.setoid S M) (m, t)
[PROOFSTEP]
simp only [one_mul]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
m : M
t : { x // x ∈ S }
⊢ mk (↑(algebraMap R R) ↑s • m) (s * t) = Quotient.mk (r.setoid S M) (m, t)
[PROOFSTEP]
change mk (s • m) (s * t) = mk m t
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
m : M
t : { x // x ∈ S }
⊢ mk (s • m) (s * t) = mk m t
[PROOFSTEP]
rw [mk_cancel_common_left s t]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
⊢ ∀ (a : M × { x // x ∈ S }),
    ↑(↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s) (↑(divBy s) (Quotient.mk (r.setoid S M) a)) =
      Quotient.mk (r.setoid S M) a
[PROOFSTEP]
intro ⟨m, t⟩
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
m : M
t : { x // x ∈ S }
⊢ ↑(↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s) (↑(divBy s) (Quotient.mk (r.setoid S M) (m, t))) =
    Quotient.mk (r.setoid S M) (m, t)
[PROOFSTEP]
simp only [LocalizedModule.liftOn_mk, divBy_apply, Module.algebraMap_end_apply, smul'_mk]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
m : M
t : { x // x ∈ S }
⊢ ↑s •
      liftOn (Quotient.mk (r.setoid S M) (m, t)) (fun p => mk p.fst (s * p.snd))
        (_ :
          ∀ (x x_1 : M × { x // x ∈ S }),
            x ≈ x_1 → (fun p => mk p.fst (s * p.snd)) x = (fun p => mk p.fst (s * p.snd)) x_1) =
    Quotient.mk (r.setoid S M) (m, t)
[PROOFSTEP]
erw [LocalizedModule.liftOn_mk, smul'_mk]
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
m : M
t : { x // x ∈ S }
⊢ mk (↑s • (m, t).fst) (s * (m, t).snd) = Quotient.mk (r.setoid S M) (m, t)
[PROOFSTEP]
change mk (s • m) (s * t) = mk m t
[GOAL]
R : Type u
inst✝² : CommSemiring R
S : Submonoid R
M : Type v
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : { x // x ∈ S }
p : LocalizedModule S M
m : M
t : { x // x ∈ S }
⊢ mk (s • m) (s * t) = mk m t
[PROOFSTEP]
rw [mk_cancel_common_left s t]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
⊢ (fun p => ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑p.snd)))⁻¹ (↑g p.fst)) (m, s) =
    (fun p => ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑p.snd)))⁻¹ (↑g p.fst)) (m', s')
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff, ← map_smul]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
⊢ ↑g (m, s).fst =
    ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑(m', s').snd)))⁻¹ (↑(m, s).snd • ↑g (m', s').fst)
[PROOFSTEP]
symm
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
⊢ ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑(m', s').snd)))⁻¹ (↑(m, s).snd • ↑g (m', s').fst) =
    ↑g (m, s).fst
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
⊢ ↑(m, s).snd • ↑g (m', s').fst = ↑(m', s').snd • ↑g (m, s).fst
[PROOFSTEP]
dsimp
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
⊢ ↑s • ↑g m' = ↑s' • ↑g m
[PROOFSTEP]
have : c • s • g m' = c • s' • g m :=
  by
  erw [← g.map_smul, ← g.map_smul, ← g.map_smul, ← g.map_smul, eq1]
  rfl
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
⊢ c • s • ↑g m' = c • s' • ↑g m
[PROOFSTEP]
erw [← g.map_smul, ← g.map_smul, ← g.map_smul, ← g.map_smul, eq1]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
⊢ ↑g (↑(Submonoid.subtype S) c • ↑(Submonoid.subtype S) s • m') = ↑g (c • (m, s).snd • (m', s').fst)
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
this : c • s • ↑g m' = c • s' • ↑g m
⊢ ↑s • ↑g m' = ↑s' • ↑g m
[PROOFSTEP]
have : Function.Injective (h c).unit.inv :=
  by
  rw [Function.injective_iff_hasLeftInverse]
  refine' ⟨(h c).unit, _⟩
  intro x
  change ((h c).unit.1 * (h c).unit.inv) x = x
  simp only [Units.inv_eq_val_inv, IsUnit.mul_val_inv, LinearMap.one_apply]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
this : c • s • ↑g m' = c • s' • ↑g m
⊢ Function.Injective ↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv
[PROOFSTEP]
rw [Function.injective_iff_hasLeftInverse]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
this : c • s • ↑g m' = c • s' • ↑g m
⊢ Function.HasLeftInverse ↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv
[PROOFSTEP]
refine' ⟨(h c).unit, _⟩
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
this : c • s • ↑g m' = c • s' • ↑g m
⊢ Function.LeftInverse ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c)))
    ↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv
[PROOFSTEP]
intro x
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
this : c • s • ↑g m' = c • s' • ↑g m
x : M''
⊢ ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c)))
      (↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv x) =
    x
[PROOFSTEP]
change ((h c).unit.1 * (h c).unit.inv) x = x
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
this : c • s • ↑g m' = c • s' • ↑g m
x : M''
⊢ ↑(↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))) *
          (IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv)
      x =
    x
[PROOFSTEP]
simp only [Units.inv_eq_val_inv, IsUnit.mul_val_inv, LinearMap.one_apply]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
this✝ : c • s • ↑g m' = c • s' • ↑g m
this : Function.Injective ↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv
⊢ ↑s • ↑g m' = ↑s' • ↑g m
[PROOFSTEP]
apply_fun (h c).unit.inv
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
this✝ : c • s • ↑g m' = c • s' • ↑g m
this : Function.Injective ↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv
⊢ ↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv (↑s • ↑g m') =
    ↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv (↑s' • ↑g m)
[PROOFSTEP]
erw [Units.inv_eq_val_inv, Module.End_algebraMap_isUnit_inv_apply_eq_iff, ← (h c).unit⁻¹.val.map_smul]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
this✝ : c • s • ↑g m' = c • s' • ↑g m
this : Function.Injective ↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv
⊢ ↑s • ↑g m' = ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c)))⁻¹ (↑c • ↑s' • ↑g m)
[PROOFSTEP]
symm
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
this✝ : c • s • ↑g m' = c • s' • ↑g m
this : Function.Injective ↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv
⊢ ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c)))⁻¹ (↑c • ↑s' • ↑g m) = ↑s • ↑g m'
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff, ← g.map_smul, ← g.map_smul, ← g.map_smul, ← g.map_smul, eq1]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
m✝ : LocalizedModule S M
x✝² x✝¹ : M × { x // x ∈ S }
m : M
s : { x // x ∈ S }
m' : M
s' : { x // x ∈ S }
x✝ : (m, s) ≈ (m', s')
c : { x // x ∈ S }
eq1 : c • (m', s').snd • (m, s).fst = c • (m, s).snd • (m', s').fst
this✝ : c • s • ↑g m' = c • s' • ↑g m
this : Function.Injective ↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑c))).inv
⊢ ↑g (c • (m, s).snd • (m', s').fst) = ↑g (↑c • ↑s • m')
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x y : LocalizedModule S M
⊢ ∀ (m m' : M) (s s' : { x // x ∈ S }), lift' S g h (mk m s + mk m' s') = lift' S g h (mk m s) + lift' S g h (mk m' s')
[PROOFSTEP]
intro a a' b b'
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ lift' S g h (mk a b + mk a' b') = lift' S g h (mk a b) + lift' S g h (mk a' b')
[PROOFSTEP]
erw [LocalizedModule.lift'_mk, LocalizedModule.lift'_mk, LocalizedModule.lift'_mk]
  -- Porting note: We remove `generalize_proofs h1 h2 h3`. This only generalize `h1`.
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑((a, b).snd * (a', b').snd))))⁻¹
      (↑g ((a', b').snd • (a, b).fst + (a, b).snd • (a', b').fst)) =
    ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑b)))⁻¹ (↑g a) +
      ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑b')))⁻¹ (↑g a')
[PROOFSTEP]
erw [map_add, Module.End_algebraMap_isUnit_inv_apply_eq_iff, smul_add, ← map_smul, ← map_smul, ← map_smul]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑g ((a', b').snd • (a, b).fst) + ↑g ((a, b).snd • (a', b').fst) =
    ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑b)))⁻¹ (↑g (↑((a, b).snd * (a', b').snd) • a)) +
      ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑b')))⁻¹ (↑((a, b).snd * (a', b').snd) • ↑g a')
[PROOFSTEP]
congr 1
[GOAL]
case e_a
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑g ((a', b').snd • (a, b).fst) =
    ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑b)))⁻¹ (↑g (↑((a, b).snd * (a', b').snd) • a))
[PROOFSTEP]
symm
[GOAL]
case e_a
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑g ((a, b).snd • (a', b').fst) =
    ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑b')))⁻¹ (↑((a, b).snd * (a', b').snd) • ↑g a')
[PROOFSTEP]
symm
[GOAL]
case e_a
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑b)))⁻¹ (↑g (↑((a, b).snd * (a', b').snd) • a)) =
    ↑g ((a', b').snd • (a, b).fst)
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff, mul_smul, ← map_smul]
[GOAL]
case e_a
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑g (↑(a, b).snd • ↑(a', b').snd • a) = ↑g (↑b • (a', b').snd • (a, b).fst)
[PROOFSTEP]
rfl
[GOAL]
case e_a
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑b')))⁻¹ (↑((a, b).snd * (a', b').snd) • ↑g a') =
    ↑g ((a, b).snd • (a', b').fst)
[PROOFSTEP]
dsimp
[GOAL]
case e_a
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑b')))⁻¹ ((↑b * ↑b') • ↑g a') = ↑g (b • a')
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff, mul_comm, mul_smul, ← map_smul]
[GOAL]
case e_a
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑b' • ↑g (↑b • a') = ↑b' • ↑g (b • a')
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
r : R
m : LocalizedModule S M
⊢ ∀ (a : M × { x // x ∈ S }),
    r • lift' S g h (Quotient.mk (r.setoid S M) a) = lift' S g h (r • Quotient.mk (r.setoid S M) a)
[PROOFSTEP]
intro ⟨a, b⟩
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
r : R
m : LocalizedModule S M
a : M
b : { x // x ∈ S }
⊢ r • lift' S g h (Quotient.mk (r.setoid S M) (a, b)) = lift' S g h (r • Quotient.mk (r.setoid S M) (a, b))
[PROOFSTEP]
erw [LocalizedModule.lift'_mk, LocalizedModule.smul'_mk, LocalizedModule.lift'_mk]
  -- Porting note: We remove `generalize_proofs h1 h2`. This does nothing here.
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
r : R
m : LocalizedModule S M
a : M
b : { x // x ∈ S }
⊢ r • ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑b)))⁻¹ (↑g a) =
    ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑b)))⁻¹ (↑g (r • a))
[PROOFSTEP]
erw [← map_smul, ← g.map_smul]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
r : R
x : LocalizedModule S M
⊢ AddHom.toFun
      { toFun := lift' S g h,
        map_add' := (_ : ∀ (x y : LocalizedModule S M), lift' S g h (x + y) = lift' S g h x + lift' S g h y) }
      (r • x) =
    ↑(RingHom.id R) r •
      AddHom.toFun
        { toFun := lift' S g h,
          map_add' := (_ : ∀ (x y : LocalizedModule S M), lift' S g h (x + y) = lift' S g h x + lift' S g h y) }
        x
[PROOFSTEP]
rw [LocalizedModule.lift'_smul, RingHom.id_apply]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
⊢ LinearMap.comp (lift S g h) (mkLinearMap S M) = g
[PROOFSTEP]
ext x
[GOAL]
case h
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x : M
⊢ ↑(LinearMap.comp (lift S g h) (mkLinearMap S M)) x = ↑g x
[PROOFSTEP]
dsimp
[GOAL]
case h
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x : M
⊢ ↑(lift S g h) (mk x 1) = ↑g x
[PROOFSTEP]
rw [LocalizedModule.lift_mk]
[GOAL]
case h
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
x : M
⊢ ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑1)))⁻¹ (↑g x) = ↑g x
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff, one_smul]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : LocalizedModule S M →ₗ[R] M''
hl : LinearMap.comp l (mkLinearMap S M) = g
⊢ lift S g h = l
[PROOFSTEP]
ext x
[GOAL]
case h
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : LocalizedModule S M →ₗ[R] M''
hl : LinearMap.comp l (mkLinearMap S M) = g
x : LocalizedModule S M
⊢ ↑(lift S g h) x = ↑l x
[PROOFSTEP]
induction' x using LocalizedModule.induction_on with m s
[GOAL]
case h.h
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : LocalizedModule S M →ₗ[R] M''
hl : LinearMap.comp l (mkLinearMap S M) = g
m : M
s : { x // x ∈ S }
⊢ ↑(lift S g h) (mk m s) = ↑l (mk m s)
[PROOFSTEP]
rw [LocalizedModule.lift_mk]
[GOAL]
case h.h
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : LocalizedModule S M →ₗ[R] M''
hl : LinearMap.comp l (mkLinearMap S M) = g
m : M
s : { x // x ∈ S }
⊢ ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M'')) ↑s)))⁻¹ (↑g m) = ↑l (mk m s)
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff, ← hl, LinearMap.coe_comp, Function.comp_apply,
  LocalizedModule.mkLinearMap_apply, ← l.map_smul, LocalizedModule.smul'_mk]
[GOAL]
case h.h
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : LocalizedModule S M →ₗ[R] M''
hl : LinearMap.comp l (mkLinearMap S M) = g
m : M
s : { x // x ∈ S }
⊢ ↑l (mk m 1) = ↑l (mk (↑s • m) s)
[PROOFSTEP]
congr 1
[GOAL]
case h.h.h.e_6.h
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : LocalizedModule S M →ₗ[R] M''
hl : LinearMap.comp l (mkLinearMap S M) = g
m : M
s : { x // x ∈ S }
⊢ mk m 1 = mk (↑s • m) s
[PROOFSTEP]
rw [LocalizedModule.mk_eq]
[GOAL]
case h.h.h.e_6.h
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : LocalizedModule S M →ₗ[R] M''
hl : LinearMap.comp l (mkLinearMap S M) = g
m : M
s : { x // x ∈ S }
⊢ ∃ u, u • s • m = u • 1 • ↑s • m
[PROOFSTEP]
refine' ⟨1, _⟩
[GOAL]
case h.h.h.e_6.h
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : LocalizedModule S M →ₗ[R] M''
hl : LinearMap.comp l (mkLinearMap S M) = g
m : M
s : { x // x ∈ S }
⊢ 1 • s • m = 1 • 1 • ↑s • m
[PROOFSTEP]
simp only [one_smul]
[GOAL]
case h.h.h.e_6.h
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g✝ g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : LocalizedModule S M →ₗ[R] M''
hl : LinearMap.comp l (mkLinearMap S M) = g
m : M
s : { x // x ∈ S }
⊢ s • m = ↑s • m
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
s : { x // x ∈ S }
p : LocalizedModule S M
⊢ ∀ (a : M × { x // x ∈ S }),
    ↑↑{ val := ↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s, inv := LocalizedModule.divBy s,
              val_inv := (_ : ↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s * LocalizedModule.divBy s = 1),
              inv_val := (_ : LocalizedModule.divBy s * ↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s = 1) }
        (Quotient.mk (LocalizedModule.r.setoid S M) a) =
      ↑(↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s) (Quotient.mk (LocalizedModule.r.setoid S M) a)
[PROOFSTEP]
intros
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
s : { x // x ∈ S }
p : LocalizedModule S M
a✝ : M × { x // x ∈ S }
⊢ ↑↑{ val := ↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s, inv := LocalizedModule.divBy s,
            val_inv := (_ : ↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s * LocalizedModule.divBy s = 1),
            inv_val := (_ : LocalizedModule.divBy s * ↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s = 1) }
      (Quotient.mk (LocalizedModule.r.setoid S M) a✝) =
    ↑(↑(algebraMap R (Module.End R (LocalizedModule S M))) ↑s) (Quotient.mk (LocalizedModule.r.setoid S M) a✝)
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
p : LocalizedModule S M
⊢ ∀ (a : M × { x // x ∈ S }),
    ∃ x, x.snd • Quotient.mk (LocalizedModule.r.setoid S M) a = ↑(LocalizedModule.mkLinearMap S M) x.fst
[PROOFSTEP]
intro ⟨m, t⟩
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
p : LocalizedModule S M
m : M
t : { x // x ∈ S }
⊢ ∃ x, x.snd • Quotient.mk (LocalizedModule.r.setoid S M) (m, t) = ↑(LocalizedModule.mkLinearMap S M) x.fst
[PROOFSTEP]
refine' ⟨⟨m, t⟩, _⟩
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
p : LocalizedModule S M
m : M
t : { x // x ∈ S }
⊢ (m, t).snd • Quotient.mk (LocalizedModule.r.setoid S M) (m, t) = ↑(LocalizedModule.mkLinearMap S M) (m, t).fst
[PROOFSTEP]
erw [LocalizedModule.smul'_mk, LocalizedModule.mkLinearMap_apply, Submonoid.coe_subtype, LocalizedModule.mk_cancel t]
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
x₁✝ x₂✝ : M
eq1 : ↑(LocalizedModule.mkLinearMap S M) x₁✝ = ↑(LocalizedModule.mkLinearMap S M) x₂✝
⊢ ∃ c, c • x₂✝ = c • x₁✝
[PROOFSTEP]
simpa only [eq_comm, one_smul] using LocalizedModule.mk_eq.mp eq1
[GOAL]
R : Type u_1
inst✝⁶ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
x₁✝ x₂✝ : M
x✝ : ∃ c, c • x₂✝ = c • x₁✝
c : { x // x ∈ S }
eq1 : c • x₂✝ = c • x₁✝
⊢ c • 1 • x₁✝ = c • 1 • x₂✝
[PROOFSTEP]
simpa only [eq_comm, one_smul] using eq1
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
p : LocalizedModule S M
⊢ ∀ (p p' : M × { x // x ∈ S }),
    p ≈ p' →
      (fun x => ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑x.snd)))⁻¹ (↑f x.fst)) p =
        (fun x => ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑x.snd)))⁻¹ (↑f x.fst)) p'
[PROOFSTEP]
rintro ⟨a, b⟩ ⟨a', b'⟩ ⟨c, eq1⟩
[GOAL]
case mk.mk.intro
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
p : LocalizedModule S M
a : M
b : { x // x ∈ S }
a' : M
b' c : { x // x ∈ S }
eq1 : c • (a', b').snd • (a, b).fst = c • (a, b).snd • (a', b').fst
⊢ (fun x => ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑x.snd)))⁻¹ (↑f x.fst)) (a, b) =
    (fun x => ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑x.snd)))⁻¹ (↑f x.fst)) (a', b')
[PROOFSTEP]
dsimp
  -- Porting note: We remove `generalize_proofs h1 h2`.
[GOAL]
case mk.mk.intro
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
p : LocalizedModule S M
a : M
b : { x // x ∈ S }
a' : M
b' c : { x // x ∈ S }
eq1 : c • (a', b').snd • (a, b).fst = c • (a, b).snd • (a', b').fst
⊢ ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b)))⁻¹ (↑f a) =
    ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b')))⁻¹ (↑f a')
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff, ← map_smul, ← map_smul,
  Module.End_algebraMap_isUnit_inv_apply_eq_iff', ← map_smul]
[GOAL]
case mk.mk.intro
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
p : LocalizedModule S M
a : M
b : { x // x ∈ S }
a' : M
b' c : { x // x ∈ S }
eq1 : c • (a', b').snd • (a, b).fst = c • (a, b).snd • (a', b').fst
⊢ ↑f (↑b • a') = ↑f (↑b' • a)
[PROOFSTEP]
exact (IsLocalizedModule.eq_iff_exists S f).mpr ⟨c, eq1⟩
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
⊢ ∀ (m m' : M) (s s' : { x // x ∈ S }),
    fromLocalizedModule' S f (LocalizedModule.mk m s + LocalizedModule.mk m' s') =
      fromLocalizedModule' S f (LocalizedModule.mk m s) + fromLocalizedModule' S f (LocalizedModule.mk m' s')
[PROOFSTEP]
intro a a' b b'
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ fromLocalizedModule' S f (LocalizedModule.mk a b + LocalizedModule.mk a' b') =
    fromLocalizedModule' S f (LocalizedModule.mk a b) + fromLocalizedModule' S f (LocalizedModule.mk a' b')
[PROOFSTEP]
simp only [LocalizedModule.mk_add_mk, fromLocalizedModule'_mk]
  -- Porting note: We remove `generalize_proofs h1 h2 h3`.
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑(b * b'))))⁻¹ (↑f (b' • a + b • a')) =
    ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b)))⁻¹ (↑f a) +
      ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b')))⁻¹ (↑f a')
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff, smul_add, ← map_smul, ← map_smul, ← map_smul, map_add]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑f (b' • a) + ↑f (b • a') =
    ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b)))⁻¹ (↑f (↑(b * b') • a)) +
      ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b')))⁻¹ (↑(b * b') • ↑f a')
[PROOFSTEP]
congr 1
[GOAL]
case e_a
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑f (b' • a) = ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b)))⁻¹ (↑f (↑(b * b') • a))
case e_a
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑f (b • a') = ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b')))⁻¹ (↑(b * b') • ↑f a')
[PROOFSTEP]
all_goals erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff']
[GOAL]
case e_a
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑f (b' • a) = ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b)))⁻¹ (↑f (↑(b * b') • a))
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff']
[GOAL]
case e_a
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑f (b • a') = ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b')))⁻¹ (↑(b * b') • ↑f a')
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff']
[GOAL]
case e_a
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑f (↑(b * b') • a) = ↑b • ↑f (b' • a)
[PROOFSTEP]
erw [mul_smul, f.map_smul]
[GOAL]
case e_a
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑b • ↑f (↑b' • a) = ↑b • ↑f (b' • a)
[PROOFSTEP]
rfl
[GOAL]
case e_a
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑(b * b') • ↑f a' = ↑b' • ↑f (b • a')
[PROOFSTEP]
erw [mul_comm, f.map_smul, mul_smul]
[GOAL]
case e_a
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
a a' : M
b b' : { x // x ∈ S }
⊢ ↑b' • ↑b • ↑f a' = ↑b' • ↑(Submonoid.subtype S) b • ↑f a'
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
r : R
x : LocalizedModule S M
⊢ ∀ (m : M) (s : { x // x ∈ S }),
    r • fromLocalizedModule' S f (LocalizedModule.mk m s) = fromLocalizedModule' S f (r • LocalizedModule.mk m s)
[PROOFSTEP]
intro a b
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
r : R
x : LocalizedModule S M
a : M
b : { x // x ∈ S }
⊢ r • fromLocalizedModule' S f (LocalizedModule.mk a b) = fromLocalizedModule' S f (r • LocalizedModule.mk a b)
[PROOFSTEP]
rw [fromLocalizedModule'_mk, LocalizedModule.smul'_mk, fromLocalizedModule'_mk]
  -- Porting note: We remove `generalize_proofs h1`.
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
r : R
x : LocalizedModule S M
a : M
b : { x // x ∈ S }
⊢ r • ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b)))⁻¹ (↑f a) =
    ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b)))⁻¹ (↑f (r • a))
[PROOFSTEP]
rw [f.map_smul, map_smul]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
r : R
x : LocalizedModule S M
⊢ AddHom.toFun
      { toFun := fromLocalizedModule' S f,
        map_add' :=
          (_ :
            ∀ (x y : LocalizedModule S M),
              fromLocalizedModule' S f (x + y) = fromLocalizedModule' S f x + fromLocalizedModule' S f y) }
      (r • x) =
    ↑(RingHom.id R) r •
      AddHom.toFun
        { toFun := fromLocalizedModule' S f,
          map_add' :=
            (_ :
              ∀ (x y : LocalizedModule S M),
                fromLocalizedModule' S f (x + y) = fromLocalizedModule' S f x + fromLocalizedModule' S f y) }
        x
[PROOFSTEP]
rw [fromLocalizedModule'_smul, RingHom.id_apply]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
eq1 : ↑(fromLocalizedModule S f) x = ↑(fromLocalizedModule S f) y
⊢ x = y
[PROOFSTEP]
induction' x using LocalizedModule.induction_on with a b
[GOAL]
case h
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
eq1✝ : ↑(fromLocalizedModule S f) x = ↑(fromLocalizedModule S f) y
a : M
b : { x // x ∈ S }
eq1 : ↑(fromLocalizedModule S f) (LocalizedModule.mk a b) = ↑(fromLocalizedModule S f) y
⊢ LocalizedModule.mk a b = y
[PROOFSTEP]
induction' y using LocalizedModule.induction_on with a' b'
[GOAL]
case h.h
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
eq1✝² : ↑(fromLocalizedModule S f) x = ↑(fromLocalizedModule S f) y
a : M
b : { x // x ∈ S }
eq1✝¹ : ↑(fromLocalizedModule S f) (LocalizedModule.mk a b) = ↑(fromLocalizedModule S f) y
a' : M
b' : { x // x ∈ S }
eq1✝ : ↑(fromLocalizedModule S f) x = ↑(fromLocalizedModule S f) (LocalizedModule.mk a' b')
eq1 : ↑(fromLocalizedModule S f) (LocalizedModule.mk a b) = ↑(fromLocalizedModule S f) (LocalizedModule.mk a' b')
⊢ LocalizedModule.mk a b = LocalizedModule.mk a' b'
[PROOFSTEP]
simp only [fromLocalizedModule_mk] at eq1 
[GOAL]
case h.h
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
eq1✝² : ↑(fromLocalizedModule S f) x = ↑(fromLocalizedModule S f) y
a : M
b : { x // x ∈ S }
eq1✝¹ : ↑(fromLocalizedModule S f) (LocalizedModule.mk a b) = ↑(fromLocalizedModule S f) y
a' : M
b' : { x // x ∈ S }
eq1✝ : ↑(fromLocalizedModule S f) x = ↑(fromLocalizedModule S f) (LocalizedModule.mk a' b')
eq1 :
  ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b)))⁻¹ (↑f a) =
    ↑↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R (Module.End R M')) ↑b')))⁻¹ (↑f a')
⊢ LocalizedModule.mk a b = LocalizedModule.mk a' b'
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff, ← LinearMap.map_smul,
  Module.End_algebraMap_isUnit_inv_apply_eq_iff'] at eq1 
[GOAL]
case h.h
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
eq1✝² : ↑(fromLocalizedModule S f) x = ↑(fromLocalizedModule S f) y
a : M
b : { x // x ∈ S }
eq1✝¹ : ↑(fromLocalizedModule S f) (LocalizedModule.mk a b) = ↑(fromLocalizedModule S f) y
a' : M
b' : { x // x ∈ S }
eq1✝ : ↑(fromLocalizedModule S f) x = ↑(fromLocalizedModule S f) (LocalizedModule.mk a' b')
eq1 : ↑b • ↑f a' = ↑b' • ↑f a
⊢ LocalizedModule.mk a b = LocalizedModule.mk a' b'
[PROOFSTEP]
erw [LocalizedModule.mk_eq, ← IsLocalizedModule.eq_iff_exists S f, f.map_smul, f.map_smul, eq1]
[GOAL]
case h.h
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x y : LocalizedModule S M
eq1✝² : ↑(fromLocalizedModule S f) x = ↑(fromLocalizedModule S f) y
a : M
b : { x // x ∈ S }
eq1✝¹ : ↑(fromLocalizedModule S f) (LocalizedModule.mk a b) = ↑(fromLocalizedModule S f) y
a' : M
b' : { x // x ∈ S }
eq1✝ : ↑(fromLocalizedModule S f) x = ↑(fromLocalizedModule S f) (LocalizedModule.mk a' b')
eq1 : ↑b • ↑f a' = ↑b' • ↑f a
⊢ ↑b' • ↑f a = ↑(Submonoid.subtype S) b' • ↑f a
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x : M'
m : M
s : { x // x ∈ S }
eq1 : (m, s).snd • x = ↑f (m, s).fst
⊢ ↑(fromLocalizedModule S f) (LocalizedModule.mk m s) = x
[PROOFSTEP]
rw [fromLocalizedModule_mk, Module.End_algebraMap_isUnit_inv_apply_eq_iff, ← eq1]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x : M'
m : M
s : { x // x ∈ S }
eq1 : (m, s).snd • x = ↑f (m, s).fst
⊢ (m, s).snd • x = ↑s • x
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M'
⊢ ↑(LinearEquiv.symm (iso S f)) m =
    LocalizedModule.mk (Exists.choose (_ : ∃ x, x.snd • m = ↑f x.fst)).fst
      (Exists.choose (_ : ∃ x, x.snd • m = ↑f x.fst)).snd
[PROOFSTEP]
apply_fun iso S f using LinearEquiv.injective (iso S f)
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M'
⊢ ↑(iso S f) (↑(LinearEquiv.symm (iso S f)) m) =
    ↑(iso S f)
      (LocalizedModule.mk (Exists.choose (_ : ∃ x, x.snd • m = ↑f x.fst)).fst
        (Exists.choose (_ : ∃ x, x.snd • m = ↑f x.fst)).snd)
[PROOFSTEP]
rw [LinearEquiv.apply_symm_apply]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M'
⊢ m =
    ↑(iso S f)
      (LocalizedModule.mk (Exists.choose (_ : ∃ x, x.snd • m = ↑f x.fst)).fst
        (Exists.choose (_ : ∃ x, x.snd • m = ↑f x.fst)).snd)
[PROOFSTEP]
simp only [iso_apply, LinearMap.toFun_eq_coe, fromLocalizedModule_mk]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M'
⊢ m =
    fromLocalizedModule' S f
      (LocalizedModule.mk (Exists.choose (_ : ∃ x, x.snd • m = ↑f x.fst)).fst
        (Exists.choose (_ : ∃ x, x.snd • m = ↑f x.fst)).snd)
[PROOFSTEP]
erw [Module.End_algebraMap_isUnit_inv_apply_eq_iff', (surj' _).choose_spec]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M'
a : M
b : { x // x ∈ S }
eq1 : b • m = ↑f a
⊢ ∃ u,
    u • b • (Exists.choose (_ : ∃ x, x.snd • m = ↑f x.fst)).fst =
      u • (Exists.choose (_ : ∃ x, x.snd • m = ↑f x.fst)).snd • a
[PROOFSTEP]
erw [← IsLocalizedModule.eq_iff_exists S f, f.map_smul, f.map_smul, ← (surj' _).choose_spec, ← mul_smul, mul_comm,
  mul_smul, eq1]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
⊢ LinearMap.comp (↑(LinearEquiv.symm (iso S f))) f = LocalizedModule.mkLinearMap S M
[PROOFSTEP]
ext m
[GOAL]
case h
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
⊢ ↑(LinearMap.comp (↑(LinearEquiv.symm (iso S f))) f) m = ↑(LocalizedModule.mkLinearMap S M) m
[PROOFSTEP]
rw [LinearMap.comp_apply, LocalizedModule.mkLinearMap_apply]
[GOAL]
case h
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
⊢ ↑↑(LinearEquiv.symm (iso S f)) (↑f m) = LocalizedModule.mk m 1
[PROOFSTEP]
change (iso S f).symm _ = _
[GOAL]
case h
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
⊢ ↑(LinearEquiv.symm (iso S f)) (↑f m) = LocalizedModule.mk m 1
[PROOFSTEP]
rw [iso_symm_apply']
[GOAL]
case h.eq1
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
⊢ 1 • ↑f m = ↑f m
[PROOFSTEP]
exact one_smul _ _
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
⊢ LinearMap.comp (lift S f g h) f = g
[PROOFSTEP]
dsimp only [IsLocalizedModule.lift]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
⊢ LinearMap.comp (LinearMap.comp (LocalizedModule.lift S g h) ↑(LinearEquiv.symm (iso S f))) f = g
[PROOFSTEP]
rw [LinearMap.comp_assoc]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
⊢ LinearMap.comp (LocalizedModule.lift S g h) (LinearMap.comp (↑(LinearEquiv.symm (iso S f))) f) = g
[PROOFSTEP]
convert LocalizedModule.lift_comp S g h
[GOAL]
case h.e'_2.h.e'_21
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
⊢ LinearMap.comp (↑(LinearEquiv.symm (iso S f))) f = LocalizedModule.mkLinearMap S M
[PROOFSTEP]
exact iso_symm_comp _ _
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : M' →ₗ[R] M''
hl : LinearMap.comp l f = g
⊢ lift S f g h = l
[PROOFSTEP]
dsimp only [IsLocalizedModule.lift]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : M' →ₗ[R] M''
hl : LinearMap.comp l f = g
⊢ LinearMap.comp (LocalizedModule.lift S g h) ↑(LinearEquiv.symm (iso S f)) = l
[PROOFSTEP]
rw [LocalizedModule.lift_unique S g h (l.comp (iso S f).toLinearMap), LinearMap.comp_assoc,
  show (iso S f).toLinearMap.comp (iso S f).symm.toLinearMap = LinearMap.id from _, LinearMap.comp_id]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : M' →ₗ[R] M''
hl : LinearMap.comp l f = g
⊢ LinearMap.comp ↑(iso S f) ↑(LinearEquiv.symm (iso S f)) = LinearMap.id
[PROOFSTEP]
rw [LinearEquiv.comp_toLinearMap_symm_eq, LinearMap.id_comp]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : M' →ₗ[R] M''
hl : LinearMap.comp l f = g
⊢ LinearMap.comp (LinearMap.comp l ↑(iso S f)) (LocalizedModule.mkLinearMap S M) = g
[PROOFSTEP]
rw [LinearMap.comp_assoc, ← hl]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : M' →ₗ[R] M''
hl : LinearMap.comp l f = g
⊢ LinearMap.comp l (LinearMap.comp (↑(iso S f)) (LocalizedModule.mkLinearMap S M)) = LinearMap.comp l f
[PROOFSTEP]
congr 1
[GOAL]
case e_g
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : M' →ₗ[R] M''
hl : LinearMap.comp l f = g
⊢ LinearMap.comp (↑(iso S f)) (LocalizedModule.mkLinearMap S M) = f
[PROOFSTEP]
ext x
[GOAL]
case e_g.h
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] M''
h : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
l : M' →ₗ[R] M''
hl : LinearMap.comp l f = g
x : M
⊢ ↑(LinearMap.comp (↑(iso S f)) (LocalizedModule.mkLinearMap S M)) x = ↑f x
[PROOFSTEP]
erw [fromLocalizedModule_mk, Module.End_algebraMap_isUnit_inv_apply_eq_iff, one_smul]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
map_unit : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
j k : M' →ₗ[R] M''
h : LinearMap.comp j f = LinearMap.comp k f
⊢ j = k
[PROOFSTEP]
rw [← lift_unique S f (k.comp f) map_unit j h, lift_unique]
[GOAL]
case hl
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
map_unit : ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R M'')) ↑x)
j k : M' →ₗ[R] M''
h : LinearMap.comp j f = LinearMap.comp k f
⊢ LinearMap.comp k f = LinearMap.comp k f
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
r : R
m : M
s : { x // x ∈ S }
⊢ mk' f (r • m) s = r • mk' f m s
[PROOFSTEP]
delta mk'
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
r : R
m : M
s : { x // x ∈ S }
⊢ ↑(fromLocalizedModule S f) (LocalizedModule.mk (r • m) s) = r • ↑(fromLocalizedModule S f) (LocalizedModule.mk m s)
[PROOFSTEP]
rw [← LocalizedModule.smul'_mk, LinearMap.map_smul]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s₁ s₂ : { x // x ∈ S }
⊢ mk' f m₁ s₁ + mk' f m₂ s₂ = mk' f (s₂ • m₁ + s₁ • m₂) (s₁ * s₂)
[PROOFSTEP]
delta mk'
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s₁ s₂ : { x // x ∈ S }
⊢ ↑(fromLocalizedModule S f) (LocalizedModule.mk m₁ s₁) + ↑(fromLocalizedModule S f) (LocalizedModule.mk m₂ s₂) =
    ↑(fromLocalizedModule S f) (LocalizedModule.mk (s₂ • m₁ + s₁ • m₂) (s₁ * s₂))
[PROOFSTEP]
rw [← map_add, LocalizedModule.mk_add_mk]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
s : { x // x ∈ S }
⊢ mk' f 0 s = 0
[PROOFSTEP]
rw [← zero_smul R (0 : M), mk'_smul, zero_smul]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
⊢ mk' f m 1 = ↑f m
[PROOFSTEP]
delta mk'
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
⊢ ↑(fromLocalizedModule S f) (LocalizedModule.mk m 1) = ↑f m
[PROOFSTEP]
rw [fromLocalizedModule_mk, Module.End_algebraMap_isUnit_inv_apply_eq_iff, Submonoid.coe_one, one_smul]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
s : { x // x ∈ S }
⊢ mk' f (s • m) s = ↑f m
[PROOFSTEP]
delta mk'
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
s : { x // x ∈ S }
⊢ ↑(fromLocalizedModule S f) (LocalizedModule.mk (s • m) s) = ↑f m
[PROOFSTEP]
rw [LocalizedModule.mk_cancel, ← mk'_one S f]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
s : { x // x ∈ S }
⊢ ↑(fromLocalizedModule S f) (LocalizedModule.mk m 1) = mk' f m 1
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
s : { x // x ∈ S }
⊢ s • mk' f m s = ↑f m
[PROOFSTEP]
rw [Submonoid.smul_def, ← mk'_smul, ← Submonoid.smul_def, mk'_cancel]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
s₁ s₂ : { x // x ∈ S }
⊢ mk' f (s₁ • m) (s₁ * s₂) = mk' f m s₂
[PROOFSTEP]
delta mk'
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
s₁ s₂ : { x // x ∈ S }
⊢ ↑(fromLocalizedModule S f) (LocalizedModule.mk (s₁ • m) (s₁ * s₂)) =
    ↑(fromLocalizedModule S f) (LocalizedModule.mk m s₂)
[PROOFSTEP]
rw [LocalizedModule.mk_cancel_common_left]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
s₁ s₂ : { x // x ∈ S }
⊢ mk' f (s₂ • m) (s₁ * s₂) = mk' f m s₁
[PROOFSTEP]
delta mk'
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
s₁ s₂ : { x // x ∈ S }
⊢ ↑(fromLocalizedModule S f) (LocalizedModule.mk (s₂ • m) (s₁ * s₂)) =
    ↑(fromLocalizedModule S f) (LocalizedModule.mk m s₁)
[PROOFSTEP]
rw [LocalizedModule.mk_cancel_common_right]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s : { x // x ∈ S }
⊢ mk' f (m₁ + m₂) s = mk' f m₁ s + mk' f m₂ s
[PROOFSTEP]
rw [mk'_add_mk', ← smul_add, mk'_cancel_left]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s₁ s₂ : { x // x ∈ S }
⊢ mk' f m₁ s₁ = mk' f m₂ s₂ ↔ ∃ s, s • s₁ • m₂ = s • s₂ • m₁
[PROOFSTEP]
delta mk'
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s₁ s₂ : { x // x ∈ S }
⊢ ↑(fromLocalizedModule S f) (LocalizedModule.mk m₁ s₁) = ↑(fromLocalizedModule S f) (LocalizedModule.mk m₂ s₂) ↔
    ∃ s, s • s₁ • m₂ = s • s₂ • m₁
[PROOFSTEP]
rw [(fromLocalizedModule.inj S f).eq_iff, LocalizedModule.mk_eq]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s₁ s₂ : { x // x ∈ S }
⊢ (∃ u, u • s₂ • m₁ = u • s₁ • m₂) ↔ ∃ s, s • s₁ • m₂ = s • s₂ • m₁
[PROOFSTEP]
simp_rw [eq_comm]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M✝ : Type u_2
M'✝ : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'✝
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M✝
inst✝⁷ : Module R M'✝
inst✝⁶ : Module R M''
f✝ : M✝ →ₗ[R] M'✝
g : M✝ →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f✝
M : Type u_5
M' : Type u_6
inst✝⁴ : AddCommGroup M
inst✝³ : AddCommGroup M'
inst✝² : Module R M
inst✝¹ : Module R M'
f : M →ₗ[R] M'
inst✝ : IsLocalizedModule S f
m : M
s : { x // x ∈ S }
⊢ mk' f (-m) s = -mk' f m s
[PROOFSTEP]
delta mk'
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M✝ : Type u_2
M'✝ : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'✝
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M✝
inst✝⁷ : Module R M'✝
inst✝⁶ : Module R M''
f✝ : M✝ →ₗ[R] M'✝
g : M✝ →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f✝
M : Type u_5
M' : Type u_6
inst✝⁴ : AddCommGroup M
inst✝³ : AddCommGroup M'
inst✝² : Module R M
inst✝¹ : Module R M'
f : M →ₗ[R] M'
inst✝ : IsLocalizedModule S f
m : M
s : { x // x ∈ S }
⊢ ↑(fromLocalizedModule S f) (LocalizedModule.mk (-m) s) = -↑(fromLocalizedModule S f) (LocalizedModule.mk m s)
[PROOFSTEP]
rw [LocalizedModule.mk_neg, map_neg]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M✝ : Type u_2
M'✝ : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'✝
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M✝
inst✝⁷ : Module R M'✝
inst✝⁶ : Module R M''
f✝ : M✝ →ₗ[R] M'✝
g : M✝ →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f✝
M : Type u_5
M' : Type u_6
inst✝⁴ : AddCommGroup M
inst✝³ : AddCommGroup M'
inst✝² : Module R M
inst✝¹ : Module R M'
f : M →ₗ[R] M'
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s : { x // x ∈ S }
⊢ mk' f (m₁ - m₂) s = mk' f m₁ s - mk' f m₂ s
[PROOFSTEP]
rw [sub_eq_add_neg, sub_eq_add_neg, mk'_add, mk'_neg]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M✝ : Type u_2
M'✝ : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'✝
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M✝
inst✝⁷ : Module R M'✝
inst✝⁶ : Module R M''
f✝ : M✝ →ₗ[R] M'✝
g : M✝ →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f✝
M : Type u_5
M' : Type u_6
inst✝⁴ : AddCommGroup M
inst✝³ : AddCommGroup M'
inst✝² : Module R M
inst✝¹ : Module R M'
f : M →ₗ[R] M'
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s₁ s₂ : { x // x ∈ S }
⊢ mk' f m₁ s₁ - mk' f m₂ s₂ = mk' f (s₂ • m₁ - s₁ • m₂) (s₁ * s₂)
[PROOFSTEP]
rw [sub_eq_add_neg, ← mk'_neg, mk'_add_mk', smul_neg, ← sub_eq_add_neg]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M✝ : Type u_2
M'✝ : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'✝
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M✝
inst✝⁷ : Module R M'✝
inst✝⁶ : Module R M''
f✝ : M✝ →ₗ[R] M'✝
g : M✝ →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f✝
M : Type u_5
M' : Type u_6
inst✝⁴ : Semiring M
inst✝³ : Semiring M'
inst✝² : Module R M
inst✝¹ : Algebra R M'
f : M →ₗ[R] M'
hf : ∀ (m₁ m₂ : M), ↑f (m₁ * m₂) = ↑f m₁ * ↑f m₂
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s₁ s₂ : { x // x ∈ S }
⊢ mk' f m₁ s₁ * mk' f m₂ s₂ = mk' f (m₁ * m₂) (s₁ * s₂)
[PROOFSTEP]
symm
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M✝ : Type u_2
M'✝ : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'✝
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M✝
inst✝⁷ : Module R M'✝
inst✝⁶ : Module R M''
f✝ : M✝ →ₗ[R] M'✝
g : M✝ →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f✝
M : Type u_5
M' : Type u_6
inst✝⁴ : Semiring M
inst✝³ : Semiring M'
inst✝² : Module R M
inst✝¹ : Algebra R M'
f : M →ₗ[R] M'
hf : ∀ (m₁ m₂ : M), ↑f (m₁ * m₂) = ↑f m₁ * ↑f m₂
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s₁ s₂ : { x // x ∈ S }
⊢ mk' f (m₁ * m₂) (s₁ * s₂) = mk' f m₁ s₁ * mk' f m₂ s₂
[PROOFSTEP]
apply (Module.End_algebraMap_isUnit_inv_apply_eq_iff _ _ _ _).mpr
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M✝ : Type u_2
M'✝ : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'✝
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M✝
inst✝⁷ : Module R M'✝
inst✝⁶ : Module R M''
f✝ : M✝ →ₗ[R] M'✝
g : M✝ →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f✝
M : Type u_5
M' : Type u_6
inst✝⁴ : Semiring M
inst✝³ : Semiring M'
inst✝² : Module R M
inst✝¹ : Algebra R M'
f : M →ₗ[R] M'
hf : ∀ (m₁ m₂ : M), ↑f (m₁ * m₂) = ↑f m₁ * ↑f m₂
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s₁ s₂ : { x // x ∈ S }
⊢ ↑f (m₁ * m₂, s₁ * s₂).fst = ↑(m₁ * m₂, s₁ * s₂).snd • (mk' f m₁ s₁ * mk' f m₂ s₂)
[PROOFSTEP]
simp_rw [Submonoid.coe_mul, ← smul_eq_mul]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M✝ : Type u_2
M'✝ : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'✝
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M✝
inst✝⁷ : Module R M'✝
inst✝⁶ : Module R M''
f✝ : M✝ →ₗ[R] M'✝
g : M✝ →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f✝
M : Type u_5
M' : Type u_6
inst✝⁴ : Semiring M
inst✝³ : Semiring M'
inst✝² : Module R M
inst✝¹ : Algebra R M'
f : M →ₗ[R] M'
hf : ∀ (m₁ m₂ : M), ↑f (m₁ * m₂) = ↑f m₁ * ↑f m₂
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s₁ s₂ : { x // x ∈ S }
⊢ ↑f (m₁ • m₂) = (↑s₁ • ↑s₂) • mk' f m₁ s₁ • mk' f m₂ s₂
[PROOFSTEP]
rw [smul_smul_smul_comm, ← mk'_smul, ← mk'_smul]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M✝ : Type u_2
M'✝ : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'✝
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M✝
inst✝⁷ : Module R M'✝
inst✝⁶ : Module R M''
f✝ : M✝ →ₗ[R] M'✝
g : M✝ →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f✝
M : Type u_5
M' : Type u_6
inst✝⁴ : Semiring M
inst✝³ : Semiring M'
inst✝² : Module R M
inst✝¹ : Algebra R M'
f : M →ₗ[R] M'
hf : ∀ (m₁ m₂ : M), ↑f (m₁ * m₂) = ↑f m₁ * ↑f m₂
inst✝ : IsLocalizedModule S f
m₁ m₂ : M
s₁ s₂ : { x // x ∈ S }
⊢ ↑f (m₁ • m₂) = mk' f (↑s₁ • m₁) s₁ • mk' f (↑s₂ • m₂) s₂
[PROOFSTEP]
simp_rw [← Submonoid.smul_def, mk'_cancel, smul_eq_mul, hf]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
s : { x // x ∈ S }
m' : M'
⊢ mk' f m s = m' ↔ ↑f m = s • m'
[PROOFSTEP]
rw [← smul_inj f s, Submonoid.smul_def, ← mk'_smul, ← Submonoid.smul_def, mk'_cancel]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
s : { x // x ∈ S }
⊢ mk' f m s = 0 ↔ ↑f m = 0
[PROOFSTEP]
rw [mk'_eq_iff, smul_zero]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
m : M
s : { x // x ∈ S }
⊢ mk' f m s = 0 ↔ ∃ s', s' • m = 0
[PROOFSTEP]
simp_rw [← mk'_zero f (1 : S), mk'_eq_mk'_iff, smul_zero, one_smul, eq_comm]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
s : { x // x ∈ S }
m : M
⊢ LocalizedModule.mk m s = mk' (LocalizedModule.mkLinearMap S M) m s
[PROOFSTEP]
rw [eq_comm, mk'_eq_iff, Submonoid.smul_def, LocalizedModule.smul'_mk, ← Submonoid.smul_def, LocalizedModule.mk_cancel,
  LocalizedModule.mkLinearMap_apply]
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
⊢ Function.Surjective (Function.uncurry (mk' f))
[PROOFSTEP]
intro x
[GOAL]
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x : M'
⊢ ∃ a, Function.uncurry (mk' f) a = x
[PROOFSTEP]
obtain ⟨⟨m, s⟩, e : s • x = f m⟩ := IsLocalizedModule.surj S f x
[GOAL]
case intro.mk
R : Type u_1
inst✝⁷ : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝⁶ : AddCommMonoid M
inst✝⁵ : AddCommMonoid M'
inst✝⁴ : AddCommMonoid M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝ : IsLocalizedModule S f
x : M'
m : M
s : { x // x ∈ S }
e : s • x = ↑f m
⊢ ∃ a, Function.uncurry (mk' f) a = x
[PROOFSTEP]
exact ⟨⟨m, s⟩, mk'_eq_iff.mpr e.symm⟩
[GOAL]
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 → ∃ m, m • x = 0
⊢ IsLocalizedModule M (AlgHom.toLinearMap f)
[PROOFSTEP]
replace h₃ := fun x =>
  Iff.intro (h₃ x) fun ⟨⟨m, hm⟩, e⟩ =>
    (h₁ m hm).mul_left_cancel <| by
      rw [← Algebra.smul_def]
      simpa [Submonoid.smul_def] using f.congr_arg e
[GOAL]
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 → ∃ m, m • x = 0
x : S
x✝ : ∃ m, m • x = 0
m : R
hm : m ∈ M
e : { val := m, property := hm } • x = 0
⊢ ↑(algebraMap R S') m * ↑f x = ↑(algebraMap R S') m * 0
[PROOFSTEP]
rw [← Algebra.smul_def]
[GOAL]
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 → ∃ m, m • x = 0
x : S
x✝ : ∃ m, m • x = 0
m : R
hm : m ∈ M
e : { val := m, property := hm } • x = 0
⊢ m • ↑f x = ↑(algebraMap R S') m * 0
[PROOFSTEP]
simpa [Submonoid.smul_def] using f.congr_arg e
[GOAL]
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
⊢ IsLocalizedModule M (AlgHom.toLinearMap f)
[PROOFSTEP]
constructor
[GOAL]
case map_units
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
⊢ ∀ (x : { x // x ∈ M }), IsUnit (↑(algebraMap R (Module.End R S')) ↑x)
[PROOFSTEP]
intro x
[GOAL]
case map_units
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x : { x // x ∈ M }
⊢ IsUnit (↑(algebraMap R (Module.End R S')) ↑x)
[PROOFSTEP]
rw [Module.End_isUnit_iff]
[GOAL]
case map_units
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x : { x // x ∈ M }
⊢ Function.Bijective ↑(↑(algebraMap R (Module.End R S')) ↑x)
[PROOFSTEP]
constructor
[GOAL]
case map_units.left
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x : { x // x ∈ M }
⊢ Function.Injective ↑(↑(algebraMap R (Module.End R S')) ↑x)
[PROOFSTEP]
rintro a b (e : x • a = x • b)
[GOAL]
case map_units.left
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x : { x // x ∈ M }
a b : S'
e : x • a = x • b
⊢ a = b
[PROOFSTEP]
simp_rw [Submonoid.smul_def, Algebra.smul_def] at e 
[GOAL]
case map_units.left
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x : { x // x ∈ M }
a b : S'
e : ↑(algebraMap R S') ↑x * a = ↑(algebraMap R S') ↑x * b
⊢ a = b
[PROOFSTEP]
exact (h₁ x x.2).mul_left_cancel e
[GOAL]
case map_units.right
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x : { x // x ∈ M }
⊢ Function.Surjective ↑(↑(algebraMap R (Module.End R S')) ↑x)
[PROOFSTEP]
intro a
[GOAL]
case map_units.right
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x : { x // x ∈ M }
a : S'
⊢ ∃ a_1, ↑(↑(algebraMap R (Module.End R S')) ↑x) a_1 = a
[PROOFSTEP]
refine' ⟨((h₁ x x.2).unit⁻¹ : _) * a, _⟩
[GOAL]
case map_units.right
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x : { x // x ∈ M }
a : S'
⊢ ↑(↑(algebraMap R (Module.End R S')) ↑x) (↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R S') ↑x)))⁻¹ * a) = a
[PROOFSTEP]
change (x : R) • (_ * a) = _
[GOAL]
case map_units.right
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x : { x // x ∈ M }
a : S'
⊢ ↑x • (↑(IsUnit.unit (_ : IsUnit (↑(algebraMap R S') ↑x)))⁻¹ * a) = a
[PROOFSTEP]
rw [Algebra.smul_def, ← mul_assoc, IsUnit.mul_val_inv, one_mul]
[GOAL]
case surj'
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
⊢ ∀ (y : S'), ∃ x, x.snd • y = ↑(AlgHom.toLinearMap f) x.fst
[PROOFSTEP]
exact h₂
[GOAL]
case eq_iff_exists'
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
⊢ ∀ {x₁ x₂ : S}, ↑(AlgHom.toLinearMap f) x₁ = ↑(AlgHom.toLinearMap f) x₂ ↔ ∃ c, c • x₂ = c • x₁
[PROOFSTEP]
intros
[GOAL]
case eq_iff_exists'
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x₁✝ x₂✝ : S
⊢ ↑(AlgHom.toLinearMap f) x₁✝ = ↑(AlgHom.toLinearMap f) x₂✝ ↔ ∃ c, c • x₂✝ = c • x₁✝
[PROOFSTEP]
dsimp only [AlgHom.toLinearMap_apply]
[GOAL]
case eq_iff_exists'
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x₁✝ x₂✝ : S
⊢ ↑f x₁✝ = ↑f x₂✝ ↔ ∃ c, c • x₂✝ = c • x₁✝
[PROOFSTEP]
rw [eq_comm, ← sub_eq_zero, ← map_sub, h₃]
[GOAL]
case eq_iff_exists'
R✝ : Type u_1
inst✝¹² : CommRing R✝
S✝ : Submonoid R✝
M✝ : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M✝
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R✝ M✝
inst✝⁷ : Module R✝ M'
inst✝⁶ : Module R✝ M''
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
inst✝⁵ : IsLocalizedModule S✝ f✝
R : Type u_5
S : Type u_6
S' : Type u_7
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : CommRing S'
inst✝¹ : Algebra R S
inst✝ : Algebra R S'
M : Submonoid R
f : S →ₐ[R] S'
h₁ : ∀ (x : R), x ∈ M → IsUnit (↑(algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.snd • y = ↑f x.fst
h₃ : ∀ (x : S), ↑f x = 0 ↔ ∃ m, m • x = 0
x₁✝ x₂✝ : S
⊢ (∃ m, m • (x₂✝ - x₁✝) = 0) ↔ ∃ c, c • x₂✝ = c • x₁✝
[PROOFSTEP]
simp_rw [smul_sub, sub_eq_zero]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
⊢ IsBaseChange A f
[PROOFSTEP]
refine' IsBaseChange.of_lift_unique _ (fun Q _ _ _ _ g ↦ _)
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
g : M →ₗ[R] Q
⊢ ∃! g', LinearMap.comp (↑R g') f = g
[PROOFSTEP]
have :=
  IsLocalizedModule.is_universal S f g <| by
    intro s
    simp_rw [Module.End_isUnit_iff, Function.bijective_iff_existsUnique, Module.algebraMap_end_apply]
    intro q
    refine' ⟨(IsLocalization.mk' _ 1 s : A) • q, _, _⟩
    · simp only [← smul_assoc, IsLocalization.smul_mk'_self, map_one, one_smul]
    · rintro q rfl
      simp only [smul_comm _ (s : R), ← smul_assoc, IsLocalization.smul_mk'_self, map_one, one_smul]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
g : M →ₗ[R] Q
⊢ ∀ (x : { x // x ∈ S }), IsUnit (↑(algebraMap R (Module.End R Q)) ↑x)
[PROOFSTEP]
intro s
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
g : M →ₗ[R] Q
s : { x // x ∈ S }
⊢ IsUnit (↑(algebraMap R (Module.End R Q)) ↑s)
[PROOFSTEP]
simp_rw [Module.End_isUnit_iff, Function.bijective_iff_existsUnique, Module.algebraMap_end_apply]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
g : M →ₗ[R] Q
s : { x // x ∈ S }
⊢ ∀ (b : Q), ∃! a, ↑s • a = b
[PROOFSTEP]
intro q
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
g : M →ₗ[R] Q
s : { x // x ∈ S }
q : Q
⊢ ∃! a, ↑s • a = q
[PROOFSTEP]
refine' ⟨(IsLocalization.mk' _ 1 s : A) • q, _, _⟩
[GOAL]
case refine'_1
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
g : M →ₗ[R] Q
s : { x // x ∈ S }
q : Q
⊢ (fun a => ↑s • a = q) (IsLocalization.mk' A 1 s • q)
[PROOFSTEP]
simp only [← smul_assoc, IsLocalization.smul_mk'_self, map_one, one_smul]
[GOAL]
case refine'_2
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
g : M →ₗ[R] Q
s : { x // x ∈ S }
q : Q
⊢ ∀ (y : Q), (fun a => ↑s • a = q) y → y = IsLocalization.mk' A 1 s • q
[PROOFSTEP]
rintro q rfl
[GOAL]
case refine'_2
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
g : M →ₗ[R] Q
s : { x // x ∈ S }
q : Q
⊢ q = IsLocalization.mk' A 1 s • ↑s • q
[PROOFSTEP]
simp only [smul_comm _ (s : R), ← smul_assoc, IsLocalization.smul_mk'_self, map_one, one_smul]
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g✝ : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
g : M →ₗ[R] Q
this : ∃! l, LinearMap.comp l f = g
⊢ ∃! g', LinearMap.comp (↑R g') f = g
[PROOFSTEP]
rcases this with ⟨ℓ, rfl, h₂⟩
[GOAL]
case intro.intro
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
ℓ : M' →ₗ[R] Q
h₂ : ∀ (y : M' →ₗ[R] Q), (fun l => LinearMap.comp l f = LinearMap.comp ℓ f) y → y = ℓ
⊢ ∃! g', LinearMap.comp (↑R g') f = LinearMap.comp ℓ f
[PROOFSTEP]
refine' ⟨ℓ.extendScalarsOfIsLocalization S A, by simp, fun g'' h ↦ _⟩
[GOAL]
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
ℓ : M' →ₗ[R] Q
h₂ : ∀ (y : M' →ₗ[R] Q), (fun l => LinearMap.comp l f = LinearMap.comp ℓ f) y → y = ℓ
⊢ (fun g' => LinearMap.comp (↑R g') f = LinearMap.comp ℓ f) (LinearMap.extendScalarsOfIsLocalization S A ℓ)
[PROOFSTEP]
simp
[GOAL]
case intro.intro
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
ℓ : M' →ₗ[R] Q
h₂ : ∀ (y : M' →ₗ[R] Q), (fun l => LinearMap.comp l f = LinearMap.comp ℓ f) y → y = ℓ
g'' : M' →ₗ[A] Q
h : (fun g' => LinearMap.comp (↑R g') f = LinearMap.comp ℓ f) g''
⊢ g'' = LinearMap.extendScalarsOfIsLocalization S A ℓ
[PROOFSTEP]
ext x
[GOAL]
case intro.intro.h
R : Type u_1
inst✝¹² : CommRing R
S : Submonoid R
M : Type u_2
M' : Type u_3
M'' : Type u_4
inst✝¹¹ : AddCommMonoid M
inst✝¹⁰ : AddCommMonoid M'
inst✝⁹ : AddCommMonoid M''
inst✝⁸ : Module R M
inst✝⁷ : Module R M'
inst✝⁶ : Module R M''
f : M →ₗ[R] M'
g : M →ₗ[R] M''
inst✝⁵ : IsLocalizedModule S f
A : Type u_5
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Module A M'
inst✝¹ : IsScalarTower R A M'
inst✝ : IsLocalization S A
Q : Type (max u_2 u_3 u_5)
x✝³ : AddCommMonoid Q
x✝² : Module R Q
x✝¹ : Module A Q
x✝ : IsScalarTower R A Q
ℓ : M' →ₗ[R] Q
h₂ : ∀ (y : M' →ₗ[R] Q), (fun l => LinearMap.comp l f = LinearMap.comp ℓ f) y → y = ℓ
g'' : M' →ₗ[A] Q
h : (fun g' => LinearMap.comp (↑R g') f = LinearMap.comp ℓ f) g''
x : M'
⊢ ↑g'' x = ↑(LinearMap.extendScalarsOfIsLocalization S A ℓ) x
[PROOFSTEP]
simp [← h₂ (LinearMap.restrictScalars R g'') h]
