Theorem: Subspace.dualAnnihilator_dualAnnihilator_eq_map
File: Mathlib/LinearAlgebra/Dual.lean

tactic: let e1 := (Free.chooseBasis K W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
state_before: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
⊢ (dualAnnihilator W).dualAnnihilator = map (Dual.eval K V) W
state_after: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
⊢ (dualAnnihilator W).dualAnnihilator = map (Dual.eval K V) W

tactic: haveI := e1.finiteDimensional
state_before: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
⊢ (dualAnnihilator W).dualAnnihilator = map (Dual.eval K V) W
state_after: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
this : FiniteDimensional K (Dual K V ⧸ dualAnnihilator W)
⊢ (dualAnnihilator W).dualAnnihilator = map (Dual.eval K V) W

tactic: let e2 := (Free.chooseBasis K _).toDualEquiv ≪≫ₗ W.dualAnnihilator.dualQuotEquivDualAnnihilator
state_before: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
this : FiniteDimensional K (Dual K V ⧸ dualAnnihilator W)
⊢ (dualAnnihilator W).dualAnnihilator = map (Dual.eval K V) W
state_after: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
this : FiniteDimensional K (Dual K V ⧸ dualAnnihilator W)
e2 : (Dual K V ⧸ dualAnnihilator W) ≃ₗ[K] ↥(dualAnnihilator W).dualAnnihilator :=
  (Free.chooseBasis K (Dual K V ⧸ dualAnnihilator W)).toDualEquiv ≪≫ₗ (dualAnnihilator W).dualQuotEquivDualAnnihilator
⊢ (dualAnnihilator W).dualAnnihilator = map (Dual.eval K V) W

tactic: haveI := LinearEquiv.finiteDimensional (V₂ := W.dualAnnihilator.dualAnnihilator) e2
state_before: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
this : FiniteDimensional K (Dual K V ⧸ dualAnnihilator W)
e2 : (Dual K V ⧸ dualAnnihilator W) ≃ₗ[K] ↥(dualAnnihilator W).dualAnnihilator :=
  (Free.chooseBasis K (Dual K V ⧸ dualAnnihilator W)).toDualEquiv ≪≫ₗ (dualAnnihilator W).dualQuotEquivDualAnnihilator
⊢ (dualAnnihilator W).dualAnnihilator = map (Dual.eval K V) W
state_after: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
this✝ : FiniteDimensional K (Dual K V ⧸ dualAnnihilator W)
e2 : (Dual K V ⧸ dualAnnihilator W) ≃ₗ[K] ↥(dualAnnihilator W).dualAnnihilator :=
  (Free.chooseBasis K (Dual K V ⧸ dualAnnihilator W)).toDualEquiv ≪≫ₗ (dualAnnihilator W).dualQuotEquivDualAnnihilator
this : FiniteDimensional K ↥(dualAnnihilator W).dualAnnihilator
⊢ (dualAnnihilator W).dualAnnihilator = map (Dual.eval K V) W

tactic: rw [FiniteDimensional.eq_of_le_of_finrank_eq (map_le_dualAnnihilator_dualAnnihilator W)]
state_before: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
this✝ : FiniteDimensional K (Dual K V ⧸ dualAnnihilator W)
e2 : (Dual K V ⧸ dualAnnihilator W) ≃ₗ[K] ↥(dualAnnihilator W).dualAnnihilator :=
  (Free.chooseBasis K (Dual K V ⧸ dualAnnihilator W)).toDualEquiv ≪≫ₗ (dualAnnihilator W).dualQuotEquivDualAnnihilator
this : FiniteDimensional K ↥(dualAnnihilator W).dualAnnihilator
⊢ (dualAnnihilator W).dualAnnihilator = map (Dual.eval K V) W
state_after: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
this✝ : FiniteDimensional K (Dual K V ⧸ dualAnnihilator W)
e2 : (Dual K V ⧸ dualAnnihilator W) ≃ₗ[K] ↥(dualAnnihilator W).dualAnnihilator :=
  (Free.chooseBasis K (Dual K V ⧸ dualAnnihilator W)).toDualEquiv ≪≫ₗ (dualAnnihilator W).dualQuotEquivDualAnnihilator
this : FiniteDimensional K ↥(dualAnnihilator W).dualAnnihilator
⊢ finrank K ↥(map (Dual.eval K V) W) = finrank K ↥(dualAnnihilator W).dualAnnihilator

tactic: rw [← (equivMapOfInjective _ (eval_apply_injective K (V := V)) W).finrank_eq, e1.finrank_eq]
state_before: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
this✝ : FiniteDimensional K (Dual K V ⧸ dualAnnihilator W)
e2 : (Dual K V ⧸ dualAnnihilator W) ≃ₗ[K] ↥(dualAnnihilator W).dualAnnihilator :=
  (Free.chooseBasis K (Dual K V ⧸ dualAnnihilator W)).toDualEquiv ≪≫ₗ (dualAnnihilator W).dualQuotEquivDualAnnihilator
this : FiniteDimensional K ↥(dualAnnihilator W).dualAnnihilator
⊢ finrank K ↥(map (Dual.eval K V) W) = finrank K ↥(dualAnnihilator W).dualAnnihilator
state_after: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
this✝ : FiniteDimensional K (Dual K V ⧸ dualAnnihilator W)
e2 : (Dual K V ⧸ dualAnnihilator W) ≃ₗ[K] ↥(dualAnnihilator W).dualAnnihilator :=
  (Free.chooseBasis K (Dual K V ⧸ dualAnnihilator W)).toDualEquiv ≪≫ₗ (dualAnnihilator W).dualQuotEquivDualAnnihilator
this : FiniteDimensional K ↥(dualAnnihilator W).dualAnnihilator
⊢ finrank K (Dual K V ⧸ dualAnnihilator W) = finrank K ↥(dualAnnihilator W).dualAnnihilator

tactic: exact e2.finrank_eq
state_before: K✝ : Type uK
inst✝⁸ : Field K✝
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K✝ V₁
inst✝⁵ : AddCommGroup V₂
inst✝⁴ : Module K✝ V₂
K : Type u_1
V : Type u_2
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
W : Subspace K V
inst✝ : FiniteDimensional K ↥W
e1 : ↥W ≃ₗ[K] Dual K V ⧸ dualAnnihilator W := (Free.chooseBasis K ↥W).toDualEquiv ≪≫ₗ W.quotAnnihilatorEquiv.symm
this✝ : FiniteDimensional K (Dual K V ⧸ dualAnnihilator W)
e2 : (Dual K V ⧸ dualAnnihilator W) ≃ₗ[K] ↥(dualAnnihilator W).dualAnnihilator :=
  (Free.chooseBasis K (Dual K V ⧸ dualAnnihilator W)).toDualEquiv ≪≫ₗ (dualAnnihilator W).dualQuotEquivDualAnnihilator
this : FiniteDimensional K ↥(dualAnnihilator W).dualAnnihilator
⊢ finrank K (Dual K V ⧸ dualAnnihilator W) = finrank K ↥(dualAnnihilator W).dualAnnihilator
state_after: no goals