[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
⊢ affineSpan k (range id) = ⊤
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
f g : AffineBasis ι k P
h : f.toFun = g.toFun
⊢ f = g
[PROOFSTEP]
cases f
[GOAL]
case mk
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
g : AffineBasis ι k P
toFun✝ : ι → P
ind'✝ : AffineIndependent k toFun✝
tot'✝ : affineSpan k (range toFun✝) = ⊤
h : { toFun := toFun✝, ind' := ind'✝, tot' := tot'✝ }.toFun = g.toFun
⊢ { toFun := toFun✝, ind' := ind'✝, tot' := tot'✝ } = g
[PROOFSTEP]
cases g
[GOAL]
case mk.mk
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
toFun✝¹ : ι → P
ind'✝¹ : AffineIndependent k toFun✝¹
tot'✝¹ : affineSpan k (range toFun✝¹) = ⊤
toFun✝ : ι → P
ind'✝ : AffineIndependent k toFun✝
tot'✝ : affineSpan k (range toFun✝) = ⊤
h : { toFun := toFun✝¹, ind' := ind'✝¹, tot' := tot'✝¹ }.toFun = { toFun := toFun✝, ind' := ind'✝, tot' := tot'✝ }.toFun
⊢ { toFun := toFun✝¹, ind' := ind'✝¹, tot' := tot'✝¹ } = { toFun := toFun✝, ind' := ind'✝, tot' := tot'✝ }
[PROOFSTEP]
congr
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
hι : IsEmpty ι
⊢ False
[PROOFSTEP]
simpa only [@range_eq_empty _ _ hι, AffineSubspace.span_empty, bot_ne_top] using b.tot
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e✝ e : ι ≃ ι'
⊢ affineSpan k (range (↑b ∘ ↑e.symm)) = ⊤
[PROOFSTEP]
rw [e.symm.surjective.range_comp]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e✝ e : ι ≃ ι'
⊢ affineSpan k (range ↑b) = ⊤
[PROOFSTEP]
exact b.3
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
⊢ ⊤ ≤ Submodule.span k (range fun i_1 => ↑b ↑i_1 -ᵥ ↑b i)
[PROOFSTEP]
suffices Submodule.span k (range fun j : { x // x ≠ i } => b ↑j -ᵥ b i) = vectorSpan k (range b) by
  rw [this, ← direction_affineSpan, b.tot, AffineSubspace.direction_top]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
this : Submodule.span k (range fun j => ↑b ↑j -ᵥ ↑b i) = vectorSpan k (range ↑b)
⊢ ⊤ ≤ Submodule.span k (range fun i_1 => ↑b ↑i_1 -ᵥ ↑b i)
[PROOFSTEP]
rw [this, ← direction_affineSpan, b.tot, AffineSubspace.direction_top]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
⊢ Submodule.span k (range fun j => ↑b ↑j -ᵥ ↑b i) = vectorSpan k (range ↑b)
[PROOFSTEP]
conv_rhs => rw [← image_univ]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
| vectorSpan k (range ↑b)
[PROOFSTEP]
rw [← image_univ]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
| vectorSpan k (range ↑b)
[PROOFSTEP]
rw [← image_univ]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
| vectorSpan k (range ↑b)
[PROOFSTEP]
rw [← image_univ]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
⊢ Submodule.span k (range fun j => ↑b ↑j -ᵥ ↑b i) = vectorSpan k (↑b '' univ)
[PROOFSTEP]
rw [vectorSpan_image_eq_span_vsub_set_right_ne k b (mem_univ i)]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
⊢ Submodule.span k (range fun j => ↑b ↑j -ᵥ ↑b i) = Submodule.span k ((fun x => x -ᵥ ↑b i) '' (↑b '' (univ \ {i})))
[PROOFSTEP]
congr
[GOAL]
case e_s
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
⊢ (range fun j => ↑b ↑j -ᵥ ↑b i) = (fun x => x -ᵥ ↑b i) '' (↑b '' (univ \ {i}))
[PROOFSTEP]
ext v
[GOAL]
case e_s.h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
v : V
⊢ (v ∈ range fun j => ↑b ↑j -ᵥ ↑b i) ↔ v ∈ (fun x => x -ᵥ ↑b i) '' (↑b '' (univ \ {i}))
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
i : ι
j : { j // j ≠ i }
⊢ ↑(basisOf b i) j = ↑b ↑j -ᵥ ↑b i
[PROOFSTEP]
simp [basisOf]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι'
⊢ basisOf (reindex b e) i =
    Basis.reindex (basisOf b (↑e.symm i)) (Equiv.subtypeEquiv e (_ : ∀ (x : ι), ¬x = ↑e.symm i ↔ ¬↑e x = i))
[PROOFSTEP]
ext j
[GOAL]
case a
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
i : ι'
j : { j // j ≠ i }
⊢ ↑(basisOf (reindex b e) i) j =
    ↑(Basis.reindex (basisOf b (↑e.symm i)) (Equiv.subtypeEquiv e (_ : ∀ (x : ι), ¬x = ↑e.symm i ↔ ¬↑e x = i))) j
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
q : P
v : V
⊢ (fun q => 1 - ↑(Basis.sumCoords (basisOf b i)) (q -ᵥ ↑b i)) (v +ᵥ q) =
    ↑(-Basis.sumCoords (basisOf b i)) v +ᵥ (fun q => 1 - ↑(Basis.sumCoords (basisOf b i)) (q -ᵥ ↑b i)) q
[PROOFSTEP]
dsimp only
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
q : P
v : V
⊢ 1 - ↑(Basis.sumCoords (basisOf b i)) (v +ᵥ q -ᵥ ↑b i) =
    ↑(-Basis.sumCoords (basisOf b i)) v +ᵥ (1 - ↑(Basis.sumCoords (basisOf b i)) (q -ᵥ ↑b i))
[PROOFSTEP]
rw [vadd_vsub_assoc, LinearMap.map_add, vadd_eq_add, LinearMap.neg_apply, sub_add_eq_sub_sub_swap, add_comm,
  sub_eq_add_neg]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι'
⊢ coord (reindex b e) i = coord b (↑e.symm i)
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι'
p✝ : P
⊢ ↑(coord (reindex b e) i) p✝ = ↑(coord b (↑e.symm i)) p✝
[PROOFSTEP]
classical simp [AffineBasis.coord]
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι'
p✝ : P
⊢ ↑(coord (reindex b e) i) p✝ = ↑(coord b (↑e.symm i)) p✝
[PROOFSTEP]
simp [AffineBasis.coord]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
i : ι
⊢ ↑(coord b i) (↑b i) = 1
[PROOFSTEP]
simp only [coord, Basis.coe_sumCoords, LinearEquiv.map_zero, LinearEquiv.coe_coe, sub_zero, AffineMap.coe_mk,
  Finsupp.sum_zero_index, vsub_self]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
h : i ≠ j
⊢ ↑(coord b i) (↑b j) = 0
[PROOFSTEP]
rw [coord, AffineMap.coe_mk, ← @Subtype.coe_mk _ (fun j => j ≠ i) j h.symm, ← b.basisOf_apply,
  Basis.sumCoords_self_apply, sub_self]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : DecidableEq ι
i j : ι
⊢ ↑(coord b i) (↑b j) = if i = j then 1 else 0
[PROOFSTEP]
cases' eq_or_ne i j with h h
[GOAL]
case inl
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : DecidableEq ι
i j : ι
h : i = j
⊢ ↑(coord b i) (↑b j) = if i = j then 1 else 0
[PROOFSTEP]
simp [h]
[GOAL]
case inr
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : DecidableEq ι
i j : ι
h : i ≠ j
⊢ ↑(coord b i) (↑b j) = if i = j then 1 else 0
[PROOFSTEP]
simp [h]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
hi : i ∈ s
w : ι → k
hw : Finset.sum s w = 1
⊢ ↑(coord b i) (↑(Finset.affineCombination k s ↑b) w) = w i
[PROOFSTEP]
classical simp only [coord_apply, hi, Finset.affineCombination_eq_linear_combination, if_true, mul_boole, hw,
  Function.comp_apply, smul_eq_mul, s.sum_ite_eq, s.map_affineCombination b w hw]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
hi : i ∈ s
w : ι → k
hw : Finset.sum s w = 1
⊢ ↑(coord b i) (↑(Finset.affineCombination k s ↑b) w) = w i
[PROOFSTEP]
simp only [coord_apply, hi, Finset.affineCombination_eq_linear_combination, if_true, mul_boole, hw, Function.comp_apply,
  smul_eq_mul, s.sum_ite_eq, s.map_affineCombination b w hw]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
hi : ¬i ∈ s
w : ι → k
hw : Finset.sum s w = 1
⊢ ↑(coord b i) (↑(Finset.affineCombination k s ↑b) w) = 0
[PROOFSTEP]
classical simp only [coord_apply, hi, Finset.affineCombination_eq_linear_combination, if_false, mul_boole, hw,
  Function.comp_apply, smul_eq_mul, s.sum_ite_eq, s.map_affineCombination b w hw]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
hi : ¬i ∈ s
w : ι → k
hw : Finset.sum s w = 1
⊢ ↑(coord b i) (↑(Finset.affineCombination k s ↑b) w) = 0
[PROOFSTEP]
simp only [coord_apply, hi, Finset.affineCombination_eq_linear_combination, if_false, mul_boole, hw,
  Function.comp_apply, smul_eq_mul, s.sum_ite_eq, s.map_affineCombination b w hw]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
q : P
⊢ ∑ i : ι, ↑(coord b i) q = 1
[PROOFSTEP]
have hq : q ∈ affineSpan k (range b) := by
  rw [b.tot]
  exact AffineSubspace.mem_top k V q
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
q : P
⊢ q ∈ affineSpan k (range ↑b)
[PROOFSTEP]
rw [b.tot]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
q : P
⊢ q ∈ ⊤
[PROOFSTEP]
exact AffineSubspace.mem_top k V q
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
q : P
hq : q ∈ affineSpan k (range ↑b)
⊢ ∑ i : ι, ↑(coord b i) q = 1
[PROOFSTEP]
obtain ⟨w, hw, rfl⟩ := eq_affineCombination_of_mem_affineSpan_of_fintype hq
[GOAL]
case intro.intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
w : ι → k
hw : ∑ i : ι, w i = 1
hq : ↑(Finset.affineCombination k Finset.univ ↑b) w ∈ affineSpan k (range ↑b)
⊢ ∑ i : ι, ↑(coord b i) (↑(Finset.affineCombination k Finset.univ ↑b) w) = 1
[PROOFSTEP]
convert hw
[GOAL]
case h.e'_2.a
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
w : ι → k
hw : ∑ i : ι, w i = 1
hq : ↑(Finset.affineCombination k Finset.univ ↑b) w ∈ affineSpan k (range ↑b)
x✝ : ι
a✝ : x✝ ∈ Finset.univ
⊢ ↑(coord b x✝) (↑(Finset.affineCombination k Finset.univ ↑b) w) = w x✝
[PROOFSTEP]
exact b.coord_apply_combination_of_mem (Finset.mem_univ _) hw
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
q : P
⊢ (↑(Finset.affineCombination k Finset.univ ↑b) fun i => ↑(coord b i) q) = q
[PROOFSTEP]
have hq : q ∈ affineSpan k (range b) := by
  rw [b.tot]
  exact AffineSubspace.mem_top k V q
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
q : P
⊢ q ∈ affineSpan k (range ↑b)
[PROOFSTEP]
rw [b.tot]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
q : P
⊢ q ∈ ⊤
[PROOFSTEP]
exact AffineSubspace.mem_top k V q
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
q : P
hq : q ∈ affineSpan k (range ↑b)
⊢ (↑(Finset.affineCombination k Finset.univ ↑b) fun i => ↑(coord b i) q) = q
[PROOFSTEP]
obtain ⟨w, hw, rfl⟩ := eq_affineCombination_of_mem_affineSpan_of_fintype hq
[GOAL]
case intro.intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
w : ι → k
hw : ∑ i : ι, w i = 1
hq : ↑(Finset.affineCombination k Finset.univ ↑b) w ∈ affineSpan k (range ↑b)
⊢ (↑(Finset.affineCombination k Finset.univ ↑b) fun i =>
      ↑(coord b i) (↑(Finset.affineCombination k Finset.univ ↑b) w)) =
    ↑(Finset.affineCombination k Finset.univ ↑b) w
[PROOFSTEP]
congr
[GOAL]
case intro.intro.h.e_6.h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
w : ι → k
hw : ∑ i : ι, w i = 1
hq : ↑(Finset.affineCombination k Finset.univ ↑b) w ∈ affineSpan k (range ↑b)
⊢ (fun i => ↑(coord b i) (↑(Finset.affineCombination k Finset.univ ↑b) w)) = w
[PROOFSTEP]
ext i
[GOAL]
case intro.intro.h.e_6.h.h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
w : ι → k
hw : ∑ i : ι, w i = 1
hq : ↑(Finset.affineCombination k Finset.univ ↑b) w ∈ affineSpan k (range ↑b)
i : ι
⊢ ↑(coord b i) (↑(Finset.affineCombination k Finset.univ ↑b) w) = w i
[PROOFSTEP]
exact b.coord_apply_combination_of_mem (Finset.mem_univ i) hw
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b✝ : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
b : AffineBasis ι k V
v : V
⊢ ∑ i : ι, ↑(coord b i) v • ↑b i = v
[PROOFSTEP]
have hb := b.affineCombination_coord_eq_self v
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b✝ : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Fintype ι
b : AffineBasis ι k V
v : V
hb : (↑(Finset.affineCombination k Finset.univ ↑b) fun i => ↑(coord b i) v) = v
⊢ ∑ i : ι, ↑(coord b i) v • ↑b i = v
[PROOFSTEP]
rwa [Finset.univ.affineCombination_eq_linear_combination _ _ (b.sum_coord_apply_eq_one v)] at hb
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Finite ι
q₁ q₂ : P
h : ∀ (i : ι), ↑(coord b i) q₁ = ↑(coord b i) q₂
⊢ q₁ = q₂
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Finite ι
q₁ q₂ : P
h : ∀ (i : ι), ↑(coord b i) q₁ = ↑(coord b i) q₂
val✝ : Fintype ι
⊢ q₁ = q₂
[PROOFSTEP]
rw [← b.affineCombination_coord_eq_self q₁, ← b.affineCombination_coord_eq_self q₂]
[GOAL]
case intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
inst✝ : Finite ι
q₁ q₂ : P
h : ∀ (i : ι), ↑(coord b i) q₁ = ↑(coord b i) q₂
val✝ : Fintype ι
⊢ (↑(Finset.affineCombination k Finset.univ ↑b) fun i => ↑(coord b i) q₁) =
    ↑(Finset.affineCombination k Finset.univ ↑b) fun i => ↑(coord b i) q₂
[PROOFSTEP]
simp only [h]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
⊢ ↑(coord b i) = 1
[PROOFSTEP]
ext q
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
⊢ ↑(coord b i) q = OfNat.ofNat 1 q
[PROOFSTEP]
have hp : (range b).Subsingleton := by
  rw [← image_univ]
  apply Subsingleton.image
  apply subsingleton_of_subsingleton
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
⊢ Set.Subsingleton (range ↑b)
[PROOFSTEP]
rw [← image_univ]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
⊢ Set.Subsingleton (↑b '' univ)
[PROOFSTEP]
apply Subsingleton.image
[GOAL]
case hs
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
⊢ Set.Subsingleton univ
[PROOFSTEP]
apply subsingleton_of_subsingleton
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
hp : Set.Subsingleton (range ↑b)
⊢ ↑(coord b i) q = OfNat.ofNat 1 q
[PROOFSTEP]
haveI := AffineSubspace.subsingleton_of_subsingleton_span_eq_top hp b.tot
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
hp : Set.Subsingleton (range ↑b)
this : Subsingleton P
⊢ ↑(coord b i) q = OfNat.ofNat 1 q
[PROOFSTEP]
let s : Finset ι := { i }
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
hp : Set.Subsingleton (range ↑b)
this : Subsingleton P
s : Finset ι := {i}
⊢ ↑(coord b i) q = OfNat.ofNat 1 q
[PROOFSTEP]
have hi : i ∈ s := by simp
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
hp : Set.Subsingleton (range ↑b)
this : Subsingleton P
s : Finset ι := {i}
⊢ i ∈ s
[PROOFSTEP]
simp
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
hp : Set.Subsingleton (range ↑b)
this : Subsingleton P
s : Finset ι := {i}
hi : i ∈ s
⊢ ↑(coord b i) q = OfNat.ofNat 1 q
[PROOFSTEP]
have hw : s.sum (Function.const ι (1 : k)) = 1 := by simp
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
hp : Set.Subsingleton (range ↑b)
this : Subsingleton P
s : Finset ι := {i}
hi : i ∈ s
⊢ Finset.sum s (Function.const ι 1) = 1
[PROOFSTEP]
simp
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
hp : Set.Subsingleton (range ↑b)
this : Subsingleton P
s : Finset ι := {i}
hi : i ∈ s
hw : Finset.sum s (Function.const ι 1) = 1
⊢ ↑(coord b i) q = OfNat.ofNat 1 q
[PROOFSTEP]
have hq : q = s.affineCombination k b (Function.const ι (1 : k)) := by simp
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
hp : Set.Subsingleton (range ↑b)
this : Subsingleton P
s : Finset ι := {i}
hi : i ∈ s
hw : Finset.sum s (Function.const ι 1) = 1
⊢ q = ↑(Finset.affineCombination k s ↑b) (Function.const ι 1)
[PROOFSTEP]
simp
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Subsingleton ι
i : ι
q : P
hp : Set.Subsingleton (range ↑b)
this : Subsingleton P
s : Finset ι := {i}
hi : i ∈ s
hw : Finset.sum s (Function.const ι 1) = 1
hq : q = ↑(Finset.affineCombination k s ↑b) (Function.const ι 1)
⊢ ↑(coord b i) q = OfNat.ofNat 1 q
[PROOFSTEP]
rw [Pi.one_apply, hq, b.coord_apply_combination_of_mem hi hw, Function.const_apply]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
⊢ Function.Surjective ↑(coord b i)
[PROOFSTEP]
classical
intro x
obtain ⟨j, hij⟩ := exists_ne i
let s : Finset ι := { i, j }
have hi : i ∈ s := by simp
have _ : j ∈ s := by simp
let w : ι → k := fun j' => if j' = i then x else 1 - x
have hw : s.sum w = 1 := by
  -- Porting note: previously this subgoal worked just by:
        -- simp [hij, Finset.sum_ite, Finset.filter_insert, Finset.filter_eq']
        -- I'm not sure why `simp` can not successfully use `Finset.filter_eq'`.
  simp [Finset.sum_ite, Finset.filter_insert, hij]
  erw [Finset.filter_eq']
  simp [hij.symm]
use s.affineCombination k b w
simp [b.coord_apply_combination_of_mem hi hw]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
⊢ Function.Surjective ↑(coord b i)
[PROOFSTEP]
intro x
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
⊢ ∃ a, ↑(coord b i) a = x
[PROOFSTEP]
obtain ⟨j, hij⟩ := exists_ne i
[GOAL]
case intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
⊢ ∃ a, ↑(coord b i) a = x
[PROOFSTEP]
let s : Finset ι := { i, j }
[GOAL]
case intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
s : Finset ι := {i, j}
⊢ ∃ a, ↑(coord b i) a = x
[PROOFSTEP]
have hi : i ∈ s := by simp
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
s : Finset ι := {i, j}
⊢ i ∈ s
[PROOFSTEP]
simp
[GOAL]
case intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
s : Finset ι := {i, j}
hi : i ∈ s
⊢ ∃ a, ↑(coord b i) a = x
[PROOFSTEP]
have _ : j ∈ s := by simp
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
s : Finset ι := {i, j}
hi : i ∈ s
⊢ j ∈ s
[PROOFSTEP]
simp
[GOAL]
case intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
s : Finset ι := {i, j}
hi : i ∈ s
x✝ : j ∈ s
⊢ ∃ a, ↑(coord b i) a = x
[PROOFSTEP]
let w : ι → k := fun j' => if j' = i then x else 1 - x
[GOAL]
case intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
s : Finset ι := {i, j}
hi : i ∈ s
x✝ : j ∈ s
w : ι → k := fun j' => if j' = i then x else 1 - x
⊢ ∃ a, ↑(coord b i) a = x
[PROOFSTEP]
have hw : s.sum w = 1 := by
  -- Porting note: previously this subgoal worked just by:
        -- simp [hij, Finset.sum_ite, Finset.filter_insert, Finset.filter_eq']
        -- I'm not sure why `simp` can not successfully use `Finset.filter_eq'`.
  simp [Finset.sum_ite, Finset.filter_insert, hij]
  erw [Finset.filter_eq']
  simp [hij.symm]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
s : Finset ι := {i, j}
hi : i ∈ s
x✝ : j ∈ s
w : ι → k := fun j' => if j' = i then x else 1 - x
⊢ Finset.sum s w = 1
[PROOFSTEP]
simp [Finset.sum_ite, Finset.filter_insert, hij]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
s : Finset ι := {i, j}
hi : i ∈ s
x✝ : j ∈ s
w : ι → k := fun j' => if j' = i then x else 1 - x
⊢ ↑(Finset.card (insert i (Finset.filter (fun x => x = i) {j}))) * x + (1 - x) = 1
[PROOFSTEP]
erw [Finset.filter_eq']
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
s : Finset ι := {i, j}
hi : i ∈ s
x✝ : j ∈ s
w : ι → k := fun j' => if j' = i then x else 1 - x
⊢ ↑(Finset.card (insert i (if i ∈ {j} then {i} else ∅))) * x + (1 - x) = 1
[PROOFSTEP]
simp [hij.symm]
[GOAL]
case intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
s : Finset ι := {i, j}
hi : i ∈ s
x✝ : j ∈ s
w : ι → k := fun j' => if j' = i then x else 1 - x
hw : Finset.sum s w = 1
⊢ ∃ a, ↑(coord b i) a = x
[PROOFSTEP]
use s.affineCombination k b w
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : Ring k
inst✝¹ : Module k V
b : AffineBasis ι k P
s✝ : Finset ι
i✝ j✝ : ι
e : ι ≃ ι'
inst✝ : Nontrivial ι
i : ι
x : k
j : ι
hij : j ≠ i
s : Finset ι := {i, j}
hi : i ∈ s
x✝ : j ∈ s
w : ι → k := fun j' => if j' = i then x else 1 - x
hw : Finset.sum s w = 1
⊢ ↑(coord b i) (↑(Finset.affineCombination k s ↑b) w) = x
[PROOFSTEP]
simp [b.coord_apply_combination_of_mem hi hw]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
v w : V
⊢ (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
    (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v + (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
v w : V
i : ι
⊢ (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) i =
    ((fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v + (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) i
[PROOFSTEP]
simp only [LinearMap.map_add, Pi.add_apply, neg_add]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
t : k
v : V
⊢ AddHom.toFun
      { toFun := fun v i => -↑(Basis.sumCoords (basisOf b i)) v,
        map_add' :=
          (_ :
            ∀ (v w : V),
              (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
                (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v +
                  (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) }
      (t • v) =
    ↑(RingHom.id k) t •
      AddHom.toFun
        { toFun := fun v i => -↑(Basis.sumCoords (basisOf b i)) v,
          map_add' :=
            (_ :
              ∀ (v w : V),
                (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
                  (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v +
                    (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) }
        v
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
t : k
v : V
i : ι
⊢ AddHom.toFun
      { toFun := fun v i => -↑(Basis.sumCoords (basisOf b i)) v,
        map_add' :=
          (_ :
            ∀ (v w : V),
              (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
                (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v +
                  (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) }
      (t • v) i =
    (↑(RingHom.id k) t •
        AddHom.toFun
          { toFun := fun v i => -↑(Basis.sumCoords (basisOf b i)) v,
            map_add' :=
              (_ :
                ∀ (v w : V),
                  (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
                    (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v +
                      (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) }
          v)
      i
[PROOFSTEP]
simp only [LinearMap.map_smul, Pi.smul_apply, smul_neg, RingHom.id_apply, mul_neg]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i j : ι
e : ι ≃ ι'
p : P
v : V
⊢ (fun q i => ↑(coord b i) q) (v +ᵥ p) =
    ↑{
            toAddHom :=
              { toFun := fun v i => -↑(Basis.sumCoords (basisOf b i)) v,
                map_add' :=
                  (_ :
                    ∀ (v w : V),
                      (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
                        (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v +
                          (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) },
            map_smul' :=
              (_ :
                ∀ (t : k) (v : V),
                  AddHom.toFun
                      { toFun := fun v i => -↑(Basis.sumCoords (basisOf b i)) v,
                        map_add' :=
                          (_ :
                            ∀ (v w : V),
                              (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
                                (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v +
                                  (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) }
                      (t • v) =
                    ↑(RingHom.id k) t •
                      AddHom.toFun
                        { toFun := fun v i => -↑(Basis.sumCoords (basisOf b i)) v,
                          map_add' :=
                            (_ :
                              ∀ (v w : V),
                                (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
                                  (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v +
                                    (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) }
                        v) }
        v +ᵥ
      (fun q i => ↑(coord b i) q) p
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
p : P
v : V
i : ι
⊢ (fun q i => ↑(coord b i) q) (v +ᵥ p) i =
    (↑{
              toAddHom :=
                { toFun := fun v i => -↑(Basis.sumCoords (basisOf b i)) v,
                  map_add' :=
                    (_ :
                      ∀ (v w : V),
                        (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
                          (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v +
                            (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) },
              map_smul' :=
                (_ :
                  ∀ (t : k) (v : V),
                    AddHom.toFun
                        { toFun := fun v i => -↑(Basis.sumCoords (basisOf b i)) v,
                          map_add' :=
                            (_ :
                              ∀ (v w : V),
                                (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
                                  (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v +
                                    (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) }
                        (t • v) =
                      ↑(RingHom.id k) t •
                        AddHom.toFun
                          { toFun := fun v i => -↑(Basis.sumCoords (basisOf b i)) v,
                            map_add' :=
                              (_ :
                                ∀ (v w : V),
                                  (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
                                    (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v +
                                      (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) }
                          v) }
          v +ᵥ
        (fun q i => ↑(coord b i) q) p)
      i
[PROOFSTEP]
rw [LinearMap.coe_mk, Pi.vadd_apply']
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
p : P
v : V
i : ι
⊢ (fun q i => ↑(coord b i) q) (v +ᵥ p) i =
    ↑{ toFun := fun v i => -↑(Basis.sumCoords (basisOf b i)) v,
            map_add' :=
              (_ :
                ∀ (v w : V),
                  (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) (v + w) =
                    (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) v +
                      (fun v i => -↑(Basis.sumCoords (basisOf b i)) v) w) }
        v i +ᵥ
      (fun q i => ↑(coord b i) q) p i
[PROOFSTEP]
dsimp
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
p : P
v : V
i : ι
⊢ ↑(coord b i) (v +ᵥ p) = (-Finsupp.sum (↑(basisOf b i).repr v) fun x => id) + ↑(coord b i) p
[PROOFSTEP]
rw [AffineMap.map_vadd, linear_eq_sumCoords, LinearMap.neg_apply]
[GOAL]
case h
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : Ring k
inst✝ : Module k V
b : AffineBasis ι k P
s : Finset ι
i✝ j : ι
e : ι ≃ ι'
p : P
v : V
i : ι
⊢ -↑(Basis.sumCoords (basisOf b i)) v +ᵥ ↑(coord b i) p =
    (-Finsupp.sum (↑(basisOf b i).repr v) fun x => id) + ↑(coord b i) p
[PROOFSTEP]
simp only [ne_eq, Basis.coe_sumCoords, vadd_eq_add]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝⁴ : AddCommGroup V
inst✝³ : AffineSpace V P
inst✝² : DivisionRing k
inst✝¹ : Module k V
inst✝ : CharZero k
b : AffineBasis ι k P
s : Finset ι
i : ι
hi : i ∈ s
⊢ ↑(coord b i) (Finset.centroid k s ↑b) = (↑(Finset.card s))⁻¹
[PROOFSTEP]
rw [Finset.centroid, b.coord_apply_combination_of_mem hi (s.sum_centroidWeights_eq_one_of_nonempty _ ⟨i, hi⟩),
  Finset.centroidWeights, Function.const_apply]
[GOAL]
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : DivisionRing k
inst✝ : Module k V
t : Set P
ht : affineSpan k t = ⊤
⊢ ∃ s x b, ↑b = Subtype.val
[PROOFSTEP]
obtain ⟨s, hst, h_tot, h_ind⟩ := exists_affineIndependent k V t
[GOAL]
case intro.intro.intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : DivisionRing k
inst✝ : Module k V
t : Set P
ht : affineSpan k t = ⊤
s : Set P
hst : s ⊆ t
h_tot : affineSpan k s = affineSpan k t
h_ind : AffineIndependent k Subtype.val
⊢ ∃ s x b, ↑b = Subtype.val
[PROOFSTEP]
refine' ⟨s, hst, ⟨(↑), h_ind, _⟩, rfl⟩
[GOAL]
case intro.intro.intro
ι : Type u_1
ι' : Type u_2
k : Type u_3
V : Type u_4
P : Type u_5
inst✝³ : AddCommGroup V
inst✝² : AffineSpace V P
inst✝¹ : DivisionRing k
inst✝ : Module k V
t : Set P
ht : affineSpan k t = ⊤
s : Set P
hst : s ⊆ t
h_tot : affineSpan k s = affineSpan k t
h_ind : AffineIndependent k Subtype.val
⊢ affineSpan k (range Subtype.val) = ⊤
[PROOFSTEP]
rw [Subtype.range_coe, h_tot, ht]


[GOAL]
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
H✝ H : LieSubalgebra R L
inst✝ : IsCartanSubalgebra H
⊢ LieSubmodule.normalizer (toLieSubmodule H) = toLieSubmodule H
[PROOFSTEP]
rw [← LieSubmodule.coe_toSubmodule_eq_iff, coe_normalizer_eq_normalizer, IsCartanSubalgebra.self_normalizing,
  coe_toLieSubmodule]
[GOAL]
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
H✝ H : LieSubalgebra R L
inst✝ : IsCartanSubalgebra H
k : ℕ
⊢ LieSubmodule.ucs k (toLieSubmodule H) = toLieSubmodule H
[PROOFSTEP]
induction' k with k ih
[GOAL]
case zero
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
H✝ H : LieSubalgebra R L
inst✝ : IsCartanSubalgebra H
⊢ LieSubmodule.ucs Nat.zero (toLieSubmodule H) = toLieSubmodule H
[PROOFSTEP]
simp
[GOAL]
case succ
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
H✝ H : LieSubalgebra R L
inst✝ : IsCartanSubalgebra H
k : ℕ
ih : LieSubmodule.ucs k (toLieSubmodule H) = toLieSubmodule H
⊢ LieSubmodule.ucs (Nat.succ k) (toLieSubmodule H) = toLieSubmodule H
[PROOFSTEP]
simp [ih]
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
⊢ IsCartanSubalgebra H ↔ LieSubmodule.IsUcsLimit (toLieSubmodule H)
[PROOFSTEP]
constructor
[GOAL]
case mp
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
⊢ IsCartanSubalgebra H → LieSubmodule.IsUcsLimit (toLieSubmodule H)
[PROOFSTEP]
intro h
[GOAL]
case mp
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
⊢ LieSubmodule.IsUcsLimit (toLieSubmodule H)
[PROOFSTEP]
have h₁ : LieAlgebra.IsNilpotent R H := by infer_instance
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
⊢ LieAlgebra.IsNilpotent R { x // x ∈ H }
[PROOFSTEP]
infer_instance
[GOAL]
case mp
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
h₁ : LieAlgebra.IsNilpotent R { x // x ∈ H }
⊢ LieSubmodule.IsUcsLimit (toLieSubmodule H)
[PROOFSTEP]
obtain ⟨k, hk⟩ := H.toLieSubmodule.isNilpotent_iff_exists_self_le_ucs.mp h₁
[GOAL]
case mp.intro
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
h₁ : LieAlgebra.IsNilpotent R { x // x ∈ H }
k : ℕ
hk : toLieSubmodule H ≤ LieSubmodule.ucs k ⊥
⊢ LieSubmodule.IsUcsLimit (toLieSubmodule H)
[PROOFSTEP]
replace hk : H.toLieSubmodule = LieSubmodule.ucs k ⊥ :=
  le_antisymm hk (LieSubmodule.ucs_le_of_normalizer_eq_self H.normalizer_eq_self_of_isCartanSubalgebra k)
[GOAL]
case mp.intro
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
h₁ : LieAlgebra.IsNilpotent R { x // x ∈ H }
k : ℕ
hk : toLieSubmodule H = LieSubmodule.ucs k ⊥
⊢ LieSubmodule.IsUcsLimit (toLieSubmodule H)
[PROOFSTEP]
refine' ⟨k, fun l hl => _⟩
[GOAL]
case mp.intro
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
h : IsCartanSubalgebra H
h₁ : LieAlgebra.IsNilpotent R { x // x ∈ H }
k : ℕ
hk : toLieSubmodule H = LieSubmodule.ucs k ⊥
l : ℕ
hl : k ≤ l
⊢ LieSubmodule.ucs l ⊥ = toLieSubmodule H
[PROOFSTEP]
rw [← Nat.sub_add_cancel hl, LieSubmodule.ucs_add, ← hk, LieSubalgebra.ucs_eq_self_of_isCartanSubalgebra]
[GOAL]
case mpr
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
⊢ LieSubmodule.IsUcsLimit (toLieSubmodule H) → IsCartanSubalgebra H
[PROOFSTEP]
rintro ⟨k, hk⟩
[GOAL]
case mpr.intro
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ IsCartanSubalgebra H
[PROOFSTEP]
exact
  { nilpotent := by
      dsimp only [LieAlgebra.IsNilpotent]
      erw [H.toLieSubmodule.isNilpotent_iff_exists_lcs_eq_bot]
      use k
      rw [_root_.eq_bot_iff, LieSubmodule.lcs_le_iff, hk k (le_refl k)]
    self_normalizing := by
      have hk' := hk (k + 1) k.le_succ
      rw [LieSubmodule.ucs_succ, hk k (le_refl k)] at hk'
      rw [← LieSubalgebra.coe_to_submodule_eq_iff, ← LieSubalgebra.coe_normalizer_eq_normalizer, hk',
        LieSubalgebra.coe_toLieSubmodule] }
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ LieAlgebra.IsNilpotent R { x // x ∈ H }
[PROOFSTEP]
dsimp only [LieAlgebra.IsNilpotent]
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ LieModule.IsNilpotent R { x // x ∈ H } { x // x ∈ H }
[PROOFSTEP]
erw [H.toLieSubmodule.isNilpotent_iff_exists_lcs_eq_bot]
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ ∃ k, LieSubmodule.lcs k (toLieSubmodule H) = ⊥
[PROOFSTEP]
use k
[GOAL]
case h
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ LieSubmodule.lcs k (toLieSubmodule H) = ⊥
[PROOFSTEP]
rw [_root_.eq_bot_iff, LieSubmodule.lcs_le_iff, hk k (le_refl k)]
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
⊢ normalizer H = H
[PROOFSTEP]
have hk' := hk (k + 1) k.le_succ
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
hk' : LieSubmodule.ucs (k + 1) ⊥ = toLieSubmodule H
⊢ normalizer H = H
[PROOFSTEP]
rw [LieSubmodule.ucs_succ, hk k (le_refl k)] at hk'
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
H : LieSubalgebra R L
k : ℕ
hk : ∀ (l : ℕ), k ≤ l → LieSubmodule.ucs l ⊥ = toLieSubmodule H
hk' : LieSubmodule.normalizer (toLieSubmodule H) = toLieSubmodule H
⊢ normalizer H = H
[PROOFSTEP]
rw [← LieSubalgebra.coe_to_submodule_eq_iff, ← LieSubalgebra.coe_normalizer_eq_normalizer, hk',
  LieSubalgebra.coe_toLieSubmodule]
[GOAL]
R✝ : Type u
L✝ : Type v
inst✝⁵ : CommRing R✝
inst✝⁴ : LieRing L✝
inst✝³ : LieAlgebra R✝ L✝
H : LieSubalgebra R✝ L✝
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
I : LieIdeal R L
⊢ LieSubalgebra.normalizer (↑R L I) = ⊤
[PROOFSTEP]
ext x
[GOAL]
case h
R✝ : Type u
L✝ : Type v
inst✝⁵ : CommRing R✝
inst✝⁴ : LieRing L✝
inst✝³ : LieAlgebra R✝ L✝
H : LieSubalgebra R✝ L✝
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
I : LieIdeal R L
x : L
⊢ x ∈ LieSubalgebra.normalizer (↑R L I) ↔ x ∈ ⊤
[PROOFSTEP]
simpa only [LieSubalgebra.mem_normalizer_iff, LieSubalgebra.mem_top, iff_true_iff] using fun y hy => I.lie_mem hy
[GOAL]
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
H : LieSubalgebra R L
inst✝ : IsNilpotent R L
⊢ LieSubalgebra.normalizer ⊤ = ⊤
[PROOFSTEP]
rw [← top_coe_lieSubalgebra, normalizer_eq_top, top_coe_lieSubalgebra]


[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
⊢ Monotone fun s => posTangentConeAt s a
[PROOFSTEP]
rintro s t hst y ⟨c, d, hd, hc, hcd⟩
[GOAL]
case intro.intro.intro.intro
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s t : Set E
hst : s ≤ t
y : E
c : ℕ → ℝ
d : ℕ → E
hd : ∀ᶠ (n : ℕ) in atTop, a + d n ∈ s
hc : Tendsto c atTop atTop
hcd : Tendsto (fun n => c n • d n) atTop (𝓝 y)
⊢ y ∈ (fun s => posTangentConeAt s a) t
[PROOFSTEP]
exact ⟨c, d, mem_of_superset hd fun h hn => hst hn, hc, hcd⟩
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x y ⊆ s
⊢ y - x ∈ posTangentConeAt s x
[PROOFSTEP]
let c := fun n : ℕ => (2 : ℝ) ^ n
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x y ⊆ s
c : ℕ → ℝ := fun n => 2 ^ n
⊢ y - x ∈ posTangentConeAt s x
[PROOFSTEP]
let d := fun n : ℕ => (c n)⁻¹ • (y - x)
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x y ⊆ s
c : ℕ → ℝ := fun n => 2 ^ n
d : ℕ → E := fun n => (c n)⁻¹ • (y - x)
⊢ y - x ∈ posTangentConeAt s x
[PROOFSTEP]
refine' ⟨c, d, Filter.univ_mem' fun n => h _, tendsto_pow_atTop_atTop_of_one_lt one_lt_two, _⟩
[GOAL]
case refine'_1
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x y ⊆ s
c : ℕ → ℝ := fun n => 2 ^ n
d : ℕ → E := fun n => (c n)⁻¹ • (y - x)
n : ℕ
⊢ x + d n ∈ segment ℝ x y
case refine'_2
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x y ⊆ s
c : ℕ → ℝ := fun n => 2 ^ n
d : ℕ → E := fun n => (c n)⁻¹ • (y - x)
⊢ Tendsto (fun n => c n • d n) atTop (𝓝 (y - x))
[PROOFSTEP]
show x + d n ∈ segment ℝ x y
[GOAL]
case refine'_1
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x y ⊆ s
c : ℕ → ℝ := fun n => 2 ^ n
d : ℕ → E := fun n => (c n)⁻¹ • (y - x)
n : ℕ
⊢ x + d n ∈ segment ℝ x y
[PROOFSTEP]
rw [segment_eq_image']
[GOAL]
case refine'_1
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x y ⊆ s
c : ℕ → ℝ := fun n => 2 ^ n
d : ℕ → E := fun n => (c n)⁻¹ • (y - x)
n : ℕ
⊢ x + d n ∈ (fun θ => x + θ • (y - x)) '' Icc 0 1
[PROOFSTEP]
refine' ⟨(c n)⁻¹, ⟨_, _⟩, rfl⟩
[GOAL]
case refine'_1.refine'_1
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x y ⊆ s
c : ℕ → ℝ := fun n => 2 ^ n
d : ℕ → E := fun n => (c n)⁻¹ • (y - x)
n : ℕ
⊢ 0 ≤ (c n)⁻¹
case refine'_1.refine'_2
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x y ⊆ s
c : ℕ → ℝ := fun n => 2 ^ n
d : ℕ → E := fun n => (c n)⁻¹ • (y - x)
n : ℕ
⊢ (c n)⁻¹ ≤ 1
[PROOFSTEP]
exacts [inv_nonneg.2 (pow_nonneg zero_le_two _), inv_le_one (one_le_pow_of_one_le one_le_two _)]
[GOAL]
case refine'_2
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x y ⊆ s
c : ℕ → ℝ := fun n => 2 ^ n
d : ℕ → E := fun n => (c n)⁻¹ • (y - x)
⊢ Tendsto (fun n => c n • d n) atTop (𝓝 (y - x))
[PROOFSTEP]
show Tendsto (fun n => c n • d n) atTop (𝓝 (y - x))
[GOAL]
case refine'_2
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x y ⊆ s
c : ℕ → ℝ := fun n => 2 ^ n
d : ℕ → E := fun n => (c n)⁻¹ • (y - x)
⊢ Tendsto (fun n => c n • d n) atTop (𝓝 (y - x))
[PROOFSTEP]
exact tendsto_const_nhds.congr fun n ↦ (smul_inv_smul₀ (pow_ne_zero _ two_ne_zero) _).symm
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
x y : E
h : segment ℝ x (x + y) ⊆ s
⊢ y ∈ posTangentConeAt s x
[PROOFSTEP]
simpa only [add_sub_cancel'] using mem_posTangentConeAt_of_segment_subset h
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
hy : y ∈ posTangentConeAt s a
⊢ ↑f' y ≤ 0
[PROOFSTEP]
rcases hy with ⟨c, d, hd, hc, hcd⟩
[GOAL]
case intro.intro.intro.intro
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
c : ℕ → ℝ
d : ℕ → E
hd : ∀ᶠ (n : ℕ) in atTop, a + d n ∈ s
hc : Tendsto c atTop atTop
hcd : Tendsto (fun n => c n • d n) atTop (𝓝 y)
⊢ ↑f' y ≤ 0
[PROOFSTEP]
have hc' : Tendsto (‖c ·‖) atTop atTop := tendsto_abs_atTop_atTop.comp hc
[GOAL]
case intro.intro.intro.intro
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
c : ℕ → ℝ
d : ℕ → E
hd : ∀ᶠ (n : ℕ) in atTop, a + d n ∈ s
hc : Tendsto c atTop atTop
hcd : Tendsto (fun n => c n • d n) atTop (𝓝 y)
hc' : Tendsto (fun x => ‖c x‖) atTop atTop
⊢ ↑f' y ≤ 0
[PROOFSTEP]
suffices : ∀ᶠ n in atTop, c n • (f (a + d n) - f a) ≤ 0
[GOAL]
case intro.intro.intro.intro
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
c : ℕ → ℝ
d : ℕ → E
hd : ∀ᶠ (n : ℕ) in atTop, a + d n ∈ s
hc : Tendsto c atTop atTop
hcd : Tendsto (fun n => c n • d n) atTop (𝓝 y)
hc' : Tendsto (fun x => ‖c x‖) atTop atTop
this : ∀ᶠ (n : ℕ) in atTop, c n • (f (a + d n) - f a) ≤ 0
⊢ ↑f' y ≤ 0
[PROOFSTEP]
exact le_of_tendsto (hf.lim atTop hd hc' hcd) this
[GOAL]
case this
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
c : ℕ → ℝ
d : ℕ → E
hd : ∀ᶠ (n : ℕ) in atTop, a + d n ∈ s
hc : Tendsto c atTop atTop
hcd : Tendsto (fun n => c n • d n) atTop (𝓝 y)
hc' : Tendsto (fun x => ‖c x‖) atTop atTop
⊢ ∀ᶠ (n : ℕ) in atTop, c n • (f (a + d n) - f a) ≤ 0
[PROOFSTEP]
replace hd : Tendsto (fun n => a + d n) atTop (𝓝[s] (a + 0))
[GOAL]
case hd
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
c : ℕ → ℝ
d : ℕ → E
hd : ∀ᶠ (n : ℕ) in atTop, a + d n ∈ s
hc : Tendsto c atTop atTop
hcd : Tendsto (fun n => c n • d n) atTop (𝓝 y)
hc' : Tendsto (fun x => ‖c x‖) atTop atTop
⊢ Tendsto (fun n => a + d n) atTop (𝓝[s] (a + 0))
[PROOFSTEP]
exact tendsto_nhdsWithin_iff.2 ⟨tendsto_const_nhds.add (tangentConeAt.lim_zero _ hc' hcd), hd⟩
[GOAL]
case this
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
c : ℕ → ℝ
d : ℕ → E
hc : Tendsto c atTop atTop
hcd : Tendsto (fun n => c n • d n) atTop (𝓝 y)
hc' : Tendsto (fun x => ‖c x‖) atTop atTop
hd : Tendsto (fun n => a + d n) atTop (𝓝[s] (a + 0))
⊢ ∀ᶠ (n : ℕ) in atTop, c n • (f (a + d n) - f a) ≤ 0
[PROOFSTEP]
rw [add_zero] at hd
[GOAL]
case this
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
c : ℕ → ℝ
d : ℕ → E
hc : Tendsto c atTop atTop
hcd : Tendsto (fun n => c n • d n) atTop (𝓝 y)
hc' : Tendsto (fun x => ‖c x‖) atTop atTop
hd : Tendsto (fun n => a + d n) atTop (𝓝[s] a)
⊢ ∀ᶠ (n : ℕ) in atTop, c n • (f (a + d n) - f a) ≤ 0
[PROOFSTEP]
filter_upwards [hd.eventually h, hc.eventually_ge_atTop 0] with n hfn hcn
[GOAL]
case h
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
c : ℕ → ℝ
d : ℕ → E
hc : Tendsto c atTop atTop
hcd : Tendsto (fun n => c n • d n) atTop (𝓝 y)
hc' : Tendsto (fun x => ‖c x‖) atTop atTop
hd : Tendsto (fun n => a + d n) atTop (𝓝[s] a)
n : ℕ
hfn : f (a + d n) ≤ f a
hcn : 0 ≤ c n
⊢ c n • (f (a + d n) - f a) ≤ 0
[PROOFSTEP]
exact mul_nonpos_of_nonneg_of_nonpos hcn (sub_nonpos.2 hfn)
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
y : E
hy : y ∈ posTangentConeAt s a
hf : ¬DifferentiableWithinAt ℝ f s a
⊢ ↑(fderivWithin ℝ f s a) y ≤ 0
[PROOFSTEP]
rw [fderivWithin_zero_of_not_differentiableWithinAt hf]
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
y : E
hy : y ∈ posTangentConeAt s a
hf : ¬DifferentiableWithinAt ℝ f s a
⊢ ↑0 y ≤ 0
[PROOFSTEP]
rfl
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
hy : y ∈ posTangentConeAt s a
hy' : -y ∈ posTangentConeAt s a
⊢ 0 ≤ ↑f' y
[PROOFSTEP]
simpa using h.hasFDerivWithinAt_nonpos hf hy'
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
y : E
hy : y ∈ posTangentConeAt s a
hy' : -y ∈ posTangentConeAt s a
hf : ¬DifferentiableWithinAt ℝ f s a
⊢ ↑(fderivWithin ℝ f s a) y = 0
[PROOFSTEP]
rw [fderivWithin_zero_of_not_differentiableWithinAt hf]
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMaxOn f s a
y : E
hy : y ∈ posTangentConeAt s a
hy' : -y ∈ posTangentConeAt s a
hf : ¬DifferentiableWithinAt ℝ f s a
⊢ ↑0 y = 0
[PROOFSTEP]
rfl
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMinOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
hy : y ∈ posTangentConeAt s a
⊢ 0 ≤ ↑f' y
[PROOFSTEP]
simpa using h.neg.hasFDerivWithinAt_nonpos hf.neg hy
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMinOn f s a
y : E
hy : y ∈ posTangentConeAt s a
hf : ¬DifferentiableWithinAt ℝ f s a
⊢ 0 ≤ ↑(fderivWithin ℝ f s a) y
[PROOFSTEP]
rw [fderivWithin_zero_of_not_differentiableWithinAt hf]
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMinOn f s a
y : E
hy : y ∈ posTangentConeAt s a
hf : ¬DifferentiableWithinAt ℝ f s a
⊢ 0 ≤ ↑0 y
[PROOFSTEP]
rfl
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMinOn f s a
hf : HasFDerivWithinAt f f' s a
y : E
hy : y ∈ posTangentConeAt s a
hy' : -y ∈ posTangentConeAt s a
⊢ ↑f' y = 0
[PROOFSTEP]
simpa using h.neg.hasFDerivWithinAt_eq_zero hf.neg hy hy'
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMinOn f s a
y : E
hy : y ∈ posTangentConeAt s a
hy' : -y ∈ posTangentConeAt s a
hf : ¬DifferentiableWithinAt ℝ f s a
⊢ ↑(fderivWithin ℝ f s a) y = 0
[PROOFSTEP]
rw [fderivWithin_zero_of_not_differentiableWithinAt hf]
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
s : Set E
h : IsLocalMinOn f s a
y : E
hy : y ∈ posTangentConeAt s a
hy' : -y ∈ posTangentConeAt s a
hf : ¬DifferentiableWithinAt ℝ f s a
⊢ ↑0 y = 0
[PROOFSTEP]
rfl
[GOAL]
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
h : IsLocalMin f a
hf : HasFDerivAt f f' a
⊢ f' = 0
[PROOFSTEP]
ext y
[GOAL]
case h
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
h : IsLocalMin f a
hf : HasFDerivAt f f' a
y : E
⊢ ↑f' y = ↑0 y
[PROOFSTEP]
apply (h.on univ).hasFDerivWithinAt_eq_zero hf.hasFDerivWithinAt
[GOAL]
case h.hy
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
h : IsLocalMin f a
hf : HasFDerivAt f f' a
y : E
⊢ y ∈ posTangentConeAt univ a
[PROOFSTEP]
rw [posTangentConeAt_univ]
[GOAL]
case h.hy'
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
h : IsLocalMin f a
hf : HasFDerivAt f f' a
y : E
⊢ -y ∈ posTangentConeAt univ a
[PROOFSTEP]
rw [posTangentConeAt_univ]
[GOAL]
case h.hy
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
h : IsLocalMin f a
hf : HasFDerivAt f f' a
y : E
⊢ y ∈ univ
[PROOFSTEP]
apply mem_univ
[GOAL]
case h.hy'
E : Type u
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℝ E
f : E → ℝ
a : E
f' : E →L[ℝ] ℝ
h : IsLocalMin f a
hf : HasFDerivAt f f' a
y : E
⊢ -y ∈ univ
[PROOFSTEP]
apply mem_univ
[GOAL]
f : ℝ → ℝ
f' a b : ℝ
h : IsLocalMin f a
hf : HasDerivAt f f' a
⊢ f' = 0
[PROOFSTEP]
simpa using FunLike.congr_fun (h.hasFDerivAt_eq_zero (hasDerivAt_iff_hasFDerivAt.1 hf)) 1


[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : ι →₀ α
t : ι → Finset α
⊢ f ∈ Finset.finsupp s t ↔ f.support ⊆ s ∧ ∀ (i : ι), i ∈ s → ↑f i ∈ t i
[PROOFSTEP]
refine' mem_map.trans ⟨_, _⟩
[GOAL]
case refine'_1
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : ι →₀ α
t : ι → Finset α
⊢ (∃ a, a ∈ pi s t ∧ ↑{ toFun := indicator s, inj' := (_ : Function.Injective fun f => indicator s f) } a = f) →
    f.support ⊆ s ∧ ∀ (i : ι), i ∈ s → ↑f i ∈ t i
[PROOFSTEP]
rintro ⟨f, hf, rfl⟩
[GOAL]
case refine'_1.intro.intro
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
t : ι → Finset α
f : (i : ι) → i ∈ s → α
hf : f ∈ pi s t
⊢ (↑{ toFun := indicator s, inj' := (_ : Function.Injective fun f => indicator s f) } f).support ⊆ s ∧
    ∀ (i : ι), i ∈ s → ↑(↑{ toFun := indicator s, inj' := (_ : Function.Injective fun f => indicator s f) } f) i ∈ t i
[PROOFSTEP]
refine' ⟨support_indicator_subset _ _, fun i hi => _⟩
[GOAL]
case refine'_1.intro.intro
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
t : ι → Finset α
f : (i : ι) → i ∈ s → α
hf : f ∈ pi s t
i : ι
hi : i ∈ s
⊢ ↑(↑{ toFun := indicator s, inj' := (_ : Function.Injective fun f => indicator s f) } f) i ∈ t i
[PROOFSTEP]
convert mem_pi.1 hf i hi
[GOAL]
case h.e'_4
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
t : ι → Finset α
f : (i : ι) → i ∈ s → α
hf : f ∈ pi s t
i : ι
hi : i ∈ s
⊢ ↑(↑{ toFun := indicator s, inj' := (_ : Function.Injective fun f => indicator s f) } f) i = f i hi
[PROOFSTEP]
exact indicator_of_mem hi _
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : ι →₀ α
t : ι → Finset α
⊢ (f.support ⊆ s ∧ ∀ (i : ι), i ∈ s → ↑f i ∈ t i) →
    ∃ a, a ∈ pi s t ∧ ↑{ toFun := indicator s, inj' := (_ : Function.Injective fun f => indicator s f) } a = f
[PROOFSTEP]
refine' fun h => ⟨fun i _ => f i, mem_pi.2 h.2, _⟩
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : ι →₀ α
t : ι → Finset α
h : f.support ⊆ s ∧ ∀ (i : ι), i ∈ s → ↑f i ∈ t i
⊢ (↑{ toFun := indicator s, inj' := (_ : Function.Injective fun f => indicator s f) } fun i x => ↑f i) = f
[PROOFSTEP]
ext i
[GOAL]
case refine'_2.h
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : ι →₀ α
t : ι → Finset α
h : f.support ⊆ s ∧ ∀ (i : ι), i ∈ s → ↑f i ∈ t i
i : ι
⊢ ↑(↑{ toFun := indicator s, inj' := (_ : Function.Injective fun f => indicator s f) } fun i x => ↑f i) i = ↑f i
[PROOFSTEP]
exact ite_eq_left_iff.2 fun hi => (not_mem_support_iff.1 fun H => hi <| h.1 H).symm
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : ι →₀ α
t : ι →₀ Finset α
ht : t.support ⊆ s
⊢ f ∈ Finset.finsupp s ↑t ↔ ∀ (i : ι), ↑f i ∈ ↑t i
[PROOFSTEP]
refine'
  mem_finsupp_iff.trans
    (forall_and.symm.trans <|
      forall_congr' fun i =>
        ⟨fun h => _, fun h => ⟨fun hi => ht <| mem_support_iff.2 fun H => mem_support_iff.1 hi _, fun _ => h⟩⟩)
[GOAL]
case refine'_1
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : ι →₀ α
t : ι →₀ Finset α
ht : t.support ⊆ s
i : ι
h : (i ∈ f.support → i ∈ s) ∧ (i ∈ s → ↑f i ∈ ↑t i)
⊢ ↑f i ∈ ↑t i
[PROOFSTEP]
by_cases hi : i ∈ s
[GOAL]
case pos
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : ι →₀ α
t : ι →₀ Finset α
ht : t.support ⊆ s
i : ι
h : (i ∈ f.support → i ∈ s) ∧ (i ∈ s → ↑f i ∈ ↑t i)
hi : i ∈ s
⊢ ↑f i ∈ ↑t i
[PROOFSTEP]
exact h.2 hi
[GOAL]
case neg
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : ι →₀ α
t : ι →₀ Finset α
ht : t.support ⊆ s
i : ι
h : (i ∈ f.support → i ∈ s) ∧ (i ∈ s → ↑f i ∈ ↑t i)
hi : ¬i ∈ s
⊢ ↑f i ∈ ↑t i
[PROOFSTEP]
rw [not_mem_support_iff.1 (mt h.1 hi), not_mem_support_iff.1 fun H => hi <| ht H]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : ι →₀ α
t : ι →₀ Finset α
ht : t.support ⊆ s
i : ι
h : (i ∈ f.support → i ∈ s) ∧ (i ∈ s → ↑f i ∈ ↑t i)
hi : ¬i ∈ s
⊢ 0 ∈ 0
[PROOFSTEP]
exact zero_mem_zero
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : ι →₀ α
t : ι →₀ Finset α
ht : t.support ⊆ s
i : ι
h : ↑f i ∈ ↑t i
hi : i ∈ f.support
H : ↑t i = 0
⊢ ↑f i = 0
[PROOFSTEP]
rwa [H, mem_zero] at h
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f✝ : ι →₀ α
f : ι →₀ Finset α
⊢ card (pi f) = prod f fun i => ↑(card (↑f i))
[PROOFSTEP]
rw [pi, card_finsupp]
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f✝ : ι →₀ α
f : ι →₀ Finset α
⊢ ∏ i in f.support, card (↑f i) = prod f fun i => ↑(card (↑f i))
[PROOFSTEP]
exact Finset.prod_congr rfl fun i _ => by simp only [Pi.nat_apply, Nat.cast_id]
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f✝ : ι →₀ α
f : ι →₀ Finset α
i : ι
x✝ : i ∈ f.support
⊢ card (↑f i) = (fun i => ↑(card (↑f i))) i (↑f i)
[PROOFSTEP]
simp only [Pi.nat_apply, Nat.cast_id]