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.Module

Slices 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 section

A. 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 d:ℕi:Fin d.succr:ℝx:Space d⊢ ∑ x_1, x.val x_1 ^ 2 = √(∑ x_1, x.val x_1 ^ 2) ^ 2 d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ ∑ x_1, x.val x_1 ^ 2 All goals completed! 🐙d:ℕi:Fin d.succr:ℝx:Space d⊢ |r| ≤ √(‖r‖ ^ 2 + ‖x‖ ^ 2) refine (le_sqrt (d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ |r| All goals completed! 🐙) (d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ ‖r‖ ^ 2 + ‖x‖ ^ 2 All goals completed! 🐙)).mpr ?_ All goals completed! 🐙d:ℕi:Fin d.succr:ℝx:Space d⊢ ‖x‖ ≤ √(‖r‖ ^ 2 + ‖x‖ ^ 2) refine (le_sqrt (d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ ‖x‖ All goals completed! 🐙) (d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ ‖r‖ ^ 2 + ‖x‖ ^ 2 All goals completed! 🐙)).mpr ?_ d:ℕi:Fin d.succr:ℝx:Space d⊢ 0 ≤ r ^ 2 All goals completed! 🐙

A.4. Derivative of the slice map

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) r1d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ ⇑(slice i).symm (r1, x)d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => (r, x)) r1 d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => x) r1d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ ⇑(slice i).symm (r1, x)d:ℕi:Fin d.succx:Space dr1:ℝr2:ℝ⊢ DifferentiableAt ℝ (fun r => (r, x)) r1 repeat' 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) x1d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ ⇑(slice i).symm (r, x1)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⊢ DifferentiableAt ℝ (fun x => x) x1d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ ⇑(slice i).symm (r, x1)d:ℕi:Fin d.succr:ℝx1:Space dx2:Space d⊢ DifferentiableAt ℝ (Prod.mk r) x1 repeat' 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))⊢ DifferentiableAt ℝ f ((slice i).symm (r, x1)) 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))⊢ DifferentiableAt ℝ f ((slice i).symm (r1, x)) 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) := d:ℕi:Fin d.succ⊢ basis i = (slice i).symm (1, 0) d:ℕi:Fin d.succj:Fin d.succ⊢ (basis i).val j = ((slice i).symm (1, 0)).val j d:ℕj:Fin d.succ⊢ (basis j).val j = ((slice j).symm (1, 0)).val jd:ℕi:Fin d.succk:Fin d⊢ (basis i).val (i.succAbove k) = ((slice i).symm (1, 0)).val (i.succAbove k) d:ℕj:Fin d.succ⊢ (basis j).val j = ((slice j).symm (1, 0)).val j All goals completed! 🐙 d:ℕi:Fin d.succk:Fin d⊢ (basis i).val (i.succAbove k) = ((slice i).symm (1, 0)).val (i.succAbove k) 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) := d:ℕi:Fin d.succj:Fin d⊢ basis (i.succAbove j) = (slice i).symm (0, basis j) d:ℕi:Fin d.succj:Fin dk:Fin (d + 1)⊢ (basis (i.succAbove j)).val k = ((slice i).symm (0, basis j)).val k d:ℕj:Fin dk:Fin (d + 1)⊢ (basis (k.succAbove j)).val k = ((slice k).symm (0, basis j)).val kd:ℕ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) d:ℕj:Fin dk:Fin (d + 1)⊢ (basis (k.succAbove j)).val k = ((slice k).symm (0, basis j)).val k All goals completed! 🐙 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) All goals completed! 🐙