-- Mathlib/RingTheory/Ideal/Cotangent.lean
theorem _root_.AlgHom.ker_kerSquareLift (f : A →ₐ[R] B) :
    RingHom.ker f.kerSquareLift.toRingHom = f.toRingHom.ker.cotangentIdeal

Proof state:
case a
R : Type u
inst✝⁴ : CommRing R
A : Type u_1
B : Type u_2
inst✝³ : CommRing A
inst✝² : CommRing B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : A →ₐ[R] B
⊢ RingHom.ker f.kerSquareLift.toRingHom ≤ (RingHom.ker f.toRingHom).cotangentIdeal

Tactic:
intro x hx

Result:
case a
R : Type u
inst✝⁴ : CommRing R
A : Type u_1
B : Type u_2
inst✝³ : CommRing A
inst✝² : CommRing B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : A →ₐ[R] B
x : A ⧸ RingHom.ker f.toRingHom ^ 2
hx : x ∈ RingHom.ker f.kerSquareLift.toRingHom
⊢ x ∈ (RingHom.ker f.toRingHom).cotangentIdeal

Proof state:
case a
R : Type u
inst✝⁴ : CommRing R
A : Type u_1
B : Type u_2
inst✝³ : CommRing A
inst✝² : CommRing B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : A →ₐ[R] B
x : A ⧸ RingHom.ker f.toRingHom ^ 2
hx : x ∈ RingHom.ker f.kerSquareLift.toRingHom
⊢ x ∈ (RingHom.ker f.toRingHom).cotangentIdeal

Tactic:
obtain ⟨x, rfl⟩ := Ideal.Quotient.mk_surjective x

Result:
case a.intro
R : Type u
inst✝⁴ : CommRing R
A : Type u_1
B : Type u_2
inst✝³ : CommRing A
inst✝² : CommRing B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : A →ₐ[R] B
x : A
hx : (Quotient.mk (RingHom.ker f.toRingHom ^ 2)) x ∈ RingHom.ker f.kerSquareLift.toRingHom
⊢ (Quotient.mk (RingHom.ker f.toRingHom ^ 2)) x ∈ (RingHom.ker f.toRingHom).cotangentIdeal

Proof state:
R : Type u
inst✝⁴ : CommRing R
A : Type u_1
B : Type u_2
inst✝³ : CommRing A
inst✝² : CommRing B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : A →ₐ[R] B
⊢ RingHom.ker f.kerSquareLift.toRingHom = (RingHom.ker f.toRingHom).cotangentIdeal

Tactic:
apply le_antisymm

Result:
case a
R : Type u
inst✝⁴ : CommRing R
A : Type u_1
B : Type u_2
inst✝³ : CommRing A
inst✝² : CommRing B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : A →ₐ[R] B
⊢ RingHom.ker f.kerSquareLift.toRingHom ≤ (RingHom.ker f.toRingHom).cotangentIdeal

case a
R : Type u
inst✝⁴ : CommRing R
A : Type u_1
B : Type u_2
inst✝³ : CommRing A
inst✝² : CommRing B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : A →ₐ[R] B
⊢ (RingHom.ker f.toRingHom).cotangentIdeal ≤ RingHom.ker f.kerSquareLift.toRingHom

Proof state:
case a.intro.intro
R : Type u
inst✝⁴ : CommRing R
A : Type u_1
B : Type u_2
inst✝³ : CommRing A
inst✝² : CommRing B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : A →ₐ[R] B
x : A
hx : x ∈ ↑(RingHom.ker f.toRingHom)
⊢ (Quotient.mk (RingHom.ker f.toRingHom ^ 2)).toSemilinearMap x ∈ RingHom.ker f.kerSquareLift.toRingHom

Tactic:
exact hx

Result:
no goals

Proof state:
case a
R : Type u
inst✝⁴ : CommRing R
A : Type u_1
B : Type u_2
inst✝³ : CommRing A
inst✝² : CommRing B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : A →ₐ[R] B
⊢ (RingHom.ker f.toRingHom).cotangentIdeal ≤ RingHom.ker f.kerSquareLift.toRingHom

Tactic:
rintro _ ⟨x, hx, rfl⟩

Result:
case a.intro.intro
R : Type u
inst✝⁴ : CommRing R
A : Type u_1
B : Type u_2
inst✝³ : CommRing A
inst✝² : CommRing B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : A →ₐ[R] B
x : A
hx : x ∈ ↑(RingHom.ker f.toRingHom)
⊢ (Quotient.mk (RingHom.ker f.toRingHom ^ 2)).toSemilinearMap x ∈ RingHom.ker f.kerSquareLift.toRingHom

Proof state:
case a.intro
R : Type u
inst✝⁴ : CommRing R
A : Type u_1
B : Type u_2
inst✝³ : CommRing A
inst✝² : CommRing B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : A →ₐ[R] B
x : A
hx : (Quotient.mk (RingHom.ker f.toRingHom ^ 2)) x ∈ RingHom.ker f.kerSquareLift.toRingHom
⊢ (Quotient.mk (RingHom.ker f.toRingHom ^ 2)) x ∈ (RingHom.ker f.toRingHom).cotangentIdeal

Tactic:
exact ⟨x, hx, rfl⟩

Result:
no goals