Imports
/- Copyright (c) 2026 Juan Jose Fernandez Morales. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Juan Jose Fernandez Morales -/ module public import Physlib.SpaceAndTime.Space.Derivatives.Basic public import Physlib.SpaceAndTime.Space.Derivatives.MultiIndex

Iterated derivatives on Space d

i. Overview

This module defines iterated coordinate derivatives on Space d indexed by multi-indices.

The implementation is intentionally modest. A multi-index is first expanded into a canonical list of coordinate directions, and the iterated derivative is then defined by repeated application of Space.deriv along that list.

ii. Key results

    Space.iteratedDeriv : iterated coordinate derivatives on Space d.

    ∂^[I] f : notation for the iterated derivative indexed by the multi-index I.

    Space.iteratedDeriv_add, Space.iteratedDeriv_const_smul : algebraic compatibility for smooth scalar-valued functions.

    Space.iteratedDeriv_contDiff : smooth scalar-valued functions remain smooth after iterated coordinate differentiation.

    Space.tsupport_iteratedDeriv_subset : the support of an iterated spatial derivative is contained in that of the original function.

iii. Table of contents

    A. Iterated derivatives on Space d

    B. Algebraic and regularity lemmas

    C. Support lemmas

iv. References

@[expose] public section

A. Iterated derivatives on Space d

@[inherit_doc iteratedDeriv] macro "∂^[" I:term "]" : term => `(iteratedDeriv $I)private lemma iteratedDerivList_contDiff (L : List (Fin d)) {f : Space d } (hf : ContDiff f) : ContDiff (L.foldr (fun i g => deriv i g) f) := d:L:List (Fin d)f:Space d hf:ContDiff fContDiff (List.foldr (fun i g => deriv i g) f L) induction L generalizing f with d:f:Space d hf:ContDiff fContDiff (List.foldr (fun i g => deriv i g) f []) All goals completed! 🐙 d:i:Fin dL:List (Fin d)ih: {f : Space d }, ContDiff f ContDiff (List.foldr (fun i g => deriv i g) f L)f:Space d hf:ContDiff fContDiff (List.foldr (fun i g => deriv i g) f (i :: L)) All goals completed! 🐙private lemma iteratedDerivList_add (L : List (Fin d)) {f g : Space d } (hf : ContDiff f) (hg : ContDiff g) : L.foldr (fun i h => deriv i h) (f + g) = L.foldr (fun i h => deriv i h) f + L.foldr (fun i h => deriv i h) g := d:L:List (Fin d)f:Space d g:Space d hf:ContDiff fhg:ContDiff gList.foldr (fun i h => deriv i h) (f + g) L = List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g L induction L generalizing f g with d:f:Space d g:Space d hf:ContDiff fhg:ContDiff gList.foldr (fun i h => deriv i h) (f + g) [] = List.foldr (fun i h => deriv i h) f [] + List.foldr (fun i h => deriv i h) g [] All goals completed! 🐙 d:i:Fin dL:List (Fin d)ih: {f g : Space d }, ContDiff f ContDiff g List.foldr (fun i h => deriv i h) (f + g) L = List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g Lf:Space d g:Space d hf:ContDiff fhg:ContDiff gList.foldr (fun i h => deriv i h) (f + g) (i :: L) = List.foldr (fun i h => deriv i h) f (i :: L) + List.foldr (fun i h => deriv i h) g (i :: L) d:i:Fin dL:List (Fin d)ih: {f g : Space d }, ContDiff f ContDiff g List.foldr (fun i h => deriv i h) (f + g) L = List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g Lf:Space d g:Space d hf:ContDiff fhg:ContDiff gderiv i (List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g L) = deriv i (List.foldr (fun i h => deriv i h) f L) + deriv i (List.foldr (fun i h => deriv i h) g L) exact Space.deriv_add _ _ ((iteratedDerivList_contDiff L hf).differentiable (d:i:Fin dL:List (Fin d)ih: {f g : Space d }, ContDiff f ContDiff g List.foldr (fun i h => deriv i h) (f + g) L = List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g Lf:Space d g:Space d hf:ContDiff fhg:ContDiff g 0 All goals completed! 🐙)) ((iteratedDerivList_contDiff L hg).differentiable (d:i:Fin dL:List (Fin d)ih: {f g : Space d }, ContDiff f ContDiff g List.foldr (fun i h => deriv i h) (f + g) L = List.foldr (fun i h => deriv i h) f L + List.foldr (fun i h => deriv i h) g Lf:Space d g:Space d hf:ContDiff fhg:ContDiff g 0 All goals completed! 🐙))private lemma iteratedDerivList_const_smul (L : List (Fin d)) (c : ) {f : Space d } (hf : ContDiff f) : L.foldr (fun i h => deriv i h) (c f) = c L.foldr (fun i h => deriv i h) f := d:L:List (Fin d)c:f:Space d hf:ContDiff fList.foldr (fun i h => deriv i h) (c f) L = c List.foldr (fun i h => deriv i h) f L induction L generalizing f with d:c:f:Space d hf:ContDiff fList.foldr (fun i h => deriv i h) (c f) [] = c List.foldr (fun i h => deriv i h) f [] All goals completed! 🐙 d:c:i:Fin dL:List (Fin d)ih: {f : Space d }, ContDiff f List.foldr (fun i h => deriv i h) (c f) L = c List.foldr (fun i h => deriv i h) f Lf:Space d hf:ContDiff fList.foldr (fun i h => deriv i h) (c f) (i :: L) = c List.foldr (fun i h => deriv i h) f (i :: L) d:c:i:Fin dL:List (Fin d)ih: {f : Space d }, ContDiff f List.foldr (fun i h => deriv i h) (c f) L = c List.foldr (fun i h => deriv i h) f Lf:Space d hf:ContDiff fderiv i (c List.foldr (fun i h => deriv i h) f L) = c deriv i (List.foldr (fun i h => deriv i h) f L) exact Space.deriv_const_smul c ((iteratedDerivList_contDiff L hf).differentiable (d:c:i:Fin dL:List (Fin d)ih: {f : Space d }, ContDiff f List.foldr (fun i h => deriv i h) (c f) L = c List.foldr (fun i h => deriv i h) f Lf:Space d hf:ContDiff f 0 All goals completed! 🐙))@[simp] lemma iteratedDeriv_zero [AddCommGroup M] [Module M] [TopologicalSpace M] (f : Space d M) : ∂^[0] f = f := M:Typed:inst✝²:AddCommGroup Minst✝¹:Module Minst✝:TopologicalSpace Mf:Space d MiteratedDeriv 0 f = f All goals completed! 🐙@[simp] lemma iteratedDeriv_increment_zero [NeZero d] [AddCommGroup M] [Module M] [TopologicalSpace M] (I : MultiIndex d) (f : Space d M) : ∂^[MultiIndex.increment I 0] f = ∂[0] (∂^[I] f) := M:Typed:inst✝³:NeZero dinst✝²:AddCommGroup Minst✝¹:Module Minst✝:TopologicalSpace MI:MultiIndex df:Space d MiteratedDeriv (I.increment 0) f = deriv 0 (iteratedDeriv I f) M:Typeinst✝³:AddCommGroup Minst✝²:Module Minst✝¹:TopologicalSpace Mn:inst✝:NeZero n.succI:MultiIndex n.succf:Space n.succ MiteratedDeriv (I.increment 0) f = deriv 0 (iteratedDeriv I f) All goals completed! 🐙@[simp] lemma iteratedDeriv_single [AddCommGroup M] [Module M] [TopologicalSpace M] (i : Fin d) (f : Space d M) : ∂^[MultiIndex.increment 0 i] f = ∂[i] f := M:Typed:inst✝²:AddCommGroup Minst✝¹:Module Minst✝:TopologicalSpace Mi:Fin df:Space d MiteratedDeriv (MultiIndex.increment 0 i) f = deriv i f All goals completed! 🐙lemma iteratedDeriv_add (I : MultiIndex d) {f g : Space d } (hf : ContDiff f) (hg : ContDiff g) : ∂^[I] (f + g) = ∂^[I] f + ∂^[I] g := d:I:MultiIndex df:Space d g:Space d hf:ContDiff fhg:ContDiff giteratedDeriv I (f + g) = iteratedDeriv I f + iteratedDeriv I g All goals completed! 🐙lemma iteratedDeriv_const_smul (I : MultiIndex d) (c : ) {f : Space d } (hf : ContDiff f) : ∂^[I] (c f) = c ∂^[I] f := d:I:MultiIndex dc:f:Space d hf:ContDiff fiteratedDeriv I (c f) = c iteratedDeriv I f All goals completed! 🐙

Iterated spatial derivatives preserve smoothness for scalar-valued functions.

lemma iteratedDeriv_contDiff (I : MultiIndex d) {f : Space d } (hf : ContDiff f) : ContDiff (∂^[I] f) := d:I:MultiIndex df:Space d hf:ContDiff fContDiff (iteratedDeriv I f) All goals completed! 🐙

The topological support of a spatial derivative is contained in that of the original function.

lemma tsupport_deriv_subset (i : Fin d) {f : Space d } : tsupport (deriv i f) tsupport f := d:i:Fin df:Space d tsupport (deriv i f) tsupport f All goals completed! 🐙
private lemma iteratedDerivList_commute_deriv (L : List (Fin d)) (i : Fin d) {f : Space d } (hf : ContDiff f) : L.foldr (fun j g => deriv j g) (deriv i f) = deriv i (L.foldr (fun j g => deriv j g) f) := d:L:List (Fin d)i:Fin df:Space d hf:ContDiff fList.foldr (fun j g => deriv j g) (deriv i f) L = deriv i (List.foldr (fun j g => deriv j g) f L) induction L generalizing f with d:i:Fin df:Space d hf:ContDiff fList.foldr (fun j g => deriv j g) (deriv i f) [] = deriv i (List.foldr (fun j g => deriv j g) f []) All goals completed! 🐙 d:i:Fin dj:Fin dL:List (Fin d)ih: {f : Space d }, ContDiff f List.foldr (fun j g => deriv j g) (deriv i f) L = deriv i (List.foldr (fun j g => deriv j g) f L)f:Space d hf:ContDiff fList.foldr (fun j g => deriv j g) (deriv i f) (j :: L) = deriv i (List.foldr (fun j g => deriv j g) f (j :: L)) d:i:Fin dj:Fin dL:List (Fin d)ih: {f : Space d }, ContDiff f List.foldr (fun j g => deriv j g) (deriv i f) L = deriv i (List.foldr (fun j g => deriv j g) f L)f:Space d hf:ContDiff fderiv j (deriv i (List.foldr (fun j g => deriv j g) f L)) = deriv i (deriv j (List.foldr (fun j g => deriv j g) f L)) All goals completed! 🐙

An extra spatial derivative commutes with iterated spatial derivatives for smooth scalar-valued functions.

lemma deriv_iteratedDeriv_commute (i : Fin d) (I : MultiIndex d) {f : Space d } (hf : ContDiff f) : deriv i (∂^[I] f) = ∂^[I] (deriv i f) := d:i:Fin dI:MultiIndex df:Space d hf:ContDiff fderiv i (iteratedDeriv I f) = iteratedDeriv I (deriv i f) All goals completed! 🐙
private lemma tsupport_iteratedDerivList_subset (L : List (Fin d)) {f : Space d } : tsupport (L.foldr (fun i g => deriv i g) f) tsupport f := d:L:List (Fin d)f:Space d tsupport (List.foldr (fun i g => deriv i g) f L) tsupport f induction L generalizing f with d:f:Space d tsupport (List.foldr (fun i g => deriv i g) f []) tsupport f All goals completed! 🐙 d:i:Fin dL:List (Fin d)ih: {f : Space d }, tsupport (List.foldr (fun i g => deriv i g) f L) tsupport ff:Space d tsupport (List.foldr (fun i g => deriv i g) f (i :: L)) tsupport f All goals completed! 🐙

The topological support of an iterated spatial derivative is contained in that of the original function.

lemma tsupport_iteratedDeriv_subset (I : MultiIndex d) {f : Space d } : tsupport (∂^[I] f) tsupport f := d:I:MultiIndex df:Space d tsupport (iteratedDeriv I f) tsupport f All goals completed! 🐙

An iterated spatial derivative vanishes outside the topological support of the original function.

lemma iteratedDeriv_eq_zero_of_notMem_tsupport (I : MultiIndex d) {f : Space d } {x : Space d} (hx : x tsupport f) : ∂^[I] f x = 0 := image_eq_zero_of_notMem_tsupport fun h => hx (tsupport_iteratedDeriv_subset I h)