-- Mathlib/LinearAlgebra/AffineSpace/Combination.lean
theorem attach_affineCombination_of_injective [DecidableEq P] (s : Finset P) (w : P → k) (f : s → P)
    (hf : Function.Injective f) :
    s.attach.affineCombination k f (w ∘ f) = (image f univ).affineCombination k id w

Proof state:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice ⋯)
⊢ g₁ = g₂ ∘ f

Tactic:
ext

Result:
case h
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice ⋯)
x✝ : { x // x ∈ s }
⊢ g₁ x✝ = (g₂ ∘ f) x✝

Proof state:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
⊢ ∑ x ∈ s.attach, w (f x) • (f x -ᵥ Classical.choice ⋯) = ∑ x ∈ image f univ, w x • (x -ᵥ Classical.choice ⋯)

Tactic:
let g₁ : s → V := fun i => w (f i) • (f i -ᵥ Classical.choice S.nonempty)

Result:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
⊢ ∑ x ∈ s.attach, w (f x) • (f x -ᵥ Classical.choice ⋯) = ∑ x ∈ image f univ, w x • (x -ᵥ Classical.choice ⋯)

Proof state:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice ⋯)
⊢ ∑ x ∈ s.attach, w (f x) • (f x -ᵥ Classical.choice ⋯) = ∑ x ∈ image f univ, w x • (x -ᵥ Classical.choice ⋯)

Tactic:
change univ.sum g₁ = (image f univ).sum g₂

Result:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice ⋯)
⊢ univ.sum g₁ = (image f univ).sum g₂

Proof state:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
⊢ (affineCombination k s.attach f) (w ∘ f) = (affineCombination k (image f univ) id) w

Tactic:
simp only [affineCombination, weightedVSubOfPoint_apply, id, vadd_right_cancel_iff,
  Function.comp_apply, AffineMap.coe_mk]

Result:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
⊢ ∑ x ∈ s.attach, w (f x) • (f x -ᵥ Classical.choice ⋯) = ∑ x ∈ image f univ, w x • (x -ᵥ Classical.choice ⋯)

Proof state:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice ⋯)
hgf : g₁ = g₂ ∘ f
⊢ ∀ x ∈ univ, ∀ y ∈ univ, f x = f y → x = y

Tactic:
exact fun _ _ _ _ hxy => hf hxy

Result:
no goals

Proof state:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice ⋯)
hgf : g₁ = g₂ ∘ f
⊢ univ.sum (g₂ ∘ f) = ∑ x : { x // x ∈ s }, w (f x) • (f x -ᵥ Classical.choice ⋯)

Tactic:
simp only [g₁, g₂,Function.comp_apply]

Result:
no goals

Proof state:
case h
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice ⋯)
x✝ : { x // x ∈ s }
⊢ g₁ x✝ = (g₂ ∘ f) x✝

Tactic:
simp [g₁, g₂]

Result:
no goals

Proof state:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
⊢ ∑ x ∈ s.attach, w (f x) • (f x -ᵥ Classical.choice ⋯) = ∑ x ∈ image f univ, w x • (x -ᵥ Classical.choice ⋯)

Tactic:
let g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice S.nonempty)

Result:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice ⋯)
⊢ ∑ x ∈ s.attach, w (f x) • (f x -ᵥ Classical.choice ⋯) = ∑ x ∈ image f univ, w x • (x -ᵥ Classical.choice ⋯)

Proof state:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice ⋯)
hgf : g₁ = g₂ ∘ f
⊢ univ.sum g₁ = (image f univ).sum g₂

Tactic:
rw [hgf, sum_image]

Result:
k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice ⋯)
hgf : g₁ = g₂ ∘ f
⊢ univ.sum (g₂ ∘ f) = ∑ x : { x // x ∈ s }, w (f x) • (f x -ᵥ Classical.choice ⋯)

k : Type u_1
V : Type u_2
P : Type u_3
inst✝³ : Ring k
inst✝² : AddCommGroup V
inst✝¹ : Module k V
S : AffineSpace V P
inst✝ : DecidableEq P
s : Finset P
w : P → k
f : { x // x ∈ s } → P
hf : Function.Injective f
g₁ : { x // x ∈ s } → V := fun i => w (f i) • (f i -ᵥ Classical.choice ⋯)
g₂ : P → V := fun i => w i • (i -ᵥ Classical.choice ⋯)
hgf : g₁ = g₂ ∘ f
⊢ ∀ x ∈ univ, ∀ y ∈ univ, f x = f y → x = y