Theorem: LinearIndependent.sum_elim_of_quotient
File: Mathlib/LinearAlgebra/Dimension/Constructions.lean

tactic: refine .sum_type (hf.map' M'.subtype M'.ker_subtype) (.of_comp M'.mkQ hg) ?_
state_before: R S : Type u
M : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring R
inst✝⁶ : CommRing S
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'✝
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'✝
inst✝ : Module R M₁
M' : Submodule R M
ι₁ : Type u_2
ι₂ : Type u_3
f : ι₁ → ↥M'
hf : LinearIndependent R f
g : ι₂ → M
hg : LinearIndependent R (Submodule.Quotient.mk ∘ g)
⊢ LinearIndependent R (Sum.elim (fun x => ↑(f x)) g)
state_after: R S : Type u
M : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring R
inst✝⁶ : CommRing S
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'✝
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'✝
inst✝ : Module R M₁
M' : Submodule R M
ι₁ : Type u_2
ι₂ : Type u_3
f : ι₁ → ↥M'
hf : LinearIndependent R f
g : ι₂ → M
hg : LinearIndependent R (Submodule.Quotient.mk ∘ g)
⊢ Disjoint (span R (range fun x => ↑(f x))) (span R (range g))

tactic: refine disjoint_def.mpr fun x h₁ h₂ ↦ ?_
state_before: R S : Type u
M : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring R
inst✝⁶ : CommRing S
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'✝
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'✝
inst✝ : Module R M₁
M' : Submodule R M
ι₁ : Type u_2
ι₂ : Type u_3
f : ι₁ → ↥M'
hf : LinearIndependent R f
g : ι₂ → M
hg : LinearIndependent R (Submodule.Quotient.mk ∘ g)
⊢ Disjoint (span R (range fun x => ↑(f x))) (span R (range g))
state_after: R S : Type u
M : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring R
inst✝⁶ : CommRing S
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'✝
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'✝
inst✝ : Module R M₁
M' : Submodule R M
ι₁ : Type u_2
ι₂ : Type u_3
f : ι₁ → ↥M'
hf : LinearIndependent R f
g : ι₂ → M
hg : LinearIndependent R (Submodule.Quotient.mk ∘ g)
x : M
h₁ : x ∈ span R (range fun x => ↑(f x))
h₂ : x ∈ span R (range g)
⊢ x = 0

tactic: have : x ∈ M' := span_le.mpr (Set.range_subset_iff.mpr fun i ↦ (f i).prop) h₁
state_before: R S : Type u
M : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring R
inst✝⁶ : CommRing S
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'✝
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'✝
inst✝ : Module R M₁
M' : Submodule R M
ι₁ : Type u_2
ι₂ : Type u_3
f : ι₁ → ↥M'
hf : LinearIndependent R f
g : ι₂ → M
hg : LinearIndependent R (Submodule.Quotient.mk ∘ g)
x : M
h₁ : x ∈ span R (range fun x => ↑(f x))
h₂ : x ∈ span R (range g)
⊢ x = 0
state_after: R S : Type u
M : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring R
inst✝⁶ : CommRing S
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'✝
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'✝
inst✝ : Module R M₁
M' : Submodule R M
ι₁ : Type u_2
ι₂ : Type u_3
f : ι₁ → ↥M'
hf : LinearIndependent R f
g : ι₂ → M
hg : LinearIndependent R (Submodule.Quotient.mk ∘ g)
x : M
h₁ : x ∈ span R (range fun x => ↑(f x))
h₂ : x ∈ span R (range g)
this : x ∈ M'
⊢ x = 0

tactic: obtain ⟨c, rfl⟩ := Finsupp.mem_span_range_iff_exists_finsupp.mp h₂
state_before: R S : Type u
M : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring R
inst✝⁶ : CommRing S
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'✝
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'✝
inst✝ : Module R M₁
M' : Submodule R M
ι₁ : Type u_2
ι₂ : Type u_3
f : ι₁ → ↥M'
hf : LinearIndependent R f
g : ι₂ → M
hg : LinearIndependent R (Submodule.Quotient.mk ∘ g)
x : M
h₁ : x ∈ span R (range fun x => ↑(f x))
h₂ : x ∈ span R (range g)
this : x ∈ M'
⊢ x = 0
state_after: case intro
R S : Type u
M : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring R
inst✝⁶ : CommRing S
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'✝
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'✝
inst✝ : Module R M₁
M' : Submodule R M
ι₁ : Type u_2
ι₂ : Type u_3
f : ι₁ → ↥M'
hf : LinearIndependent R f
g : ι₂ → M
hg : LinearIndependent R (Submodule.Quotient.mk ∘ g)
c : ι₂ →₀ R
h₁ : (c.sum fun i a => a • g i) ∈ span R (range fun x => ↑(f x))
h₂ : (c.sum fun i a => a • g i) ∈ span R (range g)
this : (c.sum fun i a => a • g i) ∈ M'
⊢ (c.sum fun i a => a • g i) = 0

tactic: simp_rw [← Quotient.mk_eq_zero, ← mkQ_apply, map_finsupp_sum, map_smul, mkQ_apply] at this
state_before: case intro
R S : Type u
M : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring R
inst✝⁶ : CommRing S
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'✝
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'✝
inst✝ : Module R M₁
M' : Submodule R M
ι₁ : Type u_2
ι₂ : Type u_3
f : ι₁ → ↥M'
hf : LinearIndependent R f
g : ι₂ → M
hg : LinearIndependent R (Submodule.Quotient.mk ∘ g)
c : ι₂ →₀ R
h₁ : (c.sum fun i a => a • g i) ∈ span R (range fun x => ↑(f x))
h₂ : (c.sum fun i a => a • g i) ∈ span R (range g)
this : (c.sum fun i a => a • g i) ∈ M'
⊢ (c.sum fun i a => a • g i) = 0
state_after: case intro
R S : Type u
M : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring R
inst✝⁶ : CommRing S
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'✝
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'✝
inst✝ : Module R M₁
M' : Submodule R M
ι₁ : Type u_2
ι₂ : Type u_3
f : ι₁ → ↥M'
hf : LinearIndependent R f
g : ι₂ → M
hg : LinearIndependent R (Submodule.Quotient.mk ∘ g)
c : ι₂ →₀ R
h₁ : (c.sum fun i a => a • g i) ∈ span R (range fun x => ↑(f x))
h₂ : (c.sum fun i a => a • g i) ∈ span R (range g)
this : (c.sum fun a b => b • Submodule.Quotient.mk (g a)) = 0
⊢ (c.sum fun i a => a • g i) = 0

tactic: rw [linearIndependent_iff.mp hg _ this, Finsupp.sum_zero_index]
state_before: case intro
R S : Type u
M : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring R
inst✝⁶ : CommRing S
inst✝⁵ : AddCommGroup M
inst✝⁴ : AddCommGroup M'✝
inst✝³ : AddCommGroup M₁
inst✝² : Module R M
inst✝¹ : Module R M'✝
inst✝ : Module R M₁
M' : Submodule R M
ι₁ : Type u_2
ι₂ : Type u_3
f : ι₁ → ↥M'
hf : LinearIndependent R f
g : ι₂ → M
hg : LinearIndependent R (Submodule.Quotient.mk ∘ g)
c : ι₂ →₀ R
h₁ : (c.sum fun i a => a • g i) ∈ span R (range fun x => ↑(f x))
h₂ : (c.sum fun i a => a • g i) ∈ span R (range g)
this : (c.sum fun a b => b • Submodule.Quotient.mk (g a)) = 0
⊢ (c.sum fun i a => a • g i) = 0
state_after: no goals