Imports
/-
Copyright (c) 2025 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
module
public import Physlib.SpaceAndTime.Space.ModuleSlices of space
i. Overview
In this module we will define the equivalence between Space d.succ and ℝ × Space d which
extracts the ith coordinate on Space d.succ.
ii. Key results
slice : The continuous linear equivalence between Space d.succ and ℝ × Space d extracting
the ith coordinate.
iii. Table of contents
A. Slicing spaces
A.1. Basic applications of the slicing map
A.2. Slice as a measurable embedding
A.3. The norm of the slice map
A.4. Derivative of the slice map
A.5. Basis in terms of slices
iv. References
https://leanprover.zulipchat.com/#narrow/channel/479953-Physlib/topic/API.20around.20.60Space.20.28d1.20.2B.20d2.29.60.20to.20.60Space.20d1.20x.20Space.20d2.60/with/556754634
@[expose] public sectionA. Slicing spaces
The linear equivalence between Space d.succ and ℝ × Space d
extracting the ith coordinate.
def slice {d} (i : Fin d.succ) : Space d.succ ≃L[ℝ] ℝ × Space d where
toFun x := ⟨x i, ⟨fun j => x (Fin.succAbove i j)⟩⟩
invFun p := ⟨fun j => Fin.insertNthEquiv (fun _ => ℝ) i (p.fst, p.snd) j⟩
map_add' x y := 𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succx:Space d.succy:Space d.succ⊢ ((x + y).val i, { val := fun j => (x + y).val (i.succAbove j) }) =
(x.val i, { val := fun j => x.val (i.succAbove j) }) + (y.val i, { val := fun j => y.val (i.succAbove j) })
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succx:Space d.succy:Space d.succ⊢ (x + y).val i = x.val i + y.val i ∧
{ val := fun j => (x + y).val (i.succAbove j) } =
{ val := fun j => x.val (i.succAbove j) } + { val := fun j => y.val (i.succAbove j) }
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succx:Space d.succy:Space d.succ⊢ (x + y).val i = x.val i + y.val i𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succx:Space d.succy:Space d.succ⊢ { val := fun j => (x + y).val (i.succAbove j) } =
{ val := fun j => x.val (i.succAbove j) } + { val := fun j => y.val (i.succAbove j) }
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succx:Space d.succy:Space d.succ⊢ (x + y).val i = x.val i + y.val i All goals completed! 🐙
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succx:Space d.succy:Space d.succ⊢ { val := fun j => (x + y).val (i.succAbove j) } =
{ val := fun j => x.val (i.succAbove j) } + { val := fun j => y.val (i.succAbove j) } 𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succx:Space d.succy:Space d.succj:Fin d⊢ { val := fun j => (x + y).val (i.succAbove j) }.val j =
({ val := fun j => x.val (i.succAbove j) } + { val := fun j => y.val (i.succAbove j) }).val j
All goals completed! 🐙
map_smul' c x := 𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succc:ℝx:Space d.succ⊢ ((c • x).val i, { val := fun j => (c • x).val (i.succAbove j) }) =
(RingHom.id ℝ) c • (x.val i, { val := fun j => x.val (i.succAbove j) })
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succc:ℝx:Space d.succ⊢ (c • x).val i = c * x.val i ∧
{ val := fun j => (c • x).val (i.succAbove j) } = c • { val := fun j => x.val (i.succAbove j) }
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succc:ℝx:Space d.succ⊢ (c • x).val i = c * x.val i𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succc:ℝx:Space d.succ⊢ { val := fun j => (c • x).val (i.succAbove j) } = c • { val := fun j => x.val (i.succAbove j) }
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succc:ℝx:Space d.succ⊢ (c • x).val i = c * x.val i All goals completed! 🐙
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succc:ℝx:Space d.succ⊢ { val := fun j => (c • x).val (i.succAbove j) } = c • { val := fun j => x.val (i.succAbove j) } 𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succc:ℝx:Space d.succj:Fin d⊢ { val := fun j => (c • x).val (i.succAbove j) }.val j = (c • { val := fun j => x.val (i.succAbove j) }).val j
All goals completed! 🐙
left_inv p := 𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succp:Space d.succ⊢ (fun p => { val := fun j => (Fin.insertNthEquiv (fun x => ℝ) i) (p.1, p.2.val) j })
((fun x => (x.val i, { val := fun j => x.val (i.succAbove j) })) p) =
p
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succp:Space d.succ⊢ { val := fun j => i.insertNth (p.val i) (fun j => p.val (i.succAbove j)) j } = p
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succp:Space d.succj:Fin (d + 1)⊢ { val := fun j => i.insertNth (p.val i) (fun j => p.val (i.succAbove j)) j }.val j = p.val j
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕp:Space d.succj:Fin (d + 1)⊢ { val := fun j_1 => j.insertNth (p.val j) (fun j_2 => p.val (j.succAbove j_2)) j_1 }.val j = p.val j𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succp:Space d.succk:Fin d⊢ { val := fun j => i.insertNth (p.val i) (fun j => p.val (i.succAbove j)) j }.val (i.succAbove k) = p.val (i.succAbove k)
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕp:Space d.succj:Fin (d + 1)⊢ { val := fun j_1 => j.insertNth (p.val j) (fun j_2 => p.val (j.succAbove j_2)) j_1 }.val j = p.val j All goals completed! 🐙
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succp:Space d.succk:Fin d⊢ { val := fun j => i.insertNth (p.val i) (fun j => p.val (i.succAbove j)) j }.val (i.succAbove k) = p.val (i.succAbove k) All goals completed! 🐙
right_inv p := 𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succp:ℝ × Space d⊢ (fun x => (x.val i, { val := fun j => x.val (i.succAbove j) }))
((fun p => { val := fun j => (Fin.insertNthEquiv (fun x => ℝ) i) (p.1, p.2.val) j }) p) =
p
match p with
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succp:ℝ × Space dp1:ℝp2:Space d⊢ (fun x => (x.val i, { val := fun j => x.val (i.succAbove j) }))
((fun p => { val := fun j => (Fin.insertNthEquiv (fun x => ℝ) i) (p.1, p.2.val) j }) (p1, p2)) =
(p1, p2)
All goals completed! 🐙
continuous_toFun := 𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succ⊢ Continuous fun x => (x.val i, { val := fun j => x.val (i.succAbove j) }) All goals completed! 🐙
continuous_invFun := 𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succ⊢ Continuous fun p => { val := fun j => (Fin.insertNthEquiv (fun x => ℝ) i) (p.1, p.2.val) j }
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succ⊢ Continuous mk𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succ⊢ Continuous fun p j => (Fin.insertNthEquiv (fun x => ℝ) i) (p.1, p.2.val) j
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succ⊢ Continuous mk All goals completed! 🐙
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succ⊢ ∀ (i_1 : Fin d.succ), Continuous fun a => (Fin.insertNthEquiv (fun x => ℝ) i) (a.1, a.2.val) i_1
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succj:Fin d.succ⊢ Continuous fun a => (Fin.insertNthEquiv (fun x => ℝ) i) (a.1, a.2.val) j
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕj:Fin d.succ⊢ Continuous fun a => (Fin.insertNthEquiv (fun x => ℝ) j) (a.1, a.2.val) j𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succk:Fin d⊢ Continuous fun a => (Fin.insertNthEquiv (fun x => ℝ) i) (a.1, a.2.val) (i.succAbove k)
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕj:Fin d.succ⊢ Continuous fun a => (Fin.insertNthEquiv (fun x => ℝ) j) (a.1, a.2.val) j 𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕj:Fin d.succ⊢ Continuous fun a => a.1
All goals completed! 🐙
𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succk:Fin d⊢ Continuous fun a => (Fin.insertNthEquiv (fun x => ℝ) i) (a.1, a.2.val) (i.succAbove k) 𝕜:TypeE:TypeF:TypeF':Typeinst✝⁵:RCLike 𝕜inst✝⁴:NormedAddCommGroup Einst✝³:NormedAddCommGroup Finst✝²:NormedAddCommGroup F'inst✝¹:NormedSpace ℝ Einst✝:NormedSpace ℝ Fd:ℕi:Fin d.succk:Fin d⊢ Continuous fun a => a.2.val k
All goals completed! 🐙A.1. Basic applications of the slicing map
lemma slice_symm_apply {d : ℕ} (i : Fin d.succ) (r : ℝ) (x : Space d) :
(slice i).symm (r, x) = fun j =>
Fin.insertNthEquiv (fun _ => ℝ) i (r, x) j := d:ℕi:Fin d.succr:ℝx:Space d⊢ ((slice i).symm (r, x)).val = fun j => (Fin.insertNthEquiv (fun x => ℝ) i) (r, x.val) j All goals completed! 🐙@[simp]
lemma slice_symm_apply_self {d : ℕ} (i : Fin d.succ) (r : ℝ) (x : Space d) :
(slice i).symm (r, x) i = r := d:ℕi:Fin d.succr:ℝx:Space d⊢ ((slice i).symm (r, x)).val i = r
All goals completed! 🐙@[simp]
lemma slice_symm_apply_succAbove {d : ℕ} (i : Fin d.succ) (r : ℝ) (x : Space d) (j : Fin d) :
(slice i).symm (r, x) (Fin.succAbove i j) = x j := d:ℕi:Fin d.succr:ℝx:Space dj:Fin d⊢ ((slice i).symm (r, x)).val (i.succAbove j) = x.val j
All goals completed! 🐙A.2. Slice as a measurable embedding
lemma slice_symm_measurableEmbedding {d : ℕ} (i : Fin d.succ) :
MeasurableEmbedding (slice i).symm := d:ℕi:Fin d.succ⊢ MeasurableEmbedding ⇑(slice i).symm
d:ℕi:Fin d.succ⊢ MeasurableEmbedding fun p => (equivPi d.succ).symm ((MeasurableEquiv.piFinSuccAbove (fun x => ℝ) i).symm (p.1, p.2.val))
d:ℕi:Fin d.succ⊢ MeasurableEmbedding ⇑(equivPi d.succ).symmd:ℕi:Fin d.succ⊢ MeasurableEmbedding fun p => (MeasurableEquiv.piFinSuccAbove (fun x => ℝ) i).symm (p.1, p.2.val)
d:ℕi:Fin d.succ⊢ MeasurableEmbedding ⇑(equivPi d.succ).symm d:ℕi:Fin d.succ⊢ Measurable ⇑(equivPi d.succ).symmd:ℕi:Fin d.succ⊢ Function.Injective ⇑(equivPi d.succ).symm
d:ℕi:Fin d.succ⊢ Measurable ⇑(equivPi d.succ).symm All goals completed! 🐙
d:ℕi:Fin d.succ⊢ Function.Injective ⇑(equivPi d.succ).symm All goals completed! 🐙
d:ℕi:Fin d.succ⊢ MeasurableEmbedding ⇑(MeasurableEquiv.piFinSuccAbove (fun x => ℝ) i).symmd:ℕi:Fin d.succ⊢ MeasurableEmbedding fun p => (p.1, p.2.val)
d:ℕi:Fin d.succ⊢ MeasurableEmbedding ⇑(MeasurableEquiv.piFinSuccAbove (fun x => ℝ) i).symm All goals completed! 🐙
d:ℕi:Fin d.succ⊢ MeasurableEmbedding fun p => (p.1, p.2.val) d:ℕi:Fin d.succ⊢ Measurable fun p => (p.1, p.2.val)d:ℕi:Fin d.succ⊢ Function.Injective fun p => (p.1, p.2.val)
d:ℕi:Fin d.succ⊢ Measurable fun p => (p.1, p.2.val) All goals completed! 🐙
d:ℕi:Fin d.succ⊢ Function.Injective fun p => (p.1, p.2.val) d:ℕi:Fin d.succa:ℝ × Space db:ℝ × Space dh:(fun p => (p.1, p.2.val)) a = (fun p => (p.1, p.2.val)) b⊢ a = b
match a, b with
d:ℕi:Fin d.succa:ℝ × Space db:ℝ × Space dr1:ℝx1:Space dr2:ℝx2:Space dh:(fun p => (p.1, p.2.val)) (r1, x1) = (fun p => (p.1, p.2.val)) (r2, x2)⊢ (r1, x1) = (r2, x2)
All goals completed! 🐙A.3. The norm of the slice map
d:ℕi:Fin d.succr:ℝx:Space d⊢ ((slice i).symm (r, x)).val i ^ 2 + ∑ i_1, ((slice i).symm (r, x)).val (i.succAbove i_1) ^ 2 =
r ^ 2 + √(∑ i, x.val i ^ 2) ^ 2
simp [slice_symm_apply_succAbove] d:ℕi:Fin d.succr:ℝx:Space d⊢ ∑ x_1, x.val x_1 ^ 2 = √(∑ x_1, x.val x_1 ^ 2) ^ 2
refine Eq.symm (Real.sq_sqrt ?_) d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ ∑ x_1, x.val x_1 ^ 2
positivity All goals completed! 🐙
lemma abs_right_le_norm_slice_symm {d : ℕ} (i : Fin d.succ) (r : ℝ) (x : Space d) :
|r| ≤ ‖(slice i).symm (r, x)‖ := by d:ℕi:Fin d.succr:ℝx:Space d⊢ |r| ≤ ‖(slice i).symm (r, x)‖
rw [norm_slice_symm_eq d:ℕi:Fin d.succr:ℝx:Space d⊢ |r| ≤ √(‖r‖ ^ 2 + ‖x‖ ^ 2) d:ℕi:Fin d.succr:ℝx:Space d⊢ |r| ≤ √(‖r‖ ^ 2 + ‖x‖ ^ 2)] d:ℕi:Fin d.succr:ℝx:Space d⊢ |r| ≤ √(‖r‖ ^ 2 + ‖x‖ ^ 2)
refine (le_sqrt (by d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ |r| positivity All goals completed! 🐙) (by d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ ‖r‖ ^ 2 + ‖x‖ ^ 2 positivity All goals completed! 🐙)).mpr ?_
simp All goals completed! 🐙
@[simp]
lemma norm_left_le_norm_slice_symm {d : ℕ} (i : Fin d.succ) (r : ℝ) (x : Space d) :
‖x‖ ≤ ‖(slice i).symm (r, x)‖ := by d:ℕi:Fin d.succr:ℝx:Space d⊢ ‖x‖ ≤ ‖(slice i).symm (r, x)‖
rw [norm_slice_symm_eq d:ℕi:Fin d.succr:ℝx:Space d⊢ ‖x‖ ≤ √(‖r‖ ^ 2 + ‖x‖ ^ 2) d:ℕi:Fin d.succr:ℝx:Space d⊢ ‖x‖ ≤ √(‖r‖ ^ 2 + ‖x‖ ^ 2)] d:ℕi:Fin d.succr:ℝx:Space d⊢ ‖x‖ ≤ √(‖r‖ ^ 2 + ‖x‖ ^ 2)
refine (le_sqrt (by d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ ‖x‖ positivity All goals completed! 🐙) (by d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ ‖r‖ ^ 2 + ‖x‖ ^ 2 positivity All goals completed! 🐙)).mpr ?_
simp only [norm_eq_abs, sq_abs, le_add_iff_nonneg_left] d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ r ^ 2
positivity All goals completed! 🐙A.4. Derivative of the slice map
@[simp]
lemma fderiv_slice_symm {d : ℕ} (i : Fin d.succ) (p1 : ℝ × Space d) :
fderiv ℝ (slice i).symm p1 = (slice i).symm := by d:ℕi:Fin d.succp1:ℝ × Space d⊢ fderiv ℝ (⇑(slice i).symm) p1 = ↑(slice i).symm
rw [ContinuousLinearEquiv.fderiv d:ℕi:Fin d.succp1:ℝ × Space d⊢ ↑(slice i).symm = ↑(slice i).symm All goals completed! 🐙] All goals completed! 🐙
lemma fderiv_slice_symm_left_apply {d : ℕ} (i : Fin d.succ) (x : Space d) (r1 r2 : ℝ) :
(fderiv ℝ (fun r => (slice i).symm (r, x))) r1 r2 = (slice i).symm (r2, 0) := by d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ (fderiv ℝ (fun r => (slice i).symm (r, x)) r1) r2 = (slice i).symm (r2, 0)
rw [fderiv_fun_comp, d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ (fderiv ℝ ⇑(slice i).symm (r1, x) ∘SL fderiv ℝ (fun r => (r, x)) r1) r2 = (slice i).symm (r2, 0)hg d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ ⇑(slice i).symm (r1, x)hf d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => (r, x)) r1 d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ (fderiv ℝ ⇑(slice i).symm (r1, x) ∘SL (fderiv ℝ (fun r => r) r1).prod (fderiv ℝ (fun r => x) r1)) r2 =
(slice i).symm (r2, 0)d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => x) r1hg d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ ⇑(slice i).symm (r1, x)hf d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => (r, x)) r1 DifferentiableAt.fderiv_prodMk (by d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => r) r1 d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ (fderiv ℝ ⇑(slice i).symm (r1, x) ∘SL (fderiv ℝ (fun r => r) r1).prod (fderiv ℝ (fun r => x) r1)) r2 =
(slice i).symm (r2, 0)d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => x) r1hg d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ ⇑(slice i).symm (r1, x)hf d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => (r, x)) r1 fun_prop All goals completed! 🐙 d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ (fderiv ℝ ⇑(slice i).symm (r1, x) ∘SL (fderiv ℝ (fun r => r) r1).prod (fderiv ℝ (fun r => x) r1)) r2 =
(slice i).symm (r2, 0)d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => x) r1hg d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ ⇑(slice i).symm (r1, x)hf d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => (r, x)) r1)] d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ (fderiv ℝ ⇑(slice i).symm (r1, x) ∘SL (fderiv ℝ (fun r => r) r1).prod (fderiv ℝ (fun r => x) r1)) r2 =
(slice i).symm (r2, 0)d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => x) r1hg d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ ⇑(slice i).symm (r1, x)hf d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => (r, x)) r1
simp only [Nat.succ_eq_add_one, fderiv_slice_symm, fderiv_fun_id, fderiv_fun_const, Pi.zero_apply,
ContinuousLinearMap.coe_comp, ContinuousLinearEquiv.coe_coe, Function.comp_apply,
ContinuousLinearMap.prod_apply, ContinuousLinearMap.coe_id', id_eq,
_root_.zero_apply] d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => x) r1hg d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ ⇑(slice i).symm (r1, x)hf d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => (r, x)) r1
repeat' fun_prop All goals completed! 🐙
@[simp]
lemma fderiv_slice_symm_right_apply {d : ℕ} (i : Fin d.succ) (r : ℝ)
(x1 x2 : Space d) :
(fderiv ℝ (fun x => (slice i).symm (r, x))) x1 x2 = (slice i).symm (0, x2) := by d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ (fderiv ℝ (fun x => (slice i).symm (r, x)) x1) x2 = (slice i).symm (0, x2)
rw [fderiv_fun_comp, d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ (fderiv ℝ ⇑(slice i).symm (r, x1) ∘SL fderiv ℝ (Prod.mk r) x1) x2 = (slice i).symm (0, x2)hg d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ ⇑(slice i).symm (r, x1)hf d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (Prod.mk r) x1 d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ (fderiv ℝ ⇑(slice i).symm (r, x1) ∘SL (fderiv ℝ (fun x => r) x1).prod (fderiv ℝ (fun x => x) x1)) x2 =
(slice i).symm (0, x2)d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (fun x => x) x1hg d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ ⇑(slice i).symm (r, x1)hf d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (Prod.mk r) x1 DifferentiableAt.fderiv_prodMk (by d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (fun x => r) x1 d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ (fderiv ℝ ⇑(slice i).symm (r, x1) ∘SL (fderiv ℝ (fun x => r) x1).prod (fderiv ℝ (fun x => x) x1)) x2 =
(slice i).symm (0, x2)d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (fun x => x) x1hg d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ ⇑(slice i).symm (r, x1)hf d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (Prod.mk r) x1 fun_prop All goals completed! 🐙 d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ (fderiv ℝ ⇑(slice i).symm (r, x1) ∘SL (fderiv ℝ (fun x => r) x1).prod (fderiv ℝ (fun x => x) x1)) x2 =
(slice i).symm (0, x2)d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (fun x => x) x1hg d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ ⇑(slice i).symm (r, x1)hf d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (Prod.mk r) x1)] d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ (fderiv ℝ ⇑(slice i).symm (r, x1) ∘SL (fderiv ℝ (fun x => r) x1).prod (fderiv ℝ (fun x => x) x1)) x2 =
(slice i).symm (0, x2)d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (fun x => x) x1hg d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ ⇑(slice i).symm (r, x1)hf d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (Prod.mk r) x1
simp only [Nat.succ_eq_add_one, fderiv_slice_symm, fderiv_fun_const, Pi.zero_apply, fderiv_fun_id,
ContinuousLinearMap.coe_comp, ContinuousLinearEquiv.coe_coe, Function.comp_apply,
ContinuousLinearMap.prod_apply, _root_.zero_apply, ContinuousLinearMap.coe_id',
id_eq] d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (fun x => x) x1hg d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ ⇑(slice i).symm (r, x1)hf d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (Prod.mk r) x1
repeat' fun_prop All goals completed! 🐙
lemma fderiv_fun_slice_symm_right_apply {d : ℕ} (i : Fin d.succ) (r : ℝ)
(x1 x2 : Space d) (f : Space d.succ → F) (hf : DifferentiableAt ℝ f ((slice i).symm (r, x1))) :
(fderiv ℝ (fun x => f ((slice i).symm (r, x)))) x1 x2 =
fderiv ℝ f ((slice i).symm (r, x1)) ((slice i).symm (0, x2)) := by F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr:ℝx1:Space dx2:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r, x1))⊢ (fderiv ℝ (fun x => f ((slice i).symm (r, x))) x1) x2 = (fderiv ℝ f ((slice i).symm (r, x1))) ((slice i).symm (0, x2))
rw [fderiv_fun_comp _ _ (by F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr:ℝx1:Space dx2:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r, x1))⊢ DifferentiableAt ℝ (fun x => (slice i).symm (r, x)) x1 F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr:ℝx1:Space dx2:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r, x1))⊢ (fderiv ℝ f ((slice i).symm (r, x1)) ∘SL fderiv ℝ (fun x => (slice i).symm (r, x)) x1) x2 =
(fderiv ℝ f ((slice i).symm (r, x1))) ((slice i).symm (0, x2))F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr:ℝx1:Space dx2:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r, x1))⊢ DifferentiableAt ℝ f ((slice i).symm (r, x1)) fun_prop All goals completed! 🐙 F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr:ℝx1:Space dx2:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r, x1))⊢ (fderiv ℝ f ((slice i).symm (r, x1)) ∘SL fderiv ℝ (fun x => (slice i).symm (r, x)) x1) x2 =
(fderiv ℝ f ((slice i).symm (r, x1))) ((slice i).symm (0, x2))F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr:ℝx1:Space dx2:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r, x1))⊢ DifferentiableAt ℝ f ((slice i).symm (r, x1)))] F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr:ℝx1:Space dx2:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r, x1))⊢ (fderiv ℝ f ((slice i).symm (r, x1)) ∘SL fderiv ℝ (fun x => (slice i).symm (r, x)) x1) x2 =
(fderiv ℝ f ((slice i).symm (r, x1))) ((slice i).symm (0, x2))F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr:ℝx1:Space dx2:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r, x1))⊢ DifferentiableAt ℝ f ((slice i).symm (r, x1))
simp only [Nat.succ_eq_add_one, ContinuousLinearMap.coe_comp, Function.comp_apply,
fderiv_slice_symm_right_apply] F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr:ℝx1:Space dx2:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r, x1))⊢ DifferentiableAt ℝ f ((slice i).symm (r, x1))
fun_prop All goals completed! 🐙
lemma fderiv_fun_slice_symm_left_apply {d : ℕ} (i : Fin d.succ) (r1 r2 : ℝ)
(x : Space d) (f : Space d.succ → F) (hf : DifferentiableAt ℝ f ((slice i).symm (r1, x))) :
(fderiv ℝ (fun r => f ((slice i).symm (r, x)))) r1 r2 =
fderiv ℝ f ((slice i).symm (r1, x)) ((slice i).symm (r2, 0)) := by F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr1:ℝr2:ℝx:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r1, x))⊢ (fderiv ℝ (fun r => f ((slice i).symm (r, x))) r1) r2 = (fderiv ℝ f ((slice i).symm (r1, x))) ((slice i).symm (r2, 0))
rw [fderiv_fun_comp _ _ (by F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr1:ℝr2:ℝx:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r1, x))⊢ DifferentiableAt ℝ (fun r => (slice i).symm (r, x)) r1 F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr1:ℝr2:ℝx:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r1, x))⊢ (fderiv ℝ f ((slice i).symm (r1, x)) ∘SL fderiv ℝ (fun r => (slice i).symm (r, x)) r1) r2 =
(fderiv ℝ f ((slice i).symm (r1, x))) ((slice i).symm (r2, 0))F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr1:ℝr2:ℝx:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r1, x))⊢ DifferentiableAt ℝ f ((slice i).symm (r1, x)) fun_prop All goals completed! 🐙 F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr1:ℝr2:ℝx:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r1, x))⊢ (fderiv ℝ f ((slice i).symm (r1, x)) ∘SL fderiv ℝ (fun r => (slice i).symm (r, x)) r1) r2 =
(fderiv ℝ f ((slice i).symm (r1, x))) ((slice i).symm (r2, 0))F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr1:ℝr2:ℝx:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r1, x))⊢ DifferentiableAt ℝ f ((slice i).symm (r1, x)))] F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr1:ℝr2:ℝx:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r1, x))⊢ (fderiv ℝ f ((slice i).symm (r1, x)) ∘SL fderiv ℝ (fun r => (slice i).symm (r, x)) r1) r2 =
(fderiv ℝ f ((slice i).symm (r1, x))) ((slice i).symm (r2, 0))F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr1:ℝr2:ℝx:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r1, x))⊢ DifferentiableAt ℝ f ((slice i).symm (r1, x))
simp only [Nat.succ_eq_add_one, ContinuousLinearMap.coe_comp, Function.comp_apply,
fderiv_slice_symm_left_apply] F:Typeinst✝¹:NormedAddCommGroup Finst✝:NormedSpace ℝ Fd:ℕi:Fin d.succr1:ℝr2:ℝx:Space df:Space d.succ → Fhf:DifferentiableAt ℝ f ((slice i).symm (r1, x))⊢ DifferentiableAt ℝ f ((slice i).symm (r1, x))
fun_prop All goals completed! 🐙A.5. Basis in terms of slices
lemma basis_self_eq_slice {d : ℕ} (i : Fin d.succ) :
basis i = (slice i).symm (1, 0) := by d:ℕi:Fin d.succ⊢ basis i = (slice i).symm (1, 0)
ext j d:ℕi:Fin d.succj:Fin d.succ⊢ (basis i).val j = ((slice i).symm (1, 0)).val j
rcases Fin.eq_self_or_eq_succAbove i j with rfl | ⟨k, rfl⟩ inl d:ℕj:Fin d.succ⊢ (basis j).val j = ((slice j).symm (1, 0)).val jinr d:ℕi:Fin d.succk:Fin d⊢ (basis i).val (i.succAbove k) = ((slice i).symm (1, 0)).val (i.succAbove k)
· inl d:ℕj:Fin d.succ⊢ (basis j).val j = ((slice j).symm (1, 0)).val j simp [slice_symm_apply_self] All goals completed! 🐙
· inr d:ℕi:Fin d.succk:Fin d⊢ (basis i).val (i.succAbove k) = ((slice i).symm (1, 0)).val (i.succAbove k) simp [basis_apply] All goals completed! 🐙lemma basis_succAbove_eq_slice {d : ℕ} (i : Fin d.succ) (j : Fin d) :
basis (Fin.succAbove i j) = (slice i).symm (0, basis j) := by d:ℕi:Fin d.succj:Fin d⊢ basis (i.succAbove j) = (slice i).symm (0, basis j)
ext k d:ℕi:Fin d.succj:Fin dk:Fin (d + 1)⊢ (basis (i.succAbove j)).val k = ((slice i).symm (0, basis j)).val k
rcases Fin.eq_self_or_eq_succAbove i k with rfl | ⟨l, rfl⟩ inl d:ℕj:Fin dk:Fin (d + 1)⊢ (basis (k.succAbove j)).val k = ((slice k).symm (0, basis j)).val kinr d:ℕi:Fin d.succj:Fin dl:Fin d⊢ (basis (i.succAbove j)).val (i.succAbove l) = ((slice i).symm (0, basis j)).val (i.succAbove l)
· inl d:ℕj:Fin dk:Fin (d + 1)⊢ (basis (k.succAbove j)).val k = ((slice k).symm (0, basis j)).val k simp [basis_apply, slice_symm_apply_self] All goals completed! 🐙
· inr d:ℕi:Fin d.succj:Fin dl:Fin d⊢ (basis (i.succAbove j)).val (i.succAbove l) = ((slice i).symm (0, basis j)).val (i.succAbove l) simp [basis_apply, slice_symm_apply_succAbove] All goals completed! 🐙