-- Mathlib/RingTheory/Kaehler/CotangentComplex.lean
lemma Cotangent.map_sub_map (f g : Hom P P') :
    map f - map g = (f.sub g) ∘ₗ P.cotangentComplex

Proof state:
case h.e.intro.a
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : ↥P.ker
⊢ P'.ker.cotangentEquivIdeal (mk ⟨f.toAlgHom ↑x, ⋯⟩ - mk ⟨g.toAlgHom ↑x, ⋯⟩).val =
    P'.ker.cotangentEquivIdeal (P'.ker.toCotangent ((f.subToKer g) ↑x))

Tactic:
ext

Result:
case h.e.intro.a.a
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : ↥P.ker
⊢ ↑(P'.ker.cotangentEquivIdeal (mk ⟨f.toAlgHom ↑x, ⋯⟩ - mk ⟨g.toAlgHom ↑x, ⋯⟩).val) =
    ↑(P'.ker.cotangentEquivIdeal (P'.ker.toCotangent ((f.subToKer g) ↑x)))

Proof state:
case h.e
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : P.Cotangent
⊢ ((map f - map g) x).val = ((f.sub g ∘ₗ P.cotangentComplex) x).val

Tactic:
obtain ⟨x, rfl⟩ := mk_surjective x

Result:
case h.e.intro
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : ↥P.ker
⊢ ((map f - map g) (mk x)).val = ((f.sub g ∘ₗ P.cotangentComplex) (mk x)).val

Proof state:
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
⊢ map f - map g = f.sub g ∘ₗ P.cotangentComplex

Tactic:
ext x

Result:
case h.e
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : P.Cotangent
⊢ ((map f - map g) x).val = ((f.sub g ∘ₗ P.cotangentComplex) x).val

Proof state:
case h.e.intro.a.a
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : ↥P.ker
⊢ (Ideal.Quotient.mk (P'.ker ^ 2)) (f.toAlgHom ↑x) - (Ideal.Quotient.mk (P'.ker ^ 2)) (g.toAlgHom ↑x) =
    (Ideal.Quotient.mk (P'.ker ^ 2)) (f.toRingHom ↑x) - (Ideal.Quotient.mk (P'.ker ^ 2)) (g.toRingHom ↑x)

Tactic:
rfl

Result:
no goals

Proof state:
case h.e.intro
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : ↥P.ker
⊢ (mk ⟨f.toAlgHom ↑x, ⋯⟩ - mk ⟨g.toAlgHom ↑x, ⋯⟩).val = P'.ker.toCotangent ((f.subToKer g) ↑x)

Tactic:
apply (Ideal.cotangentEquivIdeal _).injective

Result:
case h.e.intro.a
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : ↥P.ker
⊢ P'.ker.cotangentEquivIdeal (mk ⟨f.toAlgHom ↑x, ⋯⟩ - mk ⟨g.toAlgHom ↑x, ⋯⟩).val =
    P'.ker.cotangentEquivIdeal (P'.ker.toCotangent ((f.subToKer g) ↑x))

Proof state:
case h.e.intro
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : ↥P.ker
⊢ ((map f - map g) (mk x)).val = ((f.sub g ∘ₗ P.cotangentComplex) (mk x)).val

Tactic:
simp only [LinearMap.sub_apply, map_mk, LinearMap.coe_comp, Function.comp_apply,
  cotangentComplex_mk, Hom.sub_tmul, one_smul, val_mk]

Result:
case h.e.intro
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : ↥P.ker
⊢ (mk ⟨f.toAlgHom ↑x, ⋯⟩ - mk ⟨g.toAlgHom ↑x, ⋯⟩).val = P'.ker.toCotangent ((f.subToKer g) ↑x)

Proof state:
case h.e.intro.a.a
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : ↥P.ker
⊢ ↑(P'.ker.cotangentEquivIdeal (mk ⟨f.toAlgHom ↑x, ⋯⟩ - mk ⟨g.toAlgHom ↑x, ⋯⟩).val) =
    ↑(P'.ker.cotangentEquivIdeal (P'.ker.toCotangent ((f.subToKer g) ↑x)))

Tactic:
simp only [val_sub, val_mk, map_sub, AddSubgroupClass.coe_sub, Ideal.cotangentEquivIdeal_apply,
  Ideal.toCotangent_to_quotient_square, Submodule.mkQ_apply, Ideal.Quotient.mk_eq_mk,
  Hom.subToKer_apply_coe]

Result:
case h.e.intro.a.a
R : Type u
S : Type v
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Extension R S
R' : Type u'
S' : Type v'
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
inst✝⁵ : Algebra R' S'
P' : Extension R' S'
inst✝⁴ : Algebra R R'
inst✝³ : Algebra S S'
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R R' S'
inst✝ : IsScalarTower R S S'
f g : P.Hom P'
x : ↥P.ker
⊢ (Ideal.Quotient.mk (P'.ker ^ 2)) (f.toAlgHom ↑x) - (Ideal.Quotient.mk (P'.ker ^ 2)) (g.toAlgHom ↑x) =
    (Ideal.Quotient.mk (P'.ker ^ 2)) (f.toRingHom ↑x) - (Ideal.Quotient.mk (P'.ker ^ 2)) (g.toRingHom ↑x)