Theorem: eq_affineCombination_of_mem_affineSpan
File: Mathlib/LinearAlgebra/AffineSpace/Combination.lean

tactic: have hn : (affineSpan k (Set.range p) : Set P).Nonempty := ⟨p1, h⟩
state_before: k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h : p1 ∈ affineSpan k (Set.range p)
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: rw [affineSpan_nonempty, Set.range_nonempty_iff_nonempty] at hn
state_before: k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h : p1 ∈ affineSpan k (Set.range p)
hn : Set.Nonempty ↑(affineSpan k (Set.range p))
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: cases' hn with i0
state_before: k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h : p1 ∈ affineSpan k (Set.range p)
hn : Nonempty ι
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: have h0 : p i0 ∈ affineSpan k (Set.range p) := mem_affineSpan k (Set.mem_range_self i0)
state_before: case intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h : p1 ∈ affineSpan k (Set.range p)
i0 : ι
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: have hd : p1 -ᵥ p i0 ∈ (affineSpan k (Set.range p)).direction :=
  AffineSubspace.vsub_mem_direction h h0
state_before: case intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: rw [direction_affineSpan, mem_vectorSpan_iff_eq_weightedVSub] at hd
state_before: case intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
hd : p1 -ᵥ p i0 ∈ AffineSubspace.direction (affineSpan k (Set.range p))
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: rcases hd with ⟨s, w, h, hs⟩
state_before: case intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
hd : ∃ s w x, p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: let s' := insert i0 s
state_before: case intro.intro.intro.intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: let w' := Set.indicator (↑s) w
state_before: case intro.intro.intro.intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: have h' : (∑ i in s', w' i) = 0 := by
  rw [← h, Set.sum_indicator_subset _ (Finset.subset_insert i0 s)]
state_before: case intro.intro.intro.intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: have hs' : s'.weightedVSub p w' = p1 -ᵥ p i0 := by
  rw [hs]
  exact (Finset.weightedVSub_indicator_subset _ _ (Finset.subset_insert i0 s)).symm
state_before: case intro.intro.intro.intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: let w0 : ι → k := Function.update (Function.const ι 0) i0 1
state_before: case intro.intro.intro.intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
hs' : ↑(Finset.weightedVSub s' p) w' = p1 -ᵥ p i0
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: have hw0 : (∑ i in s', w0 i) = 1 := by
  rw [Finset.sum_update_of_mem (Finset.mem_insert_self _ _)]
  simp only [Finset.mem_insert, true_or, not_true, Function.const_apply, Finset.sum_const_zero,
    add_zero]
state_before: case intro.intro.intro.intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
hs' : ↑(Finset.weightedVSub s' p) w' = p1 -ᵥ p i0
w0 : ι → k := Function.update (Function.const ι 0) i0 1
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: have hw0s : s'.affineCombination k p w0 = p i0 :=
  s'.affineCombination_of_eq_one_of_eq_zero w0 p (Finset.mem_insert_self _ _)
    (Function.update_same _ _ _) fun _ _ hne => Function.update_noteq hne _ _
state_before: case intro.intro.intro.intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
hs' : ↑(Finset.weightedVSub s' p) w' = p1 -ᵥ p i0
w0 : ι → k := Function.update (Function.const ι 0) i0 1
hw0 : ∑ i in s', w0 i = 1
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: use s', w0 + w'
state_before: case intro.intro.intro.intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
hs' : ↑(Finset.weightedVSub s' p) w' = p1 -ᵥ p i0
w0 : ι → k := Function.update (Function.const ι 0) i0 1
hw0 : ∑ i in s', w0 i = 1
hw0s : ↑(Finset.affineCombination k s' p) w0 = p i0
⊢ ∃ s w x, p1 = ↑(Finset.affineCombination k s p) w

tactic: constructor
state_before: case intro.intro.intro.intro
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
hs' : ↑(Finset.weightedVSub s' p) w' = p1 -ᵥ p i0
w0 : ι → k := Function.update (Function.const ι 0) i0 1
hw0 : ∑ i in s', w0 i = 1
hw0s : ↑(Finset.affineCombination k s' p) w0 = p i0
⊢ ∃ x, p1 = ↑(Finset.affineCombination k s' p) (w0 + w')

tactic: rw [← h, Set.sum_indicator_subset _ (Finset.subset_insert i0 s)]
state_before: k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
⊢ ∑ i in s', w' i = 0

tactic: rw [hs]
state_before: k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
⊢ ↑(Finset.weightedVSub s' p) w' = p1 -ᵥ p i0

tactic: exact (Finset.weightedVSub_indicator_subset _ _ (Finset.subset_insert i0 s)).symm
state_before: k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
⊢ ↑(Finset.weightedVSub s' p) w' = ↑(Finset.weightedVSub s p) w

tactic: rw [Finset.sum_update_of_mem (Finset.mem_insert_self _ _)]
state_before: k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
hs' : ↑(Finset.weightedVSub s' p) w' = p1 -ᵥ p i0
w0 : ι → k := Function.update (Function.const ι 0) i0 1
⊢ ∑ i in s', w0 i = 1

tactic: simp only [Finset.mem_insert, true_or, not_true, Function.const_apply, Finset.sum_const_zero,
  add_zero]
state_before: k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
hs' : ↑(Finset.weightedVSub s' p) w' = p1 -ᵥ p i0
w0 : ι → k := Function.update (Function.const ι 0) i0 1
⊢ 1 + ∑ x in insert i0 s \ {i0}, Function.const ι 0 x = 1

tactic: rw [add_comm, ← Finset.weightedVSub_vadd_affineCombination, hw0s, hs', vsub_vadd]
state_before: case intro.intro.intro.intro.h
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
hs' : ↑(Finset.weightedVSub s' p) w' = p1 -ᵥ p i0
w0 : ι → k := Function.update (Function.const ι 0) i0 1
hw0 : ∑ i in s', w0 i = 1
hw0s : ↑(Finset.affineCombination k s' p) w0 = p i0
⊢ p1 = ↑(Finset.affineCombination k s' p) (w0 + w')

tactic: change (Finset.sum s' fun i => w0 i + w' i) = 1
state_before: case intro.intro.intro.intro.w
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
hs' : ↑(Finset.weightedVSub s' p) w' = p1 -ᵥ p i0
w0 : ι → k := Function.update (Function.const ι 0) i0 1
hw0 : ∑ i in s', w0 i = 1
hw0s : ↑(Finset.affineCombination k s' p) w0 = p i0
⊢ ∑ i in s', (w0 + w') i = 1

tactic: simp only [Finset.sum_add_distrib, hw0, h', add_zero]
state_before: case intro.intro.intro.intro.w
k : Type u_3
V : Type u_4
P : Type u_2
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_1
p1 : P
p : ι → P
h✝ : p1 ∈ affineSpan k (Set.range p)
i0 : ι
h0 : p i0 ∈ affineSpan k (Set.range p)
s : Finset ι
w : ι → k
h : ∑ i in s, w i = 0
hs : p1 -ᵥ p i0 = ↑(Finset.weightedVSub s p) w
s' : Finset ι := insert i0 s
w' : ι → k := Set.indicator (↑s) w
h' : ∑ i in s', w' i = 0
hs' : ↑(Finset.weightedVSub s' p) w' = p1 -ᵥ p i0
w0 : ι → k := Function.update (Function.const ι 0) i0 1
hw0 : ∑ i in s', w0 i = 1
hw0s : ↑(Finset.affineCombination k s' p) w0 = p i0
⊢ ∑ i in s', (w0 i + w' i) = 1