Theorem: AffineIndependent.finrank_vectorSpan_image_finset
File: Mathlib/LinearAlgebra/AffineSpace/FiniteDimensional.lean

tactic: classical
have hi' := hi.range.mono (Set.image_subset_range p ↑s)
have hc' : (s.image p).card = n + 1 := by rwa [s.card_image_of_injective hi.injective]
have hn : (s.image p).Nonempty := by simp [hc', ← Finset.card_pos]
rcases hn with ⟨p₁, hp₁⟩
have hp₁' : p₁ ∈ p '' s := by simpa using hp₁
rw [affineIndependent_set_iff_linearIndependent_vsub k hp₁', ← Finset.coe_singleton,
  ← Finset.coe_image, ← Finset.coe_sdiff, Finset.sdiff_singleton_eq_erase, ← Finset.coe_image]
  at hi'
have hc : (Finset.image (fun p : P => p -ᵥ p₁) ((Finset.image p s).erase p₁)).card = n := by
  rw [Finset.card_image_of_injective _ (vsub_left_injective _), Finset.card_erase_of_mem hp₁]
  exact Nat.pred_eq_of_eq_succ hc'
rwa [vectorSpan_eq_span_vsub_finset_right_ne k hp₁, finrank_span_finset_eq_card, hc]
state_before: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n
state_after: no goals

tactic: have hi' := hi.range.mono (Set.image_subset_range p ↑s)
state_before: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n
state_after: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n

tactic: have hc' : (s.image p).card = n + 1 := by rwa [s.card_image_of_injective hi.injective]
state_before: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n
state_after: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
hc' : (Finset.image p s).card = n + 1
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n

tactic: have hn : (s.image p).Nonempty := by simp [hc', ← Finset.card_pos]
state_before: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
hc' : (Finset.image p s).card = n + 1
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n
state_after: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
hc' : (Finset.image p s).card = n + 1
hn : (Finset.image p s).Nonempty
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n

tactic: rcases hn with ⟨p₁, hp₁⟩
state_before: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
hc' : (Finset.image p s).card = n + 1
hn : (Finset.image p s).Nonempty
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n
state_after: case intro
k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
hc' : (Finset.image p s).card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n

tactic: have hp₁' : p₁ ∈ p '' s := by simpa using hp₁
state_before: case intro
k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
hc' : (Finset.image p s).card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n
state_after: case intro
k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
hc' : (Finset.image p s).card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
hp₁' : p₁ ∈ p '' ↑s
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n

tactic: rw [affineIndependent_set_iff_linearIndependent_vsub k hp₁', ← Finset.coe_singleton,
  ← Finset.coe_image, ← Finset.coe_sdiff, Finset.sdiff_singleton_eq_erase, ← Finset.coe_image]
  at hi'
state_before: case intro
k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
hc' : (Finset.image p s).card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
hp₁' : p₁ ∈ p '' ↑s
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n
state_after: case intro
k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hc' : (Finset.image p s).card = n + 1
p₁ : P
hi' : LinearIndependent k fun (v : ↑↑(Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁))) => ↑v
hp₁ : p₁ ∈ Finset.image p s
hp₁' : p₁ ∈ p '' ↑s
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n

tactic: have hc : (Finset.image (fun p : P => p -ᵥ p₁) ((Finset.image p s).erase p₁)).card = n := by
  rw [Finset.card_image_of_injective _ (vsub_left_injective _), Finset.card_erase_of_mem hp₁]
  exact Nat.pred_eq_of_eq_succ hc'
state_before: case intro
k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hc' : (Finset.image p s).card = n + 1
p₁ : P
hi' : LinearIndependent k fun (v : ↑↑(Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁))) => ↑v
hp₁ : p₁ ∈ Finset.image p s
hp₁' : p₁ ∈ p '' ↑s
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n
state_after: case intro
k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc✝ : s.card = n + 1
hc' : (Finset.image p s).card = n + 1
p₁ : P
hi' : LinearIndependent k fun (v : ↑↑(Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁))) => ↑v
hp₁ : p₁ ∈ Finset.image p s
hp₁' : p₁ ∈ p '' ↑s
hc : (Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁)).card = n
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n

tactic: rwa [vectorSpan_eq_span_vsub_finset_right_ne k hp₁, finrank_span_finset_eq_card, hc]
state_before: case intro
k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc✝ : s.card = n + 1
hc' : (Finset.image p s).card = n + 1
p₁ : P
hi' : LinearIndependent k fun (v : ↑↑(Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁))) => ↑v
hp₁ : p₁ ∈ Finset.image p s
hp₁' : p₁ ∈ p '' ↑s
hc : (Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁)).card = n
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) = n
state_after: no goals

tactic: rwa [s.card_image_of_injective hi.injective]
state_before: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
⊢ (Finset.image p s).card = n + 1
state_after: no goals

tactic: simp [hc', ← Finset.card_pos]
state_before: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
hc' : (Finset.image p s).card = n + 1
⊢ (Finset.image p s).Nonempty
state_after: no goals

tactic: simpa using hp₁
state_before: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hi' : AffineIndependent k fun x => ↑x
hc' : (Finset.image p s).card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
⊢ p₁ ∈ p '' ↑s
state_after: no goals

tactic: rw [Finset.card_image_of_injective _ (vsub_left_injective _), Finset.card_erase_of_mem hp₁]
state_before: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hc' : (Finset.image p s).card = n + 1
p₁ : P
hi' : LinearIndependent k fun (v : ↑↑(Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁))) => ↑v
hp₁ : p₁ ∈ Finset.image p s
hp₁' : p₁ ∈ p '' ↑s
⊢ (Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁)).card = n
state_after: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hc' : (Finset.image p s).card = n + 1
p₁ : P
hi' : LinearIndependent k fun (v : ↑↑(Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁))) => ↑v
hp₁ : p₁ ∈ Finset.image p s
hp₁' : p₁ ∈ p '' ↑s
⊢ (Finset.image p s).card - 1 = n

tactic: exact Nat.pred_eq_of_eq_succ hc'
state_before: k : Type u_1
V : Type u_2
P : Type u_3
ι : Type u_4
inst✝⁴ : DivisionRing k
inst✝³ : AddCommGroup V
inst✝² : Module k V
inst✝¹ : AffineSpace V P
inst✝ : DecidableEq P
p : ι → P
hi : AffineIndependent k p
s : Finset ι
n : ℕ
hc : s.card = n + 1
hc' : (Finset.image p s).card = n + 1
p₁ : P
hi' : LinearIndependent k fun (v : ↑↑(Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁))) => ↑v
hp₁ : p₁ ∈ Finset.image p s
hp₁' : p₁ ∈ p '' ↑s
⊢ (Finset.image p s).card - 1 = n
state_after: no goals