Theorem: finrank_vectorSpan_image_finset_le
File: Mathlib/LinearAlgebra/AffineSpace/FiniteDimensional.lean

tactic: classical
have hn : (s.image p).Nonempty := by
  rw [Finset.image_nonempty, ← Finset.card_pos, hc]
  apply Nat.succ_pos
rcases hn with ⟨p₁, hp₁⟩
rw [vectorSpan_eq_span_vsub_finset_right_ne k hp₁]
refine le_trans (finrank_span_finset_le_card (((s.image p).erase p₁).image fun p => p -ᵥ p₁)) ?_
rw [Finset.card_image_of_injective _ (vsub_left_injective p₁), Finset.card_erase_of_mem hp₁,
  tsub_le_iff_right, ← hc]
apply Finset.card_image_le
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
s : Finset ι
n : ℕ
hc : s.card = n + 1
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) ≤ n
state_after: no goals

tactic: have hn : (s.image p).Nonempty := by
  rw [Finset.image_nonempty, ← Finset.card_pos, hc]
  apply Nat.succ_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
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
s : Finset ι
n : ℕ
hc : 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
s : Finset ι
n : ℕ
hc : 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
s : Finset ι
n : ℕ
hc : s.card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
⊢ finrank k ↥(vectorSpan k ↑(Finset.image p s)) ≤ n

tactic: rw [vectorSpan_eq_span_vsub_finset_right_ne k 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
s : Finset ι
n : ℕ
hc : 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
s : Finset ι
n : ℕ
hc : s.card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
⊢ finrank k ↥(Submodule.span k ↑(Finset.image (fun x => x -ᵥ p₁) ((Finset.image p s).erase p₁))) ≤ n

tactic: refine le_trans (finrank_span_finset_le_card (((s.image p).erase p₁).image fun p => p -ᵥ p₁)) ?_
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
s : Finset ι
n : ℕ
hc : s.card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
⊢ finrank k ↥(Submodule.span k ↑(Finset.image (fun x => x -ᵥ p₁) ((Finset.image p s).erase p₁))) ≤ 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
s : Finset ι
n : ℕ
hc : s.card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
⊢ (Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁)).card ≤ n

tactic: rw [Finset.card_image_of_injective _ (vsub_left_injective p₁), Finset.card_erase_of_mem hp₁,
  tsub_le_iff_right, ← 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
s : Finset ι
n : ℕ
hc : s.card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
⊢ (Finset.image (fun p => p -ᵥ p₁) ((Finset.image p s).erase p₁)).card ≤ 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
s : Finset ι
n : ℕ
hc : s.card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
⊢ (Finset.image p s).card ≤ s.card

tactic: apply Finset.card_image_le
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
s : Finset ι
n : ℕ
hc : s.card = n + 1
p₁ : P
hp₁ : p₁ ∈ Finset.image p s
⊢ (Finset.image p s).card ≤ s.card
state_after: no goals

tactic: rw [Finset.image_nonempty, ← Finset.card_pos, 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
s : Finset ι
n : ℕ
hc : s.card = n + 1
⊢ (Finset.image p s).Nonempty
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
s : Finset ι
n : ℕ
hc : s.card = n + 1
⊢ 0 < n + 1

tactic: apply Nat.succ_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
s : Finset ι
n : ℕ
hc : s.card = n + 1
⊢ 0 < n + 1
state_after: no goals