Theorem: KaehlerDifferential.span_range_derivation
File: Mathlib/RingTheory/Kaehler/Basic.lean

Proof steps:
state_before: 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)) = ⊤
state_after: 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))
tactic: rw [_root_.eq_top_iff]
state_before: 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))
state_after: 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))
tactic: rintro x -
state_before: 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))
state_after: 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 R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))
tactic: obtain ⟨⟨x, hx⟩, rfl⟩ := Ideal.toCotangent_surjective _ x
state_before: 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 R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))
state_after: 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 R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))
tactic: have : x ∈ (KaehlerDifferential.ideal R S).restrictScalars S := hx
state_before: 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 R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))
state_after: 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 R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))
tactic: rw [← KaehlerDifferential.submodule_span_range_eq_ideal] at this
state_before: 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 R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))
state_after: 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 : x ∈ ideal R S), (ideal R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))
tactic: suffices ∃ hx, (KaehlerDifferential.ideal R S).toCotangent ⟨x, hx⟩ ∈
      Submodule.span S (Set.range <| KaehlerDifferential.D R S) by
    exact this.choose_spec
state_before: 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 : x ∈ ideal R S), (ideal R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))
state_after: 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 ∈ Set.range fun s => 1 ⊗ₜ[R] s - s ⊗ₜ[R] 1,
    ∃ (hx : x ∈ ideal R S), (ideal R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))

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 : 0 ∈ ideal R S), (ideal R S).toCotangent ⟨0, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))

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 : x ∈ ideal R S), (ideal R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))) →
      (∃ (hx : y ∈ ideal R S), (ideal R S).toCotangent ⟨y, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))) →
        ∃ (hx : x + y ∈ ideal R S), (ideal R S).toCotangent ⟨x + y, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))

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 : x ∈ ideal R S), (ideal R S).toCotangent ⟨x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))) →
      ∃ (hx : a • x ∈ ideal R S), (ideal R S).toCotangent ⟨a • x, hx⟩ ∈ Submodule.span S (Set.range ⇑(D R S))
tactic: refine Submodule.span_induction this ?_ ?_ ?_ ?_