diff --git a/Mathlib.lean b/Mathlib.lean index 4126812cdba773..0e3a8cad35c394 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -4482,6 +4482,8 @@ 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.Category.MfldCat.CartesianMonoidal 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..5a94de71cf9332 --- /dev/null +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/Basic.lean @@ -0,0 +1,213 @@ +/- +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.Diffeomorph +public import Mathlib.Topology.Category.TopCat.Basic + +/-! +# The category of $C^n$ manifolds + +We introduce the category `MfldCat ๐•œ n` of `C^n` manifolds over a field `๐•œ`. Each object bundles the +underlying manifold together with its model vector space `E`, model 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 `๐•œ`. + +# Implementation Notes +* We do not assume `[FiniteDimensional ๐•œ E] [T2Space M] [SigmaCompactSpace M]`, so this category + includes non-Hausdorff, non-paracompact, and infite-dimensional manifolds. +* We keep `E`, `H` and `carrier` all in the same `Type u`; `๐•œ` is given a seperate `Type v`. + +# Future Work +* Define a functor `FGModuleCat ๐•œ โฅค MfldCat ๐•œ n`. +-/ + +@[expose] public section + +open CategoryTheory +open scoped Manifold ContDiff + +universe u v + +/-- The category of `C^n` ๐•œ-manifolds. -/ +structure MfldCat (๐•œ : Type v) [NontriviallyNormedField ๐•œ] (n : โ„•โˆžฯ‰) 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 + [instNormedAddCommGroup : NormedAddCommGroup E] + [instNormedSpace : NormedSpace ๐•œ E] + [instTopologicalSpaceH : TopologicalSpace H] + /-- The model with corners. -/ + I : ModelWithCorners ๐•œ E H + [instTopologicalSpace : TopologicalSpace carrier] + [instChartedSpace : ChartedSpace H carrier] + [instIsManifold : 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.instNormedAddCommGroup MfldCat.instNormedSpace + MfldCat.instTopologicalSpaceH MfldCat.instTopologicalSpace + MfldCat.instChartedSpace MfldCat.instIsManifold + +initialize_simps_projections MfldCat + (-instNormedAddCommGroup, -instNormedSpace, -instTopologicalSpaceH, -instTopologicalSpace, + -instChartedSpace, -instIsManifold) + +namespace MfldCat + +variable {๐•œ : Type v} [NontriviallyNormedField ๐•œ] {n : โ„•โˆžฯ‰} + {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 + +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 ๐•œ 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 + private mk :: + /-- The underlying `C^n` map. -/ + hom' : ContMDiffMap M.I N.I M N n + +set_option backward.privateInPublic true in +set_option backward.privateInPublic.warn false in +instance : Category (MfldCat ๐•œ n) where + Hom M N := Hom M N + id M := โŸจContMDiffMap.idโŸฉ + comp f g := โŸจg.hom'.comp f.hom'โŸฉ + +set_option backward.privateInPublic true in +set_option backward.privateInPublic.warn false in +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 ๐•œ 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 ๐•œ n) f + +/-- Use the `ConcreteCategory.hom` projection for `@[simps]` lemmas. -/ +def Hom.Simps.hom (M N : MfldCat.{u, v} ๐•œ 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] +lemma hom_comp {M N P : MfldCat ๐•œ n} (f : M โŸถ N) (g : N โŸถ P) : + (f โ‰ซ g).hom = g.hom.comp f.hom := rfl + + +section ofHom + +@[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 + +end ofHom + +instance inhabited : Inhabited (MfldCat ๐•œ n) := + โŸจof ๐•œ ๐•œ ๐•œ (modelWithCornersSelf ๐•œ ๐•œ)โŸฉ + +/-- A normed space is a `C^n` manifold (modeled on itself). -/ +abbrev ofNormedSpace (n : โ„•โˆžฯ‰) (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 + forgetโ‚‚.obj M := TopCat.of M + forgetโ‚‚.map f := TopCat.ofHom โŸจf.hom, f.hom.contMDiff.continuousโŸฉ + +/-- Any diffeomorphism induces an isomorphism in `MfldCat`. -/ +@[simps] +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 + +/-- Any isomorphism in `MfldCat` induces a diffeomorphism. -/ +@[simps] +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 + right_inv _ := by simp + contMDiff_toFun := f.hom.hom.contMDiff + contMDiff_invFun := f.inv.hom.contMDiff + +@[simp] +theorem of_isoOfDiffeomorph {M N : MfldCat ๐•œ n} (f : M โ‰ƒโ‚˜^nโŸฎM.I, N.IโŸฏ N) : + diffeomorphOfIso (isoOfDiffeomorph f) = f := + rfl + +@[simp] +theorem of_diffeomorphOfIso {M N : MfldCat ๐•œ n} (f : M โ‰… N) : + isoOfDiffeomorph (diffeomorphOfIso f) = f := + rfl + +/-- The constant morphism `M โŸถ N` in `MfldCat` given by `y : N`. -/ +def const {M N : MfldCat ๐•œ n} (y : N) : M โŸถ N := + ofHom <| ContMDiffMap.const y + +@[simp] +lemma const_apply {M N : MfldCat ๐•œ n} (y : N) (x : M) : + const y x = y := rfl + +end MfldCat diff --git a/Mathlib/Geometry/Manifold/Category/MfldCat/CartesianMonoidal.lean b/Mathlib/Geometry/Manifold/Category/MfldCat/CartesianMonoidal.lean new file mode 100644 index 00000000000000..8fe3b75c3eb823 --- /dev/null +++ b/Mathlib/Geometry/Manifold/Category/MfldCat/CartesianMonoidal.lean @@ -0,0 +1,56 @@ +/- +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.CategoryTheory.Monoidal.Cartesian.Basic + +/-! +# Cartesian monoidal structure on `MfldCat` + +We endow `MfldCat ๐•œ n` with its cartesian monoidal structure: the monoidal product is the +product manifold, and the unit is `PUnit`, viewed as a zero-dimensional `๐•œ`-manifold. +We also derive the induced braided category structure. + +## Implementation notes + +We use `PUnit.{u + 1}` (rather than `Fin 0 โ†’ ๐•œ`, which lives in `๐•œ`'s universe) for the unit +object so that it exists in `MfldCat.{u} ๐•œ n` for any universe of `๐•œ`. +-/ + +@[expose] public section + +open CategoryTheory Limits MonoidalCategory +open scoped Manifold ContDiff + +universe u v + +namespace MfldCat + +variable {๐•œ : Type v} [NontriviallyNormedField ๐•œ] {n : โ„•โˆžฯ‰} + +/-- Limit data for a binary product in `MfldCat`, using the product manifold `M ร— N`. -/ +@[simps! cone_pt isLimit_lift] +def binaryProductLimitCone (M N : MfldCat.{u} ๐•œ n) : LimitCone (pair M N) where + cone := BinaryFan.mk (ofHom .fst) (ofHom .snd) + isLimit := BinaryFan.IsLimit.mk _ (fun l r => ofHom (l.hom.prodMk r.hom)) + (fun _ _ => rfl) (fun _ _ => rfl) (by cat_disch) + +/-- We choose `MfldCat.of (M โจฏ N) (M.E ร— N.E) (ModelProd M.H N.H) (M.I.prod N.I)` as product of `M` +and `N`, and `ofNormedSpace n PUnit` as the terminal object. -/ +noncomputable instance cartesianMonoidalCategory : + CartesianMonoidalCategory (MfldCat.{u} ๐•œ n) := + .ofChosenFiniteProducts + โŸจ_, IsTerminal.ofUniqueHom (Y := ofNormedSpace n PUnit.{u + 1}) + (fun _ => const PUnit.unit) (fun _ _ => by ext)โŸฉ + binaryProductLimitCone + +noncomputable instance : BraidedCategory (MfldCat.{u} ๐•œ n) := .ofCartesianMonoidalCategory + +theorem tensorObj_eq (M N : MfldCat.{u} ๐•œ n) : + (M โŠ— N) = of (M ร— N) (M.E ร— N.E) (ModelProd M.H N.H) (M.I.prod N.I) := rfl + +end MfldCat 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โŸฉโŸฉ