From b558daec92c06ed60c3de92f469eae4fd01fde47 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 11 Mar 2026 09:30:16 +0000 Subject: [PATCH 01/14] feat: mfderiv for Space --- PhysLean/SpaceAndTime/Space/Basic.lean | 31 +++++++ .../SpaceAndTime/Space/Derivatives/Basic.lean | 35 ++++++++ PhysLean/SpaceAndTime/Space/Module.lean | 90 ++++++++++++++++++- 3 files changed, 155 insertions(+), 1 deletion(-) diff --git a/PhysLean/SpaceAndTime/Space/Basic.lean b/PhysLean/SpaceAndTime/Space/Basic.lean index a5cf96d16..6995881b6 100644 --- a/PhysLean/SpaceAndTime/Space/Basic.lean +++ b/PhysLean/SpaceAndTime/Space/Basic.lean @@ -12,6 +12,7 @@ public import Mathlib.Topology.ContinuousMap.CompactlySupported public import Mathlib.Geometry.Manifold.IsManifold.Basic public import Mathlib.MeasureTheory.Measure.Lebesgue.VolumeOfBalls public import Mathlib.Analysis.InnerProductSpace.Calculus +public import Mathlib.Geometry.Manifold.Diffeomorph /-! # Space @@ -288,4 +289,34 @@ noncomputable def manifoldStructure (d : ℕ) : simp only [Equiv.coe_vaddConst] fun_prop +@[simp] +lemma manifoldStructure_comp_manifoldStructure_symm {d : ℕ} : + (↑(manifoldStructure d) ∘ ↑(manifoldStructure d).symm) = id := by + ext1 x + simpa using (manifoldStructure d).right_inv' (x := x) (by simp [manifoldStructure]) + +@[simp] +lemma range_manifoldStructure {d : ℕ} : + (Set.range ↑(manifoldStructure d)) = Set.univ := by + ext x + simp + use (manifoldStructure d).symm x + change (↑(manifoldStructure d) ∘ ↑(manifoldStructure d).symm) x = x + rw [manifoldStructure_comp_manifoldStructure_symm] + simp + + +open Manifold in +lemma contMDiff_vaddConst (d : ℕ) : ContMDiff + (manifoldStructure d) (𝓘(ℝ, EuclideanSpace ℝ (Fin d))) ⊤ (manifoldStructure d).toFun := by + rw [contMDiff_iff] + refine ⟨(manifoldStructure d).continuous_toFun, fun x y ↦ ?_⟩ + simp only [extChartAt, OpenPartialHomeomorph.extend, OpenPartialHomeomorph.refl_partialEquiv, + PartialEquiv.refl_source, OpenPartialHomeomorph.singletonChartedSpace_chartAt_eq, + modelWithCornersSelf_partialEquiv, PartialEquiv.trans_refl, PartialEquiv.refl_coe, + ModelWithCorners.toPartialEquiv_coe, PartialEquiv.refl_trans, + ModelWithCorners.toPartialEquiv_coe_symm, manifoldStructure_comp_manifoldStructure_symm, + CompTriple.comp_eq, ModelWithCorners.target_eq, Set.preimage_univ, Set.inter_univ] + exact contDiffOn_id + end Space diff --git a/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean b/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean index 4d0efb353..82fad86d3 100644 --- a/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean +++ b/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean @@ -100,6 +100,41 @@ lemma deriv_eq_mfderiv {M d} [NormedAddCommGroup M] [NormedSpace ℝ M] rw [deriv_eq_fderiv_basis, ← mfderiv_eq_fderiv] rfl +open Manifold in +/-- The spatial-derivative in terms of the derivative of functions between + manifolds with the manifold structure `Space.manifoldStructure d`. + This should eventually be used as the definition of `deriv`. -/ +lemma deriv_eq_mfderiv_manifoldStructure {M d} [NormedAddCommGroup M] [NormedSpace ℝ M] + (μ : Fin d) (f : Space d → M) (hf : Differentiable ℝ f) (x : Space d) : + deriv μ f x = mfderiv (Space.manifoldStructure d) 𝓘(ℝ, M) f x (EuclideanSpace.single μ 1) := by + rw [deriv_eq_mfderiv] + change _ = mfderiv (Space.manifoldStructure d) 𝓘(ℝ, M) + (f ∘ modelDiffeo) x (EuclideanSpace.single μ 1) + rw [mfderiv_comp (I' := 𝓘(ℝ, Space d))] + rotate_left + · exact hf.mdifferentiable.mdifferentiableAt + · exact MDifferentiable.mdifferentiableAt <| + Diffeomorph.mdifferentiable modelDiffeo WithTop.top_ne_zero + simp only [Function.comp_apply, modelDiffeo_apply, mfderiv_eq_fderiv, + ContinuousLinearMap.coe_comp'] + congr 1 + simp [mfderiv] + rw [if_pos] + rotate_left + · exact MDifferentiable.mdifferentiableAt <| + Diffeomorph.mdifferentiable modelDiffeo WithTop.top_ne_zero + change _ = (fderiv ℝ (↑(manifoldStructure d).symm) ((manifoldStructure d) x)) + (EuclideanSpace.single μ 1) + simp [manifoldStructure] + ext i + rw [fderiv_space_components _ _ (by fun_prop)] + simp only [vadd_apply, fderiv_add_const] + change _ = (fderiv ℝ (EuclideanSpace.proj i) (x -ᵥ Classical.choice _)) + (EuclideanSpace.single μ 1) + simp [basis_apply] + congr 1 + exact Eq.propIntro (fun a => id (Eq.symm a)) fun a => id (Eq.symm a) + /-! ### A.2. Derivative of the constant function diff --git a/PhysLean/SpaceAndTime/Space/Module.lean b/PhysLean/SpaceAndTime/Space/Module.lean index 545b568d0..5f007a73b 100644 --- a/PhysLean/SpaceAndTime/Space/Module.lean +++ b/PhysLean/SpaceAndTime/Space/Module.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import PhysLean.SpaceAndTime.Space.Basic +public import Mathlib.Geometry.Manifold.Diffeomorph /-! # The structure of a module on Space @@ -474,6 +475,12 @@ def equivPi (d : ℕ) : invFun := fun f => ⟨f⟩ } +/-! + +## Basic differentiablity conditions + +-/ + @[fun_prop] lemma mk_continuous {d : ℕ} : Continuous (fun (f : Fin d → ℝ) => (⟨f⟩ : Space d)) := (equivPi d).symm.continuous @@ -483,7 +490,7 @@ lemma mk_differentiable {d : ℕ} : Differentiable ℝ (fun (f : Fin d → ℝ) => (⟨f⟩ : Space d)) := (equivPi d).symm.differentiable @[fun_prop] -lemma mk_contDiff {d n : ℕ} : +lemma mk_contDiff {d : ℕ} {n : WithTop ℕ∞}: ContDiff ℝ n (fun (f : Fin d → ℝ) => (⟨f⟩ : Space d)) := (equivPi d).symm.contDiff @[simp] @@ -498,6 +505,50 @@ lemma fderiv_val {d : ℕ} (p : Space d) : change fderiv ℝ (equivPi d) p = _ rw [@ContinuousLinearEquiv.fderiv] +@[fun_prop] +lemma contDiffOn_vadd (s : Space d) : + ContDiffOn ℝ ω (fun (v : EuclideanSpace ℝ (Fin d)) => v +ᵥ s) Set.univ := by + rw [contDiffOn_univ] + refine fun_comp ?_ ?_ + · exact mk_contDiff (n := ω) + · fun_prop + +@[fun_prop] +lemma vadd_differentiable {d} (s : Space d) : + Differentiable ℝ (fun (v : EuclideanSpace ℝ (Fin d)) => v +ᵥ s) := by + apply Differentiable.comp + · exact mk_differentiable + · fun_prop + +@[fun_prop] +lemma contDiffOn_vsub (s1 : Space d) : + ContDiffOn ℝ ω (fun (s : Space d) => s -ᵥ s1) Set.univ := by + rw [contDiffOn_univ] + refine fun_comp ?_ ?_ + · fun_prop + · fun_prop + +@[fun_prop] +lemma vsub_differentiable {d} (s1 : Space d) : + Differentiable ℝ (fun (s : Space d) => s -ᵥ s1) := by + apply Differentiable.comp + · exact PiLp.contDiff_toLp.differentiable (NeZero.ne' 2).symm + · fun_prop + +lemma fderiv_space_components {M d} [NormedAddCommGroup M] [NormedSpace ℝ M] + (μ : Fin d) (f : M → Space d) (hf : Differentiable ℝ f) (m dm : M): + fderiv ℝ f m dm μ = fderiv ℝ (fun m' => f m' μ) m dm := by + trans fderiv ℝ (Space.coordCLM μ ∘ fun m' => f m') m dm + swap + · congr + ext i + simp [coordCLM, coord_apply] + rw [fderiv_comp] + simp + simp [coordCLM, coord_apply] + · fun_prop + · fun_prop + /-! ## Directions @@ -604,4 +655,41 @@ lemma oneEquiv_measurePreserving : MeasurePreserving oneEquiv volume volume := lemma oneEquiv_symm_measurePreserving : MeasurePreserving oneEquiv.symm volume volume := by exact LinearIsometryEquiv.measurePreserving oneEquiv.symm +/-! + +## Relation to tangent space + +-/ + + + + +open Manifold in +/-- A diffeomorphism between the two different manifold sturctures on `Space d`, + that equivalent to `manifoldStructure d` and that equivalent to `𝓘(ℝ, Space d)` -/ +noncomputable def modelDiffeo {d} : + Diffeomorph (manifoldStructure d) 𝓘(ℝ, Space d) (Space d) (Space d) ⊤ where + toFun p := p + invFun p := p + left_inv := fun _ => rfl + right_inv := fun _ => rfl + contMDiff_toFun := by + rw [contMDiff_iff] + refine ⟨?_, ?_⟩ + · simpa using continuous_id' + intro x y + simp [manifoldStructure] + fun_prop + contMDiff_invFun := by + rw [contMDiff_iff] + refine ⟨?_, ?_⟩ + · simpa using continuous_id' + intro x y + simp [manifoldStructure] + fun_prop + +@[simp] +lemma modelDiffeo_apply (p : Space d) : + modelDiffeo p = p := rfl + end Space From dccdb0ec7cba3aa2aba659151f55a6cb1b1cff1b Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 11 Mar 2026 11:27:48 +0000 Subject: [PATCH 02/14] refactor: Lint --- PhysLean/SpaceAndTime/Space/Basic.lean | 13 ++++--- PhysLean/SpaceAndTime/Space/Module.lean | 51 ++++++++----------------- 2 files changed, 23 insertions(+), 41 deletions(-) diff --git a/PhysLean/SpaceAndTime/Space/Basic.lean b/PhysLean/SpaceAndTime/Space/Basic.lean index 6995881b6..e38317e2c 100644 --- a/PhysLean/SpaceAndTime/Space/Basic.lean +++ b/PhysLean/SpaceAndTime/Space/Basic.lean @@ -295,16 +295,17 @@ lemma manifoldStructure_comp_manifoldStructure_symm {d : ℕ} : ext1 x simpa using (manifoldStructure d).right_inv' (x := x) (by simp [manifoldStructure]) +@[simp] +lemma manifoldStructure_comp_manifoldStructure_symm_apply {d : ℕ} + (x : EuclideanSpace ℝ (Fin d)) : + (manifoldStructure d) ((manifoldStructure d).symm x) = x := by + simpa using (manifoldStructure d).right_inv' (x := x) (by simp [manifoldStructure]) + @[simp] lemma range_manifoldStructure {d : ℕ} : (Set.range ↑(manifoldStructure d)) = Set.univ := by ext x - simp - use (manifoldStructure d).symm x - change (↑(manifoldStructure d) ∘ ↑(manifoldStructure d).symm) x = x - rw [manifoldStructure_comp_manifoldStructure_symm] - simp - + simpa using ⟨(manifoldStructure d).symm x, manifoldStructure_comp_manifoldStructure_symm_apply x⟩ open Manifold in lemma contMDiff_vaddConst (d : ℕ) : ContMDiff diff --git a/PhysLean/SpaceAndTime/Space/Module.lean b/PhysLean/SpaceAndTime/Space/Module.lean index 5f007a73b..da5dad788 100644 --- a/PhysLean/SpaceAndTime/Space/Module.lean +++ b/PhysLean/SpaceAndTime/Space/Module.lean @@ -497,13 +497,13 @@ lemma mk_contDiff {d : ℕ} {n : WithTop ℕ∞}: lemma fderiv_mk {d : ℕ} (f : Fin d → ℝ) : fderiv ℝ Space.mk f = (equivPi d).symm := by change fderiv ℝ (equivPi d).symm f = _ - rw [@ContinuousLinearEquiv.fderiv] + rw [ContinuousLinearEquiv.fderiv] @[simp] lemma fderiv_val {d : ℕ} (p : Space d) : fderiv ℝ Space.val p = (equivPi d) := by change fderiv ℝ (equivPi d) p = _ - rw [@ContinuousLinearEquiv.fderiv] + rw [ContinuousLinearEquiv.fderiv] @[fun_prop] lemma contDiffOn_vadd (s : Space d) : @@ -515,39 +515,29 @@ lemma contDiffOn_vadd (s : Space d) : @[fun_prop] lemma vadd_differentiable {d} (s : Space d) : - Differentiable ℝ (fun (v : EuclideanSpace ℝ (Fin d)) => v +ᵥ s) := by - apply Differentiable.comp - · exact mk_differentiable - · fun_prop + Differentiable ℝ (fun (v : EuclideanSpace ℝ (Fin d)) => v +ᵥ s) := + mk_differentiable.comp <| by fun_prop @[fun_prop] lemma contDiffOn_vsub (s1 : Space d) : - ContDiffOn ℝ ω (fun (s : Space d) => s -ᵥ s1) Set.univ := by - rw [contDiffOn_univ] - refine fun_comp ?_ ?_ - · fun_prop - · fun_prop + ContDiffOn ℝ ω (fun (s : Space d) => s -ᵥ s1) Set.univ := + contDiffOn_univ.mpr <| fun_comp (PiLp.contDiff_toLp) (by fun_prop) @[fun_prop] lemma vsub_differentiable {d} (s1 : Space d) : - Differentiable ℝ (fun (s : Space d) => s -ᵥ s1) := by - apply Differentiable.comp - · exact PiLp.contDiff_toLp.differentiable (NeZero.ne' 2).symm - · fun_prop + Differentiable ℝ (fun (s : Space d) => s -ᵥ s1) := + (PiLp.contDiff_toLp.differentiable (NeZero.ne' 2).symm).comp (by fun_prop) lemma fderiv_space_components {M d} [NormedAddCommGroup M] [NormedSpace ℝ M] (μ : Fin d) (f : M → Space d) (hf : Differentiable ℝ f) (m dm : M): fderiv ℝ f m dm μ = fderiv ℝ (fun m' => f m' μ) m dm := by trans fderiv ℝ (Space.coordCLM μ ∘ fun m' => f m') m dm - swap + · rw [fderiv_comp _ (by fun_prop) (by fun_prop), ContinuousLinearMap.fderiv, + ContinuousLinearMap.coe_comp', Function.comp_apply] + simp [coordCLM, coord_apply] · congr ext i simp [coordCLM, coord_apply] - rw [fderiv_comp] - simp - simp [coordCLM, coord_apply] - · fun_prop - · fun_prop /-! @@ -661,30 +651,21 @@ lemma oneEquiv_symm_measurePreserving : MeasurePreserving oneEquiv.symm volume v -/ - - - open Manifold in -/-- A diffeomorphism between the two different manifold sturctures on `Space d`, +/-- A diffeomorphism between the two different manifold structures on `Space d`, that equivalent to `manifoldStructure d` and that equivalent to `𝓘(ℝ, Space d)` -/ noncomputable def modelDiffeo {d} : Diffeomorph (manifoldStructure d) 𝓘(ℝ, Space d) (Space d) (Space d) ⊤ where toFun p := p invFun p := p - left_inv := fun _ => rfl - right_inv := fun _ => rfl + left_inv _ := rfl + right_inv _ := rfl contMDiff_toFun := by - rw [contMDiff_iff] - refine ⟨?_, ?_⟩ - · simpa using continuous_id' - intro x y + refine contMDiff_iff.mpr ⟨continuous_id', fun x y => ?_⟩ simp [manifoldStructure] fun_prop contMDiff_invFun := by - rw [contMDiff_iff] - refine ⟨?_, ?_⟩ - · simpa using continuous_id' - intro x y + refine contMDiff_iff.mpr ⟨continuous_id', fun x y => ?_⟩ simp [manifoldStructure] fun_prop From ebef7d634ca78ee5ad34cb3b64332aacf94ceb39 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 11 Mar 2026 11:40:44 +0000 Subject: [PATCH 03/14] refactor: Lint --- .../SpaceAndTime/Space/Derivatives/Basic.lean | 26 +++---------------- PhysLean/SpaceAndTime/Space/Module.lean | 19 ++++++++++++++ 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean b/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean index 82fad86d3..550c5e80e 100644 --- a/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean +++ b/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean @@ -110,30 +110,12 @@ lemma deriv_eq_mfderiv_manifoldStructure {M d} [NormedAddCommGroup M] [NormedSpa rw [deriv_eq_mfderiv] change _ = mfderiv (Space.manifoldStructure d) 𝓘(ℝ, M) (f ∘ modelDiffeo) x (EuclideanSpace.single μ 1) - rw [mfderiv_comp (I' := 𝓘(ℝ, Space d))] - rotate_left - · exact hf.mdifferentiable.mdifferentiableAt - · exact MDifferentiable.mdifferentiableAt <| - Diffeomorph.mdifferentiable modelDiffeo WithTop.top_ne_zero + rw [mfderiv_comp (I' := 𝓘(ℝ, Space d)) _ hf.mdifferentiable.mdifferentiableAt + (modelDiffeo.mdifferentiable WithTop.top_ne_zero).mdifferentiableAt] simp only [Function.comp_apply, modelDiffeo_apply, mfderiv_eq_fderiv, ContinuousLinearMap.coe_comp'] - congr 1 - simp [mfderiv] - rw [if_pos] - rotate_left - · exact MDifferentiable.mdifferentiableAt <| - Diffeomorph.mdifferentiable modelDiffeo WithTop.top_ne_zero - change _ = (fderiv ℝ (↑(manifoldStructure d).symm) ((manifoldStructure d) x)) - (EuclideanSpace.single μ 1) - simp [manifoldStructure] - ext i - rw [fderiv_space_components _ _ (by fun_prop)] - simp only [vadd_apply, fderiv_add_const] - change _ = (fderiv ℝ (EuclideanSpace.proj i) (x -ᵥ Classical.choice _)) - (EuclideanSpace.single μ 1) - simp [basis_apply] - congr 1 - exact Eq.propIntro (fun a => id (Eq.symm a)) fun a => id (Eq.symm a) + rw [basis_eq_mfderiv_modelDiffeo_single] + rfl /-! diff --git a/PhysLean/SpaceAndTime/Space/Module.lean b/PhysLean/SpaceAndTime/Space/Module.lean index da5dad788..ce59fa66b 100644 --- a/PhysLean/SpaceAndTime/Space/Module.lean +++ b/PhysLean/SpaceAndTime/Space/Module.lean @@ -673,4 +673,23 @@ noncomputable def modelDiffeo {d} : lemma modelDiffeo_apply (p : Space d) : modelDiffeo p = p := rfl +open Manifold in +@[simp] +lemma basis_eq_mfderiv_modelDiffeo_single (d : ℕ) (μ : Fin d) (x : Space d) : + basis μ = mfderiv (manifoldStructure d) 𝓘(ℝ, Space d) (modelDiffeo (d := d)) x + (EuclideanSpace.single μ 1) := by + simp [mfderiv] + rw [if_pos (modelDiffeo.mdifferentiable (WithTop.top_ne_zero)).mdifferentiableAt] + change _ = fderiv ℝ (↑(manifoldStructure d).symm) ((manifoldStructure d) x) + (EuclideanSpace.single μ 1) + simp [manifoldStructure] + ext i + rw [fderiv_space_components _ _ (by fun_prop)] + simp only [vadd_apply, fderiv_add_const] + change _ = (fderiv ℝ (EuclideanSpace.proj i) (x -ᵥ Classical.choice _)) + (EuclideanSpace.single μ 1) + simp [basis_apply] + congr 1 + exact Eq.propIntro (fun a => Eq.symm a) fun a => (Eq.symm a) + end Space From 116184b0f15ec12ad9ac4c088bb737b0cdf978e7 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 11 Mar 2026 11:45:27 +0000 Subject: [PATCH 04/14] refactor: LInt --- PhysLean/SpaceAndTime/Space/Module.lean | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/PhysLean/SpaceAndTime/Space/Module.lean b/PhysLean/SpaceAndTime/Space/Module.lean index ce59fa66b..b4eb03656 100644 --- a/PhysLean/SpaceAndTime/Space/Module.lean +++ b/PhysLean/SpaceAndTime/Space/Module.lean @@ -674,10 +674,13 @@ lemma modelDiffeo_apply (p : Space d) : modelDiffeo p = p := rfl open Manifold in +/-- The derivative of `modelDiffeo` provides an equivalence between + `Space d` and `EuclideanSpace ℝ (Fin d)`. This equivalences takes the basis + of `EuclideanSpace ℝ (Fin d)` to the basis of `Space d`, and vice versa. -/ @[simp] lemma basis_eq_mfderiv_modelDiffeo_single (d : ℕ) (μ : Fin d) (x : Space d) : - basis μ = mfderiv (manifoldStructure d) 𝓘(ℝ, Space d) (modelDiffeo (d := d)) x - (EuclideanSpace.single μ 1) := by + basis μ = mfderiv (manifoldStructure d) 𝓘(ℝ, Space d) (modelDiffeo (d := d)) x + (EuclideanSpace.single μ 1) := by simp [mfderiv] rw [if_pos (modelDiffeo.mdifferentiable (WithTop.top_ne_zero)).mdifferentiableAt] change _ = fderiv ℝ (↑(manifoldStructure d).symm) ((manifoldStructure d) x) From 1e601835aa56987dd29f3f39dab4ce7a5ddacff1 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 11 Mar 2026 11:47:11 +0000 Subject: [PATCH 05/14] refactor: Golf --- PhysLean/SpaceAndTime/Space/Module.lean | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PhysLean/SpaceAndTime/Space/Module.lean b/PhysLean/SpaceAndTime/Space/Module.lean index b4eb03656..d9804e2c4 100644 --- a/PhysLean/SpaceAndTime/Space/Module.lean +++ b/PhysLean/SpaceAndTime/Space/Module.lean @@ -683,8 +683,7 @@ lemma basis_eq_mfderiv_modelDiffeo_single (d : ℕ) (μ : Fin d) (x : Space d) : (EuclideanSpace.single μ 1) := by simp [mfderiv] rw [if_pos (modelDiffeo.mdifferentiable (WithTop.top_ne_zero)).mdifferentiableAt] - change _ = fderiv ℝ (↑(manifoldStructure d).symm) ((manifoldStructure d) x) - (EuclideanSpace.single μ 1) + change _ = fderiv ℝ (manifoldStructure d).symm (manifoldStructure d x) (EuclideanSpace.single μ 1) simp [manifoldStructure] ext i rw [fderiv_space_components _ _ (by fun_prop)] From d34d53afef4550e9dd054c43e85b2b20c7c293f0 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 11 Mar 2026 12:07:38 +0000 Subject: [PATCH 06/14] refactor: Lint --- PhysLean/SpaceAndTime/Space/Module.lean | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PhysLean/SpaceAndTime/Space/Module.lean b/PhysLean/SpaceAndTime/Space/Module.lean index d9804e2c4..d96d832bb 100644 --- a/PhysLean/SpaceAndTime/Space/Module.lean +++ b/PhysLean/SpaceAndTime/Space/Module.lean @@ -671,7 +671,7 @@ noncomputable def modelDiffeo {d} : @[simp] lemma modelDiffeo_apply (p : Space d) : - modelDiffeo p = p := rfl + modelDiffeo p = p := rfl open Manifold in /-- The derivative of `modelDiffeo` provides an equivalence between @@ -688,8 +688,7 @@ lemma basis_eq_mfderiv_modelDiffeo_single (d : ℕ) (μ : Fin d) (x : Space d) : ext i rw [fderiv_space_components _ _ (by fun_prop)] simp only [vadd_apply, fderiv_add_const] - change _ = (fderiv ℝ (EuclideanSpace.proj i) (x -ᵥ Classical.choice _)) - (EuclideanSpace.single μ 1) + change _ = fderiv ℝ (EuclideanSpace.proj i) (x -ᵥ Classical.choice _) (EuclideanSpace.single μ 1) simp [basis_apply] congr 1 exact Eq.propIntro (fun a => Eq.symm a) fun a => (Eq.symm a) From 5a1a20f6e371c5d74026dc4911a81572dddeb23c Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 11 Mar 2026 12:08:29 +0000 Subject: [PATCH 07/14] refactor: Remove simp --- PhysLean/SpaceAndTime/Space/Module.lean | 1 - 1 file changed, 1 deletion(-) diff --git a/PhysLean/SpaceAndTime/Space/Module.lean b/PhysLean/SpaceAndTime/Space/Module.lean index d96d832bb..c85ee92f5 100644 --- a/PhysLean/SpaceAndTime/Space/Module.lean +++ b/PhysLean/SpaceAndTime/Space/Module.lean @@ -677,7 +677,6 @@ open Manifold in /-- The derivative of `modelDiffeo` provides an equivalence between `Space d` and `EuclideanSpace ℝ (Fin d)`. This equivalences takes the basis of `EuclideanSpace ℝ (Fin d)` to the basis of `Space d`, and vice versa. -/ -@[simp] lemma basis_eq_mfderiv_modelDiffeo_single (d : ℕ) (μ : Fin d) (x : Space d) : basis μ = mfderiv (manifoldStructure d) 𝓘(ℝ, Space d) (modelDiffeo (d := d)) x (EuclideanSpace.single μ 1) := by From 08c5f586abda52ec933bbd00bd5547fc1c451b53 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 11 Mar 2026 15:43:14 +0000 Subject: [PATCH 08/14] refactor: Lint --- PhysLean/SpaceAndTime/Space/Basic.lean | 1 - PhysLean/SpaceAndTime/Space/Module.lean | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/PhysLean/SpaceAndTime/Space/Basic.lean b/PhysLean/SpaceAndTime/Space/Basic.lean index e38317e2c..8cd12f8b6 100644 --- a/PhysLean/SpaceAndTime/Space/Basic.lean +++ b/PhysLean/SpaceAndTime/Space/Basic.lean @@ -295,7 +295,6 @@ lemma manifoldStructure_comp_manifoldStructure_symm {d : ℕ} : ext1 x simpa using (manifoldStructure d).right_inv' (x := x) (by simp [manifoldStructure]) -@[simp] lemma manifoldStructure_comp_manifoldStructure_symm_apply {d : ℕ} (x : EuclideanSpace ℝ (Fin d)) : (manifoldStructure d) ((manifoldStructure d).symm x) = x := by diff --git a/PhysLean/SpaceAndTime/Space/Module.lean b/PhysLean/SpaceAndTime/Space/Module.lean index c85ee92f5..49a99665c 100644 --- a/PhysLean/SpaceAndTime/Space/Module.lean +++ b/PhysLean/SpaceAndTime/Space/Module.lean @@ -671,15 +671,15 @@ noncomputable def modelDiffeo {d} : @[simp] lemma modelDiffeo_apply (p : Space d) : - modelDiffeo p = p := rfl + modelDiffeo p = p := rfl open Manifold in /-- The derivative of `modelDiffeo` provides an equivalence between `Space d` and `EuclideanSpace ℝ (Fin d)`. This equivalences takes the basis of `EuclideanSpace ℝ (Fin d)` to the basis of `Space d`, and vice versa. -/ lemma basis_eq_mfderiv_modelDiffeo_single (d : ℕ) (μ : Fin d) (x : Space d) : - basis μ = mfderiv (manifoldStructure d) 𝓘(ℝ, Space d) (modelDiffeo (d := d)) x - (EuclideanSpace.single μ 1) := by + basis μ = mfderiv (manifoldStructure d) 𝓘(ℝ, Space d) (modelDiffeo (d := d)) x + (EuclideanSpace.single μ 1) := by simp [mfderiv] rw [if_pos (modelDiffeo.mdifferentiable (WithTop.top_ne_zero)).mdifferentiableAt] change _ = fderiv ℝ (manifoldStructure d).symm (manifoldStructure d x) (EuclideanSpace.single μ 1) From d54087c018a2dacb7acf5b3f0561857a5c317f04 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 12 Mar 2026 10:55:04 +0000 Subject: [PATCH 09/14] feat: Small generalization --- .../SpaceAndTime/Space/Derivatives/Basic.lean | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean b/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean index 550c5e80e..10cc1ac1b 100644 --- a/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean +++ b/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean @@ -100,22 +100,39 @@ lemma deriv_eq_mfderiv {M d} [NormedAddCommGroup M] [NormedSpace ℝ M] rw [deriv_eq_fderiv_basis, ← mfderiv_eq_fderiv] rfl +open Manifold in +lemma mdifferentiable_manifoldStructure_iff_differentiable {M d} [NormedAddCommGroup M] + [NormedSpace ℝ M] {f : Space d → M} {x : Space d} : + MDifferentiableAt (Space.manifoldStructure d) 𝓘(ℝ, M) f x ↔ DifferentiableAt ℝ f x := by + constructor + · intro h + rw [← mdifferentiableAt_iff_differentiableAt] + apply h.comp (I' := Space.manifoldStructure d) + exact (modelDiffeo.symm.mdifferentiable (WithTop.top_ne_zero)).mdifferentiableAt + · intro h + apply (mdifferentiableAt_iff_differentiableAt.mpr h).comp (I' := 𝓘(ℝ, Space d)) + exact (modelDiffeo.mdifferentiable (WithTop.top_ne_zero)).mdifferentiableAt + open Manifold in /-- The spatial-derivative in terms of the derivative of functions between manifolds with the manifold structure `Space.manifoldStructure d`. This should eventually be used as the definition of `deriv`. -/ lemma deriv_eq_mfderiv_manifoldStructure {M d} [NormedAddCommGroup M] [NormedSpace ℝ M] - (μ : Fin d) (f : Space d → M) (hf : Differentiable ℝ f) (x : Space d) : + (μ : Fin d) (f : Space d → M) (x : Space d) : deriv μ f x = mfderiv (Space.manifoldStructure d) 𝓘(ℝ, M) f x (EuclideanSpace.single μ 1) := by - rw [deriv_eq_mfderiv] - change _ = mfderiv (Space.manifoldStructure d) 𝓘(ℝ, M) - (f ∘ modelDiffeo) x (EuclideanSpace.single μ 1) - rw [mfderiv_comp (I' := 𝓘(ℝ, Space d)) _ hf.mdifferentiable.mdifferentiableAt - (modelDiffeo.mdifferentiable WithTop.top_ne_zero).mdifferentiableAt] - simp only [Function.comp_apply, modelDiffeo_apply, mfderiv_eq_fderiv, - ContinuousLinearMap.coe_comp'] - rw [basis_eq_mfderiv_modelDiffeo_single] - rfl + by_cases hf : DifferentiableAt ℝ f x + · rw [deriv_eq_mfderiv] + change _ = mfderiv (Space.manifoldStructure d) 𝓘(ℝ, M) + (f ∘ modelDiffeo) x (EuclideanSpace.single μ 1) + rw [mfderiv_comp (I' := 𝓘(ℝ, Space d)) _ hf.mdifferentiableAt + (modelDiffeo.mdifferentiable WithTop.top_ne_zero).mdifferentiableAt] + simp only [Function.comp_apply, modelDiffeo_apply, mfderiv_eq_fderiv, + ContinuousLinearMap.coe_comp'] + rw [basis_eq_mfderiv_modelDiffeo_single] + rfl + · rw [deriv_eq, fderiv_zero_of_not_differentiableAt hf, + mfderiv_zero_of_not_mdifferentiableAt <| mdifferentiable_iff_differentiable.mp.mt hf] + simp /-! From 4ba57c73f8fdb539a4f89c5864e13a98c5d35bea Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:24:33 +0000 Subject: [PATCH 10/14] fix: build --- PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean b/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean index 10cc1ac1b..76d571331 100644 --- a/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean +++ b/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean @@ -131,7 +131,8 @@ lemma deriv_eq_mfderiv_manifoldStructure {M d} [NormedAddCommGroup M] [NormedSpa rw [basis_eq_mfderiv_modelDiffeo_single] rfl · rw [deriv_eq, fderiv_zero_of_not_differentiableAt hf, - mfderiv_zero_of_not_mdifferentiableAt <| mdifferentiable_iff_differentiable.mp.mt hf] + mfderiv_zero_of_not_mdifferentiableAt <| + mdifferentiable_manifoldStructure_iff_differentiable.mp.mt hf] simp /-! From 643cad9152787ac3fcf97eaf7d101c91980d5943 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 16 Mar 2026 11:44:19 +0000 Subject: [PATCH 11/14] feat: Properties of vadd --- PhysLean/SpaceAndTime/Space/Module.lean | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/PhysLean/SpaceAndTime/Space/Module.lean b/PhysLean/SpaceAndTime/Space/Module.lean index 49a99665c..f1457792e 100644 --- a/PhysLean/SpaceAndTime/Space/Module.lean +++ b/PhysLean/SpaceAndTime/Space/Module.lean @@ -7,6 +7,7 @@ module public import PhysLean.SpaceAndTime.Space.Basic public import Mathlib.Geometry.Manifold.Diffeomorph +public import Mathlib.Analysis.Distribution.TemperateGrowth /-! # The structure of a module on Space @@ -692,4 +693,57 @@ lemma basis_eq_mfderiv_modelDiffeo_single (d : ℕ) (μ : Fin d) (x : Space d) : congr 1 exact Eq.propIntro (fun a => Eq.symm a) fun a => (Eq.symm a) + +/-! + +## Properties of vadd with module structure + +-/ + +lemma norm_vadd_le_add {d} (v : EuclideanSpace ℝ (Fin d)) (s : Space d) : + ‖v +ᵥ s‖ ≤ ‖v‖ + ‖s‖ := by + trans ‖s - (-v +ᵥ (0 : Space d))‖ + · apply le_of_eq + congr + ext i + simp only [vadd_apply, sub_apply, PiLp.neg_apply, zero_apply, add_zero, sub_neg_eq_add] + ring + · apply (norm_sub_le _ _).trans <| le_of_eq _ + simp only [norm_vadd_zero, norm_neg] + ring + +@[fun_prop] +lemma differentiable_vadd {d} (v : EuclideanSpace ℝ (Fin d)) : + Differentiable ℝ (fun (s : Space d) => v +ᵥ s) := + mk_differentiable.comp <| by fun_prop + +@[simp] +lemma fderiv_vadd {d} (v : EuclideanSpace ℝ (Fin d)) : + fderiv ℝ (fun s => v +ᵥ s) = fun (_ : Space d) => ContinuousLinearMap.id ℝ _ := by + ext s ds i + change fderiv ℝ (fun s => v +ᵥ s) s ds i = _ + rw [fderiv_space_components] + simp + trans fderiv ℝ (coordCLM i) s ds + · congr + ext j + simp [coordCLM, coord_apply] + · rw [ContinuousLinearMap.fderiv] + simp [coordCLM, coord_apply] + · fun_prop + +@[fun_prop] +lemma vadd_hasTemperateGrowth {d} (v : EuclideanSpace ℝ (Fin d)) : + Function.HasTemperateGrowth (fun s : Space d => v +ᵥ s) := by + apply Function.HasTemperateGrowth.of_fderiv (k := 1) (C := 1 + ‖v‖) + · rw [fderiv_vadd] + simp + · fun_prop + · intro x + simp + apply (norm_vadd_le_add _ _).trans + have : 0 ≤ ‖v‖ := by positivity + have : 0 ≤ ‖x‖ := by positivity + nlinarith + end Space From f804baa1448002e19525d6d6ee3ac09a00c6d982 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 19 Mar 2026 08:21:22 +0000 Subject: [PATCH 12/14] Update Basic.lean --- PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean b/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean index 76d571331..d35e44a98 100644 --- a/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean +++ b/PhysLean/SpaceAndTime/Space/Derivatives/Basic.lean @@ -113,10 +113,14 @@ lemma mdifferentiable_manifoldStructure_iff_differentiable {M d} [NormedAddCommG apply (mdifferentiableAt_iff_differentiableAt.mpr h).comp (I' := 𝓘(ℝ, Space d)) exact (modelDiffeo.mdifferentiable (WithTop.top_ne_zero)).mdifferentiableAt + +TODO "3XMN6" "Make the version of the derivative described through + `deriv_eq_mfderiv_manifoldStructure` the definition of `deriv` and prove the + equivalence with the current definition, under suitable conditions." + open Manifold in /-- The spatial-derivative in terms of the derivative of functions between - manifolds with the manifold structure `Space.manifoldStructure d`. - This should eventually be used as the definition of `deriv`. -/ + manifolds with the manifold structure `Space.manifoldStructure d`. -/ lemma deriv_eq_mfderiv_manifoldStructure {M d} [NormedAddCommGroup M] [NormedSpace ℝ M] (μ : Fin d) (f : Space d → M) (x : Space d) : deriv μ f x = mfderiv (Space.manifoldStructure d) 𝓘(ℝ, M) f x (EuclideanSpace.single μ 1) := by From 06635044763d422a0eeb6a076973c2bc2c095b68 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 19 Mar 2026 15:37:05 +0000 Subject: [PATCH 13/14] feat: Update readme (#986) * feat: Update readme * spelling: ignore abbrev of journal --- .codespellignore | 1 + README.md | 153 +++++++++++++++++++++++------------------ docs/PhysLib-logo.jpeg | Bin 0 -> 169733 bytes 3 files changed, 88 insertions(+), 66 deletions(-) create mode 100644 docs/PhysLib-logo.jpeg diff --git a/.codespellignore b/.codespellignore index 35ba186f6..0ea841340 100644 --- a/.codespellignore +++ b/.codespellignore @@ -9,3 +9,4 @@ Breal ket rIn FRO +Commun diff --git a/README.md b/README.md index b34f96bc4..fae37caaa 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@
-PhysLean logo +PhysLean logo
@@ -35,7 +35,8 @@ ## Requirements of the project -🎯 The project shall contain results (definitions, theorems, lemmas and calculations) from **physics** formalized (or **digitalized**) into the interactive theorem prover **Lean 4**. +🎯 The project shall contain results (definitions, theorems, lemmas and calculations) from **physics**, + including quantum information, formalized (or **digitalized**) into the interactive theorem prover **Lean 4**. 🎯 The project shall be **organized** by **physics**. @@ -45,7 +46,7 @@ 🎯 The project shall contain Physics Lean **tactics**, **notation** and **syntax** for physicists. -🎯 The project shall *not* be tied to physics axiomizations (e.g. axiomatic QFT), but rather lexiable enough to accommodate different approaches and starting points. +🎯 The project shall *not* be tied to physics axiomizations (e.g. axiomatic QFT), but rather flexiable enough to accommodate different approaches and starting points. 🎯 The content of the project shall be carefully **reviewed** and curated, to ensure reusability, readability and fit. @@ -56,71 +57,19 @@ 🎯 The project shall be for **main-stream** physics only. -## How to get involved +## Contributing to PhysLib -See the [Get Involved](https://physlean.com/GetInvolved.html) for more details. Some suggestions: - -📣 write **informal** results - no need to learn Lean for this - see the [Getting Started](https://physlean.com/GettingStarted) page for more details, - -📣 tackle a [TODO item](https://physlean.com/TODOList), - -📣 or, start formalizing an area that you find interesting. - -Feel free to come to the [PhysLean zulip](https://leanprover.zulipchat.com/#narrow/channel/479953-PhysLean/) to ask questions and advice. +PhysLib is open-source and community run, and we welcome contributions from anyone. +All you need to do is open a pull-request with your changes +and our team of maintainers will review it and iterate with you on feedback until it +can be merged. +If you unsure where you would like to contribute, you may find ideas on: +- our [open issues](https://github.com/leanprover-community/physlib/issues). +- our [todo list](https://physlean.com/TODOList) +- our [Get Involved page](https://physlean.com/GetInvolved.html) > [!NOTE] -> When making contributing to PhysLean it is much better to do it with small steps. This makes it easier for us to review, and allows you to get feedback sooner. - - -## Places in the project to start - -Good places to start an exploration of the project. - -- [🗂️](https://github.com/HEPLean/PhysLean/blob/master/PhysLean/Electromagnetism/MaxwellEquations.lean) -[💻](https://live.physlean.com/#url=https%3A%2F%2Fraw.githubusercontent.com%2FHEPLean%2FPhysLean%2Frefs%2Fheads%2Fmaster%2FPhysLean%2FElectromagnetism%2FMaxwellEquations.lean) -**Maxwell's equations** in electromagnetism. -- [🗂️](https://github.com/HEPLean/PhysLean/blob/master/PhysLean/QuantumMechanics/OneDimension/HarmonicOscillator/Basic.lean) -[💻](https://live.physlean.com/#url=https%3A%2F%2Fraw.githubusercontent.com%2FHEPLean%2FPhysLean%2Frefs%2Fheads%2Fmaster%2FPhysLean%2FQuantumMechanics%2FOneDimension%2FHarmonicOscillator%2FBasic.lean) -**Quantum Harmonic Oscillator** in quantum mechanics. -- [🗂️](https://github.com/HEPLean/PhysLean/blob/master/PhysLean/StatisticalMechanics/CanonicalEnsemble/TwoState.lean) -[💻](https://live.physlean.com/#url=https%3A%2F%2Fraw.githubusercontent.com%2FHEPLean%2FPhysLean%2Frefs%2Fheads%2Fmaster%2FPhysLean%2FStatisticalMechanics%2FCanonicalEnsemble%2FTwoState.lean) -The two state **canonical ensemble** in statistical mechanics. -- [🗂️](https://github.com/HEPLean/PhysLean/blob/master/PhysLean/CondensedMatter/TightBindingChain/Basic.lean) -[💻](https://live.physlean.com/#url=https%3A%2F%2Fraw.githubusercontent.com%2FHEPLean%2FPhysLean%2Frefs%2Fheads%2Fmaster%2FPhysLean%2FCondensedMatter%2FTightBindingChain%2FBasic.lean) -The **tight-binding model** in condensed matter physics -- [🗂️](https://github.com/HEPLean/PhysLean/blob/master/PhysLean/Relativity/Special/TwinParadox/Basic.lean) -[💻](https://live.physlean.com/#url=https%3A%2F%2Fraw.githubusercontent.com%2FHEPLean%2FPhysLean%2Frefs%2Fheads%2Fmaster%2FPhysLean%2FRelativity%2FSpecial%2FTwinParadox%2FBasic.lean) -The **twin paradox** in special relativity. -- [🗂️](https://github.com/HEPLean/PhysLean/blob/master/PhysLean/Particles/BeyondTheStandardModel/TwoHDM/Basic.lean) -[💻](https://live.physlean.com/#url=https%3A%2F%2Fraw.githubusercontent.com%2FHEPLean%2FPhysLean%2Frefs%2Fheads%2Fmaster%2FPhysLean%2FParticles%2FBeyondTheStandardModel%2FTwoHDM%2FBasic.lean) The **two-Higgs doublet model** in particle physics -- [🗂️](https://github.com/HEPLean/PhysLean/blob/master/PhysLean/QFT/PerturbationTheory/WickAlgebra/WicksTheorem.lean) -[💻](https://live.physlean.com/#url=https%3A%2F%2Fraw.githubusercontent.com%2FHEPLean%2FPhysLean%2Frefs%2Fheads%2Fmaster%2FPhysLean%2FQFT%2FPerturbationTheory%2FWickAlgebra%2FWicksTheorem.lean) -**Wick's theorem** in quantum field theory. - - -## Associated media and publications -- [📄](https://arxiv.org/abs/2405.08863) Joseph Tooby-Smith, -__HepLean: Digitalising high energy physics__, Computer Physics Communications, Volume 308, -2025, 109457, ISSN 0010-4655, https://doi.org/10.1016/j.cpc.2024.109457. \[arXiv:2405.08863\] -- [📄](https://arxiv.org/abs/2411.07667) Joseph Tooby-Smith, __Formalization of physics index notation in Lean 4__, arXiv:2411.07667 -- [📄](https://arxiv.org/abs/2505.07939) Joseph Tooby-Smith, __Digitalizing Wick's Theorem__, arXiv:2505.07939 -- [🎥](https://www.youtube.com/watch?v=U7Xf5p6jAUU&t=62s) Lean Together 2025: Joseph Tooby-Smith, Physics and Lean -- [🎥](https://www.youtube.com/watch?v=W2cObnopqas) Seminar recording of "HepLean: Lean and high energy physics" by J. Tooby-Smith - -### Papers referencing PhysLean -- Hu, Jiewen, Thomas Zhu, and Sean Welleck. "miniCTX: Neural Theorem Proving with (Long-) Contexts." arXiv preprint [arXiv:2408.03350](https://www.arxiv.org/abs/2408.03350) (2024). [Project page]( https://cmu-l3.github.io/minictx/) - -How PhysLean (then called HepLean) was used: *Theorems from the space-time files of HepLean were included in a data set used to evaluate the ability of models to prove theorems from real-world repositories, which requires working with definitions, theorems, and other context not seen in training.* - -## Contributing - -We would love to have you involved! See the [Get Involved](https://physlean.com/GetInvolved.html) page to see how you can get involved. -Any contributions are welcome! If you have any questions or want permission permission to create a pull-request for this -repository contact Joseph Tooby-Smith on the [Lean Zulip](https://leanprover.zulipchat.com), or email. - -## Installation - -If you want to play around with PhysLean, but do not want to download Lean, then you can use [GitPod](https://gitpod.io/#https://github.com/HEPLean/HepLean). +> If stuck at any point there are lots of people happly to help on the [PhysLib zulip](https://leanprover.zulipchat.com/#narrow/channel/479953-PhysLib) ### Installing Lean 4 @@ -132,10 +81,82 @@ or - https://leanprover-community.github.io/get_started.html -### Installing PhysLean +### Installing PhysLib - Clone this repository (or download the repository as a Zip file) - Open a terminal at the top-level in the corresponding directory. - Run `lake exe cache get`. The command `lake` should have been installed when you installed Lean. - Run `lake build`. - Open the directory (not a single file) in Visual Studio Code (or another Lean compatible code editor). + +### Making a pull-request + +There are lots of guides on how to make a pull-request on GitHub. The first thing you +need to do is fork the repository. Once you've made your pull request we will review it: +- Guide to [PhysLib reviews](https://github.com/leanprover-community/physlib/blob/master/docs/ReviewGuidelines.md). +It will also undergo a number of automated checks called linters. Sometimes these are easier +to run locally: +- Guide to [linters and running them locally](https://github.com/leanprover-community/physlib/blob/master/scripts/README.md). + +Most importantly: +> [!NOTE] +> When making contributing to PhysLib it is much better to do it with small steps. This makes it easier for us to review, and allows you to get feedback sooner. + +## Maintainers + +Below are the maintainers of the project, however the best way to reach them is by posting +on the [Lean Zulip](https://leanprover.zulipchat.com/#narrow/channel/479953-PhysLib) + +- Léo Lessa (@Megaleo) +- Alex Meiburg (@Timeroot) +- Daniel Morrison (@morrison-daniel) +- Zhi-Kai Pong (@zhikaip) +- Rodolfo Soldati (@rodolfor-s) +- Joseph Tooby-Smith (@jstoobysmith) +- Winston Yin (@winstonyin) + +## Citing the project + +If you want to cite the project as a whole please cite: + +``` +@misc{physlib, + author = {The PhysLib community}, + title = {PhysLib: The Lean Physics Library}, + year = {2024}, + publisher = {GitHub}, + journal = {GitHub repository}, + howpublished = {\url{https://github.com/leanprover-community/physlib}}, +} +``` + +PhysLib was formed by merging the general physics Lean library PhysLean (formerly called HepLean) +with the quantum-information library Lean-QuantumInfo. Where appropriate please also consider +citing the papers associated with the origin of these projects. For the former please use: +``` +@article{Tooby-Smith:2024vqu, + author = "Tooby-Smith, Joseph", + title = "{HepLean: Digitalising high energy physics}", + eprint = "2405.08863", + archivePrefix = "arXiv", + primaryClass = "hep-ph", + doi = "10.1016/j.cpc.2024.109457", + journal = "Comput. Phys. Commun.", + volume = "308", + pages = "109457", + year = "2025" +} +``` +and for the latter please use: + +``` +@article{Meiburg:2025mwn, + author = "Meiburg, Alex and Lessa, Leonardo A. and Soldati, Rodolfo R.", + title = "{A Formalization of the Generalized Quantum Stein's Lemma in Lean}", + eprint = "2510.08672", + archivePrefix = "arXiv", + primaryClass = "quant-ph", + month = "10", + year = "2025" +} +``` diff --git a/docs/PhysLib-logo.jpeg b/docs/PhysLib-logo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0a0cf877cba569fad90f3ce6f3297d89de8b68d7 GIT binary patch literal 169733 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 Date: Mon, 16 Mar 2026 11:44:19 +0000 Subject: [PATCH 14/14] feat: Properties of vadd --- PhysLean/SpaceAndTime/Space/Module.lean | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/PhysLean/SpaceAndTime/Space/Module.lean b/PhysLean/SpaceAndTime/Space/Module.lean index 49a99665c..f1457792e 100644 --- a/PhysLean/SpaceAndTime/Space/Module.lean +++ b/PhysLean/SpaceAndTime/Space/Module.lean @@ -7,6 +7,7 @@ module public import PhysLean.SpaceAndTime.Space.Basic public import Mathlib.Geometry.Manifold.Diffeomorph +public import Mathlib.Analysis.Distribution.TemperateGrowth /-! # The structure of a module on Space @@ -692,4 +693,57 @@ lemma basis_eq_mfderiv_modelDiffeo_single (d : ℕ) (μ : Fin d) (x : Space d) : congr 1 exact Eq.propIntro (fun a => Eq.symm a) fun a => (Eq.symm a) + +/-! + +## Properties of vadd with module structure + +-/ + +lemma norm_vadd_le_add {d} (v : EuclideanSpace ℝ (Fin d)) (s : Space d) : + ‖v +ᵥ s‖ ≤ ‖v‖ + ‖s‖ := by + trans ‖s - (-v +ᵥ (0 : Space d))‖ + · apply le_of_eq + congr + ext i + simp only [vadd_apply, sub_apply, PiLp.neg_apply, zero_apply, add_zero, sub_neg_eq_add] + ring + · apply (norm_sub_le _ _).trans <| le_of_eq _ + simp only [norm_vadd_zero, norm_neg] + ring + +@[fun_prop] +lemma differentiable_vadd {d} (v : EuclideanSpace ℝ (Fin d)) : + Differentiable ℝ (fun (s : Space d) => v +ᵥ s) := + mk_differentiable.comp <| by fun_prop + +@[simp] +lemma fderiv_vadd {d} (v : EuclideanSpace ℝ (Fin d)) : + fderiv ℝ (fun s => v +ᵥ s) = fun (_ : Space d) => ContinuousLinearMap.id ℝ _ := by + ext s ds i + change fderiv ℝ (fun s => v +ᵥ s) s ds i = _ + rw [fderiv_space_components] + simp + trans fderiv ℝ (coordCLM i) s ds + · congr + ext j + simp [coordCLM, coord_apply] + · rw [ContinuousLinearMap.fderiv] + simp [coordCLM, coord_apply] + · fun_prop + +@[fun_prop] +lemma vadd_hasTemperateGrowth {d} (v : EuclideanSpace ℝ (Fin d)) : + Function.HasTemperateGrowth (fun s : Space d => v +ᵥ s) := by + apply Function.HasTemperateGrowth.of_fderiv (k := 1) (C := 1 + ‖v‖) + · rw [fderiv_vadd] + simp + · fun_prop + · intro x + simp + apply (norm_vadd_le_add _ _).trans + have : 0 ≤ ‖v‖ := by positivity + have : 0 ≤ ‖x‖ := by positivity + nlinarith + end Space