Theorem: RingHom.surjectiveOnStalks_iff_of_isLocalRingHom
File: Mathlib/RingTheory/SurjectiveOnStalks.lean

Proof steps:
state_before: R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
⊢ f.SurjectiveOnStalks ↔ Function.Surjective ⇑f
state_after: R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
⊢ ∃ a, f a = x
tactic: refine ⟨fun H x ↦ ?_, fun h ↦ surjectiveOnStalks_of_surjective h⟩
state_before: R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
⊢ ∃ a, f a = x
state_after: case intro.intro.intro.intro.intro
R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
y r : R
c : S
hc : c ∉ LocalRing.maximalIdeal S
hr : f r ∉ LocalRing.maximalIdeal S
e : c * f r * x = c * f y
⊢ ∃ a, f a = x
tactic: obtain ⟨y, r, c, hc, hr, e⟩ :=
    (surjective_localRingHom_iff _).mp (H (LocalRing.maximalIdeal _) inferInstance) x
state_before: case intro.intro.intro.intro.intro
R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
y r : R
c : S
hc : c ∉ LocalRing.maximalIdeal S
hr : f r ∉ LocalRing.maximalIdeal S
e : c * f r * x = c * f y
⊢ ∃ a, f a = x
state_after: case intro.intro.intro.intro.intro
R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
y r : R
c : S
e : c * f r * x = c * f y
hc : IsUnit c
hr : IsUnit (f r)
⊢ ∃ a, f a = x
tactic: simp only [LocalRing.mem_maximalIdeal, mem_nonunits_iff, not_not] at hc hr
state_before: case intro.intro.intro.intro.intro
R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
y r : R
c : S
e : c * f r * x = c * f y
hc : IsUnit c
hr : IsUnit (f r)
⊢ ∃ a, f a = x
state_after: case intro.intro.intro.intro.intro
R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
y r : R
c : S
e : c * f r * x = c * f y
hc : IsUnit c
hr : IsUnit (f r)
⊢ f (↑⋯.unit⁻¹ * y) = x
tactic: refine ⟨(isUnit_of_map_unit f r hr).unit⁻¹ * y, ?_⟩
state_before: case intro.intro.intro.intro.intro
R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
y r : R
c : S
e : c * f r * x = c * f y
hc : IsUnit c
hr : IsUnit (f r)
⊢ f (↑⋯.unit⁻¹ * y) = x
state_after: case intro.intro.intro.intro.intro.a
R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
y r : R
c : S
e : c * f r * x = c * f y
hc : IsUnit c
hr : IsUnit (f r)
⊢ (fun x => f r * x) (f (↑⋯.unit⁻¹ * y)) = (fun x => f r * x) x
tactic: apply hr.mul_right_injective
state_before: case intro.intro.intro.intro.intro.a
R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
y r : R
c : S
e : c * f r * x = c * f y
hc : IsUnit c
hr : IsUnit (f r)
⊢ (fun x => f r * x) (f (↑⋯.unit⁻¹ * y)) = (fun x => f r * x) x
state_after: case intro.intro.intro.intro.intro.a.a
R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
y r : R
c : S
e : c * f r * x = c * f y
hc : IsUnit c
hr : IsUnit (f r)
⊢ (fun x => c * x) ((fun x => f r * x) (f (↑⋯.unit⁻¹ * y))) = (fun x => c * x) ((fun x => f r * x) x)
tactic: apply hc.mul_right_injective
state_before: case intro.intro.intro.intro.intro.a.a
R : Type u_1
inst✝⁸ : CommRing R
M : Submonoid R
S : Type u_2
inst✝⁷ : CommRing S
inst✝⁶ : Algebra R S
T : Type u_3
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
g : S →+* T
f : R →+* S
inst✝¹ : LocalRing S
inst✝ : IsLocalRingHom f
H : f.SurjectiveOnStalks
x : S
y r : R
c : S
e : c * f r * x = c * f y
hc : IsUnit c
hr : IsUnit (f r)
⊢ (fun x => c * x) ((fun x => f r * x) (f (↑⋯.unit⁻¹ * y))) = (fun x => c * x) ((fun x => f r * x) x)
state_after: no goals
tactic: simp only [← _root_.map_mul, ← mul_assoc, IsUnit.mul_val_inv, one_mul, e]