Theorem: Algebra.FormallySmooth.localization_base
File: Mathlib/RingTheory/Smooth/Basic.lean

Proof steps:
state_before: R S Rₘ Sₘ : Type u
inst✝¹³ : CommRing R
inst✝¹² : CommRing S
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : CommRing Sₘ
M : Submonoid R
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R Sₘ
inst✝⁷ : Algebra S Sₘ
inst✝⁶ : Algebra R Rₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : IsScalarTower R Rₘ Sₘ
inst✝³ : IsScalarTower R S Sₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝ : FormallySmooth R Sₘ
⊢ FormallySmooth Rₘ Sₘ
state_after: case comp_surjective
R S Rₘ Sₘ : Type u
inst✝¹³ : CommRing R
inst✝¹² : CommRing S
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : CommRing Sₘ
M : Submonoid R
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R Sₘ
inst✝⁷ : Algebra S Sₘ
inst✝⁶ : Algebra R Rₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : IsScalarTower R Rₘ Sₘ
inst✝³ : IsScalarTower R S Sₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝ : FormallySmooth R Sₘ
⊢ ∀ ⦃B : Type u⦄ [inst : CommRing B] [inst_1 : Algebra Rₘ B] (I : Ideal B),
    I ^ 2 = ⊥ → Function.Surjective (Ideal.Quotient.mkₐ Rₘ I).comp
tactic: constructor
state_before: case comp_surjective
R S Rₘ Sₘ : Type u
inst✝¹³ : CommRing R
inst✝¹² : CommRing S
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : CommRing Sₘ
M : Submonoid R
inst✝⁹ : Algebra R S
inst✝⁸ : Algebra R Sₘ
inst✝⁷ : Algebra S Sₘ
inst✝⁶ : Algebra R Rₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : IsScalarTower R Rₘ Sₘ
inst✝³ : IsScalarTower R S Sₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝ : FormallySmooth R Sₘ
⊢ ∀ ⦃B : Type u⦄ [inst : CommRing B] [inst_1 : Algebra Rₘ B] (I : Ideal B),
    I ^ 2 = ⊥ → Function.Surjective (Ideal.Quotient.mkₐ Rₘ I).comp
state_after: case comp_surjective
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f : Sₘ →ₐ[Rₘ] Q ⧸ I
⊢ ∃ a, (Ideal.Quotient.mkₐ Rₘ I).comp a = f
tactic: intro Q _ _ I e f
state_before: case comp_surjective
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f : Sₘ →ₐ[Rₘ] Q ⧸ I
⊢ ∃ a, (Ideal.Quotient.mkₐ Rₘ I).comp a = f
state_after: case comp_surjective
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f : Sₘ →ₐ[Rₘ] Q ⧸ I
this : Algebra R Q := ((algebraMap Rₘ Q).comp (algebraMap R Rₘ)).toAlgebra
⊢ ∃ a, (Ideal.Quotient.mkₐ Rₘ I).comp a = f
tactic: letI := ((algebraMap Rₘ Q).comp (algebraMap R Rₘ)).toAlgebra
state_before: case comp_surjective
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f : Sₘ →ₐ[Rₘ] Q ⧸ I
this : Algebra R Q := ((algebraMap Rₘ Q).comp (algebraMap R Rₘ)).toAlgebra
⊢ ∃ a, (Ideal.Quotient.mkₐ Rₘ I).comp a = f
state_after: case comp_surjective
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f : Sₘ →ₐ[Rₘ] Q ⧸ I
this✝ : Algebra R Q := ((algebraMap Rₘ Q).comp (algebraMap R Rₘ)).toAlgebra
this : IsScalarTower R Rₘ Q := IsScalarTower.of_algebraMap_eq' rfl
⊢ ∃ a, (Ideal.Quotient.mkₐ Rₘ I).comp a = f
tactic: letI : IsScalarTower R Rₘ Q := IsScalarTower.of_algebraMap_eq' rfl
state_before: case comp_surjective
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f : Sₘ →ₐ[Rₘ] Q ⧸ I
this✝ : Algebra R Q := ((algebraMap Rₘ Q).comp (algebraMap R Rₘ)).toAlgebra
this : IsScalarTower R Rₘ Q := IsScalarTower.of_algebraMap_eq' rfl
⊢ ∃ a, (Ideal.Quotient.mkₐ Rₘ I).comp a = f
state_after: case comp_surjective
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f✝ : Sₘ →ₐ[Rₘ] Q ⧸ I
this✝ : Algebra R Q := ((algebraMap Rₘ Q).comp (algebraMap R Rₘ)).toAlgebra
this : IsScalarTower R Rₘ Q := IsScalarTower.of_algebraMap_eq' rfl
f : Sₘ →ₐ[Rₘ] Q :=
  let __src := lift I ⋯ (AlgHom.restrictScalars R f✝);
  { toRingHom := __src.toRingHom, commutes' := ⋯ }
⊢ ∃ a, (Ideal.Quotient.mkₐ Rₘ I).comp a = f✝
tactic: let f : Sₘ →ₐ[Rₘ] Q := by
    refine { FormallySmooth.lift I ⟨2, e⟩ (f.restrictScalars R) with commutes' := ?_ }
    intro r
    change
      (RingHom.comp (FormallySmooth.lift I ⟨2, e⟩ (f.restrictScalars R) : Sₘ →+* Q)
            (algebraMap _ _))
          r =
        algebraMap _ _ r
    congr 1
    refine IsLocalization.ringHom_ext M ?_
    rw [RingHom.comp_assoc, ← IsScalarTower.algebraMap_eq, ← IsScalarTower.algebraMap_eq,
      AlgHom.comp_algebraMap]
state_before: case comp_surjective
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f✝ : Sₘ →ₐ[Rₘ] Q ⧸ I
this✝ : Algebra R Q := ((algebraMap Rₘ Q).comp (algebraMap R Rₘ)).toAlgebra
this : IsScalarTower R Rₘ Q := IsScalarTower.of_algebraMap_eq' rfl
f : Sₘ →ₐ[Rₘ] Q :=
  let __src := lift I ⋯ (AlgHom.restrictScalars R f✝);
  { toRingHom := __src.toRingHom, commutes' := ⋯ }
⊢ ∃ a, (Ideal.Quotient.mkₐ Rₘ I).comp a = f✝
state_after: case h
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f✝ : Sₘ →ₐ[Rₘ] Q ⧸ I
this✝ : Algebra R Q := ((algebraMap Rₘ Q).comp (algebraMap R Rₘ)).toAlgebra
this : IsScalarTower R Rₘ Q := IsScalarTower.of_algebraMap_eq' rfl
f : Sₘ →ₐ[Rₘ] Q :=
  let __src := lift I ⋯ (AlgHom.restrictScalars R f✝);
  { toRingHom := __src.toRingHom, commutes' := ⋯ }
⊢ (Ideal.Quotient.mkₐ Rₘ I).comp f = f✝
tactic: use f
state_before: case h
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f✝ : Sₘ →ₐ[Rₘ] Q ⧸ I
this✝ : Algebra R Q := ((algebraMap Rₘ Q).comp (algebraMap R Rₘ)).toAlgebra
this : IsScalarTower R Rₘ Q := IsScalarTower.of_algebraMap_eq' rfl
f : Sₘ →ₐ[Rₘ] Q :=
  let __src := lift I ⋯ (AlgHom.restrictScalars R f✝);
  { toRingHom := __src.toRingHom, commutes' := ⋯ }
⊢ (Ideal.Quotient.mkₐ Rₘ I).comp f = f✝
state_after: case h.H
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f✝ : Sₘ →ₐ[Rₘ] Q ⧸ I
this✝ : Algebra R Q := ((algebraMap Rₘ Q).comp (algebraMap R Rₘ)).toAlgebra
this : IsScalarTower R Rₘ Q := IsScalarTower.of_algebraMap_eq' rfl
f : Sₘ →ₐ[Rₘ] Q :=
  let __src := lift I ⋯ (AlgHom.restrictScalars R f✝);
  { toRingHom := __src.toRingHom, commutes' := ⋯ }
x✝ : Sₘ
⊢ ((Ideal.Quotient.mkₐ Rₘ I).comp f) x✝ = f✝ x✝
tactic: ext
state_before: case h.H
R S Rₘ Sₘ : Type u
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : CommRing Rₘ
inst✝¹² : CommRing Sₘ
M : Submonoid R
inst✝¹¹ : Algebra R S
inst✝¹⁰ : Algebra R Sₘ
inst✝⁹ : Algebra S Sₘ
inst✝⁸ : Algebra R Rₘ
inst✝⁷ : Algebra Rₘ Sₘ
inst✝⁶ : IsScalarTower R Rₘ Sₘ
inst✝⁵ : IsScalarTower R S Sₘ
inst✝⁴ : IsLocalization M Rₘ
inst✝³ : IsLocalization (Submonoid.map (algebraMap R S) M) Sₘ
inst✝² : FormallySmooth R Sₘ
Q : Type u
inst✝¹ : CommRing Q
inst✝ : Algebra Rₘ Q
I : Ideal Q
e : I ^ 2 = ⊥
f✝ : Sₘ →ₐ[Rₘ] Q ⧸ I
this✝ : Algebra R Q := ((algebraMap Rₘ Q).comp (algebraMap R Rₘ)).toAlgebra
this : IsScalarTower R Rₘ Q := IsScalarTower.of_algebraMap_eq' rfl
f : Sₘ →ₐ[Rₘ] Q :=
  let __src := lift I ⋯ (AlgHom.restrictScalars R f✝);
  { toRingHom := __src.toRingHom, commutes' := ⋯ }
x✝ : Sₘ
⊢ ((Ideal.Quotient.mkₐ Rₘ I).comp f) x✝ = f✝ x✝
state_after: no goals
tactic: simp [f]