Theorem: Module.finite_dual_iff
File: Mathlib/LinearAlgebra/Dual.lean

tactic: constructor <;> intro h
state_before: K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
⊢ Finite K (Dual K V) ↔ Finite K V
state_after: case mp
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
h : Finite K (Dual K V)
⊢ Finite K V

case mpr
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
h : Finite K V
⊢ Finite K (Dual K V)

tactic: obtain ⟨⟨ι, b⟩⟩ := Module.Free.exists_basis (R := K) (M := V)
state_before: case mp
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
h : Finite K (Dual K V)
⊢ Finite K V
state_after: case mp.intro.mk
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
h : Finite K (Dual K V)
ι : Type uV
b : Basis ι K V
⊢ Finite K V

tactic: nontriviality K
state_before: case mp.intro.mk
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
h : Finite K (Dual K V)
ι : Type uV
b : Basis ι K V
⊢ Finite K V
state_after: K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
h : Finite K (Dual K V)
ι : Type uV
b : Basis ι K V
a✝ : Nontrivial K
⊢ Finite K V

tactic: obtain ⟨⟨s, span_s⟩⟩ := h
state_before: K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
h : Finite K (Dual K V)
ι : Type uV
b : Basis ι K V
a✝ : Nontrivial K
⊢ Finite K V
state_after: case mk.intro
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
ι : Type uV
b : Basis ι K V
a✝ : Nontrivial K
s : Finset (Dual K V)
span_s : span K ↑s = ⊤
⊢ Finite K V

tactic: haveI := (b.linearIndependent.map' _ b.toDual_ker).finite_of_le_span_finite _ s ?_
state_before: case mk.intro
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
ι : Type uV
b : Basis ι K V
a✝ : Nontrivial K
s : Finset (Dual K V)
span_s : span K ↑s = ⊤
⊢ Finite K V
state_after: case mk.intro.refine_2
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
ι : Type uV
b : Basis ι K V
a✝ : Nontrivial K
s : Finset (Dual K V)
span_s : span K ↑s = ⊤
this : _root_.Finite ι
⊢ Finite K V

case mk.intro.refine_1
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
ι : Type uV
b : Basis ι K V
a✝ : Nontrivial K
s : Finset (Dual K V)
span_s : span K ↑s = ⊤
⊢ Set.range (⇑b.toDual ∘ ⇑b) ≤ ↑(span K ↑s)

tactic: exact Finite.of_basis b
state_before: case mk.intro.refine_2
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
ι : Type uV
b : Basis ι K V
a✝ : Nontrivial K
s : Finset (Dual K V)
span_s : span K ↑s = ⊤
this : _root_.Finite ι
⊢ Finite K V
state_after: no goals

tactic: rw [span_s]
state_before: case mk.intro.refine_1
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
ι : Type uV
b : Basis ι K V
a✝ : Nontrivial K
s : Finset (Dual K V)
span_s : span K ↑s = ⊤
⊢ Set.range (⇑b.toDual ∘ ⇑b) ≤ ↑(span K ↑s)
state_after: case mk.intro.refine_1
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
ι : Type uV
b : Basis ι K V
a✝ : Nontrivial K
s : Finset (Dual K V)
span_s : span K ↑s = ⊤
⊢ Set.range (⇑b.toDual ∘ ⇑b) ≤ ↑⊤

tactic: apply le_top
state_before: case mk.intro.refine_1
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
ι : Type uV
b : Basis ι K V
a✝ : Nontrivial K
s : Finset (Dual K V)
span_s : span K ↑s = ⊤
⊢ Set.range (⇑b.toDual ∘ ⇑b) ≤ ↑⊤
state_after: no goals

tactic: infer_instance
state_before: case mpr
K : Type uK
V : Type uV
inst✝³ : CommRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Free K V
h : Finite K V
⊢ Finite K (Dual K V)
state_after: no goals