Theorem: TensorProduct.dualDistrib_dualDistribInvOfBasis_right_inverse
File: Mathlib/LinearAlgebra/Dual.lean

tactic: apply (b.dualBasis.tensorProduct c.dualBasis).ext
state_before: R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
⊢ comp (dualDistribInvOfBasis b c) (dualDistrib R M N) = LinearMap.id

tactic: rintro ⟨i, j⟩
state_before: R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
⊢ ∀ (i : ι × κ),
    ↑(comp (dualDistribInvOfBasis b c) (dualDistrib R M N))
        (↑(Basis.tensorProduct (Basis.dualBasis b) (Basis.dualBasis c)) i) =
      ↑LinearMap.id (↑(Basis.tensorProduct (Basis.dualBasis b) (Basis.dualBasis c)) i)

tactic: simp only [Basis.tensorProduct_apply, Basis.coe_dualBasis, coe_comp, Function.comp_apply,
  dualDistribInvOfBasis_apply, dualDistrib_apply, Basis.coord_apply, Basis.repr_self,
  ne_eq, id_coe, id_eq]
state_before: case mk
R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
i : ι
j : κ
⊢ ↑(comp (dualDistribInvOfBasis b c) (dualDistrib R M N))
      (↑(Basis.tensorProduct (Basis.dualBasis b) (Basis.dualBasis c)) (i, j)) =
    ↑LinearMap.id (↑(Basis.tensorProduct (Basis.dualBasis b) (Basis.dualBasis c)) (i, j))

tactic: rw [Finset.sum_eq_single i, Finset.sum_eq_single j]
state_before: case mk
R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
i : ι
j : κ
⊢ ∑ x : ι, ∑ x_1 : κ, (↑(Finsupp.single x 1) i * ↑(Finsupp.single x_1 1) j) • Basis.coord b x ⊗ₜ[R] Basis.coord c x_1 =
    Basis.coord b i ⊗ₜ[R] Basis.coord c j

tactic: simp
state_before: case mk
R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
i : ι
j : κ
⊢ (↑(Finsupp.single i 1) i * ↑(Finsupp.single j 1) j) • Basis.coord b i ⊗ₜ[R] Basis.coord c j =
    Basis.coord b i ⊗ₜ[R] Basis.coord c j

case mk.h₀
R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
i : ι
j : κ
⊢ ∀ (b_1 : κ),
    b_1 ∈ Finset.univ →
      b_1 ≠ j → (↑(Finsupp.single i 1) i * ↑(Finsupp.single b_1 1) j) • Basis.coord b i ⊗ₜ[R] Basis.coord c b_1 = 0

case mk.h₁
R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
i : ι
j : κ
⊢ ¬j ∈ Finset.univ → (↑(Finsupp.single i 1) i * ↑(Finsupp.single j 1) j) • Basis.coord b i ⊗ₜ[R] Basis.coord c j = 0

case mk.h₀
R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
i : ι
j : κ
⊢ ∀ (b_1 : ι),
    b_1 ∈ Finset.univ →
      b_1 ≠ i →
        ∑ x : κ, (↑(Finsupp.single b_1 1) i * ↑(Finsupp.single x 1) j) • Basis.coord b b_1 ⊗ₜ[R] Basis.coord c x = 0

case mk.h₁
R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
i : ι
j : κ
⊢ ¬i ∈ Finset.univ →
    ∑ x : κ, (↑(Finsupp.single i 1) i * ↑(Finsupp.single x 1) j) • Basis.coord b i ⊗ₜ[R] Basis.coord c x = 0

tactic: all_goals { intros; simp [*] at * }
state_before: case mk.h₀
R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
i : ι
j : κ
⊢ ∀ (b_1 : κ),
    b_1 ∈ Finset.univ →
      b_1 ≠ j → (↑(Finsupp.single i 1) i * ↑(Finsupp.single b_1 1) j) • Basis.coord b i ⊗ₜ[R] Basis.coord c b_1 = 0

case mk.h₁
R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
i : ι
j : κ
⊢ ¬j ∈ Finset.univ → (↑(Finsupp.single i 1) i * ↑(Finsupp.single j 1) j) • Basis.coord b i ⊗ₜ[R] Basis.coord c j = 0

case mk.h₀
R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
i : ι
j : κ
⊢ ∀ (b_1 : ι),
    b_1 ∈ Finset.univ →
      b_1 ≠ i →
        ∑ x : κ, (↑(Finsupp.single b_1 1) i * ↑(Finsupp.single x 1) j) • Basis.coord b b_1 ⊗ₜ[R] Basis.coord c x = 0

case mk.h₁
R : Type u_2
M : Type u_3
N : Type u_5
ι : Type u_1
κ : Type u_4
inst✝⁸ : DecidableEq ι
inst✝⁷ : DecidableEq κ
inst✝⁶ : Fintype ι
inst✝⁵ : Fintype κ
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
b : Basis ι R M
c : Basis κ R N
i : ι
j : κ
⊢ ¬i ∈ Finset.univ →
    ∑ x : κ, (↑(Finsupp.single i 1) i * ↑(Finsupp.single x 1) j) • Basis.coord b i ⊗ₜ[R] Basis.coord c x = 0