From 46db87e1e3c7638cecd9431157bd0b63c8bfc1f7 Mon Sep 17 00:00:00 2001 From: Jack McCarthy <37917934+Deicyde@users.noreply.github.com> Date: Sat, 18 Apr 2026 20:10:01 -0400 Subject: [PATCH 01/10] Added a new file Geometry/Manifold/Category/MfldCat/Basic.lean --- Mathlib.lean | 1 + .../Manifold/Category/MfldCat/Basic.lean | 278 ++++++++++++++++++ 2 files changed, 279 insertions(+) create mode 100644 Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean diff --git a/Mathlib.lean b/Mathlib.lean index 51561e14b0c337..710110e96cc514 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -4460,6 +4460,7 @@ public import Mathlib.Geometry.Manifold.Algebra.SmoothFunctions public import Mathlib.Geometry.Manifold.Algebra.Structures public import Mathlib.Geometry.Manifold.Bordism public import Mathlib.Geometry.Manifold.BumpFunction +public import Mathlib.Geometry.Manifold.Category.MfldCat.Basic public import Mathlib.Geometry.Manifold.ChartedSpace public import Mathlib.Geometry.Manifold.Complex public import Mathlib.Geometry.Manifold.ConformalGroupoid diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean new file mode 100644 index 00000000000000..e2bac2b30cd50d --- /dev/null +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean @@ -0,0 +1,278 @@ +/- +Copyright (c) 2026 Jack McCarthy. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jack McCarthy +-/ +module + +public import Mathlib.CategoryTheory.Elementwise +public import Mathlib.Geometry.Manifold.ContMDiffMap +public import Mathlib.Geometry.Manifold.ContMDiff.Constructions +public import Mathlib.Geometry.Manifold.Diffeomorph +public import Mathlib.Topology.Category.TopCat.Basic + +/-! +# Category instance for smooth manifolds + +We introduce the category `MfldCat ๐•œ n` of `C^n` manifolds over a field `๐•œ`. Each object bundles the +underlying manifold together with its model space `E`, chart space `H`, and +`I : ModelWithCorners ๐•œ E H`. Thus, `MfldCat ๐•œ n` also includes manifolds with boundary and corners. + +We define a forgetful functor `forgetโ‚‚ (MfldCat ๐•œ n) TopCat` taking smooth manifolds to topological +spaces. We also define `MfldCat.ofNormedSpace` turning any `NormedSpace ๐•œ E` into a manifold. In the +future, we plan to define a functor `FGModuleCat ๐•œ โฅค MfldCat ๐•œ n` from the category of +finite-dimensional vector spaces over `๐•œ`. +-/ + +@[expose] public section + +set_option autoImplicit false + +open CategoryTheory +open scoped Manifold + +universe u + +/-- The category of `C^n` ๐•œ-manifolds. -/ +structure MfldCat (๐•œ : Type u) [NontriviallyNormedField ๐•œ] (n : WithTop โ„•โˆž) where + /-- The object in `MfldCat` associated to a type equipped with the appropriate typeclasses. -/ + of :: + /-- The underlying type. -/ + carrier : Type u + /-- The model normed space. -/ + E : Type u + /-- The chart space. -/ + H : Type u + [instNAG : NormedAddCommGroup E] + [instNS : NormedSpace ๐•œ E] + [instTopH : TopologicalSpace H] + /-- The model with corners. -/ + I : ModelWithCorners ๐•œ E H + [instTop : TopologicalSpace carrier] + [instCharted : ChartedSpace H carrier] + [instManifold : IsManifold I n carrier] + +section Notation + +open Lean.PrettyPrinter.Delaborator + +/-- This prevents `MfldCat.of M E H I` being printed as `{ carrier := M, ... }` by +`delabStructureInstance`. -/ +@[app_delab MfldCat.of] +meta def MfldCat.delabOf : Delab := delabApp + +end Notation + +attribute [instance] MfldCat.instNAG MfldCat.instNS MfldCat.instTopH MfldCat.instTop + MfldCat.instCharted MfldCat.instManifold + +initialize_simps_projections MfldCat + (-instNAG, -instNS, -instTopH, -instTop, -instCharted, -instManifold) + +namespace MfldCat + +variable {๐•œ : Type u} [NontriviallyNormedField ๐•œ] {n : WithTop โ„•โˆž} + +instance : CoeSort (MfldCat ๐•œ n) (Type u) := โŸจMfldCat.carrierโŸฉ + +attribute [coe] MfldCat.carrier + +lemma coe_of (M : Type u) (E : Type u) (H : Type u) + [NormedAddCommGroup E] [NormedSpace ๐•œ E] [TopologicalSpace H] + (I : ModelWithCorners ๐•œ E H) [TopologicalSpace M] [ChartedSpace H M] + [IsManifold I n M] : (of (n := n) M E H I : Type u) = M := rfl + +lemma of_carrier (M : MfldCat.{u} ๐•œ n) : of (n := n) M.carrier M.E M.H M.I = M := rfl + +/-- The type of morphisms in `MfldCat`. -/ +@[ext] +structure Hom (M N : MfldCat ๐•œ n) where + /-- The underlying `C^n` map. -/ + hom' : ContMDiffMap M.I N.I M N n + +instance : Category (MfldCat ๐•œ n) where + Hom M N := Hom M N + id M := โŸจContMDiffMap.idโŸฉ + comp f g := โŸจg.hom'.comp f.hom'โŸฉ + +instance : ConcreteCategory.{u} (MfldCat ๐•œ n) + (fun M N => ContMDiffMap M.I N.I M N n) where + hom f := f.hom' + ofHom f := โŸจfโŸฉ + +/-- Turn a morphism in `MfldCat` back into a `ContMDiffMap`. -/ +abbrev Hom.hom {M N : MfldCat.{u} ๐•œ n} (f : Hom M N) := + ConcreteCategory.hom (C := MfldCat ๐•œ n) f + +/-- Typecheck a `ContMDiffMap` as a morphism in `MfldCat`. -/ +abbrev ofHom {M N : Type u} {E E' : Type u} {H H' : Type u} + [NormedAddCommGroup E] [NormedSpace ๐•œ E] [TopologicalSpace H] + [NormedAddCommGroup E'] [NormedSpace ๐•œ E'] [TopologicalSpace H'] + {I : ModelWithCorners ๐•œ E H} {I' : ModelWithCorners ๐•œ E' H'} + [TopologicalSpace M] [ChartedSpace H M] [IsManifold I n M] + [TopologicalSpace N] [ChartedSpace H' N] [IsManifold I' n N] + (f : ContMDiffMap I I' M N n) : + of (n := n) M E H I โŸถ of (n := n) N E' H' I' := + ConcreteCategory.ofHom (C := MfldCat ๐•œ n) f + +/-- Use the `ConcreteCategory.hom` projection for `@[simps]` lemmas. -/ +def Hom.Simps.hom (M N : MfldCat.{u} ๐•œ n) (f : Hom M N) := + f.hom + +initialize_simps_projections Hom (hom' โ†’ hom) + +/-! +The results below duplicate the `ConcreteCategory` simp lemmas, but we can keep them for `dsimp`. +-/ + +@[simp] +lemma hom_id {M : MfldCat ๐•œ n} : + (๐Ÿ™ M : M โŸถ M).hom = ContMDiffMap.id := rfl + +@[simp] +theorem id_app (M : MfldCat ๐•œ n) (x : โ†‘M) : (๐Ÿ™ M : M โŸถ M) x = x := rfl + +@[simp] +theorem coe_id (M : MfldCat ๐•œ n) : (๐Ÿ™ M : M โ†’ M) = _root_.id := rfl + +@[simp] +lemma hom_comp {M N P : MfldCat ๐•œ n} (f : M โŸถ N) (g : N โŸถ P) : + (f โ‰ซ g).hom = g.hom.comp f.hom := rfl + +@[simp] +theorem comp_app {M N P : MfldCat ๐•œ n} (f : M โŸถ N) (g : N โŸถ P) (x : M) : + (f โ‰ซ g : M โ†’ P) x = g (f x) := rfl + +@[simp] +theorem coe_comp {M N P : MfldCat ๐•œ n} (f : M โŸถ N) (g : N โŸถ P) : + (f โ‰ซ g : M โ†’ P) = g โˆ˜ f := rfl + +@[ext] +lemma hom_ext {M N : MfldCat ๐•œ n} {f g : M โŸถ N} (hf : f.hom = g.hom) : f = g := + Hom.ext hf + +@[ext] +lemma ext {M N : MfldCat ๐•œ n} {f g : M โŸถ N} (w : โˆ€ x : M, f x = g x) : f = g := + ConcreteCategory.hom_ext _ _ w + +section ofHom + +variable {X Y Z : Type u} {E E' E'' : Type u} {H H' H'' : Type u} + [NormedAddCommGroup E] [NormedSpace ๐•œ E] [TopologicalSpace H] + [NormedAddCommGroup E'] [NormedSpace ๐•œ E'] [TopologicalSpace H'] + [NormedAddCommGroup E''] [NormedSpace ๐•œ E''] [TopologicalSpace H''] + {I : ModelWithCorners ๐•œ E H} {I' : ModelWithCorners ๐•œ E' H'} + {I'' : ModelWithCorners ๐•œ E'' H''} + [TopologicalSpace X] [ChartedSpace H X] [IsManifold I n X] + [TopologicalSpace Y] [ChartedSpace H' Y] [IsManifold I' n Y] + [TopologicalSpace Z] [ChartedSpace H'' Z] [IsManifold I'' n Z] + +@[simp] +lemma hom_ofHom (f : ContMDiffMap I I' X Y n) : (ofHom f).hom = f := rfl + +@[simp] +lemma ofHom_hom {M N : MfldCat ๐•œ n} (f : M โŸถ N) : + ofHom (Hom.hom f) = f := rfl + +@[simp] +lemma ofHom_id : + ofHom (ContMDiffMap.id : ContMDiffMap I I X X n) = ๐Ÿ™ (of (n := n) X E H I) := rfl + +@[simp] +lemma ofHom_comp (f : ContMDiffMap I I' X Y n) (g : ContMDiffMap I' I'' Y Z n) : + ofHom (g.comp f) = ofHom f โ‰ซ ofHom g := rfl + +lemma ofHom_apply (f : ContMDiffMap I I' X Y n) (x : X) : (ofHom f) x = f x := rfl + +lemma hom_inv_id_apply {M N : MfldCat ๐•œ n} (f : M โ‰… N) (x : M) : f.inv (f.hom x) = x := by + simp + +lemma inv_hom_id_apply {M N : MfldCat ๐•œ n} (f : M โ‰… N) (y : N) : f.hom (f.inv y) = y := by + simp + +end ofHom + +/-- Morphisms in `MfldCat` are equivalent to `ContMDiffMap`s. -/ +@[simps] +def Hom.equivContMDiffMap (M N : MfldCat.{u} ๐•œ n) : + (M โŸถ N) โ‰ƒ ContMDiffMap M.I N.I M N n where + toFun f := f.hom + invFun f := ofHom f + +/-- Replace a function coercion for a morphism `MfldCat.of X E H I โŸถ MfldCat.of Y E' H' I'` with +the definitionally equal function coercion for a `ContMDiffMap I I' X Y n`. -/ +@[simp] theorem coe_of_of {X Y E E' H H' : Type u} + [NormedAddCommGroup E] [NormedSpace ๐•œ E] [TopologicalSpace H] + [NormedAddCommGroup E'] [NormedSpace ๐•œ E'] [TopologicalSpace H'] + {I : ModelWithCorners ๐•œ E H} {I' : ModelWithCorners ๐•œ E' H'} + [TopologicalSpace X] [ChartedSpace H X] [IsManifold I n X] + [TopologicalSpace Y] [ChartedSpace H' Y] [IsManifold I' n Y] + {f : ContMDiffMap I I' X Y n} {x} : + @DFunLike.coe (of (n := n) X E H I โŸถ of (n := n) Y E' H' I') + ((CategoryTheory.forget (MfldCat ๐•œ n)).obj (of (n := n) X E H I)) + (fun _ โ†ฆ (CategoryTheory.forget (MfldCat ๐•œ n)).obj (of (n := n) Y E' H' I')) + ConcreteCategory.instFunLike + (ofHom f) x = + @DFunLike.coe (ContMDiffMap I I' X Y n) X + (fun _ โ†ฆ Y) _ + f x := + rfl + +instance inhabited : Inhabited (MfldCat ๐•œ n) := + โŸจof ๐•œ ๐•œ ๐•œ (modelWithCornersSelf ๐•œ ๐•œ)โŸฉ + +/-- Bundle a normed space as a `C^n` manifold without boundary (modeled on itself). -/ +@[simps] +abbrev ofNormedSpace (n : WithTop โ„•โˆž) (E : Type u) [NormedAddCommGroup E] [NormedSpace ๐•œ E] : + MfldCat.{u} ๐•œ n := + of E E E (modelWithCornersSelf ๐•œ E) + +/-- `MfldCat ๐•œ n` has a forgetful functor to `TopCat`, sending a manifold to its underlying +topological space and a `C^n` map to its underlying continuous map. -/ +instance : HasForgetโ‚‚ (MfldCat.{u} ๐•œ n) TopCat.{u} where + forgetโ‚‚.obj M := TopCat.of M + forgetโ‚‚.map f := TopCat.ofHom โŸจf.hom, f.hom.contMDiff.continuousโŸฉ + +-- TODO: define a functor `FGModuleCat ๐•œ โฅค MfldCat ๐•œ n` from the category of +-- finite-dimensional `๐•œ`-vector spaces. Requires `[CompleteSpace ๐•œ]` and a choice of norm on each +-- object (e.g. via `Module.finBasis ๐•œ V` transporting the norm from `EuclideanSpace ๐•œ (Fin _)`). + +/-- Any diffeomorphism induces an isomorphism in `MfldCat`. -/ +@[simps] +def isoOfDiffeomorph {M N : MfldCat.{u} ๐•œ n} (f : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N) : M โ‰… N where + hom := ofHom f.toContMDiffMap + inv := ofHom f.symm.toContMDiffMap + hom_inv_id := by ext x; exact f.left_inv x + inv_hom_id := by ext x; exact f.right_inv x + +/-- Any isomorphism in `MfldCat` induces a diffeomorphism. -/ +@[simps] +def diffeomorphOfIso {M N : MfldCat.{u} ๐•œ n} (f : M โ‰… N) : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N where + toFun := f.hom + invFun := f.inv + left_inv _ := by simp + right_inv _ := by simp + contMDiff_toFun := f.hom.hom.contMDiff + contMDiff_invFun := f.inv.hom.contMDiff + +@[simp] +theorem of_isoOfDiffeomorph {M N : MfldCat.{u} ๐•œ n} (f : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N) : + diffeomorphOfIso (isoOfDiffeomorph f) = f := by + ext + rfl + +@[simp] +theorem of_diffeomorphOfIso {M N : MfldCat.{u} ๐•œ n} (f : M โ‰… N) : + isoOfDiffeomorph (diffeomorphOfIso f) = f := by + ext + rfl + +/-- The constant morphism `M โŸถ N` in `MfldCat` given by `y : N`. -/ +def const {M N : MfldCat.{u} ๐•œ n} (y : N) : M โŸถ N := + ofHom โŸจfun _ โ†ฆ y, contMDiff_constโŸฉ + +@[simp] +lemma const_apply {M N : MfldCat.{u} ๐•œ n} (y : N) (x : M) : + const y x = y := rfl + +end MfldCat From 61c3aaa9f27d586867e368342b2bd7d40489f16c Mon Sep 17 00:00:00 2001 From: Jack McCarthy <37917934+Deicyde@users.noreply.github.com> Date: Sat, 18 Apr 2026 20:54:21 -0400 Subject: [PATCH 02/10] Fixed CI errors. Added simp lemmas for ContMDiffMap analogous to those for ContinuousMap. --- Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean | 1 - Mathlib/Geometry/Manifold/ContMDiffMap.lean | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean index e2bac2b30cd50d..01fe5b43711f42 100644 --- a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean @@ -222,7 +222,6 @@ instance inhabited : Inhabited (MfldCat ๐•œ n) := โŸจof ๐•œ ๐•œ ๐•œ (modelWithCornersSelf ๐•œ ๐•œ)โŸฉ /-- Bundle a normed space as a `C^n` manifold without boundary (modeled on itself). -/ -@[simps] abbrev ofNormedSpace (n : WithTop โ„•โˆž) (E : Type u) [NormedAddCommGroup E] [NormedSpace ๐•œ E] : MfldCat.{u} ๐•œ n := of E E E (modelWithCornersSelf ๐•œ E) diff --git a/Mathlib/Geometry/Manifold/ContMDiffMap.lean b/Mathlib/Geometry/Manifold/ContMDiffMap.lean index e0fce000c3f725..049d54c2b870e1 100644 --- a/Mathlib/Geometry/Manifold/ContMDiffMap.lean +++ b/Mathlib/Geometry/Manifold/ContMDiffMap.lean @@ -79,6 +79,12 @@ instance : ContinuousMapClass C^nโŸฎI, M; I', M'โŸฏ M M' where nonrec def id : C^nโŸฎI, M; I, MโŸฏ := โŸจid, contMDiff_idโŸฉ +@[simp] +theorem id_apply (x : M) : (ContMDiffMap.id : C^nโŸฎI, M; I, MโŸฏ) x = x := rfl + +@[simp] +theorem coe_id : โ‡‘(ContMDiffMap.id : C^nโŸฎI, M; I, MโŸฏ) = _root_.id := rfl + /-- The composition of `C^n` maps, as a `C^n` map. -/ def comp (f : C^nโŸฎI', M'; I'', M''โŸฏ) (g : C^nโŸฎI, M; I', M'โŸฏ) : C^nโŸฎI, M; I'', M''โŸฏ where val a := f (g a) @@ -89,6 +95,10 @@ theorem comp_apply (f : C^nโŸฎI', M'; I'', M''โŸฏ) (g : C^nโŸฎI, M; I', M'โŸฏ) ( f.comp g x = f (g x) := rfl +@[simp] +theorem coe_comp (f : C^nโŸฎI', M'; I'', M''โŸฏ) (g : C^nโŸฎI, M; I', M'โŸฏ) : + โ‡‘(f.comp g) = f โˆ˜ g := rfl + instance [Inhabited M'] : Inhabited C^nโŸฎI, M; I', M'โŸฏ := โŸจโŸจfun _ => default, contMDiff_constโŸฉโŸฉ From 3d17542d3c61506fa18564f86c1c954781f2d2a8 Mon Sep 17 00:00:00 2001 From: Jack McCarthy <37917934+Deicyde@users.noreply.github.com> Date: Sun, 19 Apr 2026 05:18:10 -0400 Subject: [PATCH 03/10] Added tangent functor. --- .../Manifold/Category/MfldCat/Basic.lean | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean index 01fe5b43711f42..d38d47ed1e6326 100644 --- a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean @@ -8,7 +8,9 @@ module public import Mathlib.CategoryTheory.Elementwise public import Mathlib.Geometry.Manifold.ContMDiffMap public import Mathlib.Geometry.Manifold.ContMDiff.Constructions +public import Mathlib.Geometry.Manifold.ContMDiffMFDeriv public import Mathlib.Geometry.Manifold.Diffeomorph +public import Mathlib.Geometry.Manifold.MFDeriv.SpecificFunctions public import Mathlib.Topology.Category.TopCat.Basic /-! @@ -29,7 +31,7 @@ finite-dimensional vector spaces over `๐•œ`. set_option autoImplicit false open CategoryTheory -open scoped Manifold +open scoped Manifold ContDiff universe u @@ -274,4 +276,28 @@ def const {M N : MfldCat.{u} ๐•œ n} (y : N) : M โŸถ N := lemma const_apply {M N : MfldCat.{u} ๐•œ n} (y : N) (x : M) : const y x = y := rfl +section TangentFunctor + +variable (M : MfldCat.{u} ๐•œ (n + 1)) + +local instance : IsManifold M.I 1 M := IsManifold.of_le (n := n + 1) le_add_self +local instance : IsManifold M.I n M := IsManifold.of_le (n := n + 1) le_self_add +-- This implies `TangentBundle M.I M` is a manifold by `Bundle.TotalSpace.isManifold` +local instance : ContMDiffVectorBundle n M.E (TangentSpace M.I : M โ†’ Type u) M.I := + TangentBundle.contMDiffVectorBundle + + +/-- The tangent functor `MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n` -- Sends a `C^(n+1)` manifold to its +tangent bundle; Sends a `C^(n+1)` map to it's pushforward. -/ +noncomputable def tangentFunctor : MfldCat.{u} ๐•œ (n + 1) โฅค MfldCat.{u} ๐•œ n where + obj M := of (TangentBundle M.I M) (M.E ร— M.E) (ModelProd M.H M.E) M.I.tangent + map {M N} f := + ofHom โŸจtangentMap M.I N.I f.hom, f.hom.contMDiff.contMDiff_tangentMap le_rflโŸฉ + map_id _ := Hom.ext <| Subtype.ext tangentMap_id + map_comp f g := Hom.ext <| Subtype.ext <| tangentMap_comp + (g.hom.contMDiff.mdifferentiable (by simp)) + (f.hom.contMDiff.mdifferentiable (by simp)) + +end TangentFunctor + end MfldCat From d1b20275e5095a9aafee36b9ad9f897ea0856db3 Mon Sep 17 00:00:00 2001 From: Jack McCarthy <37917934+Deicyde@users.noreply.github.com> Date: Sun, 19 Apr 2026 05:40:10 -0400 Subject: [PATCH 04/10] Changed to 2 universes instead of 1. --- .../Manifold/Category/MfldCat/Basic.lean | 102 +++++++----------- 1 file changed, 41 insertions(+), 61 deletions(-) diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean index d38d47ed1e6326..4e110573d642f0 100644 --- a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean @@ -5,12 +5,7 @@ Authors: Jack McCarthy -/ module -public import Mathlib.CategoryTheory.Elementwise -public import Mathlib.Geometry.Manifold.ContMDiffMap -public import Mathlib.Geometry.Manifold.ContMDiff.Constructions -public import Mathlib.Geometry.Manifold.ContMDiffMFDeriv public import Mathlib.Geometry.Manifold.Diffeomorph -public import Mathlib.Geometry.Manifold.MFDeriv.SpecificFunctions public import Mathlib.Topology.Category.TopCat.Basic /-! @@ -31,12 +26,16 @@ finite-dimensional vector spaces over `๐•œ`. set_option autoImplicit false open CategoryTheory -open scoped Manifold ContDiff +open scoped Manifold -universe u +/- Implementation note: `carrier`, `E`, `H`, and `I` all live in the same `Type u`. This assumption +is essential (?) to differential geometry because we wish to compare the linear model +(`E`, `H`, `I`) with the manifold itself. E.g. the tangent bundle should also be a manifold. +The field `๐•œ` lives in a seperate `Type v`, according to the convention of `ModuleCat` -/ +universe u v /-- The category of `C^n` ๐•œ-manifolds. -/ -structure MfldCat (๐•œ : Type u) [NontriviallyNormedField ๐•œ] (n : WithTop โ„•โˆž) where +structure MfldCat (๐•œ : Type v) [NontriviallyNormedField ๐•œ] (n : WithTop โ„•โˆž) where /-- The object in `MfldCat` associated to a type equipped with the appropriate typeclasses. -/ of :: /-- The underlying type. -/ @@ -73,52 +72,52 @@ initialize_simps_projections MfldCat namespace MfldCat -variable {๐•œ : Type u} [NontriviallyNormedField ๐•œ] {n : WithTop โ„•โˆž} +variable {๐•œ : Type v} [NontriviallyNormedField ๐•œ] {n : WithTop โ„•โˆž} + {X Y Z : Type u} {E E' E'' : Type u} {H H' H'' : Type u} + [NormedAddCommGroup E] [NormedSpace ๐•œ E] [TopologicalSpace H] + [NormedAddCommGroup E'] [NormedSpace ๐•œ E'] [TopologicalSpace H'] + [NormedAddCommGroup E''] [NormedSpace ๐•œ E''] [TopologicalSpace H''] + {I : ModelWithCorners ๐•œ E H} {I' : ModelWithCorners ๐•œ E' H'} + {I'' : ModelWithCorners ๐•œ E'' H''} + [TopologicalSpace X] [ChartedSpace H X] [IsManifold I n X] + [TopologicalSpace Y] [ChartedSpace H' Y] [IsManifold I' n Y] + [TopologicalSpace Z] [ChartedSpace H'' Z] [IsManifold I'' n Z] instance : CoeSort (MfldCat ๐•œ n) (Type u) := โŸจMfldCat.carrierโŸฉ attribute [coe] MfldCat.carrier -lemma coe_of (M : Type u) (E : Type u) (H : Type u) - [NormedAddCommGroup E] [NormedSpace ๐•œ E] [TopologicalSpace H] - (I : ModelWithCorners ๐•œ E H) [TopologicalSpace M] [ChartedSpace H M] - [IsManifold I n M] : (of (n := n) M E H I : Type u) = M := rfl +variable (X E H I) in +lemma coe_of : (of (n := n) X E H I : Type u) = X := rfl -lemma of_carrier (M : MfldCat.{u} ๐•œ n) : of (n := n) M.carrier M.E M.H M.I = M := rfl +lemma of_carrier (M : MfldCat.{u, v} ๐•œ n) : of (n := n) M.carrier M.E M.H M.I = M := rfl /-- The type of morphisms in `MfldCat`. -/ @[ext] -structure Hom (M N : MfldCat ๐•œ n) where +structure Hom (M N : MfldCat.{u, v} ๐•œ n) where /-- The underlying `C^n` map. -/ hom' : ContMDiffMap M.I N.I M N n -instance : Category (MfldCat ๐•œ n) where +instance : Category (MfldCat.{u, v} ๐•œ n) where Hom M N := Hom M N id M := โŸจContMDiffMap.idโŸฉ comp f g := โŸจg.hom'.comp f.hom'โŸฉ -instance : ConcreteCategory.{u} (MfldCat ๐•œ n) +instance : ConcreteCategory.{u} (MfldCat.{u, v} ๐•œ n) (fun M N => ContMDiffMap M.I N.I M N n) where hom f := f.hom' ofHom f := โŸจfโŸฉ /-- Turn a morphism in `MfldCat` back into a `ContMDiffMap`. -/ -abbrev Hom.hom {M N : MfldCat.{u} ๐•œ n} (f : Hom M N) := - ConcreteCategory.hom (C := MfldCat ๐•œ n) f +abbrev Hom.hom {M N : MfldCat.{u, v} ๐•œ n} (f : Hom M N) := + ConcreteCategory.hom (C := MfldCat.{u, v} ๐•œ n) f /-- Typecheck a `ContMDiffMap` as a morphism in `MfldCat`. -/ -abbrev ofHom {M N : Type u} {E E' : Type u} {H H' : Type u} - [NormedAddCommGroup E] [NormedSpace ๐•œ E] [TopologicalSpace H] - [NormedAddCommGroup E'] [NormedSpace ๐•œ E'] [TopologicalSpace H'] - {I : ModelWithCorners ๐•œ E H} {I' : ModelWithCorners ๐•œ E' H'} - [TopologicalSpace M] [ChartedSpace H M] [IsManifold I n M] - [TopologicalSpace N] [ChartedSpace H' N] [IsManifold I' n N] - (f : ContMDiffMap I I' M N n) : - of (n := n) M E H I โŸถ of (n := n) N E' H' I' := - ConcreteCategory.ofHom (C := MfldCat ๐•œ n) f +abbrev ofHom (f : ContMDiffMap I I' X Y n) : of (n := n) X E H I โŸถ of (n := n) Y E' H' I' := + ConcreteCategory.ofHom (C := MfldCat.{u, v} ๐•œ n) f /-- Use the `ConcreteCategory.hom` projection for `@[simps]` lemmas. -/ -def Hom.Simps.hom (M N : MfldCat.{u} ๐•œ n) (f : Hom M N) := +def Hom.Simps.hom (M N : MfldCat.{u, v} ๐•œ n) (f : Hom M N) := f.hom initialize_simps_projections Hom (hom' โ†’ hom) @@ -159,16 +158,6 @@ lemma ext {M N : MfldCat ๐•œ n} {f g : M โŸถ N} (w : โˆ€ x : M, f x = g x) : f section ofHom -variable {X Y Z : Type u} {E E' E'' : Type u} {H H' H'' : Type u} - [NormedAddCommGroup E] [NormedSpace ๐•œ E] [TopologicalSpace H] - [NormedAddCommGroup E'] [NormedSpace ๐•œ E'] [TopologicalSpace H'] - [NormedAddCommGroup E''] [NormedSpace ๐•œ E''] [TopologicalSpace H''] - {I : ModelWithCorners ๐•œ E H} {I' : ModelWithCorners ๐•œ E' H'} - {I'' : ModelWithCorners ๐•œ E'' H''} - [TopologicalSpace X] [ChartedSpace H X] [IsManifold I n X] - [TopologicalSpace Y] [ChartedSpace H' Y] [IsManifold I' n Y] - [TopologicalSpace Z] [ChartedSpace H'' Z] [IsManifold I'' n Z] - @[simp] lemma hom_ofHom (f : ContMDiffMap I I' X Y n) : (ofHom f).hom = f := rfl @@ -196,20 +185,14 @@ end ofHom /-- Morphisms in `MfldCat` are equivalent to `ContMDiffMap`s. -/ @[simps] -def Hom.equivContMDiffMap (M N : MfldCat.{u} ๐•œ n) : +def Hom.equivContMDiffMap (M N : MfldCat.{u, v} ๐•œ n) : (M โŸถ N) โ‰ƒ ContMDiffMap M.I N.I M N n where toFun f := f.hom invFun f := ofHom f /-- Replace a function coercion for a morphism `MfldCat.of X E H I โŸถ MfldCat.of Y E' H' I'` with the definitionally equal function coercion for a `ContMDiffMap I I' X Y n`. -/ -@[simp] theorem coe_of_of {X Y E E' H H' : Type u} - [NormedAddCommGroup E] [NormedSpace ๐•œ E] [TopologicalSpace H] - [NormedAddCommGroup E'] [NormedSpace ๐•œ E'] [TopologicalSpace H'] - {I : ModelWithCorners ๐•œ E H} {I' : ModelWithCorners ๐•œ E' H'} - [TopologicalSpace X] [ChartedSpace H X] [IsManifold I n X] - [TopologicalSpace Y] [ChartedSpace H' Y] [IsManifold I' n Y] - {f : ContMDiffMap I I' X Y n} {x} : +@[simp] theorem coe_of_of {f : ContMDiffMap I I' X Y n} {x} : @DFunLike.coe (of (n := n) X E H I โŸถ of (n := n) Y E' H' I') ((CategoryTheory.forget (MfldCat ๐•œ n)).obj (of (n := n) X E H I)) (fun _ โ†ฆ (CategoryTheory.forget (MfldCat ๐•œ n)).obj (of (n := n) Y E' H' I')) @@ -223,24 +206,21 @@ the definitionally equal function coercion for a `ContMDiffMap I I' X Y n`. -/ instance inhabited : Inhabited (MfldCat ๐•œ n) := โŸจof ๐•œ ๐•œ ๐•œ (modelWithCornersSelf ๐•œ ๐•œ)โŸฉ -/-- Bundle a normed space as a `C^n` manifold without boundary (modeled on itself). -/ +/-- A normed space is a `C^n` manifold (modeled on itself). -/ abbrev ofNormedSpace (n : WithTop โ„•โˆž) (E : Type u) [NormedAddCommGroup E] [NormedSpace ๐•œ E] : - MfldCat.{u} ๐•œ n := + MfldCat ๐•œ n := of E E E (modelWithCornersSelf ๐•œ E) -/-- `MfldCat ๐•œ n` has a forgetful functor to `TopCat`, sending a manifold to its underlying -topological space and a `C^n` map to its underlying continuous map. -/ -instance : HasForgetโ‚‚ (MfldCat.{u} ๐•œ n) TopCat.{u} where +/-- `MfldCat ๐•œ n` has a forgetful functor to `TopCat`. -/ +instance : HasForgetโ‚‚ (MfldCat ๐•œ n) TopCat.{u} where forgetโ‚‚.obj M := TopCat.of M forgetโ‚‚.map f := TopCat.ofHom โŸจf.hom, f.hom.contMDiff.continuousโŸฉ --- TODO: define a functor `FGModuleCat ๐•œ โฅค MfldCat ๐•œ n` from the category of --- finite-dimensional `๐•œ`-vector spaces. Requires `[CompleteSpace ๐•œ]` and a choice of norm on each --- object (e.g. via `Module.finBasis ๐•œ V` transporting the norm from `EuclideanSpace ๐•œ (Fin _)`). +-- TODO: define a functor `FGModuleCat ๐•œ โฅค MfldCat ๐•œ n`. /-- Any diffeomorphism induces an isomorphism in `MfldCat`. -/ @[simps] -def isoOfDiffeomorph {M N : MfldCat.{u} ๐•œ n} (f : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N) : M โ‰… N where +def isoOfDiffeomorph {M N : MfldCat.{u, v} ๐•œ n} (f : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N) : M โ‰… N where hom := ofHom f.toContMDiffMap inv := ofHom f.symm.toContMDiffMap hom_inv_id := by ext x; exact f.left_inv x @@ -248,7 +228,7 @@ def isoOfDiffeomorph {M N : MfldCat.{u} ๐•œ n} (f : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N) /-- Any isomorphism in `MfldCat` induces a diffeomorphism. -/ @[simps] -def diffeomorphOfIso {M N : MfldCat.{u} ๐•œ n} (f : M โ‰… N) : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N where +def diffeomorphOfIso {M N : MfldCat.{u, v} ๐•œ n} (f : M โ‰… N) : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N where toFun := f.hom invFun := f.inv left_inv _ := by simp @@ -257,23 +237,23 @@ def diffeomorphOfIso {M N : MfldCat.{u} ๐•œ n} (f : M โ‰… N) : M โ‰ƒโ‚˜^nโŸฎM.I contMDiff_invFun := f.inv.hom.contMDiff @[simp] -theorem of_isoOfDiffeomorph {M N : MfldCat.{u} ๐•œ n} (f : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N) : +theorem of_isoOfDiffeomorph {M N : MfldCat ๐•œ n} (f : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N) : diffeomorphOfIso (isoOfDiffeomorph f) = f := by ext rfl @[simp] -theorem of_diffeomorphOfIso {M N : MfldCat.{u} ๐•œ n} (f : M โ‰… N) : +theorem of_diffeomorphOfIso {M N : MfldCat ๐•œ n} (f : M โ‰… N) : isoOfDiffeomorph (diffeomorphOfIso f) = f := by ext rfl /-- The constant morphism `M โŸถ N` in `MfldCat` given by `y : N`. -/ -def const {M N : MfldCat.{u} ๐•œ n} (y : N) : M โŸถ N := +def const {M N : MfldCat.{u, v} ๐•œ n} (y : N) : M โŸถ N := ofHom โŸจfun _ โ†ฆ y, contMDiff_constโŸฉ @[simp] -lemma const_apply {M N : MfldCat.{u} ๐•œ n} (y : N) (x : M) : +lemma const_apply {M N : MfldCat ๐•œ n} (y : N) (x : M) : const y x = y := rfl section TangentFunctor From 8a35dc63ae579d081c189394ae8824841749123e Mon Sep 17 00:00:00 2001 From: Jack McCarthy <37917934+Deicyde@users.noreply.github.com> Date: Sun, 19 Apr 2026 06:06:24 -0400 Subject: [PATCH 05/10] Added universe polymorphism for tangentFunctor. --- .../Manifold/Category/MfldCat/Basic.lean | 60 +++++++++---------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean index 4e110573d642f0..e2c38e67ef9fec 100644 --- a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean @@ -5,6 +5,7 @@ Authors: Jack McCarthy -/ module +public import Mathlib.Geometry.Manifold.ContMDiffMFDeriv public import Mathlib.Geometry.Manifold.Diffeomorph public import Mathlib.Topology.Category.TopCat.Basic @@ -28,22 +29,18 @@ set_option autoImplicit false open CategoryTheory open scoped Manifold -/- Implementation note: `carrier`, `E`, `H`, and `I` all live in the same `Type u`. This assumption -is essential (?) to differential geometry because we wish to compare the linear model -(`E`, `H`, `I`) with the manifold itself. E.g. the tangent bundle should also be a manifold. -The field `๐•œ` lives in a seperate `Type v`, according to the convention of `ModuleCat` -/ -universe u v +universe uโ‚ uโ‚‚ uโ‚ƒ uโ‚„ /-- The category of `C^n` ๐•œ-manifolds. -/ -structure MfldCat (๐•œ : Type v) [NontriviallyNormedField ๐•œ] (n : WithTop โ„•โˆž) where +structure MfldCat (๐•œ : Type uโ‚) [NontriviallyNormedField ๐•œ] (n : WithTop โ„•โˆž) where /-- The object in `MfldCat` associated to a type equipped with the appropriate typeclasses. -/ of :: /-- The underlying type. -/ - carrier : Type u + carrier : Type uโ‚‚ /-- The model normed space. -/ - E : Type u + E : Type uโ‚ƒ /-- The chart space. -/ - H : Type u + H : Type uโ‚„ [instNAG : NormedAddCommGroup E] [instNS : NormedSpace ๐•œ E] [instTopH : TopologicalSpace H] @@ -72,8 +69,8 @@ initialize_simps_projections MfldCat namespace MfldCat -variable {๐•œ : Type v} [NontriviallyNormedField ๐•œ] {n : WithTop โ„•โˆž} - {X Y Z : Type u} {E E' E'' : Type u} {H H' H'' : Type u} +variable {๐•œ : Type uโ‚} [NontriviallyNormedField ๐•œ] {n : WithTop โ„•โˆž} + {X Y Z : Type uโ‚‚} {E E' E'' : Type uโ‚ƒ} {H H' H'' : Type uโ‚„} [NormedAddCommGroup E] [NormedSpace ๐•œ E] [TopologicalSpace H] [NormedAddCommGroup E'] [NormedSpace ๐•œ E'] [TopologicalSpace H'] [NormedAddCommGroup E''] [NormedSpace ๐•œ E''] [TopologicalSpace H''] @@ -83,41 +80,41 @@ variable {๐•œ : Type v} [NontriviallyNormedField ๐•œ] {n : WithTop โ„•โˆž} [TopologicalSpace Y] [ChartedSpace H' Y] [IsManifold I' n Y] [TopologicalSpace Z] [ChartedSpace H'' Z] [IsManifold I'' n Z] -instance : CoeSort (MfldCat ๐•œ n) (Type u) := โŸจMfldCat.carrierโŸฉ +instance : CoeSort (MfldCat ๐•œ n) (Type uโ‚‚) := โŸจMfldCat.carrierโŸฉ attribute [coe] MfldCat.carrier variable (X E H I) in -lemma coe_of : (of (n := n) X E H I : Type u) = X := rfl +lemma coe_of : (of (n := n) X E H I : Type uโ‚‚) = X := rfl -lemma of_carrier (M : MfldCat.{u, v} ๐•œ n) : of (n := n) M.carrier M.E M.H M.I = M := rfl +lemma of_carrier (M : MfldCat ๐•œ n) : of (n := n) M.carrier M.E M.H M.I = M := rfl /-- The type of morphisms in `MfldCat`. -/ @[ext] -structure Hom (M N : MfldCat.{u, v} ๐•œ n) where +structure Hom (M N : MfldCat.{uโ‚, uโ‚‚, uโ‚ƒ, uโ‚„} ๐•œ n) where /-- The underlying `C^n` map. -/ hom' : ContMDiffMap M.I N.I M N n -instance : Category (MfldCat.{u, v} ๐•œ n) where +instance : Category (MfldCat ๐•œ n) where Hom M N := Hom M N id M := โŸจContMDiffMap.idโŸฉ comp f g := โŸจg.hom'.comp f.hom'โŸฉ -instance : ConcreteCategory.{u} (MfldCat.{u, v} ๐•œ n) +instance : ConcreteCategory (MfldCat ๐•œ n) (fun M N => ContMDiffMap M.I N.I M N n) where hom f := f.hom' ofHom f := โŸจfโŸฉ /-- Turn a morphism in `MfldCat` back into a `ContMDiffMap`. -/ -abbrev Hom.hom {M N : MfldCat.{u, v} ๐•œ n} (f : Hom M N) := - ConcreteCategory.hom (C := MfldCat.{u, v} ๐•œ n) f +abbrev Hom.hom {M N : MfldCat ๐•œ n} (f : Hom M N) := + ConcreteCategory.hom (C := MfldCat ๐•œ n) f /-- Typecheck a `ContMDiffMap` as a morphism in `MfldCat`. -/ abbrev ofHom (f : ContMDiffMap I I' X Y n) : of (n := n) X E H I โŸถ of (n := n) Y E' H' I' := - ConcreteCategory.ofHom (C := MfldCat.{u, v} ๐•œ n) f + ConcreteCategory.ofHom (C := MfldCat ๐•œ n) f /-- Use the `ConcreteCategory.hom` projection for `@[simps]` lemmas. -/ -def Hom.Simps.hom (M N : MfldCat.{u, v} ๐•œ n) (f : Hom M N) := +def Hom.Simps.hom (M N : MfldCat ๐•œ n) (f : Hom M N) := f.hom initialize_simps_projections Hom (hom' โ†’ hom) @@ -185,7 +182,7 @@ end ofHom /-- Morphisms in `MfldCat` are equivalent to `ContMDiffMap`s. -/ @[simps] -def Hom.equivContMDiffMap (M N : MfldCat.{u, v} ๐•œ n) : +def Hom.equivContMDiffMap (M N : MfldCat ๐•œ n) : (M โŸถ N) โ‰ƒ ContMDiffMap M.I N.I M N n where toFun f := f.hom invFun f := ofHom f @@ -207,12 +204,12 @@ instance inhabited : Inhabited (MfldCat ๐•œ n) := โŸจof ๐•œ ๐•œ ๐•œ (modelWithCornersSelf ๐•œ ๐•œ)โŸฉ /-- A normed space is a `C^n` manifold (modeled on itself). -/ -abbrev ofNormedSpace (n : WithTop โ„•โˆž) (E : Type u) [NormedAddCommGroup E] [NormedSpace ๐•œ E] : +abbrev ofNormedSpace (n : WithTop โ„•โˆž) (E : Type uโ‚ƒ) [NormedAddCommGroup E] [NormedSpace ๐•œ E] : MfldCat ๐•œ n := of E E E (modelWithCornersSelf ๐•œ E) /-- `MfldCat ๐•œ n` has a forgetful functor to `TopCat`. -/ -instance : HasForgetโ‚‚ (MfldCat ๐•œ n) TopCat.{u} where +instance : HasForgetโ‚‚ (MfldCat ๐•œ n) TopCat.{uโ‚‚} where forgetโ‚‚.obj M := TopCat.of M forgetโ‚‚.map f := TopCat.ofHom โŸจf.hom, f.hom.contMDiff.continuousโŸฉ @@ -220,7 +217,7 @@ instance : HasForgetโ‚‚ (MfldCat ๐•œ n) TopCat.{u} where /-- Any diffeomorphism induces an isomorphism in `MfldCat`. -/ @[simps] -def isoOfDiffeomorph {M N : MfldCat.{u, v} ๐•œ n} (f : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N) : M โ‰… N where +def isoOfDiffeomorph {M N : MfldCat ๐•œ n} (f : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N) : M โ‰… N where hom := ofHom f.toContMDiffMap inv := ofHom f.symm.toContMDiffMap hom_inv_id := by ext x; exact f.left_inv x @@ -228,7 +225,7 @@ def isoOfDiffeomorph {M N : MfldCat.{u, v} ๐•œ n} (f : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ /-- Any isomorphism in `MfldCat` induces a diffeomorphism. -/ @[simps] -def diffeomorphOfIso {M N : MfldCat.{u, v} ๐•œ n} (f : M โ‰… N) : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N where +def diffeomorphOfIso {M N : MfldCat ๐•œ n} (f : M โ‰… N) : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N where toFun := f.hom invFun := f.inv left_inv _ := by simp @@ -249,7 +246,7 @@ theorem of_diffeomorphOfIso {M N : MfldCat ๐•œ n} (f : M โ‰… N) : rfl /-- The constant morphism `M โŸถ N` in `MfldCat` given by `y : N`. -/ -def const {M N : MfldCat.{u, v} ๐•œ n} (y : N) : M โŸถ N := +def const {M N : MfldCat ๐•œ n} (y : N) : M โŸถ N := ofHom โŸจfun _ โ†ฆ y, contMDiff_constโŸฉ @[simp] @@ -258,21 +255,22 @@ lemma const_apply {M N : MfldCat ๐•œ n} (y : N) (x : M) : section TangentFunctor -variable (M : MfldCat.{u} ๐•œ (n + 1)) +variable (M : MfldCat ๐•œ (n + 1)) local instance : IsManifold M.I 1 M := IsManifold.of_le (n := n + 1) le_add_self local instance : IsManifold M.I n M := IsManifold.of_le (n := n + 1) le_self_add -- This implies `TangentBundle M.I M` is a manifold by `Bundle.TotalSpace.isManifold` -local instance : ContMDiffVectorBundle n M.E (TangentSpace M.I : M โ†’ Type u) M.I := +local instance : ContMDiffVectorBundle n M.E (TangentSpace M.I : M โ†’ Type uโ‚ƒ) M.I := TangentBundle.contMDiffVectorBundle /-- The tangent functor `MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n` -- Sends a `C^(n+1)` manifold to its tangent bundle; Sends a `C^(n+1)` map to it's pushforward. -/ -noncomputable def tangentFunctor : MfldCat.{u} ๐•œ (n + 1) โฅค MfldCat.{u} ๐•œ n where +noncomputable def tangentFunctor : + MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n where obj M := of (TangentBundle M.I M) (M.E ร— M.E) (ModelProd M.H M.E) M.I.tangent map {M N} f := - ofHom โŸจtangentMap M.I N.I f.hom, f.hom.contMDiff.contMDiff_tangentMap le_rflโŸฉ + ofHom โŸจtangentMap M.I N.I f.hom, ContMDiff.contMDiff_tangentMap f.hom.contMDiff le_rflโŸฉ map_id _ := Hom.ext <| Subtype.ext tangentMap_id map_comp f g := Hom.ext <| Subtype.ext <| tangentMap_comp (g.hom.contMDiff.mdifferentiable (by simp)) From 7d4554639d536c95b0b0e0656a6e846283991acd Mon Sep 17 00:00:00 2001 From: Jack McCarthy <37917934+Deicyde@users.noreply.github.com> Date: Sun, 19 Apr 2026 19:34:42 -0400 Subject: [PATCH 06/10] Pulled out the Tangent Functor into a seperate file. --- Mathlib.lean | 1 + .../Manifold/Category/MfldCat/Basic.lean | 25 --------- .../Category/MfldCat/TangentFunctor.lean | 51 +++++++++++++++++++ 3 files changed, 52 insertions(+), 25 deletions(-) create mode 100644 Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean diff --git a/Mathlib.lean b/Mathlib.lean index 212f0cd349b9a8..d2bbd7576603de 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -4481,6 +4481,7 @@ public import Mathlib.Geometry.Manifold.Algebra.Structures public import Mathlib.Geometry.Manifold.Bordism public import Mathlib.Geometry.Manifold.BumpFunction public import Mathlib.Geometry.Manifold.Category.MfldCat.Basic +public import Mathlib.Geometry.Manifold.Category.MfldCat.TangentFunctor public import Mathlib.Geometry.Manifold.ChartedSpace public import Mathlib.Geometry.Manifold.Complex public import Mathlib.Geometry.Manifold.ConformalGroupoid diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean index e2c38e67ef9fec..d65101e3f0d166 100644 --- a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean @@ -253,29 +253,4 @@ def const {M N : MfldCat ๐•œ n} (y : N) : M โŸถ N := lemma const_apply {M N : MfldCat ๐•œ n} (y : N) (x : M) : const y x = y := rfl -section TangentFunctor - -variable (M : MfldCat ๐•œ (n + 1)) - -local instance : IsManifold M.I 1 M := IsManifold.of_le (n := n + 1) le_add_self -local instance : IsManifold M.I n M := IsManifold.of_le (n := n + 1) le_self_add --- This implies `TangentBundle M.I M` is a manifold by `Bundle.TotalSpace.isManifold` -local instance : ContMDiffVectorBundle n M.E (TangentSpace M.I : M โ†’ Type uโ‚ƒ) M.I := - TangentBundle.contMDiffVectorBundle - - -/-- The tangent functor `MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n` -- Sends a `C^(n+1)` manifold to its -tangent bundle; Sends a `C^(n+1)` map to it's pushforward. -/ -noncomputable def tangentFunctor : - MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n where - obj M := of (TangentBundle M.I M) (M.E ร— M.E) (ModelProd M.H M.E) M.I.tangent - map {M N} f := - ofHom โŸจtangentMap M.I N.I f.hom, ContMDiff.contMDiff_tangentMap f.hom.contMDiff le_rflโŸฉ - map_id _ := Hom.ext <| Subtype.ext tangentMap_id - map_comp f g := Hom.ext <| Subtype.ext <| tangentMap_comp - (g.hom.contMDiff.mdifferentiable (by simp)) - (f.hom.contMDiff.mdifferentiable (by simp)) - -end TangentFunctor - end MfldCat diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean new file mode 100644 index 00000000000000..c7a3f791a11570 --- /dev/null +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean @@ -0,0 +1,51 @@ +/- +Copyright (c) 2026 Jack McCarthy. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jack McCarthy +-/ +module + +public import Mathlib.Geometry.Manifold.Category.MfldCat.Basic +public import Mathlib.Geometry.Manifold.ContMDiffMFDeriv + +/-! +# The tangent functor on `MfldCat` + +We define the tangent functor `MfldCat.tangentFunctor : MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n`, sending a +`C^(n+1)` manifold to its tangent bundle and a `C^(n+1)` map to its pushforward (tangent map). +-/ + +@[expose] public section + +set_option autoImplicit false + +open CategoryTheory +open scoped Manifold + +universe uโ‚ uโ‚‚ uโ‚ƒ uโ‚„ + +namespace MfldCat + +variable {๐•œ : Type uโ‚} [NontriviallyNormedField ๐•œ] {n : WithTop โ„•โˆž} + +variable (M : MfldCat.{uโ‚, uโ‚‚, uโ‚ƒ, uโ‚„} ๐•œ (n + 1)) + +local instance : IsManifold M.I 1 M := IsManifold.of_le (n := n + 1) le_add_self +local instance : IsManifold M.I n M := IsManifold.of_le (n := n + 1) le_self_add +/- This implies `TangentBundle M.I M` is a manifold by `Bundle.TotalSpace.isManifold`. -/ +local instance : ContMDiffVectorBundle n M.E (TangentSpace M.I : M โ†’ Type uโ‚ƒ) M.I := + TangentBundle.contMDiffVectorBundle + +/-- The tangent functor `MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n` sends a `C^(n+1)` manifold to its +tangent bundle and a `C^(n+1)` map to its pushforward (tangent map). -/ +noncomputable def tangentFunctor : + MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n where + obj M := of (TangentBundle M.I M) (M.E ร— M.E) (ModelProd M.H M.E) M.I.tangent + map {M N} f := + ofHom โŸจtangentMap M.I N.I f.hom, ContMDiff.contMDiff_tangentMap f.hom.contMDiff le_rflโŸฉ + map_id _ := Hom.ext <| Subtype.ext tangentMap_id + map_comp f g := Hom.ext <| Subtype.ext <| tangentMap_comp + (g.hom.contMDiff.mdifferentiable (by simp)) + (f.hom.contMDiff.mdifferentiable (by simp)) + +end MfldCat From 3d9fc8591c1174ee40e4e2b09db901604c409b19 Mon Sep 17 00:00:00 2001 From: Jack McCarthy <37917934+Deicyde@users.noreply.github.com> Date: Sun, 19 Apr 2026 21:20:54 -0400 Subject: [PATCH 07/10] Clean up --- .../Manifold/Category/MfldCat/TangentFunctor.lean | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean index c7a3f791a11570..d20cb0ec9c6091 100644 --- a/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean @@ -17,8 +17,6 @@ We define the tangent functor `MfldCat.tangentFunctor : MfldCat ๐•œ (n + 1) โฅค @[expose] public section -set_option autoImplicit false - open CategoryTheory open scoped Manifold @@ -32,12 +30,11 @@ variable (M : MfldCat.{uโ‚, uโ‚‚, uโ‚ƒ, uโ‚„} ๐•œ (n + 1)) local instance : IsManifold M.I 1 M := IsManifold.of_le (n := n + 1) le_add_self local instance : IsManifold M.I n M := IsManifold.of_le (n := n + 1) le_self_add -/- This implies `TangentBundle M.I M` is a manifold by `Bundle.TotalSpace.isManifold`. -/ local instance : ContMDiffVectorBundle n M.E (TangentSpace M.I : M โ†’ Type uโ‚ƒ) M.I := TangentBundle.contMDiffVectorBundle +-- The above instance implies `TangentBundle M.I M` is a manifold by `Bundle.TotalSpace.isManifold`. -/-- The tangent functor `MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n` sends a `C^(n+1)` manifold to its -tangent bundle and a `C^(n+1)` map to its pushforward (tangent map). -/ +/-- Sends a `C^(n+1)` manifold to its tangent bundle and a `C^(n+1)` map to its `TangentMap`. -/ noncomputable def tangentFunctor : MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n where obj M := of (TangentBundle M.I M) (M.E ร— M.E) (ModelProd M.H M.E) M.I.tangent @@ -45,7 +42,7 @@ noncomputable def tangentFunctor : ofHom โŸจtangentMap M.I N.I f.hom, ContMDiff.contMDiff_tangentMap f.hom.contMDiff le_rflโŸฉ map_id _ := Hom.ext <| Subtype.ext tangentMap_id map_comp f g := Hom.ext <| Subtype.ext <| tangentMap_comp - (g.hom.contMDiff.mdifferentiable (by simp)) - (f.hom.contMDiff.mdifferentiable (by simp)) + (g.hom.contMDiff.mdifferentiable (by positivity)) + (f.hom.contMDiff.mdifferentiable (by positivity)) end MfldCat From 10b255fef31a7543926cbc265981320c8ef76ec7 Mon Sep 17 00:00:00 2001 From: Jack McCarthy <37917934+Deicyde@users.noreply.github.com> Date: Sun, 19 Apr 2026 21:26:45 -0400 Subject: [PATCH 08/10] Typo --- .../Geometry/Manifold/Category/MfldCat/TangentFunctor.lean | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean index d20cb0ec9c6091..5f88dd859512b1 100644 --- a/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean @@ -12,7 +12,7 @@ public import Mathlib.Geometry.Manifold.ContMDiffMFDeriv # The tangent functor on `MfldCat` We define the tangent functor `MfldCat.tangentFunctor : MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n`, sending a -`C^(n+1)` manifold to its tangent bundle and a `C^(n+1)` map to its pushforward (tangent map). +`C^(n+1)` manifold to its tangent bundle and a `C^(n+1)` map to its pushforward `tangentMap`. -/ @[expose] public section @@ -34,7 +34,7 @@ local instance : ContMDiffVectorBundle n M.E (TangentSpace M.I : M โ†’ Type uโ‚ƒ TangentBundle.contMDiffVectorBundle -- The above instance implies `TangentBundle M.I M` is a manifold by `Bundle.TotalSpace.isManifold`. -/-- Sends a `C^(n+1)` manifold to its tangent bundle and a `C^(n+1)` map to its `TangentMap`. -/ +/-- Sends a `C^(n+1)` manifold to its tangent bundle and a `C^(n+1)` map to its `tangentMap`. -/ noncomputable def tangentFunctor : MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n where obj M := of (TangentBundle M.I M) (M.E ร— M.E) (ModelProd M.H M.E) M.I.tangent From 1f71b8c9264d91708fd5972a7c2237fe2b63eeec Mon Sep 17 00:00:00 2001 From: Jack McCarthy <37917934+Deicyde@users.noreply.github.com> Date: Sun, 19 Apr 2026 21:33:40 -0400 Subject: [PATCH 09/10] Added John Lee reference --- Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean index 5f88dd859512b1..a2d894aa5ec504 100644 --- a/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/TangentFunctor.lean @@ -13,6 +13,9 @@ public import Mathlib.Geometry.Manifold.ContMDiffMFDeriv We define the tangent functor `MfldCat.tangentFunctor : MfldCat ๐•œ (n + 1) โฅค MfldCat ๐•œ n`, sending a `C^(n+1)` manifold to its tangent bundle and a `C^(n+1)` map to its pushforward `tangentMap`. + +## References +* [J. M. Lee, *Introduction to Smooth Manifolds*][lee2012] (2nd Edition, p. 75) -/ @[expose] public section From a491fa46ff143f39665d472cc5460bf8724497e8 Mon Sep 17 00:00:00 2001 From: Jack McCarthy <37917934+Deicyde@users.noreply.github.com> Date: Sun, 19 Apr 2026 21:49:09 -0400 Subject: [PATCH 10/10] Added nolint checkUnivs --- Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean | 1 + 1 file changed, 1 insertion(+) diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean index d65101e3f0d166..de10c10dc1b37d 100644 --- a/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean @@ -32,6 +32,7 @@ open scoped Manifold universe uโ‚ uโ‚‚ uโ‚ƒ uโ‚„ /-- The category of `C^n` ๐•œ-manifolds. -/ +@[pp_with_univ, nolint checkUnivs] structure MfldCat (๐•œ : Type uโ‚) [NontriviallyNormedField ๐•œ] (n : WithTop โ„•โˆž) where /-- The object in `MfldCat` associated to a type equipped with the appropriate typeclasses. -/ of ::