Theorem: AffineIndependent.comp_embedding
File: Mathlib/LinearAlgebra/AffineSpace/Independent.lean

tactic: classical
  intro fs w hw hs i0 hi0
  let fs' := fs.map f
  let w' i := if h : ∃ i2, f i2 = i then w h.choose else 0
  have hw' : ∀ i2 : ι2, w' (f i2) = w i2 := by
    intro i2
    have h : ∃ i : ι2, f i = f i2 := ⟨i2, rfl⟩
    have hs : h.choose = i2 := f.injective h.choose_spec
    simp_rw [dif_pos h, hs]
  have hw's : (∑ i in fs', w' i) = 0 := by
    rw [← hw, Finset.sum_map]
    simp [hw']
  have hs' : fs'.weightedVSub p w' = (0 : V) := by
    rw [← hs, Finset.weightedVSub_map]
    congr with i
    simp_all only [comp_apply, EmbeddingLike.apply_eq_iff_eq, exists_eq, dite_true]
  rw [← ha fs' w' hw's hs' (f i0) ((Finset.mem_map' _).2 hi0), hw']
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
⊢ AffineIndependent k (p ∘ ↑f)

tactic: intro fs w hw hs i0 hi0
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
⊢ AffineIndependent k (p ∘ ↑f)

tactic: let fs' := fs.map f
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
⊢ w i0 = 0

tactic: let w' i := if h : ∃ i2, f i2 = i then w h.choose else 0
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
⊢ w i0 = 0

tactic: have hw' : ∀ i2 : ι2, w' (f i2) = w i2 := by
  intro i2
  have h : ∃ i : ι2, f i = f i2 := ⟨i2, rfl⟩
  have hs : h.choose = i2 := f.injective h.choose_spec
  simp_rw [dif_pos h, hs]
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
⊢ w i0 = 0

tactic: have hw's : (∑ i in fs', w' i) = 0 := by
  rw [← hw, Finset.sum_map]
  simp [hw']
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
hw' : ∀ (i2 : ι2), w' (↑f i2) = w i2
⊢ w i0 = 0

tactic: have hs' : fs'.weightedVSub p w' = (0 : V) := by
  rw [← hs, Finset.weightedVSub_map]
  congr with i
  simp_all only [comp_apply, EmbeddingLike.apply_eq_iff_eq, exists_eq, dite_true]
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
hw' : ∀ (i2 : ι2), w' (↑f i2) = w i2
hw's : ∑ i in fs', w' i = 0
⊢ w i0 = 0

tactic: rw [← ha fs' w' hw's hs' (f i0) ((Finset.mem_map' _).2 hi0), hw']
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
hw' : ∀ (i2 : ι2), w' (↑f i2) = w i2
hw's : ∑ i in fs', w' i = 0
hs' : ↑(Finset.weightedVSub fs' p) w' = 0
⊢ w i0 = 0

tactic: intro i2
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
⊢ ∀ (i2 : ι2), w' (↑f i2) = w i2

tactic: have h : ∃ i : ι2, f i = f i2 := ⟨i2, rfl⟩
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
i2 : ι2
⊢ w' (↑f i2) = w i2

tactic: have hs : h.choose = i2 := f.injective h.choose_spec
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
i2 : ι2
h : ∃ i, ↑f i = ↑f i2
⊢ w' (↑f i2) = w i2

tactic: simp_rw [dif_pos h, hs]
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs✝ : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
i2 : ι2
h : ∃ i, ↑f i = ↑f i2
hs : Exists.choose h = i2
⊢ w' (↑f i2) = w i2

tactic: rw [← hw, Finset.sum_map]
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
hw' : ∀ (i2 : ι2), w' (↑f i2) = w i2
⊢ ∑ i in fs', w' i = 0

tactic: simp [hw']
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
hw' : ∀ (i2 : ι2), w' (↑f i2) = w i2
⊢ ∑ x in fs, w' (↑f x) = ∑ i in fs, w i

tactic: rw [← hs, Finset.weightedVSub_map]
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
hw' : ∀ (i2 : ι2), w' (↑f i2) = w i2
hw's : ∑ i in fs', w' i = 0
⊢ ↑(Finset.weightedVSub fs' p) w' = 0

tactic: congr with i
state_before: k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
hw' : ∀ (i2 : ι2), w' (↑f i2) = w i2
hw's : ∑ i in fs', w' i = 0
⊢ ↑(Finset.weightedVSub fs (p ∘ ↑f)) (w' ∘ ↑f) = ↑(Finset.weightedVSub fs (p ∘ ↑f)) w

tactic: simp_all only [comp_apply, EmbeddingLike.apply_eq_iff_eq, exists_eq, dite_true]
state_before: case h.e_6.h.h
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
inst✝ : AffineSpace V P
ι : Type u_2
ι2 : Type u_1
f : ι2 ↪ ι
p : ι → P
ha : AffineIndependent k p
fs : Finset ι2
w : ι2 → k
hw : ∑ i in fs, w i = 0
hs : ↑(Finset.weightedVSub fs (p ∘ ↑f)) w = 0
i0 : ι2
hi0 : i0 ∈ fs
fs' : Finset ι := Finset.map f fs
w' : ι → k := fun i => if h : ∃ i2, ↑f i2 = i then w (Exists.choose h) else 0
hw' : ∀ (i2 : ι2), w' (↑f i2) = w i2
hw's : ∑ i in fs', w' i = 0
i : ι2
⊢ (w' ∘ ↑f) i = w i