[GOAL]
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : Algebra R S
a : S
⊢ 1 ⊗ₜ[R] a - a ⊗ₜ[R] 1 ∈ ideal R S
[PROOFSTEP]
simp [RingHom.mem_ker]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
⊢ ↑(tensorProductTo D) (x * y) =
    ↑(TensorProduct.lmul' R) x • ↑(tensorProductTo D) y + ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) x
[PROOFSTEP]
refine TensorProduct.induction_on x ?_ ?_ ?_
[GOAL]
case refine_1
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
⊢ ↑(tensorProductTo D) (0 * y) =
    ↑(TensorProduct.lmul' R) 0 • ↑(tensorProductTo D) y + ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) 0
[PROOFSTEP]
rw [zero_mul, map_zero, map_zero, zero_smul, smul_zero, add_zero]
[GOAL]
case refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
⊢ ∀ (x y_1 : S),
    ↑(tensorProductTo D) (x ⊗ₜ[R] y_1 * y) =
      ↑(TensorProduct.lmul' R) (x ⊗ₜ[R] y_1) • ↑(tensorProductTo D) y +
        ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) (x ⊗ₜ[R] y_1)
case refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
⊢ ∀ (x y_1 : S ⊗[R] S),
    ↑(tensorProductTo D) (x * y) =
        ↑(TensorProduct.lmul' R) x • ↑(tensorProductTo D) y + ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) x →
      ↑(tensorProductTo D) (y_1 * y) =
          ↑(TensorProduct.lmul' R) y_1 • ↑(tensorProductTo D) y +
            ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) y_1 →
        ↑(tensorProductTo D) ((x + y_1) * y) =
          ↑(TensorProduct.lmul' R) (x + y_1) • ↑(tensorProductTo D) y +
            ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) (x + y_1)
[PROOFSTEP]
swap
[GOAL]
case refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
⊢ ∀ (x y_1 : S ⊗[R] S),
    ↑(tensorProductTo D) (x * y) =
        ↑(TensorProduct.lmul' R) x • ↑(tensorProductTo D) y + ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) x →
      ↑(tensorProductTo D) (y_1 * y) =
          ↑(TensorProduct.lmul' R) y_1 • ↑(tensorProductTo D) y +
            ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) y_1 →
        ↑(tensorProductTo D) ((x + y_1) * y) =
          ↑(TensorProduct.lmul' R) (x + y_1) • ↑(tensorProductTo D) y +
            ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) (x + y_1)
[PROOFSTEP]
intro x₁ y₁ h₁ h₂
[GOAL]
case refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y x₁ y₁ : S ⊗[R] S
h₁ :
  ↑(tensorProductTo D) (x₁ * y) =
    ↑(TensorProduct.lmul' R) x₁ • ↑(tensorProductTo D) y + ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) x₁
h₂ :
  ↑(tensorProductTo D) (y₁ * y) =
    ↑(TensorProduct.lmul' R) y₁ • ↑(tensorProductTo D) y + ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) y₁
⊢ ↑(tensorProductTo D) ((x₁ + y₁) * y) =
    ↑(TensorProduct.lmul' R) (x₁ + y₁) • ↑(tensorProductTo D) y +
      ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) (x₁ + y₁)
[PROOFSTEP]
rw [add_mul, map_add, map_add, map_add, add_smul, smul_add, h₁, h₂, add_add_add_comm]
[GOAL]
case refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
⊢ ∀ (x y_1 : S),
    ↑(tensorProductTo D) (x ⊗ₜ[R] y_1 * y) =
      ↑(TensorProduct.lmul' R) (x ⊗ₜ[R] y_1) • ↑(tensorProductTo D) y +
        ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) (x ⊗ₜ[R] y_1)
[PROOFSTEP]
intro x₁ x₂
[GOAL]
case refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
x₁ x₂ : S
⊢ ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂ * y) =
    ↑(TensorProduct.lmul' R) (x₁ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) y +
      ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂)
[PROOFSTEP]
refine TensorProduct.induction_on y ?_ ?_ ?_
[GOAL]
case refine_2.refine_1
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
x₁ x₂ : S
⊢ ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂ * 0) =
    ↑(TensorProduct.lmul' R) (x₁ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) 0 +
      ↑(TensorProduct.lmul' R) 0 • ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂)
[PROOFSTEP]
rw [mul_zero, map_zero, map_zero, zero_smul, smul_zero, add_zero]
[GOAL]
case refine_2.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
x₁ x₂ : S
⊢ ∀ (x y : S),
    ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂ * x ⊗ₜ[R] y) =
      ↑(TensorProduct.lmul' R) (x₁ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) (x ⊗ₜ[R] y) +
        ↑(TensorProduct.lmul' R) (x ⊗ₜ[R] y) • ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂)
case refine_2.refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
x₁ x₂ : S
⊢ ∀ (x y : S ⊗[R] S),
    ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂ * x) =
        ↑(TensorProduct.lmul' R) (x₁ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) x +
          ↑(TensorProduct.lmul' R) x • ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂) →
      ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂ * y) =
          ↑(TensorProduct.lmul' R) (x₁ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) y +
            ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂) →
        ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂ * (x + y)) =
          ↑(TensorProduct.lmul' R) (x₁ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) (x + y) +
            ↑(TensorProduct.lmul' R) (x + y) • ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂)
[PROOFSTEP]
swap
[GOAL]
case refine_2.refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
x₁ x₂ : S
⊢ ∀ (x y : S ⊗[R] S),
    ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂ * x) =
        ↑(TensorProduct.lmul' R) (x₁ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) x +
          ↑(TensorProduct.lmul' R) x • ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂) →
      ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂ * y) =
          ↑(TensorProduct.lmul' R) (x₁ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) y +
            ↑(TensorProduct.lmul' R) y • ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂) →
        ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂ * (x + y)) =
          ↑(TensorProduct.lmul' R) (x₁ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) (x + y) +
            ↑(TensorProduct.lmul' R) (x + y) • ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂)
[PROOFSTEP]
intro x₁ y₁ h₁ h₂
[GOAL]
case refine_2.refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
x₁✝ x₂ : S
x₁ y₁ : S ⊗[R] S
h₁ :
  ↑(tensorProductTo D) (x₁✝ ⊗ₜ[R] x₂ * x₁) =
    ↑(TensorProduct.lmul' R) (x₁✝ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) x₁ +
      ↑(TensorProduct.lmul' R) x₁ • ↑(tensorProductTo D) (x₁✝ ⊗ₜ[R] x₂)
h₂ :
  ↑(tensorProductTo D) (x₁✝ ⊗ₜ[R] x₂ * y₁) =
    ↑(TensorProduct.lmul' R) (x₁✝ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) y₁ +
      ↑(TensorProduct.lmul' R) y₁ • ↑(tensorProductTo D) (x₁✝ ⊗ₜ[R] x₂)
⊢ ↑(tensorProductTo D) (x₁✝ ⊗ₜ[R] x₂ * (x₁ + y₁)) =
    ↑(TensorProduct.lmul' R) (x₁✝ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) (x₁ + y₁) +
      ↑(TensorProduct.lmul' R) (x₁ + y₁) • ↑(tensorProductTo D) (x₁✝ ⊗ₜ[R] x₂)
[PROOFSTEP]
rw [mul_add, map_add, map_add, map_add, add_smul, smul_add, h₁, h₂, add_add_add_comm]
[GOAL]
case refine_2.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x y : S ⊗[R] S
x₁ x₂ : S
⊢ ∀ (x y : S),
    ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂ * x ⊗ₜ[R] y) =
      ↑(TensorProduct.lmul' R) (x₁ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) (x ⊗ₜ[R] y) +
        ↑(TensorProduct.lmul' R) (x ⊗ₜ[R] y) • ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂)
[PROOFSTEP]
intro x y
[GOAL]
case refine_2.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x✝ y✝ : S ⊗[R] S
x₁ x₂ x y : S
⊢ ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂ * x ⊗ₜ[R] y) =
    ↑(TensorProduct.lmul' R) (x₁ ⊗ₜ[R] x₂) • ↑(tensorProductTo D) (x ⊗ₜ[R] y) +
      ↑(TensorProduct.lmul' R) (x ⊗ₜ[R] y) • ↑(tensorProductTo D) (x₁ ⊗ₜ[R] x₂)
[PROOFSTEP]
simp only [TensorProduct.tmul_mul_tmul, Derivation.tensorProductTo, TensorProduct.AlgebraTensorModule.lift_apply,
  TensorProduct.lift.tmul', TensorProduct.lmul'_apply_tmul]
[GOAL]
case refine_2.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x✝ y✝ : S ⊗[R] S
x₁ x₂ x y : S
⊢ ↑(TensorProduct.lift (↑R (↑(LinearMap.flip (LinearMap.lsmul S (S →ₗ[R] M))) ↑D))) ((x₁ * x) ⊗ₜ[R] (x₂ * y)) =
    (x₁ * x₂) • ↑(TensorProduct.lift (↑R (↑(LinearMap.flip (LinearMap.lsmul S (S →ₗ[R] M))) ↑D))) (x ⊗ₜ[R] y) +
      (x * y) • ↑(TensorProduct.lift (↑R (↑(LinearMap.flip (LinearMap.lsmul S (S →ₗ[R] M))) ↑D))) (x₁ ⊗ₜ[R] x₂)
[PROOFSTEP]
dsimp
[GOAL]
case refine_2.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x✝ y✝ : S ⊗[R] S
x₁ x₂ x y : S
⊢ (x₁ * x) • ↑D (x₂ * y) = (x₁ * x₂) • x • ↑D y + (x * y) • x₁ • ↑D x₂
[PROOFSTEP]
rw [D.leibniz]
[GOAL]
case refine_2.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x✝ y✝ : S ⊗[R] S
x₁ x₂ x y : S
⊢ (x₁ * x) • (x₂ • ↑D y + y • ↑D x₂) = (x₁ * x₂) • x • ↑D y + (x * y) • x₁ • ↑D x₂
[PROOFSTEP]
simp only [smul_smul, smul_add, mul_comm (x * y) x₁, mul_right_comm x₁ x₂, ← mul_assoc]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) = Submodule.restrictScalars S (ideal R S)
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) ≤ Submodule.restrictScalars S (ideal R S)
[PROOFSTEP]
rw [Submodule.span_le]
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) ⊆ ↑(Submodule.restrictScalars S (ideal R S))
[PROOFSTEP]
rintro _ ⟨s, rfl⟩
[GOAL]
case a.intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
s : S
⊢ (fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) s ∈ ↑(Submodule.restrictScalars S (ideal R S))
[PROOFSTEP]
exact KaehlerDifferential.one_smul_sub_smul_one_mem_ideal _ _
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Submodule.restrictScalars S (ideal R S) ≤ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
rintro x (hx : _ = _)
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : ↑(TensorProduct.lmul' R) x = 0
⊢ x ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
have : x - TensorProduct.lmul' (S := S) R x ⊗ₜ[R] (1 : S) = x := by rw [hx, TensorProduct.zero_tmul, sub_zero]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : ↑(TensorProduct.lmul' R) x = 0
⊢ x - ↑(TensorProduct.lmul' R) x ⊗ₜ[R] 1 = x
[PROOFSTEP]
rw [hx, TensorProduct.zero_tmul, sub_zero]
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : ↑(TensorProduct.lmul' R) x = 0
this : x - ↑(TensorProduct.lmul' R) x ⊗ₜ[R] 1 = x
⊢ x ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
rw [← this]
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : ↑(TensorProduct.lmul' R) x = 0
this : x - ↑(TensorProduct.lmul' R) x ⊗ₜ[R] 1 = x
⊢ x - ↑(TensorProduct.lmul' R) x ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
clear this hx
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
⊢ x - ↑(TensorProduct.lmul' R) x ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
refine TensorProduct.induction_on x ?_ ?_ ?_
[GOAL]
case a.refine_1
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
⊢ 0 - ↑(TensorProduct.lmul' R) 0 ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
rw [map_zero, TensorProduct.zero_tmul, sub_zero]
[GOAL]
case a.refine_1
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
⊢ 0 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
exact zero_mem _
[GOAL]
case a.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
⊢ ∀ (x y : S),
    x ⊗ₜ[R] y - ↑(TensorProduct.lmul' R) (x ⊗ₜ[R] y) ⊗ₜ[R] 1 ∈
      Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
intro x y
[GOAL]
case a.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ : S ⊗[R] S
x y : S
⊢ x ⊗ₜ[R] y - ↑(TensorProduct.lmul' R) (x ⊗ₜ[R] y) ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
have : x ⊗ₜ[R] y - (x * y) ⊗ₜ[R] (1 : S) = x • ((1 : S) ⊗ₜ y - y ⊗ₜ (1 : S)) := by
  simp_rw [smul_sub, TensorProduct.smul_tmul', smul_eq_mul, mul_one]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ : S ⊗[R] S
x y : S
⊢ x ⊗ₜ[R] y - (x * y) ⊗ₜ[R] 1 = x • (1 ⊗ₜ[R] y - y ⊗ₜ[R] 1)
[PROOFSTEP]
simp_rw [smul_sub, TensorProduct.smul_tmul', smul_eq_mul, mul_one]
[GOAL]
case a.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ : S ⊗[R] S
x y : S
this : x ⊗ₜ[R] y - (x * y) ⊗ₜ[R] 1 = x • (1 ⊗ₜ[R] y - y ⊗ₜ[R] 1)
⊢ x ⊗ₜ[R] y - ↑(TensorProduct.lmul' R) (x ⊗ₜ[R] y) ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
rw [TensorProduct.lmul'_apply_tmul, this]
[GOAL]
case a.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ : S ⊗[R] S
x y : S
this : x ⊗ₜ[R] y - (x * y) ⊗ₜ[R] 1 = x • (1 ⊗ₜ[R] y - y ⊗ₜ[R] 1)
⊢ x • (1 ⊗ₜ[R] y - y ⊗ₜ[R] 1) ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
refine Submodule.smul_mem _ x ?_
[GOAL]
case a.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ : S ⊗[R] S
x y : S
this : x ⊗ₜ[R] y - (x * y) ⊗ₜ[R] 1 = x • (1 ⊗ₜ[R] y - y ⊗ₜ[R] 1)
⊢ 1 ⊗ₜ[R] y - y ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
apply Submodule.subset_span
[GOAL]
case a.refine_2.a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ : S ⊗[R] S
x y : S
this : x ⊗ₜ[R] y - (x * y) ⊗ₜ[R] 1 = x • (1 ⊗ₜ[R] y - y ⊗ₜ[R] 1)
⊢ 1 ⊗ₜ[R] y - y ⊗ₜ[R] 1 ∈ Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1
[PROOFSTEP]
exact Set.mem_range_self y
[GOAL]
case a.refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
⊢ ∀ (x y : S ⊗[R] S),
    x - ↑(TensorProduct.lmul' R) x ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) →
      y - ↑(TensorProduct.lmul' R) y ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) →
        x + y - ↑(TensorProduct.lmul' R) (x + y) ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
intro x y hx hy
[GOAL]
case a.refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ x y : S ⊗[R] S
hx : x - ↑(TensorProduct.lmul' R) x ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
hy : y - ↑(TensorProduct.lmul' R) y ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
⊢ x + y - ↑(TensorProduct.lmul' R) (x + y) ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
rw [map_add, TensorProduct.add_tmul, ← sub_add_sub_comm]
[GOAL]
case a.refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ x y : S ⊗[R] S
hx : x - ↑(TensorProduct.lmul' R) x ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
hy : y - ↑(TensorProduct.lmul' R) y ⊗ₜ[R] 1 ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
⊢ x - ↑(TensorProduct.lmul' R) x ⊗ₜ[R] 1 + (y - ↑(TensorProduct.lmul' R) y ⊗ₜ[R] 1) ∈
    Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
exact add_mem hx hy
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Ideal.span (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) = ideal R S
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Ideal.span (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) ≤ ideal R S
[PROOFSTEP]
rw [Ideal.span_le]
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) ⊆ ↑(ideal R S)
[PROOFSTEP]
rintro _ ⟨s, rfl⟩
[GOAL]
case a.intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
s : S
⊢ (fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) s ∈ ↑(ideal R S)
[PROOFSTEP]
exact KaehlerDifferential.one_smul_sub_smul_one_mem_ideal _ _
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ ideal R S ≤ Ideal.span (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
[PROOFSTEP]
change (KaehlerDifferential.ideal R S).restrictScalars S ≤ (Ideal.span _).restrictScalars S
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Submodule.restrictScalars S (ideal R S) ≤
    Submodule.restrictScalars S (Ideal.span (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1))
[PROOFSTEP]
rw [← KaehlerDifferential.submodule_span_range_eq_ideal, Ideal.span]
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) ≤
    Submodule.restrictScalars S (Submodule.span (S ⊗[R] S) (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1))
[PROOFSTEP]
conv_rhs => rw [← Submodule.span_span_of_tower S]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
| Submodule.restrictScalars S (Submodule.span (S ⊗[R] S) (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1))
[PROOFSTEP]
rw [← Submodule.span_span_of_tower S]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
| Submodule.restrictScalars S (Submodule.span (S ⊗[R] S) (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1))
[PROOFSTEP]
rw [← Submodule.span_span_of_tower S]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
| Submodule.restrictScalars S (Submodule.span (S ⊗[R] S) (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1))
[PROOFSTEP]
rw [← Submodule.span_span_of_tower S]
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) ≤
    Submodule.restrictScalars S
      (Submodule.span (S ⊗[R] S) ↑(Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)))
[PROOFSTEP]
exact Submodule.subset_span
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ AddCommGroup (KaehlerDifferential R S)
[PROOFSTEP]
unfold KaehlerDifferential
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ AddCommGroup (Ideal.Cotangent (KaehlerDifferential.ideal R S))
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ ↑(DLinearMap R S) 1 = 0
[PROOFSTEP]
dsimp [KaehlerDifferential.DLinearMap_apply]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Submodule.Quotient.mk { val := 1 ⊗ₜ[R] 1 - 1 ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] 1 - 1 ⊗ₜ[R] 1 ∈ ideal R S) } = 0
[PROOFSTEP]
congr
[GOAL]
case e_a.e_val
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ 1 ⊗ₜ[R] 1 - 1 ⊗ₜ[R] 1 = 0
[PROOFSTEP]
rw [sub_self]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
⊢ ↑(DLinearMap R S) (a * b) = a • ↑(DLinearMap R S) b + b • ↑(DLinearMap R S) a
[PROOFSTEP]
have : LinearMap.CompatibleSMul { x // x ∈ ideal R S } (Ω[S⁄R]) S (S ⊗[R] S) := inferInstance
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
this : LinearMap.CompatibleSMul { x // x ∈ ideal R S } (Ω[S⁄R]) S (S ⊗[R] S)
⊢ ↑(DLinearMap R S) (a * b) = a • ↑(DLinearMap R S) b + b • ↑(DLinearMap R S) a
[PROOFSTEP]
dsimp [KaehlerDifferential.DLinearMap_apply, -Ideal.toCotangent_apply]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
this : LinearMap.CompatibleSMul { x // x ∈ ideal R S } (Ω[S⁄R]) S (S ⊗[R] S)
⊢ ↑(Ideal.toCotangent (ideal R S))
      { val := 1 ⊗ₜ[R] (a * b) - (a * b) ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] (a * b) - (a * b) ⊗ₜ[R] 1 ∈ ideal R S) } =
    a •
        ↑(Ideal.toCotangent (ideal R S))
          { val := 1 ⊗ₜ[R] b - b ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] b - b ⊗ₜ[R] 1 ∈ ideal R S) } +
      b •
        ↑(Ideal.toCotangent (ideal R S))
          { val := 1 ⊗ₜ[R] a - a ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] a - a ⊗ₜ[R] 1 ∈ ideal R S) }
[PROOFSTEP]
rw [← LinearMap.map_smul_of_tower (M₂ := Ω[S⁄R]), ← LinearMap.map_smul_of_tower (M₂ := Ω[S⁄R]), ← map_add,
  Ideal.toCotangent_eq, pow_two]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
this : LinearMap.CompatibleSMul { x // x ∈ ideal R S } (Ω[S⁄R]) S (S ⊗[R] S)
⊢ ↑{ val := 1 ⊗ₜ[R] (a * b) - (a * b) ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] (a * b) - (a * b) ⊗ₜ[R] 1 ∈ ideal R S) } -
      ↑(a • { val := 1 ⊗ₜ[R] b - b ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] b - b ⊗ₜ[R] 1 ∈ ideal R S) } +
          b • { val := 1 ⊗ₜ[R] a - a ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] a - a ⊗ₜ[R] 1 ∈ ideal R S) }) ∈
    ideal R S * ideal R S
[PROOFSTEP]
convert
  Submodule.mul_mem_mul (KaehlerDifferential.one_smul_sub_smul_one_mem_ideal R a : _)
    (KaehlerDifferential.one_smul_sub_smul_one_mem_ideal R b : _) using
  1
[GOAL]
case h.e'_4
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
this : LinearMap.CompatibleSMul { x // x ∈ ideal R S } (Ω[S⁄R]) S (S ⊗[R] S)
⊢ ↑{ val := 1 ⊗ₜ[R] (a * b) - (a * b) ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] (a * b) - (a * b) ⊗ₜ[R] 1 ∈ ideal R S) } -
      ↑(a • { val := 1 ⊗ₜ[R] b - b ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] b - b ⊗ₜ[R] 1 ∈ ideal R S) } +
          b • { val := 1 ⊗ₜ[R] a - a ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] a - a ⊗ₜ[R] 1 ∈ ideal R S) }) =
    (1 ⊗ₜ[R] a - a ⊗ₜ[R] 1) * (1 ⊗ₜ[R] b - b ⊗ₜ[R] 1)
[PROOFSTEP]
simp only [AddSubgroupClass.coe_sub, Submodule.coe_add, Submodule.coe_mk, TensorProduct.tmul_mul_tmul, mul_sub, sub_mul,
  mul_comm b, Submodule.coe_smul_of_tower, smul_sub, TensorProduct.smul_tmul', smul_eq_mul, mul_one]
[GOAL]
case h.e'_4
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
this : LinearMap.CompatibleSMul { x // x ∈ ideal R S } (Ω[S⁄R]) S (S ⊗[R] S)
⊢ 1 ⊗ₜ[R] (a * b) - (a * b) ⊗ₜ[R] 1 - (a ⊗ₜ[R] b - (a * b) ⊗ₜ[R] 1 + (b ⊗ₜ[R] a - (a * b) ⊗ₜ[R] 1)) =
    1 ⊗ₜ[R] (a * b) - a ⊗ₜ[R] (1 * b) - ((1 * b) ⊗ₜ[R] a - (a * b) ⊗ₜ[R] 1)
[PROOFSTEP]
ring_nf
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Submodule.span S (Set.range ↑(D R S)) = ⊤
[PROOFSTEP]
rw [_root_.eq_top_iff]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ ⊤ ≤ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
rintro x -
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : Ω[S⁄R]
⊢ x ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
obtain ⟨⟨x, hx⟩, rfl⟩ := Ideal.toCotangent_surjective _ x
[GOAL]
case intro.mk
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : x ∈ ideal R S
⊢ ↑(Ideal.toCotangent (ideal R S)) { val := x, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
have : x ∈ (KaehlerDifferential.ideal R S).restrictScalars S := hx
[GOAL]
case intro.mk
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : x ∈ ideal R S
this : x ∈ Submodule.restrictScalars S (ideal R S)
⊢ ↑(Ideal.toCotangent (ideal R S)) { val := x, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
rw [← KaehlerDifferential.submodule_span_range_eq_ideal] at this
[GOAL]
case intro.mk
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : x ∈ ideal R S
this : x ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
⊢ ↑(Ideal.toCotangent (ideal R S)) { val := x, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
suffices
  ∃ hx, (KaehlerDifferential.ideal R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range <| KaehlerDifferential.D R S)
  by exact this.choose_spec
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : x ∈ ideal R S
this✝ : x ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
this : ∃ hx, ↑(Ideal.toCotangent (ideal R S)) { val := x, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
⊢ ↑(Ideal.toCotangent (ideal R S)) { val := x, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
exact this.choose_spec
[GOAL]
case intro.mk
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : x ∈ ideal R S
this : x ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
⊢ ∃ hx, ↑(Ideal.toCotangent (ideal R S)) { val := x, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
refine Submodule.span_induction this ?_ ?_ ?_ ?_
[GOAL]
case intro.mk.refine_1
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : x ∈ ideal R S
this : x ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
⊢ ∀ (x : S ⊗[R] S),
    (x ∈ Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) →
      ∃ hx, ↑(Ideal.toCotangent (ideal R S)) { val := x, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
rintro _ ⟨x, rfl⟩
[GOAL]
case intro.mk.refine_1.intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ : S ⊗[R] S
hx : x✝ ∈ ideal R S
this : x✝ ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
x : S
⊢ ∃ hx,
    ↑(Ideal.toCotangent (ideal R S)) { val := (fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) x, property := hx } ∈
      Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
refine ⟨KaehlerDifferential.one_smul_sub_smul_one_mem_ideal R x, ?_⟩
[GOAL]
case intro.mk.refine_1.intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ : S ⊗[R] S
hx : x✝ ∈ ideal R S
this : x✝ ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
x : S
⊢ ↑(Ideal.toCotangent (ideal R S))
      { val := (fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) x, property := (_ : 1 ⊗ₜ[R] x - x ⊗ₜ[R] 1 ∈ ideal R S) } ∈
    Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
apply Submodule.subset_span
[GOAL]
case intro.mk.refine_1.intro.a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ : S ⊗[R] S
hx : x✝ ∈ ideal R S
this : x✝ ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
x : S
⊢ ↑(Ideal.toCotangent (ideal R S))
      { val := (fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1) x, property := (_ : 1 ⊗ₜ[R] x - x ⊗ₜ[R] 1 ∈ ideal R S) } ∈
    Set.range ↑(D R S)
[PROOFSTEP]
exact ⟨x, KaehlerDifferential.DLinearMap_apply R S x⟩
[GOAL]
case intro.mk.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : x ∈ ideal R S
this : x ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
⊢ ∃ hx, ↑(Ideal.toCotangent (ideal R S)) { val := 0, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
exact ⟨zero_mem _, Submodule.zero_mem _⟩
[GOAL]
case intro.mk.refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : x ∈ ideal R S
this : x ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
⊢ ∀ (x y : S ⊗[R] S),
    (∃ hx, ↑(Ideal.toCotangent (ideal R S)) { val := x, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))) →
      (∃ hx, ↑(Ideal.toCotangent (ideal R S)) { val := y, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))) →
        ∃ hx, ↑(Ideal.toCotangent (ideal R S)) { val := x + y, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
rintro x y ⟨hx₁, hx₂⟩ ⟨hy₁, hy₂⟩
[GOAL]
case intro.mk.refine_3.intro.intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ : S ⊗[R] S
hx : x✝ ∈ ideal R S
this : x✝ ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
x y : S ⊗[R] S
hx₁ : x ∈ ideal R S
hx₂ : ↑(Ideal.toCotangent (ideal R S)) { val := x, property := hx₁ } ∈ Submodule.span S (Set.range ↑(D R S))
hy₁ : y ∈ ideal R S
hy₂ : ↑(Ideal.toCotangent (ideal R S)) { val := y, property := hy₁ } ∈ Submodule.span S (Set.range ↑(D R S))
⊢ ∃ hx, ↑(Ideal.toCotangent (ideal R S)) { val := x + y, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
exact ⟨add_mem hx₁ hy₁, Submodule.add_mem _ hx₂ hy₂⟩
[GOAL]
case intro.mk.refine_4
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S ⊗[R] S
hx : x ∈ ideal R S
this : x ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
⊢ ∀ (a : S) (x : S ⊗[R] S),
    (∃ hx, ↑(Ideal.toCotangent (ideal R S)) { val := x, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))) →
      ∃ hx, ↑(Ideal.toCotangent (ideal R S)) { val := a • x, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
rintro r x ⟨hx₁, hx₂⟩
[GOAL]
case intro.mk.refine_4.intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x✝ : S ⊗[R] S
hx : x✝ ∈ ideal R S
this : x✝ ∈ Submodule.span S (Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1)
r : S
x : S ⊗[R] S
hx₁ : x ∈ ideal R S
hx₂ : ↑(Ideal.toCotangent (ideal R S)) { val := x, property := hx₁ } ∈ Submodule.span S (Set.range ↑(D R S))
⊢ ∃ hx, ↑(Ideal.toCotangent (ideal R S)) { val := r • x, property := hx } ∈ Submodule.span S (Set.range ↑(D R S))
[PROOFSTEP]
exact ⟨((KaehlerDifferential.ideal R S).restrictScalars S).smul_mem r hx₁, Submodule.smul_mem _ r hx₂⟩
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
⊢ Ω[S⁄R] →ₗ[S] M
[PROOFSTEP]
refine
  LinearMap.comp
    ((((KaehlerDifferential.ideal R S) • (⊤ : Submodule (S ⊗[R] S) (KaehlerDifferential.ideal R S))).restrictScalars
          S).liftQ
      ?_ ?_)
    (Submodule.Quotient.restrictScalarsEquiv S _).symm.toLinearMap
[GOAL]
case refine_1
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
⊢ { x // x ∈ KaehlerDifferential.ideal R S } →ₗ[S] M
[PROOFSTEP]
exact D.tensorProductTo.comp ((KaehlerDifferential.ideal R S).subtype.restrictScalars S)
[GOAL]
case refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
⊢ Submodule.restrictScalars S (KaehlerDifferential.ideal R S • ⊤) ≤
    LinearMap.ker (LinearMap.comp (tensorProductTo D) (↑S (Submodule.subtype (KaehlerDifferential.ideal R S))))
[PROOFSTEP]
intro x hx
[GOAL]
case refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x : { x // x ∈ KaehlerDifferential.ideal R S }
hx : x ∈ Submodule.restrictScalars S (KaehlerDifferential.ideal R S • ⊤)
⊢ x ∈ LinearMap.ker (LinearMap.comp (tensorProductTo D) (↑S (Submodule.subtype (KaehlerDifferential.ideal R S))))
[PROOFSTEP]
change _ = _
[GOAL]
case refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x : { x // x ∈ KaehlerDifferential.ideal R S }
hx : x ∈ Submodule.restrictScalars S (KaehlerDifferential.ideal R S • ⊤)
⊢ ↑(LinearMap.comp (tensorProductTo D) (↑S (Submodule.subtype (KaehlerDifferential.ideal R S)))) x = 0
[PROOFSTEP]
refine Submodule.smul_induction_on hx ?_ ?_
[GOAL]
case refine_2.refine_1
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x : { x // x ∈ KaehlerDifferential.ideal R S }
hx : x ∈ Submodule.restrictScalars S (KaehlerDifferential.ideal R S • ⊤)
⊢ ∀ (r : S ⊗[R] S),
    r ∈ KaehlerDifferential.ideal R S →
      ∀ (n : { x // x ∈ KaehlerDifferential.ideal R S }),
        n ∈ ⊤ →
          ↑(LinearMap.comp (tensorProductTo D) (↑S (Submodule.subtype (KaehlerDifferential.ideal R S)))) (r • n) = 0
[PROOFSTEP]
rintro x (hx : _ = _) y -
[GOAL]
case refine_2.refine_1
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x✝ : { x // x ∈ KaehlerDifferential.ideal R S }
hx✝ : x✝ ∈ Submodule.restrictScalars S (KaehlerDifferential.ideal R S • ⊤)
x : S ⊗[R] S
hx : ↑(TensorProduct.lmul' R) x = 0
y : { x // x ∈ KaehlerDifferential.ideal R S }
⊢ ↑(LinearMap.comp (tensorProductTo D) (↑S (Submodule.subtype (KaehlerDifferential.ideal R S)))) (x • y) = 0
[PROOFSTEP]
dsimp
[GOAL]
case refine_2.refine_1
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x✝ : { x // x ∈ KaehlerDifferential.ideal R S }
hx✝ : x✝ ∈ Submodule.restrictScalars S (KaehlerDifferential.ideal R S • ⊤)
x : S ⊗[R] S
hx : ↑(TensorProduct.lmul' R) x = 0
y : { x // x ∈ KaehlerDifferential.ideal R S }
⊢ ↑(tensorProductTo D) ↑(x • y) = 0
[PROOFSTEP]
rw [show ↑(x • y) = x * ↑y by rfl, Derivation.tensorProductTo_mul, hx, y.prop, zero_smul, zero_smul, zero_add]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x✝ : { x // x ∈ KaehlerDifferential.ideal R S }
hx✝ : x✝ ∈ Submodule.restrictScalars S (KaehlerDifferential.ideal R S • ⊤)
x : S ⊗[R] S
hx : ↑(TensorProduct.lmul' R) x = 0
y : { x // x ∈ KaehlerDifferential.ideal R S }
⊢ ↑(x • y) = x * ↑y
[PROOFSTEP]
rfl
[GOAL]
case refine_2.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x : { x // x ∈ KaehlerDifferential.ideal R S }
hx : x ∈ Submodule.restrictScalars S (KaehlerDifferential.ideal R S • ⊤)
⊢ ∀ (x y : { x // x ∈ KaehlerDifferential.ideal R S }),
    ↑(LinearMap.comp (tensorProductTo D) (↑S (Submodule.subtype (KaehlerDifferential.ideal R S)))) x = 0 →
      ↑(LinearMap.comp (tensorProductTo D) (↑S (Submodule.subtype (KaehlerDifferential.ideal R S)))) y = 0 →
        ↑(LinearMap.comp (tensorProductTo D) (↑S (Submodule.subtype (KaehlerDifferential.ideal R S)))) (x + y) = 0
[PROOFSTEP]
intro x y ex ey
[GOAL]
case refine_2.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
x✝ : { x // x ∈ KaehlerDifferential.ideal R S }
hx : x✝ ∈ Submodule.restrictScalars S (KaehlerDifferential.ideal R S • ⊤)
x y : { x // x ∈ KaehlerDifferential.ideal R S }
ex : ↑(LinearMap.comp (tensorProductTo D) (↑S (Submodule.subtype (KaehlerDifferential.ideal R S)))) x = 0
ey : ↑(LinearMap.comp (tensorProductTo D) (↑S (Submodule.subtype (KaehlerDifferential.ideal R S)))) y = 0
⊢ ↑(LinearMap.comp (tensorProductTo D) (↑S (Submodule.subtype (KaehlerDifferential.ideal R S)))) (x + y) = 0
[PROOFSTEP]
rw [map_add, ex, ey, zero_add]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
⊢ ↑(LinearMap.compDer (liftKaehlerDifferential D)) (KaehlerDifferential.D R S) = D
[PROOFSTEP]
ext a
[GOAL]
case H
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
a : S
⊢ ↑(↑(LinearMap.compDer (liftKaehlerDifferential D)) (KaehlerDifferential.D R S)) a = ↑D a
[PROOFSTEP]
dsimp [KaehlerDifferential.D_apply]
[GOAL]
case H
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
a : S
⊢ ↑(liftKaehlerDifferential D)
      (Submodule.Quotient.mk
        { val := 1 ⊗ₜ[R] a - a ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] a - a ⊗ₜ[R] 1 ∈ KaehlerDifferential.ideal R S) }) =
    ↑D a
[PROOFSTEP]
refine (D.liftKaehlerDifferential_apply _).trans ?_
[GOAL]
case H
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D : Derivation R S M
a : S
⊢ ↑(tensorProductTo D)
      ↑{ val := 1 ⊗ₜ[R] a - a ⊗ₜ[R] 1, property := (_ : 1 ⊗ₜ[R] a - a ⊗ₜ[R] 1 ∈ KaehlerDifferential.ideal R S) } =
    ↑D a
[PROOFSTEP]
rw [Subtype.coe_mk, map_sub, Derivation.tensorProductTo_tmul, Derivation.tensorProductTo_tmul, one_smul,
  D.map_one_eq_zero, smul_zero, sub_zero]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D' : Derivation R S M
x : S
⊢ ↑(liftKaehlerDifferential D') (↑(KaehlerDifferential.D R S) x) = ↑D' x
[PROOFSTEP]
rw [← Derivation.congr_fun D'.liftKaehlerDifferential_comp x]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
D' : Derivation R S M
x : S
⊢ ↑(liftKaehlerDifferential D') (↑(KaehlerDifferential.D R S) x) =
    ↑(↑(LinearMap.compDer (liftKaehlerDifferential D')) (KaehlerDifferential.D R S)) x
[PROOFSTEP]
simp
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
⊢ f = f'
[PROOFSTEP]
apply LinearMap.ext
[GOAL]
case h
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
⊢ ∀ (x : Ω[S⁄R]), ↑f x = ↑f' x
[PROOFSTEP]
intro x
[GOAL]
case h
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
x : Ω[S⁄R]
⊢ ↑f x = ↑f' x
[PROOFSTEP]
have : x ∈ Submodule.span S (Set.range <| KaehlerDifferential.D R S) := by
  rw [KaehlerDifferential.span_range_derivation]; trivial
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
x : Ω[S⁄R]
⊢ x ∈ Submodule.span S (Set.range ↑(KaehlerDifferential.D R S))
[PROOFSTEP]
rw [KaehlerDifferential.span_range_derivation]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
x : Ω[S⁄R]
⊢ x ∈ ⊤
[PROOFSTEP]
trivial
[GOAL]
case h
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
x : Ω[S⁄R]
this : x ∈ Submodule.span S (Set.range ↑(KaehlerDifferential.D R S))
⊢ ↑f x = ↑f' x
[PROOFSTEP]
refine Submodule.span_induction this ?_ ?_ ?_ ?_
[GOAL]
case h.refine_1
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
x : Ω[S⁄R]
this : x ∈ Submodule.span S (Set.range ↑(KaehlerDifferential.D R S))
⊢ ∀ (x : Ω[S⁄R]), x ∈ Set.range ↑(KaehlerDifferential.D R S) → ↑f x = ↑f' x
[PROOFSTEP]
rintro _ ⟨x, rfl⟩
[GOAL]
case h.refine_1.intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
x✝ : Ω[S⁄R]
this : x✝ ∈ Submodule.span S (Set.range ↑(KaehlerDifferential.D R S))
x : S
⊢ ↑f (↑(KaehlerDifferential.D R S) x) = ↑f' (↑(KaehlerDifferential.D R S) x)
[PROOFSTEP]
exact congr_arg (fun D : Derivation R S M => D x) hf
[GOAL]
case h.refine_2
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
x : Ω[S⁄R]
this : x ∈ Submodule.span S (Set.range ↑(KaehlerDifferential.D R S))
⊢ ↑f 0 = ↑f' 0
[PROOFSTEP]
rw [map_zero, map_zero]
[GOAL]
case h.refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
x : Ω[S⁄R]
this : x ∈ Submodule.span S (Set.range ↑(KaehlerDifferential.D R S))
⊢ ∀ (x y : Ω[S⁄R]), ↑f x = ↑f' x → ↑f y = ↑f' y → ↑f (x + y) = ↑f' (x + y)
[PROOFSTEP]
intro x y hx hy
[GOAL]
case h.refine_3
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
x✝ : Ω[S⁄R]
this : x✝ ∈ Submodule.span S (Set.range ↑(KaehlerDifferential.D R S))
x y : Ω[S⁄R]
hx : ↑f x = ↑f' x
hy : ↑f y = ↑f' y
⊢ ↑f (x + y) = ↑f' (x + y)
[PROOFSTEP]
rw [map_add, map_add, hx, hy]
[GOAL]
case h.refine_4
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
x : Ω[S⁄R]
this : x ∈ Submodule.span S (Set.range ↑(KaehlerDifferential.D R S))
⊢ ∀ (a : S) (x : Ω[S⁄R]), ↑f x = ↑f' x → ↑f (a • x) = ↑f' (a • x)
[PROOFSTEP]
intro a x e
[GOAL]
case h.refine_4
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f f' : Ω[S⁄R] →ₗ[S] M
hf : ↑(LinearMap.compDer f) (KaehlerDifferential.D R S) = ↑(LinearMap.compDer f') (KaehlerDifferential.D R S)
x✝ : Ω[S⁄R]
this : x✝ ∈ Submodule.span S (Set.range ↑(KaehlerDifferential.D R S))
a : S
x : Ω[S⁄R]
e : ↑f x = ↑f' x
⊢ ↑f (a • x) = ↑f' (a • x)
[PROOFSTEP]
simp [e]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : { x // x ∈ ideal R S }
⊢ ↑(Derivation.tensorProductTo (D R S)) ↑x = ↑(Ideal.toCotangent (ideal R S)) x
[PROOFSTEP]
rw [← Derivation.liftKaehlerDifferential_apply, Derivation.liftKaehlerDifferential_D]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : { x // x ∈ ideal R S }
⊢ ↑LinearMap.id (↑(Ideal.toCotangent (ideal R S)) x) = ↑(Ideal.toCotangent (ideal R S)) x
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Function.Surjective ↑(Derivation.tensorProductTo (D R S))
[PROOFSTEP]
intro x
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : Ω[S⁄R]
⊢ ∃ a, ↑(Derivation.tensorProductTo (D R S)) a = x
[PROOFSTEP]
obtain ⟨x, rfl⟩ := (KaehlerDifferential.ideal R S).toCotangent_surjective x
[GOAL]
case intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : { x // x ∈ ideal R S }
⊢ ∃ a, ↑(Derivation.tensorProductTo (D R S)) a = ↑(Ideal.toCotangent (ideal R S)) x
[PROOFSTEP]
exact ⟨x, KaehlerDifferential.D_tensorProductTo x⟩
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ (S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S) ≃+* S
[PROOFSTEP]
have :
  Function.RightInverse (TensorProduct.includeLeft (R := R) (A := S) (B := S))
    (↑(TensorProduct.lmul' R : S ⊗[R] S →ₐ[R] S) : S ⊗[R] S →+* S) :=
  by
  intro x; rw [AlgHom.coe_toRingHom, ← AlgHom.comp_apply, TensorProduct.lmul'_comp_includeLeft]
  rfl
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Function.RightInverse ↑TensorProduct.includeLeft ↑↑(TensorProduct.lmul' R)
[PROOFSTEP]
intro x
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S
⊢ ↑↑(TensorProduct.lmul' R) (↑TensorProduct.includeLeft x) = x
[PROOFSTEP]
rw [AlgHom.coe_toRingHom, ← AlgHom.comp_apply, TensorProduct.lmul'_comp_includeLeft]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S
⊢ ↑(AlgHom.id R S) x = x
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
this : Function.RightInverse ↑TensorProduct.includeLeft ↑↑(TensorProduct.lmul' R)
⊢ (S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S) ≃+* S
[PROOFSTEP]
refine (Ideal.quotCotangent _).trans ?_
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
this : Function.RightInverse ↑TensorProduct.includeLeft ↑↑(TensorProduct.lmul' R)
⊢ S ⊗[R] S ⧸ ideal R S ≃+* S
[PROOFSTEP]
refine (Ideal.quotEquivOfEq ?_).trans (RingHom.quotientKerEquivOfRightInverse this)
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
this : Function.RightInverse ↑TensorProduct.includeLeft ↑↑(TensorProduct.lmul' R)
⊢ ideal R S = RingHom.ker ↑(TensorProduct.lmul' R)
[PROOFSTEP]
ext
[GOAL]
case h
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
this : Function.RightInverse ↑TensorProduct.includeLeft ↑↑(TensorProduct.lmul' R)
x✝ : S ⊗[R] S
⊢ x✝ ∈ ideal R S ↔ x✝ ∈ RingHom.ker ↑(TensorProduct.lmul' R)
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
⊢ AlgHom.comp (Ideal.Quotient.mkₐ R (Ideal.cotangentIdeal (ideal R S))) f =
      IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S)) ↔
    AlgHom.comp (AlgHom.kerSquareLift (TensorProduct.lmul' R)) f = AlgHom.id R S
[PROOFSTEP]
rw [AlgHom.ext_iff, AlgHom.ext_iff]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
⊢ (∀ (x : S),
      ↑(AlgHom.comp (Ideal.Quotient.mkₐ R (Ideal.cotangentIdeal (ideal R S))) f) x =
        ↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x) ↔
    ∀ (x : S), ↑(AlgHom.comp (AlgHom.kerSquareLift (TensorProduct.lmul' R)) f) x = ↑(AlgHom.id R S) x
[PROOFSTEP]
apply forall_congr'
[GOAL]
case h
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
⊢ ∀ (a : S),
    ↑(AlgHom.comp (Ideal.Quotient.mkₐ R (Ideal.cotangentIdeal (ideal R S))) f) a =
        ↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) a ↔
      ↑(AlgHom.comp (AlgHom.kerSquareLift (TensorProduct.lmul' R)) f) a = ↑(AlgHom.id R S) a
[PROOFSTEP]
intro x
[GOAL]
case h
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
x : S
⊢ ↑(AlgHom.comp (Ideal.Quotient.mkₐ R (Ideal.cotangentIdeal (ideal R S))) f) x =
      ↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x ↔
    ↑(AlgHom.comp (AlgHom.kerSquareLift (TensorProduct.lmul' R)) f) x = ↑(AlgHom.id R S) x
[PROOFSTEP]
have e₁ :
  (TensorProduct.lmul' R : S ⊗[R] S →ₐ[R] S).kerSquareLift (f x) =
    KaehlerDifferential.quotientCotangentIdealRingEquiv R S
      (Ideal.Quotient.mk (KaehlerDifferential.ideal R S).cotangentIdeal <| f x) :=
  by generalize f x = y; obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective y; rfl
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
x : S
⊢ ↑(AlgHom.kerSquareLift (TensorProduct.lmul' R)) (↑f x) =
    ↑(quotientCotangentIdealRingEquiv R S) (↑(Ideal.Quotient.mk (Ideal.cotangentIdeal (ideal R S))) (↑f x))
[PROOFSTEP]
generalize f x = y
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
x : S
y : S ⊗[R] S ⧸ ideal R S ^ 2
⊢ ↑(AlgHom.kerSquareLift (TensorProduct.lmul' R)) y =
    ↑(quotientCotangentIdealRingEquiv R S) (↑(Ideal.Quotient.mk (Ideal.cotangentIdeal (ideal R S))) y)
[PROOFSTEP]
obtain ⟨y, rfl⟩ := Ideal.Quotient.mk_surjective y
[GOAL]
case intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
x : S
y : S ⊗[R] S
⊢ ↑(AlgHom.kerSquareLift (TensorProduct.lmul' R)) (↑(Ideal.Quotient.mk (ideal R S ^ 2)) y) =
    ↑(quotientCotangentIdealRingEquiv R S)
      (↑(Ideal.Quotient.mk (Ideal.cotangentIdeal (ideal R S))) (↑(Ideal.Quotient.mk (ideal R S ^ 2)) y))
[PROOFSTEP]
rfl
[GOAL]
case h
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
x : S
e₁ :
  ↑(AlgHom.kerSquareLift (TensorProduct.lmul' R)) (↑f x) =
    ↑(quotientCotangentIdealRingEquiv R S) (↑(Ideal.Quotient.mk (Ideal.cotangentIdeal (ideal R S))) (↑f x))
⊢ ↑(AlgHom.comp (Ideal.Quotient.mkₐ R (Ideal.cotangentIdeal (ideal R S))) f) x =
      ↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x ↔
    ↑(AlgHom.comp (AlgHom.kerSquareLift (TensorProduct.lmul' R)) f) x = ↑(AlgHom.id R S) x
[PROOFSTEP]
have e₂ : x = KaehlerDifferential.quotientCotangentIdealRingEquiv R S (IsScalarTower.toAlgHom R S _ x) :=
  (mul_one x).symm
[GOAL]
case h
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
x : S
e₁ :
  ↑(AlgHom.kerSquareLift (TensorProduct.lmul' R)) (↑f x) =
    ↑(quotientCotangentIdealRingEquiv R S) (↑(Ideal.Quotient.mk (Ideal.cotangentIdeal (ideal R S))) (↑f x))
e₂ :
  x =
    ↑(quotientCotangentIdealRingEquiv R S)
      (↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x)
⊢ ↑(AlgHom.comp (Ideal.Quotient.mkₐ R (Ideal.cotangentIdeal (ideal R S))) f) x =
      ↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x ↔
    ↑(AlgHom.comp (AlgHom.kerSquareLift (TensorProduct.lmul' R)) f) x = ↑(AlgHom.id R S) x
[PROOFSTEP]
constructor
[GOAL]
case h.mp
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
x : S
e₁ :
  ↑(AlgHom.kerSquareLift (TensorProduct.lmul' R)) (↑f x) =
    ↑(quotientCotangentIdealRingEquiv R S) (↑(Ideal.Quotient.mk (Ideal.cotangentIdeal (ideal R S))) (↑f x))
e₂ :
  x =
    ↑(quotientCotangentIdealRingEquiv R S)
      (↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x)
⊢ ↑(AlgHom.comp (Ideal.Quotient.mkₐ R (Ideal.cotangentIdeal (ideal R S))) f) x =
      ↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x →
    ↑(AlgHom.comp (AlgHom.kerSquareLift (TensorProduct.lmul' R)) f) x = ↑(AlgHom.id R S) x
[PROOFSTEP]
intro e
[GOAL]
case h.mp
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
x : S
e₁ :
  ↑(AlgHom.kerSquareLift (TensorProduct.lmul' R)) (↑f x) =
    ↑(quotientCotangentIdealRingEquiv R S) (↑(Ideal.Quotient.mk (Ideal.cotangentIdeal (ideal R S))) (↑f x))
e₂ :
  x =
    ↑(quotientCotangentIdealRingEquiv R S)
      (↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x)
e :
  ↑(AlgHom.comp (Ideal.Quotient.mkₐ R (Ideal.cotangentIdeal (ideal R S))) f) x =
    ↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x
⊢ ↑(AlgHom.comp (AlgHom.kerSquareLift (TensorProduct.lmul' R)) f) x = ↑(AlgHom.id R S) x
[PROOFSTEP]
exact
  (e₁.trans (@RingEquiv.congr_arg _ _ _ _ _ _ (KaehlerDifferential.quotientCotangentIdealRingEquiv R S) _ _ e)).trans
    e₂.symm
[GOAL]
case h.mpr
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
x : S
e₁ :
  ↑(AlgHom.kerSquareLift (TensorProduct.lmul' R)) (↑f x) =
    ↑(quotientCotangentIdealRingEquiv R S) (↑(Ideal.Quotient.mk (Ideal.cotangentIdeal (ideal R S))) (↑f x))
e₂ :
  x =
    ↑(quotientCotangentIdealRingEquiv R S)
      (↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x)
⊢ ↑(AlgHom.comp (AlgHom.kerSquareLift (TensorProduct.lmul' R)) f) x = ↑(AlgHom.id R S) x →
    ↑(AlgHom.comp (Ideal.Quotient.mkₐ R (Ideal.cotangentIdeal (ideal R S))) f) x =
      ↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x
[PROOFSTEP]
intro e
[GOAL]
case h.mpr
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
x : S
e₁ :
  ↑(AlgHom.kerSquareLift (TensorProduct.lmul' R)) (↑f x) =
    ↑(quotientCotangentIdealRingEquiv R S) (↑(Ideal.Quotient.mk (Ideal.cotangentIdeal (ideal R S))) (↑f x))
e₂ :
  x =
    ↑(quotientCotangentIdealRingEquiv R S)
      (↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x)
e : ↑(AlgHom.comp (AlgHom.kerSquareLift (TensorProduct.lmul' R)) f) x = ↑(AlgHom.id R S) x
⊢ ↑(AlgHom.comp (Ideal.Quotient.mkₐ R (Ideal.cotangentIdeal (ideal R S))) f) x =
    ↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x
[PROOFSTEP]
apply (KaehlerDifferential.quotientCotangentIdealRingEquiv R S).injective
[GOAL]
case h.mpr.a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
f : S →ₐ[R] S ⊗[R] S ⧸ ideal R S ^ 2
x : S
e₁ :
  ↑(AlgHom.kerSquareLift (TensorProduct.lmul' R)) (↑f x) =
    ↑(quotientCotangentIdealRingEquiv R S) (↑(Ideal.Quotient.mk (Ideal.cotangentIdeal (ideal R S))) (↑f x))
e₂ :
  x =
    ↑(quotientCotangentIdealRingEquiv R S)
      (↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x)
e : ↑(AlgHom.comp (AlgHom.kerSquareLift (TensorProduct.lmul' R)) f) x = ↑(AlgHom.id R S) x
⊢ ↑(quotientCotangentIdealRingEquiv R S)
      (↑(AlgHom.comp (Ideal.Quotient.mkₐ R (Ideal.cotangentIdeal (ideal R S))) f) x) =
    ↑(quotientCotangentIdealRingEquiv R S)
      (↑(IsScalarTower.toAlgHom R S ((S ⊗[R] S ⧸ ideal R S ^ 2) ⧸ Ideal.cotangentIdeal (ideal R S))) x)
[PROOFSTEP]
exact e₁.symm.trans (e.trans e₂)
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x y z : S
⊢ (z𝖣x + y) = (z𝖣x) + z𝖣y
[PROOFSTEP]
rw [← map_add, eq_comm, ← sub_eq_zero, ← map_sub (Submodule.mkQ (kerTotal R S)), Submodule.mkQ_apply,
  Submodule.Quotient.mk_eq_zero]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x y z : S
⊢ single x z + single y z - single (x + y) z ∈ kerTotal R S
[PROOFSTEP]
simp_rw [← Finsupp.smul_single_one _ z, ← smul_add, ← smul_sub]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x y z : S
⊢ z • (single x 1 + single y 1 - single (x + y) 1) ∈ kerTotal R S
[PROOFSTEP]
exact Submodule.smul_mem _ _ (Submodule.subset_span (Or.inl <| Or.inl <| ⟨⟨_, _⟩, rfl⟩))
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x y z : S
⊢ (z𝖣x * y) = ((z * x)𝖣y) + (z * y)𝖣x
[PROOFSTEP]
rw [← map_add, eq_comm, ← sub_eq_zero, ← map_sub (Submodule.mkQ (kerTotal R S)), Submodule.mkQ_apply,
  Submodule.Quotient.mk_eq_zero]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x y z : S
⊢ single y (z * x) + single x (z * y) - single (x * y) z ∈ kerTotal R S
[PROOFSTEP]
simp_rw [← Finsupp.smul_single_one _ z, ← @smul_eq_mul _ _ z, ← Finsupp.smul_single, ← smul_add, ← smul_sub]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x y z : S
⊢ z • (single y x + single x y - single (x * y) 1) ∈ kerTotal R S
[PROOFSTEP]
exact Submodule.smul_mem _ _ (Submodule.subset_span (Or.inl <| Or.inr <| ⟨⟨_, _⟩, rfl⟩))
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : R
y : S
⊢ (y𝖣↑(algebraMap R S) x) = 0
[PROOFSTEP]
rw [Submodule.mkQ_apply, Submodule.Quotient.mk_eq_zero, ← Finsupp.smul_single_one _ y]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : R
y : S
⊢ y • single (↑(algebraMap R S) x) 1 ∈ kerTotal R S
[PROOFSTEP]
exact Submodule.smul_mem _ _ (Submodule.subset_span (Or.inr <| ⟨_, rfl⟩))
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : S
⊢ (x𝖣1) = 0
[PROOFSTEP]
rw [← (algebraMap R S).map_one, KaehlerDifferential.kerTotal_mkQ_single_algebraMap]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
r : R
x y : S
⊢ (y𝖣r • x) = r • y𝖣x
[PROOFSTEP]
rw [Algebra.smul_def, KaehlerDifferential.kerTotal_mkQ_single_mul, KaehlerDifferential.kerTotal_mkQ_single_algebraMap,
  add_zero, ← LinearMap.map_smul_of_tower, Finsupp.smul_single, mul_comm, Algebra.smul_def]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
⊢ (((1 * a)𝖣b) + (1 * b)𝖣a) =
    a •
        ↑{ toAddHom := { toFun := fun x => 1𝖣x, map_add' := (_ : ∀ (x y : S), (1𝖣x + y) = (1𝖣x) + 1𝖣y) },
              map_smul' := (_ : ∀ (r : R) (s : S), (1𝖣r • s) = r • 1𝖣s) }
          b +
      b •
        ↑{ toAddHom := { toFun := fun x => 1𝖣x, map_add' := (_ : ∀ (x y : S), (1𝖣x + y) = (1𝖣x) + 1𝖣y) },
              map_smul' := (_ : ∀ (r : R) (s : S), (1𝖣r • s) = r • 1𝖣s) }
          a
[PROOFSTEP]
simp_rw [← Finsupp.smul_single_one _ (1 * _ : S)]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
⊢ ↑(Submodule.mkQ (kerTotal R S)) ((1 * a) • single b 1) + ↑(Submodule.mkQ (kerTotal R S)) ((1 * b) • single a 1) =
    a •
        ↑{ toAddHom := { toFun := fun x => 1𝖣x, map_add' := (_ : ∀ (x y : S), (1𝖣x + y) = (1𝖣x) + 1𝖣y) },
              map_smul' := (_ : ∀ (r : R) (s : S), (1𝖣r • s) = r • 1𝖣s) }
          b +
      b •
        ↑{ toAddHom := { toFun := fun x => 1𝖣x, map_add' := (_ : ∀ (x y : S), (1𝖣x + y) = (1𝖣x) + 1𝖣y) },
              map_smul' := (_ : ∀ (r : R) (s : S), (1𝖣r • s) = r • 1𝖣s) }
          a
[PROOFSTEP]
dsimp
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
⊢ (1 * a) • Submodule.Quotient.mk (single b 1) + (1 * b) • Submodule.Quotient.mk (single a 1) =
    a • Submodule.Quotient.mk (single b 1) + b • Submodule.Quotient.mk (single a 1)
[PROOFSTEP]
simp
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ LinearMap.comp (Derivation.liftKaehlerDifferential (derivationQuotKerTotal R S))
      (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)) =
    Submodule.mkQ (kerTotal R S)
[PROOFSTEP]
apply Finsupp.lhom_ext
[GOAL]
case h
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ ∀ (a b : S),
    ↑(LinearMap.comp (Derivation.liftKaehlerDifferential (derivationQuotKerTotal R S))
            (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
        (single a b) =
      b𝖣a
[PROOFSTEP]
intro a b
[GOAL]
case h
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
⊢ ↑(LinearMap.comp (Derivation.liftKaehlerDifferential (derivationQuotKerTotal R S))
          (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
      (single a b) =
    b𝖣a
[PROOFSTEP]
conv_rhs => rw [← Finsupp.smul_single_one a b, LinearMap.map_smul]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
| b𝖣a
[PROOFSTEP]
rw [← Finsupp.smul_single_one a b, LinearMap.map_smul]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
| b𝖣a
[PROOFSTEP]
rw [← Finsupp.smul_single_one a b, LinearMap.map_smul]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
| b𝖣a
[PROOFSTEP]
rw [← Finsupp.smul_single_one a b, LinearMap.map_smul]
[GOAL]
case h
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
a b : S
⊢ ↑(LinearMap.comp (Derivation.liftKaehlerDifferential (derivationQuotKerTotal R S))
          (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
      (single a b) =
    b • 1𝖣a
[PROOFSTEP]
simp [KaehlerDifferential.derivationQuotKerTotal_apply]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)) = kerTotal R S
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)) ≤ kerTotal R S
[PROOFSTEP]
conv_rhs => rw [← (KaehlerDifferential.kerTotal R S).ker_mkQ]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
| kerTotal R S
[PROOFSTEP]
rw [← (KaehlerDifferential.kerTotal R S).ker_mkQ]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
| kerTotal R S
[PROOFSTEP]
rw [← (KaehlerDifferential.kerTotal R S).ker_mkQ]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
| kerTotal R S
[PROOFSTEP]
rw [← (KaehlerDifferential.kerTotal R S).ker_mkQ]
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)) ≤ LinearMap.ker (Submodule.mkQ (kerTotal R S))
[PROOFSTEP]
rw [← KaehlerDifferential.derivationQuotKerTotal_lift_comp_total]
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)) ≤
    LinearMap.ker
      (LinearMap.comp (Derivation.liftKaehlerDifferential (derivationQuotKerTotal R S))
        (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
[PROOFSTEP]
exact LinearMap.ker_le_ker_comp _ _
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ kerTotal R S ≤ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S))
[PROOFSTEP]
rw [KaehlerDifferential.kerTotal, Submodule.span_le]
[GOAL]
case a
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ (((Set.range fun x => single x.fst 1 + single x.snd 1 - single (x.fst + x.snd) 1) ∪
        Set.range fun x => single x.snd x.fst + single x.fst x.snd - single (x.fst * x.snd) 1) ∪
      Set.range fun x => single (↑(algebraMap R S) x) 1) ⊆
    ↑(LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
[PROOFSTEP]
rintro _ ((⟨⟨x, y⟩, rfl⟩ | ⟨⟨x, y⟩, rfl⟩) | ⟨x, rfl⟩)
[GOAL]
case a.inl.inl.intro.mk
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x y : S
⊢ (fun x => single x.fst 1 + single x.snd 1 - single (x.fst + x.snd) 1) (x, y) ∈
    ↑(LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
[PROOFSTEP]
dsimp
[GOAL]
case a.inl.inr.intro.mk
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x y : S
⊢ (fun x => single x.snd x.fst + single x.fst x.snd - single (x.fst * x.snd) 1) (x, y) ∈
    ↑(LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
[PROOFSTEP]
dsimp
[GOAL]
case a.inr.intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : R
⊢ (fun x => single (↑(algebraMap R S) x) 1) x ∈ ↑(LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
[PROOFSTEP]
dsimp
[GOAL]
case a.inl.inl.intro.mk
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x y : S
⊢ single x 1 + single y 1 - single (x + y) 1 ∈ ↑(LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
[PROOFSTEP]
simp [LinearMap.mem_ker]
[GOAL]
case a.inl.inr.intro.mk
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x y : S
⊢ single y x + single x y - single (x * y) 1 ∈ ↑(LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
[PROOFSTEP]
simp [LinearMap.mem_ker]
[GOAL]
case a.inr.intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
x : R
⊢ single (↑(algebraMap R S) x) 1 ∈ ↑(LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
[PROOFSTEP]
simp [LinearMap.mem_ker]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ Function.Surjective ↑(Finsupp.total S (Ω[S⁄R]) S ↑(D R S))
[PROOFSTEP]
rw [← LinearMap.range_eq_top, Finsupp.range_total, KaehlerDifferential.span_range_derivation]
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
src✝ : (S →₀ S) ⧸ kerTotal R S →ₗ[S] Ω[S⁄R] :=
  Submodule.liftQ (kerTotal R S) (Finsupp.total S (Ω[S⁄R]) S ↑(D R S))
    (_ : kerTotal R S ≤ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
⊢ Function.LeftInverse ↑(Derivation.liftKaehlerDifferential (derivationQuotKerTotal R S))
    { toAddHom := src✝.toAddHom,
          map_smul' :=
            (_ :
              ∀ (r : S) (x : (S →₀ S) ⧸ kerTotal R S),
                AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id S) r • AddHom.toFun src✝.toAddHom x) }.toAddHom.toFun
[PROOFSTEP]
intro x
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
src✝ : (S →₀ S) ⧸ kerTotal R S →ₗ[S] Ω[S⁄R] :=
  Submodule.liftQ (kerTotal R S) (Finsupp.total S (Ω[S⁄R]) S ↑(D R S))
    (_ : kerTotal R S ≤ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
x : (S →₀ S) ⧸ kerTotal R S
⊢ ↑(Derivation.liftKaehlerDifferential (derivationQuotKerTotal R S))
      (AddHom.toFun
        { toAddHom := src✝.toAddHom,
            map_smul' :=
              (_ :
                ∀ (r : S) (x : (S →₀ S) ⧸ kerTotal R S),
                  AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id S) r • AddHom.toFun src✝.toAddHom x) }.toAddHom
        x) =
    x
[PROOFSTEP]
obtain ⟨x, rfl⟩ := Submodule.mkQ_surjective _ x
[GOAL]
case intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
src✝ : (S →₀ S) ⧸ kerTotal R S →ₗ[S] Ω[S⁄R] :=
  Submodule.liftQ (kerTotal R S) (Finsupp.total S (Ω[S⁄R]) S ↑(D R S))
    (_ : kerTotal R S ≤ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
x : S →₀ S
⊢ ↑(Derivation.liftKaehlerDifferential (derivationQuotKerTotal R S))
      (AddHom.toFun
        { toAddHom := src✝.toAddHom,
            map_smul' :=
              (_ :
                ∀ (r : S) (x : (S →₀ S) ⧸ kerTotal R S),
                  AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id S) r • AddHom.toFun src✝.toAddHom x) }.toAddHom
        (↑(Submodule.mkQ (kerTotal R S)) x)) =
    ↑(Submodule.mkQ (kerTotal R S)) x
[PROOFSTEP]
exact LinearMap.congr_fun (KaehlerDifferential.derivationQuotKerTotal_lift_comp_total R S : _) x
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
src✝ : (S →₀ S) ⧸ kerTotal R S →ₗ[S] Ω[S⁄R] :=
  Submodule.liftQ (kerTotal R S) (Finsupp.total S (Ω[S⁄R]) S ↑(D R S))
    (_ : kerTotal R S ≤ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
⊢ Function.RightInverse ↑(Derivation.liftKaehlerDifferential (derivationQuotKerTotal R S))
    { toAddHom := src✝.toAddHom,
          map_smul' :=
            (_ :
              ∀ (r : S) (x : (S →₀ S) ⧸ kerTotal R S),
                AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id S) r • AddHom.toFun src✝.toAddHom x) }.toAddHom.toFun
[PROOFSTEP]
intro x
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
src✝ : (S →₀ S) ⧸ kerTotal R S →ₗ[S] Ω[S⁄R] :=
  Submodule.liftQ (kerTotal R S) (Finsupp.total S (Ω[S⁄R]) S ↑(D R S))
    (_ : kerTotal R S ≤ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
x : Ω[S⁄R]
⊢ AddHom.toFun
      { toAddHom := src✝.toAddHom,
          map_smul' :=
            (_ :
              ∀ (r : S) (x : (S →₀ S) ⧸ kerTotal R S),
                AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id S) r • AddHom.toFun src✝.toAddHom x) }.toAddHom
      (↑(Derivation.liftKaehlerDifferential (derivationQuotKerTotal R S)) x) =
    x
[PROOFSTEP]
obtain ⟨x, rfl⟩ := KaehlerDifferential.total_surjective R S x
[GOAL]
case intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
src✝ : (S →₀ S) ⧸ kerTotal R S →ₗ[S] Ω[S⁄R] :=
  Submodule.liftQ (kerTotal R S) (Finsupp.total S (Ω[S⁄R]) S ↑(D R S))
    (_ : kerTotal R S ≤ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
x : S →₀ S
⊢ AddHom.toFun
      { toAddHom := src✝.toAddHom,
          map_smul' :=
            (_ :
              ∀ (r : S) (x : (S →₀ S) ⧸ kerTotal R S),
                AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id S) r • AddHom.toFun src✝.toAddHom x) }.toAddHom
      (↑(Derivation.liftKaehlerDifferential (derivationQuotKerTotal R S)) (↑(Finsupp.total S (Ω[S⁄R]) S ↑(D R S)) x)) =
    ↑(Finsupp.total S (Ω[S⁄R]) S ↑(D R S)) x
[PROOFSTEP]
erw [LinearMap.congr_fun (KaehlerDifferential.derivationQuotKerTotal_lift_comp_total R S : _) x]
[GOAL]
case intro
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
src✝ : (S →₀ S) ⧸ kerTotal R S →ₗ[S] Ω[S⁄R] :=
  Submodule.liftQ (kerTotal R S) (Finsupp.total S (Ω[S⁄R]) S ↑(D R S))
    (_ : kerTotal R S ≤ LinearMap.ker (Finsupp.total S (Ω[S⁄R]) S ↑(D R S)))
x : S →₀ S
⊢ AddHom.toFun
      { toAddHom := src✝.toAddHom,
          map_smul' :=
            (_ :
              ∀ (r : S) (x : (S →₀ S) ⧸ kerTotal R S),
                AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id S) r • AddHom.toFun src✝.toAddHom x) }.toAddHom
      (↑(Submodule.mkQ (kerTotal R S)) x) =
    ↑(Finsupp.total S (Ω[S⁄R]) S ↑(D R S)) x
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S : Type v
inst✝⁶ : CommRing R
inst✝⁵ : CommRing S
inst✝⁴ : Algebra R S
M : Type u_1
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : Module S M
inst✝ : IsScalarTower R S M
⊢ ↑(LinearMap.compDer ↑(LinearEquiv.symm (quotKerTotalEquiv R S))) (D R S) = derivationQuotKerTotal R S
[PROOFSTEP]
convert (KaehlerDifferential.derivationQuotKerTotal R S).liftKaehlerDifferential_comp
[GOAL]
R : Type u
S : Type v
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
M : Type u_1
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
inst✝⁹ : Module S M
inst✝⁸ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : Algebra R A
inst✝⁴ : Algebra S B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R S B
inst✝ : IsScalarTower R A B
h : Function.Surjective ↑(algebraMap A B)
⊢ Submodule.map
        (LinearMap.comp (Finsupp.mapRange.linearMap (Algebra.linearMap A B)) (Finsupp.lmapDomain A A ↑(algebraMap A B)))
        (kerTotal R A) ⊔
      Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1) =
    Submodule.restrictScalars A (kerTotal S B)
[PROOFSTEP]
rw [KaehlerDifferential.kerTotal, Submodule.map_span, KaehlerDifferential.kerTotal,
  Submodule.restrictScalars_span _ _ h]
  -- Porting note: the proof is diverging from the mathlib3 proof here.
    -- `map_sub` and `map_add` are not firing so we need to use `LinearMap.map_*` instead
[GOAL]
R : Type u
S : Type v
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
M : Type u_1
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
inst✝⁹ : Module S M
inst✝⁸ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : Algebra R A
inst✝⁴ : Algebra S B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R S B
inst✝ : IsScalarTower R A B
h : Function.Surjective ↑(algebraMap A B)
⊢ Submodule.span A
        (↑(LinearMap.comp (Finsupp.mapRange.linearMap (Algebra.linearMap A B))
              (Finsupp.lmapDomain A A ↑(algebraMap A B))) ''
          (((Set.range fun x => single x.fst 1 + single x.snd 1 - single (x.fst + x.snd) 1) ∪
              Set.range fun x => single x.snd x.fst + single x.fst x.snd - single (x.fst * x.snd) 1) ∪
            Set.range fun x => single (↑(algebraMap R A) x) 1)) ⊔
      Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1) =
    Submodule.span A
      (((Set.range fun x => single x.fst 1 + single x.snd 1 - single (x.fst + x.snd) 1) ∪
          Set.range fun x => single x.snd x.fst + single x.fst x.snd - single (x.fst * x.snd) 1) ∪
        Set.range fun x => single (↑(algebraMap S B) x) 1)
[PROOFSTEP]
simp_rw [Set.image_union, Submodule.span_union, ← Set.image_univ, Set.image_image, Set.image_univ, LinearMap.map_sub,
  LinearMap.map_add]
[GOAL]
R : Type u
S : Type v
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
M : Type u_1
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
inst✝⁹ : Module S M
inst✝⁸ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : Algebra R A
inst✝⁴ : Algebra S B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R S B
inst✝ : IsScalarTower R A B
h : Function.Surjective ↑(algebraMap A B)
⊢ Submodule.span A
            (Set.range fun x =>
              ↑(LinearMap.comp (Finsupp.mapRange.linearMap (Algebra.linearMap A B))
                        (Finsupp.lmapDomain A A ↑(algebraMap A B)))
                    (single x.fst 1) +
                  ↑(LinearMap.comp (Finsupp.mapRange.linearMap (Algebra.linearMap A B))
                        (Finsupp.lmapDomain A A ↑(algebraMap A B)))
                    (single x.snd 1) -
                ↑(LinearMap.comp (Finsupp.mapRange.linearMap (Algebra.linearMap A B))
                      (Finsupp.lmapDomain A A ↑(algebraMap A B)))
                  (single (x.fst + x.snd) 1)) ⊔
          Submodule.span A
            (Set.range fun x =>
              ↑(LinearMap.comp (Finsupp.mapRange.linearMap (Algebra.linearMap A B))
                        (Finsupp.lmapDomain A A ↑(algebraMap A B)))
                    (single x.snd x.fst) +
                  ↑(LinearMap.comp (Finsupp.mapRange.linearMap (Algebra.linearMap A B))
                        (Finsupp.lmapDomain A A ↑(algebraMap A B)))
                    (single x.fst x.snd) -
                ↑(LinearMap.comp (Finsupp.mapRange.linearMap (Algebra.linearMap A B))
                      (Finsupp.lmapDomain A A ↑(algebraMap A B)))
                  (single (x.fst * x.snd) 1)) ⊔
        Submodule.span A
          (Set.range fun x =>
            ↑(LinearMap.comp (Finsupp.mapRange.linearMap (Algebra.linearMap A B))
                  (Finsupp.lmapDomain A A ↑(algebraMap A B)))
              (single (↑(algebraMap R A) x) 1)) ⊔
      Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1) =
    Submodule.span A (Set.range fun x => single x.fst 1 + single x.snd 1 - single (x.fst + x.snd) 1) ⊔
        Submodule.span A (Set.range fun x => single x.snd x.fst + single x.fst x.snd - single (x.fst * x.snd) 1) ⊔
      Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1)
[PROOFSTEP]
simp only [LinearMap.comp_apply, Finsupp.lmapDomain_apply, Finsupp.mapDomain_single, Finsupp.mapRange.linearMap_apply,
  Finsupp.mapRange_single, Algebra.linearMap_apply, map_one, map_add, map_mul]
[GOAL]
R : Type u
S : Type v
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
M : Type u_1
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
inst✝⁹ : Module S M
inst✝⁸ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : Algebra R A
inst✝⁴ : Algebra S B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R S B
inst✝ : IsScalarTower R A B
h : Function.Surjective ↑(algebraMap A B)
⊢ Submodule.span A
            (Set.range fun x =>
              single (↑(algebraMap A B) x.fst) 1 + single (↑(algebraMap A B) x.snd) 1 -
                single (↑(algebraMap A B) x.fst + ↑(algebraMap A B) x.snd) 1) ⊔
          Submodule.span A
            (Set.range fun x =>
              single (↑(algebraMap A B) x.snd) (↑(algebraMap A B) x.fst) +
                  single (↑(algebraMap A B) x.fst) (↑(algebraMap A B) x.snd) -
                single (↑(algebraMap A B) x.fst * ↑(algebraMap A B) x.snd) 1) ⊔
        Submodule.span A (Set.range fun x => single (↑(algebraMap A B) (↑(algebraMap R A) x)) 1) ⊔
      Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1) =
    Submodule.span A (Set.range fun x => single x.fst 1 + single x.snd 1 - single (x.fst + x.snd) 1) ⊔
        Submodule.span A (Set.range fun x => single x.snd x.fst + single x.fst x.snd - single (x.fst * x.snd) 1) ⊔
      Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1)
[PROOFSTEP]
simp_rw [sup_assoc, ← (h.Prod_map h).range_comp]
[GOAL]
R : Type u
S : Type v
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
M : Type u_1
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
inst✝⁹ : Module S M
inst✝⁸ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : Algebra R A
inst✝⁴ : Algebra S B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R S B
inst✝ : IsScalarTower R A B
h : Function.Surjective ↑(algebraMap A B)
⊢ Submodule.span A
        (Set.range fun x =>
          single (↑(algebraMap A B) x.fst) 1 + single (↑(algebraMap A B) x.snd) 1 -
            single (↑(algebraMap A B) x.fst + ↑(algebraMap A B) x.snd) 1) ⊔
      (Submodule.span A
          (Set.range fun x =>
            single (↑(algebraMap A B) x.snd) (↑(algebraMap A B) x.fst) +
                single (↑(algebraMap A B) x.fst) (↑(algebraMap A B) x.snd) -
              single (↑(algebraMap A B) x.fst * ↑(algebraMap A B) x.snd) 1) ⊔
        (Submodule.span A (Set.range fun x => single (↑(algebraMap A B) (↑(algebraMap R A) x)) 1) ⊔
          Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1))) =
    Submodule.span A
        (Set.range
          ((fun x => single x.fst 1 + single x.snd 1 - single (x.fst + x.snd) 1) ∘
            Prod.map ↑(algebraMap A B) ↑(algebraMap A B))) ⊔
      (Submodule.span A
          (Set.range
            ((fun x => single x.snd x.fst + single x.fst x.snd - single (x.fst * x.snd) 1) ∘
              Prod.map ↑(algebraMap A B) ↑(algebraMap A B))) ⊔
        Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1))
[PROOFSTEP]
congr 3
  -- Porting note: new
[GOAL]
case e_a.e_a
R : Type u
S : Type v
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
M : Type u_1
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
inst✝⁹ : Module S M
inst✝⁸ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : Algebra R A
inst✝⁴ : Algebra S B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R S B
inst✝ : IsScalarTower R A B
h : Function.Surjective ↑(algebraMap A B)
⊢ Submodule.span A (Set.range fun x => single (↑(algebraMap A B) (↑(algebraMap R A) x)) 1) ⊔
      Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1) =
    Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1)
[PROOFSTEP]
simp_rw [← IsScalarTower.algebraMap_apply R A B]
[GOAL]
case e_a.e_a
R : Type u
S : Type v
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
M : Type u_1
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
inst✝⁹ : Module S M
inst✝⁸ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : Algebra R A
inst✝⁴ : Algebra S B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R S B
inst✝ : IsScalarTower R A B
h : Function.Surjective ↑(algebraMap A B)
⊢ Submodule.span A (Set.range fun x => single (↑(algebraMap R B) x) 1) ⊔
      Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1) =
    Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1)
[PROOFSTEP]
rw [sup_eq_right]
[GOAL]
case e_a.e_a
R : Type u
S : Type v
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
M : Type u_1
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
inst✝⁹ : Module S M
inst✝⁸ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : Algebra R A
inst✝⁴ : Algebra S B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R S B
inst✝ : IsScalarTower R A B
h : Function.Surjective ↑(algebraMap A B)
⊢ Submodule.span A (Set.range fun x => single (↑(algebraMap R B) x) 1) ≤
    Submodule.span A (Set.range fun x => single (↑(algebraMap S B) x) 1)
[PROOFSTEP]
apply Submodule.span_mono
[GOAL]
case e_a.e_a.h
R : Type u
S : Type v
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
M : Type u_1
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
inst✝⁹ : Module S M
inst✝⁸ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : Algebra R A
inst✝⁴ : Algebra S B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R S B
inst✝ : IsScalarTower R A B
h : Function.Surjective ↑(algebraMap A B)
⊢ (Set.range fun x => single (↑(algebraMap R B) x) 1) ⊆ Set.range fun x => single (↑(algebraMap S B) x) 1
[PROOFSTEP]
simp_rw [IsScalarTower.algebraMap_apply R S B]
[GOAL]
case e_a.e_a.h
R : Type u
S : Type v
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
M : Type u_1
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : Module R M
inst✝⁹ : Module S M
inst✝⁸ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : Algebra R A
inst✝⁴ : Algebra S B
inst✝³ : Algebra R B
inst✝² : Algebra A B
inst✝¹ : IsScalarTower R S B
inst✝ : IsScalarTower R A B
h : Function.Surjective ↑(algebraMap A B)
⊢ (Set.range fun x => single (↑(algebraMap S B) (↑(algebraMap R S) x)) 1) ⊆
    Set.range fun x => single (↑(algebraMap S B) x) 1
[PROOFSTEP]
exact Set.range_comp_subset_range (algebraMap R S) fun x => single (algebraMap S B x) (1 : B)
[GOAL]
R : Type u
S : Type v
inst✝¹⁷ : CommRing R
inst✝¹⁶ : CommRing S
inst✝¹⁵ : Algebra R S
M : Type u_1
inst✝¹⁴ : AddCommGroup M
inst✝¹³ : Module R M
inst✝¹² : Module S M
inst✝¹¹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝¹⁰ : CommRing A
inst✝⁹ : CommRing B
inst✝⁸ : Algebra R A
inst✝⁷ : Algebra R B
inst✝⁶ : Algebra A B
inst✝⁵ : Algebra S B
inst✝⁴ : IsScalarTower R A B
inst✝³ : IsScalarTower R S B
inst✝² : Module A M
inst✝¹ : Module B M
inst✝ : IsScalarTower A B M
d : Derivation R B M
⊢ ↑(LinearMap.comp (↑d) (AlgHom.toLinearMap (IsScalarTower.toAlgHom R A B))) 1 = 0
[PROOFSTEP]
simp
[GOAL]
R : Type u
S : Type v
inst✝¹⁷ : CommRing R
inst✝¹⁶ : CommRing S
inst✝¹⁵ : Algebra R S
M : Type u_1
inst✝¹⁴ : AddCommGroup M
inst✝¹³ : Module R M
inst✝¹² : Module S M
inst✝¹¹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝¹⁰ : CommRing A
inst✝⁹ : CommRing B
inst✝⁸ : Algebra R A
inst✝⁷ : Algebra R B
inst✝⁶ : Algebra A B
inst✝⁵ : Algebra S B
inst✝⁴ : IsScalarTower R A B
inst✝³ : IsScalarTower R S B
inst✝² : Module A M
inst✝¹ : Module B M
inst✝ : IsScalarTower A B M
d : Derivation R B M
a b : A
⊢ ↑(LinearMap.comp (↑d) (AlgHom.toLinearMap (IsScalarTower.toAlgHom R A B))) (a * b) =
    a • ↑(LinearMap.comp (↑d) (AlgHom.toLinearMap (IsScalarTower.toAlgHom R A B))) b +
      b • ↑(LinearMap.comp (↑d) (AlgHom.toLinearMap (IsScalarTower.toAlgHom R A B))) a
[PROOFSTEP]
simp
[GOAL]
R : Type u
S : Type v
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : Algebra R S
M : Type u_1
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
inst✝¹⁰ : Module S M
inst✝⁹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁸ : CommRing A
inst✝⁷ : CommRing B
inst✝⁶ : Algebra R A
inst✝⁵ : Algebra R B
inst✝⁴ : Algebra A B
inst✝³ : Algebra S B
inst✝² : IsScalarTower R A B
inst✝¹ : IsScalarTower R S B
inst✝ : SMulCommClass S A B
h : Function.Surjective ↑(algebraMap A B)
⊢ Function.Surjective ↑(map R S A B)
[PROOFSTEP]
rw [← LinearMap.range_eq_top, _root_.eq_top_iff, ← @Submodule.restrictScalars_top B A, ←
  KaehlerDifferential.span_range_derivation, Submodule.restrictScalars_span _ _ h, Submodule.span_le]
[GOAL]
R : Type u
S : Type v
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : Algebra R S
M : Type u_1
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
inst✝¹⁰ : Module S M
inst✝⁹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁸ : CommRing A
inst✝⁷ : CommRing B
inst✝⁶ : Algebra R A
inst✝⁵ : Algebra R B
inst✝⁴ : Algebra A B
inst✝³ : Algebra S B
inst✝² : IsScalarTower R A B
inst✝¹ : IsScalarTower R S B
inst✝ : SMulCommClass S A B
h : Function.Surjective ↑(algebraMap A B)
⊢ Set.range ↑(D S B) ⊆ ↑(LinearMap.range (map R S A B))
[PROOFSTEP]
rintro _ ⟨x, rfl⟩
[GOAL]
case intro
R : Type u
S : Type v
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : Algebra R S
M : Type u_1
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
inst✝¹⁰ : Module S M
inst✝⁹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁸ : CommRing A
inst✝⁷ : CommRing B
inst✝⁶ : Algebra R A
inst✝⁵ : Algebra R B
inst✝⁴ : Algebra A B
inst✝³ : Algebra S B
inst✝² : IsScalarTower R A B
inst✝¹ : IsScalarTower R S B
inst✝ : SMulCommClass S A B
h : Function.Surjective ↑(algebraMap A B)
x : B
⊢ ↑(D S B) x ∈ ↑(LinearMap.range (map R S A B))
[PROOFSTEP]
obtain ⟨y, rfl⟩ := h x
[GOAL]
case intro.intro
R : Type u
S : Type v
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : Algebra R S
M : Type u_1
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
inst✝¹⁰ : Module S M
inst✝⁹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁸ : CommRing A
inst✝⁷ : CommRing B
inst✝⁶ : Algebra R A
inst✝⁵ : Algebra R B
inst✝⁴ : Algebra A B
inst✝³ : Algebra S B
inst✝² : IsScalarTower R A B
inst✝¹ : IsScalarTower R S B
inst✝ : SMulCommClass S A B
h : Function.Surjective ↑(algebraMap A B)
y : A
⊢ ↑(D S B) (↑(algebraMap A B) y) ∈ ↑(LinearMap.range (map R S A B))
[PROOFSTEP]
rw [← KaehlerDifferential.map_D R S A B]
[GOAL]
case intro.intro
R : Type u
S : Type v
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : Algebra R S
M : Type u_1
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
inst✝¹⁰ : Module S M
inst✝⁹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁸ : CommRing A
inst✝⁷ : CommRing B
inst✝⁶ : Algebra R A
inst✝⁵ : Algebra R B
inst✝⁴ : Algebra A B
inst✝³ : Algebra S B
inst✝² : IsScalarTower R A B
inst✝¹ : IsScalarTower R S B
inst✝ : SMulCommClass S A B
h : Function.Surjective ↑(algebraMap A B)
y : A
⊢ ↑(map R S A B) (↑(D R A) y) ∈ ↑(LinearMap.range (map R S A B))
[PROOFSTEP]
exact ⟨_, rfl⟩
[GOAL]
R : Type u
S : Type v
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : Algebra R S
M : Type u_1
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
inst✝¹⁰ : Module S M
inst✝⁹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁸ : CommRing A
inst✝⁷ : CommRing B
inst✝⁶ : Algebra R A
inst✝⁵ : Algebra R B
inst✝⁴ : Algebra A B
inst✝³ : Algebra S B
inst✝² : IsScalarTower R A B
inst✝¹ : IsScalarTower R S B
inst✝ : SMulCommClass S A B
x : B
y : Ω[A⁄R]
⊢ ↑(mapBaseChange R A B) (x ⊗ₜ[A] y) = x • ↑(map R R A B) y
[PROOFSTEP]
conv_lhs => rw [← mul_one x, ← smul_eq_mul, ← TensorProduct.smul_tmul', LinearMap.map_smul]
[GOAL]
R : Type u
S : Type v
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : Algebra R S
M : Type u_1
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
inst✝¹⁰ : Module S M
inst✝⁹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁸ : CommRing A
inst✝⁷ : CommRing B
inst✝⁶ : Algebra R A
inst✝⁵ : Algebra R B
inst✝⁴ : Algebra A B
inst✝³ : Algebra S B
inst✝² : IsScalarTower R A B
inst✝¹ : IsScalarTower R S B
inst✝ : SMulCommClass S A B
x : B
y : Ω[A⁄R]
| ↑(mapBaseChange R A B) (x ⊗ₜ[A] y)
[PROOFSTEP]
rw [← mul_one x, ← smul_eq_mul, ← TensorProduct.smul_tmul', LinearMap.map_smul]
[GOAL]
R : Type u
S : Type v
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : Algebra R S
M : Type u_1
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
inst✝¹⁰ : Module S M
inst✝⁹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁸ : CommRing A
inst✝⁷ : CommRing B
inst✝⁶ : Algebra R A
inst✝⁵ : Algebra R B
inst✝⁴ : Algebra A B
inst✝³ : Algebra S B
inst✝² : IsScalarTower R A B
inst✝¹ : IsScalarTower R S B
inst✝ : SMulCommClass S A B
x : B
y : Ω[A⁄R]
| ↑(mapBaseChange R A B) (x ⊗ₜ[A] y)
[PROOFSTEP]
rw [← mul_one x, ← smul_eq_mul, ← TensorProduct.smul_tmul', LinearMap.map_smul]
[GOAL]
R : Type u
S : Type v
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : Algebra R S
M : Type u_1
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
inst✝¹⁰ : Module S M
inst✝⁹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁸ : CommRing A
inst✝⁷ : CommRing B
inst✝⁶ : Algebra R A
inst✝⁵ : Algebra R B
inst✝⁴ : Algebra A B
inst✝³ : Algebra S B
inst✝² : IsScalarTower R A B
inst✝¹ : IsScalarTower R S B
inst✝ : SMulCommClass S A B
x : B
y : Ω[A⁄R]
| ↑(mapBaseChange R A B) (x ⊗ₜ[A] y)
[PROOFSTEP]
rw [← mul_one x, ← smul_eq_mul, ← TensorProduct.smul_tmul', LinearMap.map_smul]
[GOAL]
R : Type u
S : Type v
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : Algebra R S
M : Type u_1
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
inst✝¹⁰ : Module S M
inst✝⁹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁸ : CommRing A
inst✝⁷ : CommRing B
inst✝⁶ : Algebra R A
inst✝⁵ : Algebra R B
inst✝⁴ : Algebra A B
inst✝³ : Algebra S B
inst✝² : IsScalarTower R A B
inst✝¹ : IsScalarTower R S B
inst✝ : SMulCommClass S A B
x : B
y : Ω[A⁄R]
⊢ x • ↑(mapBaseChange R A B) (1 ⊗ₜ[A] y) = x • ↑(map R R A B) y
[PROOFSTEP]
congr 1
[GOAL]
case e_a
R : Type u
S : Type v
inst✝¹⁵ : CommRing R
inst✝¹⁴ : CommRing S
inst✝¹³ : Algebra R S
M : Type u_1
inst✝¹² : AddCommGroup M
inst✝¹¹ : Module R M
inst✝¹⁰ : Module S M
inst✝⁹ : IsScalarTower R S M
A : Type u_2
B : Type u_3
inst✝⁸ : CommRing A
inst✝⁷ : CommRing B
inst✝⁶ : Algebra R A
inst✝⁵ : Algebra R B
inst✝⁴ : Algebra A B
inst✝³ : Algebra S B
inst✝² : IsScalarTower R A B
inst✝¹ : IsScalarTower R S B
inst✝ : SMulCommClass S A B
x : B
y : Ω[A⁄R]
⊢ ↑(mapBaseChange R A B) (1 ⊗ₜ[A] y) = ↑(map R R A B) y
[PROOFSTEP]
exact IsBaseChange.lift_eq _ _ _