Theorem: Algebra.FormallyUnramified.iff_subsingleton_kaehlerDifferential
File: Mathlib/RingTheory/Unramified/Derivations.lean

tactic: constructor
state_before: R S : Type u
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
⊢ FormallyUnramified R S ↔ Subsingleton (Ω[S⁄R])
state_after: case mp
R S : Type u
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
⊢ FormallyUnramified R S → Subsingleton (Ω[S⁄R])

case mpr
R S : Type u
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
⊢ Subsingleton (Ω[S⁄R]) → FormallyUnramified R S

tactic: intros
state_before: case mp
R S : Type u
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
⊢ FormallyUnramified R S → Subsingleton (Ω[S⁄R])
state_after: case mp
R S : Type u
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
a✝ : FormallyUnramified R S
⊢ Subsingleton (Ω[S⁄R])

tactic: infer_instance
state_before: case mp
R S : Type u
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
a✝ : FormallyUnramified R S
⊢ Subsingleton (Ω[S⁄R])
state_after: no goals

tactic: intro H
state_before: case mpr
R S : Type u
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
⊢ Subsingleton (Ω[S⁄R]) → FormallyUnramified R S
state_after: case mpr
R S : Type u
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
H : Subsingleton (Ω[S⁄R])
⊢ FormallyUnramified R S

tactic: constructor
state_before: case mpr
R S : Type u
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
H : Subsingleton (Ω[S⁄R])
⊢ FormallyUnramified R S
state_after: case mpr.comp_injective
R S : Type u
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
H : Subsingleton (Ω[S⁄R])
⊢ ∀ ⦃B : Type u⦄ [inst : CommRing B] [inst_1 : Algebra R B] (I : Ideal B),
    I ^ 2 = ⊥ → Function.Injective (Ideal.Quotient.mkₐ R I).comp

tactic: intro B _ _ I hI f₁ f₂ e
state_before: case mpr.comp_injective
R S : Type u
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
H : Subsingleton (Ω[S⁄R])
⊢ ∀ ⦃B : Type u⦄ [inst : CommRing B] [inst_1 : Algebra R B] (I : Ideal B),
    I ^ 2 = ⊥ → Function.Injective (Ideal.Quotient.mkₐ R I).comp
state_after: case mpr.comp_injective
R S : Type u
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
H : Subsingleton (Ω[S⁄R])
B : Type u
inst✝¹ : CommRing B
inst✝ : Algebra R B
I : Ideal B
hI : I ^ 2 = ⊥
f₁ f₂ : S →ₐ[R] B
e : (Ideal.Quotient.mkₐ R I).comp f₁ = (Ideal.Quotient.mkₐ R I).comp f₂
⊢ f₁ = f₂

tactic: letI := f₁.toRingHom.toAlgebra
state_before: case mpr.comp_injective
R S : Type u
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
H : Subsingleton (Ω[S⁄R])
B : Type u
inst✝¹ : CommRing B
inst✝ : Algebra R B
I : Ideal B
hI : I ^ 2 = ⊥
f₁ f₂ : S →ₐ[R] B
e : (Ideal.Quotient.mkₐ R I).comp f₁ = (Ideal.Quotient.mkₐ R I).comp f₂
⊢ f₁ = f₂
state_after: case mpr.comp_injective
R S : Type u
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
H : Subsingleton (Ω[S⁄R])
B : Type u
inst✝¹ : CommRing B
inst✝ : Algebra R B
I : Ideal B
hI : I ^ 2 = ⊥
f₁ f₂ : S →ₐ[R] B
e : (Ideal.Quotient.mkₐ R I).comp f₁ = (Ideal.Quotient.mkₐ R I).comp f₂
this : Algebra S B := f₁.toAlgebra
⊢ f₁ = f₂

tactic: haveI := IsScalarTower.of_algebraMap_eq' f₁.comp_algebraMap.symm
state_before: case mpr.comp_injective
R S : Type u
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
H : Subsingleton (Ω[S⁄R])
B : Type u
inst✝¹ : CommRing B
inst✝ : Algebra R B
I : Ideal B
hI : I ^ 2 = ⊥
f₁ f₂ : S →ₐ[R] B
e : (Ideal.Quotient.mkₐ R I).comp f₁ = (Ideal.Quotient.mkₐ R I).comp f₂
this : Algebra S B := f₁.toAlgebra
⊢ f₁ = f₂
state_after: case mpr.comp_injective
R S : Type u
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
H : Subsingleton (Ω[S⁄R])
B : Type u
inst✝¹ : CommRing B
inst✝ : Algebra R B
I : Ideal B
hI : I ^ 2 = ⊥
f₁ f₂ : S →ₐ[R] B
e : (Ideal.Quotient.mkₐ R I).comp f₁ = (Ideal.Quotient.mkₐ R I).comp f₂
this✝ : Algebra S B := f₁.toAlgebra
this : IsScalarTower R S B
⊢ f₁ = f₂

tactic: have :=
  ((KaehlerDifferential.linearMapEquivDerivation R S).toEquiv.trans
        (derivationToSquareZeroEquivLift I hI)).surjective.subsingleton
state_before: case mpr.comp_injective
R S : Type u
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
H : Subsingleton (Ω[S⁄R])
B : Type u
inst✝¹ : CommRing B
inst✝ : Algebra R B
I : Ideal B
hI : I ^ 2 = ⊥
f₁ f₂ : S →ₐ[R] B
e : (Ideal.Quotient.mkₐ R I).comp f₁ = (Ideal.Quotient.mkₐ R I).comp f₂
this✝ : Algebra S B := f₁.toAlgebra
this : IsScalarTower R S B
⊢ f₁ = f₂
state_after: case mpr.comp_injective
R S : Type u
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
H : Subsingleton (Ω[S⁄R])
B : Type u
inst✝¹ : CommRing B
inst✝ : Algebra R B
I : Ideal B
hI : I ^ 2 = ⊥
f₁ f₂ : S →ₐ[R] B
e : (Ideal.Quotient.mkₐ R I).comp f₁ = (Ideal.Quotient.mkₐ R I).comp f₂
this✝¹ : Algebra S B := f₁.toAlgebra
this✝ : IsScalarTower R S B
this : Subsingleton { f // (Ideal.Quotient.mkₐ R I).comp f = IsScalarTower.toAlgHom R S (B ⧸ I) }
⊢ f₁ = f₂

tactic: exact Subtype.ext_iff.mp (@Subsingleton.elim _ this ⟨f₁, rfl⟩ ⟨f₂, e.symm⟩)
state_before: case mpr.comp_injective
R S : Type u
inst✝⁴ : CommRing R
inst✝³ : CommRing S
inst✝² : Algebra R S
H : Subsingleton (Ω[S⁄R])
B : Type u
inst✝¹ : CommRing B
inst✝ : Algebra R B
I : Ideal B
hI : I ^ 2 = ⊥
f₁ f₂ : S →ₐ[R] B
e : (Ideal.Quotient.mkₐ R I).comp f₁ = (Ideal.Quotient.mkₐ R I).comp f₂
this✝¹ : Algebra S B := f₁.toAlgebra
this✝ : IsScalarTower R S B
this : Subsingleton { f // (Ideal.Quotient.mkₐ R I).comp f = IsScalarTower.toAlgHom R S (B ⧸ I) }
⊢ f₁ = f₂
state_after: no goals