Theorem: IsLocalizedModule.mkOfAlgebra
File: Mathlib/Algebra/Module/LocalizedModule.lean

Proof steps:
state_before: R✝ : Type u_1
inst✝³¹ : CommSemiring 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''
A : Type u_5
inst✝²⁷ : CommSemiring A
inst✝²⁶ : Algebra R✝ A
inst✝²⁵ : Module A M'
inst✝²⁴ : IsLocalization S✝ A
inst✝²³ : Module R✝ M✝
inst✝²² : Module R✝ M'
inst✝²¹ : Module R✝ M''
inst✝²⁰ : IsScalarTower R✝ A M'
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
M₀ : Type ?u.1244734
M₀' : Type ?u.1244737
inst✝¹⁹ : AddCommGroup M₀
inst✝¹⁸ : AddCommGroup M₀'
inst✝¹⁷ : Module R✝ M₀
inst✝¹⁶ : Module R✝ M₀'
f₀ : M₀ →ₗ[R✝] M₀'
inst✝¹⁵ : IsLocalizedModule S✝ f₀
M₁ : Type ?u.1246805
M₁' : Type ?u.1246808
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : AddCommGroup M₁'
inst✝¹² : Module R✝ M₁
inst✝¹¹ : Module R✝ M₁'
f₁ : M₁ →ₗ[R✝] M₁'
inst✝¹⁰ : IsLocalizedModule S✝ f₁
M₂ : Type ?u.1248876
M₂' : Type ?u.1248879
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₂'
inst✝⁷ : Module R✝ M₂
inst✝⁶ : Module R✝ M₂'
f₂ : M₂ →ₗ[R✝] M₂'
inst✝⁵ : IsLocalizedModule S✝ f₂
R : Type u_6
S : Type u_7
S' : Type u_8
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 ∈ M, IsUnit ((algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.2 • y = f x.1
h₃ : ∀ (x : S), f x = 0 → ∃ m, m • x = 0
⊢ IsLocalizedModule M f.toLinearMap
state_after: R✝ : Type u_1
inst✝³¹ : CommSemiring 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''
A : Type u_5
inst✝²⁷ : CommSemiring A
inst✝²⁶ : Algebra R✝ A
inst✝²⁵ : Module A M'
inst✝²⁴ : IsLocalization S✝ A
inst✝²³ : Module R✝ M✝
inst✝²² : Module R✝ M'
inst✝²¹ : Module R✝ M''
inst✝²⁰ : IsScalarTower R✝ A M'
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
M₀ : Type ?u.1244734
M₀' : Type ?u.1244737
inst✝¹⁹ : AddCommGroup M₀
inst✝¹⁸ : AddCommGroup M₀'
inst✝¹⁷ : Module R✝ M₀
inst✝¹⁶ : Module R✝ M₀'
f₀ : M₀ →ₗ[R✝] M₀'
inst✝¹⁵ : IsLocalizedModule S✝ f₀
M₁ : Type ?u.1246805
M₁' : Type ?u.1246808
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : AddCommGroup M₁'
inst✝¹² : Module R✝ M₁
inst✝¹¹ : Module R✝ M₁'
f₁ : M₁ →ₗ[R✝] M₁'
inst✝¹⁰ : IsLocalizedModule S✝ f₁
M₂ : Type ?u.1248876
M₂' : Type ?u.1248879
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₂'
inst✝⁷ : Module R✝ M₂
inst✝⁶ : Module R✝ M₂'
f₂ : M₂ →ₗ[R✝] M₂'
inst✝⁵ : IsLocalizedModule S✝ f₂
R : Type u_6
S : Type u_7
S' : Type u_8
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 ∈ M, IsUnit ((algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.2 • y = f x.1
h₃ : ∀ (x : S), f x = 0 ↔ ∃ m, m • x = 0
⊢ IsLocalizedModule M f.toLinearMap
tactic: 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
state_before: R✝ : Type u_1
inst✝³¹ : CommSemiring 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''
A : Type u_5
inst✝²⁷ : CommSemiring A
inst✝²⁶ : Algebra R✝ A
inst✝²⁵ : Module A M'
inst✝²⁴ : IsLocalization S✝ A
inst✝²³ : Module R✝ M✝
inst✝²² : Module R✝ M'
inst✝²¹ : Module R✝ M''
inst✝²⁰ : IsScalarTower R✝ A M'
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
M₀ : Type ?u.1244734
M₀' : Type ?u.1244737
inst✝¹⁹ : AddCommGroup M₀
inst✝¹⁸ : AddCommGroup M₀'
inst✝¹⁷ : Module R✝ M₀
inst✝¹⁶ : Module R✝ M₀'
f₀ : M₀ →ₗ[R✝] M₀'
inst✝¹⁵ : IsLocalizedModule S✝ f₀
M₁ : Type ?u.1246805
M₁' : Type ?u.1246808
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : AddCommGroup M₁'
inst✝¹² : Module R✝ M₁
inst✝¹¹ : Module R✝ M₁'
f₁ : M₁ →ₗ[R✝] M₁'
inst✝¹⁰ : IsLocalizedModule S✝ f₁
M₂ : Type ?u.1248876
M₂' : Type ?u.1248879
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₂'
inst✝⁷ : Module R✝ M₂
inst✝⁶ : Module R✝ M₂'
f₂ : M₂ →ₗ[R✝] M₂'
inst✝⁵ : IsLocalizedModule S✝ f₂
R : Type u_6
S : Type u_7
S' : Type u_8
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 ∈ M, IsUnit ((algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.2 • y = f x.1
h₃ : ∀ (x : S), f x = 0 ↔ ∃ m, m • x = 0
⊢ IsLocalizedModule M f.toLinearMap
state_after: case map_units
R✝ : Type u_1
inst✝³¹ : CommSemiring 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''
A : Type u_5
inst✝²⁷ : CommSemiring A
inst✝²⁶ : Algebra R✝ A
inst✝²⁵ : Module A M'
inst✝²⁴ : IsLocalization S✝ A
inst✝²³ : Module R✝ M✝
inst✝²² : Module R✝ M'
inst✝²¹ : Module R✝ M''
inst✝²⁰ : IsScalarTower R✝ A M'
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
M₀ : Type ?u.1244734
M₀' : Type ?u.1244737
inst✝¹⁹ : AddCommGroup M₀
inst✝¹⁸ : AddCommGroup M₀'
inst✝¹⁷ : Module R✝ M₀
inst✝¹⁶ : Module R✝ M₀'
f₀ : M₀ →ₗ[R✝] M₀'
inst✝¹⁵ : IsLocalizedModule S✝ f₀
M₁ : Type ?u.1246805
M₁' : Type ?u.1246808
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : AddCommGroup M₁'
inst✝¹² : Module R✝ M₁
inst✝¹¹ : Module R✝ M₁'
f₁ : M₁ →ₗ[R✝] M₁'
inst✝¹⁰ : IsLocalizedModule S✝ f₁
M₂ : Type ?u.1248876
M₂' : Type ?u.1248879
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₂'
inst✝⁷ : Module R✝ M₂
inst✝⁶ : Module R✝ M₂'
f₂ : M₂ →ₗ[R✝] M₂'
inst✝⁵ : IsLocalizedModule S✝ f₂
R : Type u_6
S : Type u_7
S' : Type u_8
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 ∈ M, IsUnit ((algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.2 • y = f x.1
h₃ : ∀ (x : S), f x = 0 ↔ ∃ m, m • x = 0
⊢ ∀ (x : ↥M), IsUnit ((algebraMap R (Module.End R S')) ↑x)

case surj'
R✝ : Type u_1
inst✝³¹ : CommSemiring 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''
A : Type u_5
inst✝²⁷ : CommSemiring A
inst✝²⁶ : Algebra R✝ A
inst✝²⁵ : Module A M'
inst✝²⁴ : IsLocalization S✝ A
inst✝²³ : Module R✝ M✝
inst✝²² : Module R✝ M'
inst✝²¹ : Module R✝ M''
inst✝²⁰ : IsScalarTower R✝ A M'
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
M₀ : Type ?u.1244734
M₀' : Type ?u.1244737
inst✝¹⁹ : AddCommGroup M₀
inst✝¹⁸ : AddCommGroup M₀'
inst✝¹⁷ : Module R✝ M₀
inst✝¹⁶ : Module R✝ M₀'
f₀ : M₀ →ₗ[R✝] M₀'
inst✝¹⁵ : IsLocalizedModule S✝ f₀
M₁ : Type ?u.1246805
M₁' : Type ?u.1246808
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : AddCommGroup M₁'
inst✝¹² : Module R✝ M₁
inst✝¹¹ : Module R✝ M₁'
f₁ : M₁ →ₗ[R✝] M₁'
inst✝¹⁰ : IsLocalizedModule S✝ f₁
M₂ : Type ?u.1248876
M₂' : Type ?u.1248879
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₂'
inst✝⁷ : Module R✝ M₂
inst✝⁶ : Module R✝ M₂'
f₂ : M₂ →ₗ[R✝] M₂'
inst✝⁵ : IsLocalizedModule S✝ f₂
R : Type u_6
S : Type u_7
S' : Type u_8
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 ∈ M, IsUnit ((algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.2 • y = f x.1
h₃ : ∀ (x : S), f x = 0 ↔ ∃ m, m • x = 0
⊢ ∀ (y : S'), ∃ x, x.2 • y = f.toLinearMap x.1

case exists_of_eq
R✝ : Type u_1
inst✝³¹ : CommSemiring 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''
A : Type u_5
inst✝²⁷ : CommSemiring A
inst✝²⁶ : Algebra R✝ A
inst✝²⁵ : Module A M'
inst✝²⁴ : IsLocalization S✝ A
inst✝²³ : Module R✝ M✝
inst✝²² : Module R✝ M'
inst✝²¹ : Module R✝ M''
inst✝²⁰ : IsScalarTower R✝ A M'
f✝ : M✝ →ₗ[R✝] M'
g : M✝ →ₗ[R✝] M''
M₀ : Type ?u.1244734
M₀' : Type ?u.1244737
inst✝¹⁹ : AddCommGroup M₀
inst✝¹⁸ : AddCommGroup M₀'
inst✝¹⁷ : Module R✝ M₀
inst✝¹⁶ : Module R✝ M₀'
f₀ : M₀ →ₗ[R✝] M₀'
inst✝¹⁵ : IsLocalizedModule S✝ f₀
M₁ : Type ?u.1246805
M₁' : Type ?u.1246808
inst✝¹⁴ : AddCommGroup M₁
inst✝¹³ : AddCommGroup M₁'
inst✝¹² : Module R✝ M₁
inst✝¹¹ : Module R✝ M₁'
f₁ : M₁ →ₗ[R✝] M₁'
inst✝¹⁰ : IsLocalizedModule S✝ f₁
M₂ : Type ?u.1248876
M₂' : Type ?u.1248879
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₂'
inst✝⁷ : Module R✝ M₂
inst✝⁶ : Module R✝ M₂'
f₂ : M₂ →ₗ[R✝] M₂'
inst✝⁵ : IsLocalizedModule S✝ f₂
R : Type u_6
S : Type u_7
S' : Type u_8
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 ∈ M, IsUnit ((algebraMap R S') x)
h₂ : ∀ (y : S'), ∃ x, x.2 • y = f x.1
h₃ : ∀ (x : S), f x = 0 ↔ ∃ m, m • x = 0
⊢ ∀ {x₁ x₂ : S}, f.toLinearMap x₁ = f.toLinearMap x₂ → ∃ c, c • x₁ = c • x₂
tactic: constructor