Theorem: ExteriorAlgebra.ιMulti_span
File: Mathlib/LinearAlgebra/ExteriorAlgebra/Grading.lean

tactic: rw [Submodule.eq_top_iff']
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd) = ⊤
state_after: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ ∀ (x : ExteriorAlgebra R M), x ∈ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd)

tactic: intro x
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ ∀ (x : ExteriorAlgebra R M), x ∈ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd)
state_after: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
x : ExteriorAlgebra R M
⊢ x ∈ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd)

tactic: induction x using DirectSum.Decomposition.inductionOn fun i => ⋀[R]^i M with
| h_zero => exact Submodule.zero_mem _
| h_add _ _ hm hm' => exact Submodule.add_mem _ hm hm'
| h_homogeneous hm =>
  let ⟨m, hm⟩ := hm
  apply Set.mem_of_mem_of_subset hm
  rw [← ιMulti_span_fixedDegree]
  refine Submodule.span_mono fun _ hx ↦ ?_
  obtain ⟨y, rfl⟩ := hx
  exact ⟨⟨_, y⟩, rfl⟩
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
x : ExteriorAlgebra R M
⊢ x ∈ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd)
state_after: no goals

tactic: exact Submodule.zero_mem _
state_before: case h_zero
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ 0 ∈ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd)
state_after: no goals

tactic: exact Submodule.add_mem _ hm hm'
state_before: case h_add
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
m✝ m'✝ : ExteriorAlgebra R M
hm : m✝ ∈ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd)
hm' : m'✝ ∈ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd)
⊢ m✝ + m'✝ ∈ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd)
state_after: no goals

tactic: let ⟨m, hm⟩ := hm
state_before: case h_homogeneous
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
i✝ : ℕ
hm : ↥(⋀[R]^i✝ M)
⊢ ↑hm ∈ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd)
state_after: case h_homogeneous
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
i✝ : ℕ
hm✝ : ↥(⋀[R]^i✝ M)
m : ExteriorAlgebra R M
hm : m ∈ ⋀[R]^i✝ M
⊢ ↑⟨m, hm⟩ ∈ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd)

tactic: apply Set.mem_of_mem_of_subset hm
state_before: case h_homogeneous
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
i✝ : ℕ
hm✝ : ↥(⋀[R]^i✝ M)
m : ExteriorAlgebra R M
hm : m ∈ ⋀[R]^i✝ M
⊢ ↑⟨m, hm⟩ ∈ Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd)
state_after: case h_homogeneous
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
i✝ : ℕ
hm✝ : ↥(⋀[R]^i✝ M)
m : ExteriorAlgebra R M
hm : m ∈ ⋀[R]^i✝ M
⊢ ↑(⋀[R]^i✝ M) ⊆ ↑(Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd))

tactic: rw [← ιMulti_span_fixedDegree]
state_before: case h_homogeneous
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
i✝ : ℕ
hm✝ : ↥(⋀[R]^i✝ M)
m : ExteriorAlgebra R M
hm : m ∈ ⋀[R]^i✝ M
⊢ ↑(⋀[R]^i✝ M) ⊆ ↑(Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd))
state_after: case h_homogeneous
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
i✝ : ℕ
hm✝ : ↥(⋀[R]^i✝ M)
m : ExteriorAlgebra R M
hm : m ∈ ⋀[R]^i✝ M
⊢ ↑(Submodule.span R (Set.range ⇑(ιMulti R i✝))) ⊆ ↑(Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd))

tactic: refine Submodule.span_mono fun _ hx ↦ ?_
state_before: case h_homogeneous
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
i✝ : ℕ
hm✝ : ↥(⋀[R]^i✝ M)
m : ExteriorAlgebra R M
hm : m ∈ ⋀[R]^i✝ M
⊢ ↑(Submodule.span R (Set.range ⇑(ιMulti R i✝))) ⊆ ↑(Submodule.span R (Set.range fun x => (ιMulti R x.fst) x.snd))
state_after: case h_homogeneous
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
i✝ : ℕ
hm✝ : ↥(⋀[R]^i✝ M)
m : ExteriorAlgebra R M
hm : m ∈ ⋀[R]^i✝ M
x✝ : ExteriorAlgebra R M
hx : x✝ ∈ Set.range ⇑(ιMulti R i✝)
⊢ x✝ ∈ Set.range fun x => (ιMulti R x.fst) x.snd

tactic: obtain ⟨y, rfl⟩ := hx
state_before: case h_homogeneous
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
i✝ : ℕ
hm✝ : ↥(⋀[R]^i✝ M)
m : ExteriorAlgebra R M
hm : m ∈ ⋀[R]^i✝ M
x✝ : ExteriorAlgebra R M
hx : x✝ ∈ Set.range ⇑(ιMulti R i✝)
⊢ x✝ ∈ Set.range fun x => (ιMulti R x.fst) x.snd
state_after: case h_homogeneous.intro
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
i✝ : ℕ
hm✝ : ↥(⋀[R]^i✝ M)
m : ExteriorAlgebra R M
hm : m ∈ ⋀[R]^i✝ M
y : Fin i✝ → M
⊢ (ιMulti R i✝) y ∈ Set.range fun x => (ιMulti R x.fst) x.snd

tactic: exact ⟨⟨_, y⟩, rfl⟩
state_before: case h_homogeneous.intro
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
i✝ : ℕ
hm✝ : ↥(⋀[R]^i✝ M)
m : ExteriorAlgebra R M
hm : m ∈ ⋀[R]^i✝ M
y : Fin i✝ → M
⊢ (ιMulti R i✝) y ∈ Set.range fun x => (ιMulti R x.fst) x.snd
state_after: no goals