module Cat.Displayed.Functor where
Displayed and fibred functorsπ
If you have a pair of categories displayed over a common base category it makes immediate sense to talk about functors youβd have an assignment of objects and an assignment of morphisms
which makes sense because lies over just as did, that a morphism is allowed to lie over a morphism But, in the spirit of relativising category theory, it makes more sense to consider functors between categories displayed over different bases, as in
with our displayed functor lying over an ordinary functor to mediate between the bases.
module _ {o β o' β' oβ ββ oβ' ββ'} {A : Precategory o β} {B : Precategory oβ ββ} (β° : Displayed A o' β') (β± : Displayed B oβ' ββ') (F : Functor A B) where private module F = Functor F module A = CR A module B = CR B module β° = Displayed β° module β± = Displayed β± lvl : Level lvl = o β o' β oβ' β β β β' β ββ'
record Displayed-functor : Type lvl where no-eta-equality field Fβ' : β {x} (o : β°.Ob[ x ]) β β±.Ob[ F.β x ] Fβ' : β {a b} {f : A.Hom a b} {a' b'} β β°.Hom[ f ] a' b' β β±.Hom[ F.β f ] (Fβ' a') (Fβ' b')
In order to state the displayed functoriality laws, we require functoriality for our mediating functor Functors between categories displayed over the same base can be recovered as the βvertical displayed functorsβ, i.e., those lying over the identity functor.
F-id' : β {x} {o : β°.Ob[ x ]} β PathP (Ξ» i β β±.Hom[ F.F-id i ] (Fβ' o) (Fβ' o)) (Fβ' β°.id') β±.id' F-β' : β {a b c} {f : A.Hom b c} {g : A.Hom a b} {a' b' c'} {f' : β°.Hom[ f ] b' c'} {g' : β°.Hom[ g ] a' b'} β PathP (Ξ» i β β±.Hom[ F.F-β f g i ] (Fβ' a') (Fβ' c')) (Fβ' (f' β°.β' g')) (Fβ' f' β±.β' Fβ' g') β' = Fβ' β' = Fβ'
Note that, if and are fibred categories over their bases (rather than just displayed categories), then the appropriate notion of 1-cell are displayed functors that take Cartesian morphisms to Cartesian morphisms:
module _ {o β o' β' oβ ββ oβ' ββ'} {A : Precategory o β} {B : Precategory oβ ββ} {β° : Displayed A o' β'} {β± : Displayed B oβ' ββ'} {F : Functor A B} where private module F = Functor F module A = CR A module B = CR B module β° = Displayed β° module β± = Displayed β± lvl : Level lvl = o β o' β oβ' β β β β' β ββ'
is-fibred-functor : Displayed-functor β° β± F β Type _ is-fibred-functor F' = β {a b a' b'} {f : A.Hom a b} (f' : β°.Hom[ f ] a' b') β is-cartesian β° f f' β is-cartesian β± (F.β f) (Fβ' f') where open Displayed-functor F'
module _ {o β o' β' oβ ββ oβ' ββ'} {A : Precategory o β} {B : Precategory oβ ββ} (β° : Displayed A o' β') (β± : Displayed B oβ' ββ') (F : Functor A B) where private module F = Functor F module A = CR A module B = CR B module β° = Displayed β° module β± = Displayed β± lvl : Level lvl = o β o' β oβ' β β β β' β ββ'
record Fibred-functor : Type (lvl β oβ β ββ) where no-eta-equality field disp : Displayed-functor β° β± F F-cartesian : is-fibred-functor disp open Displayed-functor disp public
One can also define the composition of displayed functors, which lies over the composition of the underlying functors.
module _ {oa βa ob βb oc βc oe βe of βf oh βh} {A : Precategory oa βa} {B : Precategory ob βb} {C : Precategory oc βc} {β° : Displayed A oe βe} {β± : Displayed B of βf} {β : Displayed C oh βh} {F : Functor B C} {G : Functor A B} where private module A = Precategory A module B = Precategory B module β° = Displayed β° module β± = Displayed β± module β = Displayed β module F = Functor F module G = Functor G open DR β open Displayed-functor infixr 30 _Fβ'_
_Fβ'_ : Displayed-functor β± β F β Displayed-functor β° β± G β Displayed-functor β° β (F Fβ G) (F' Fβ' G') .Fβ' x = F' .Fβ' (G' .Fβ' x) (F' Fβ' G') .Fβ' f = F' .Fβ' (G' .Fβ' f) (F' Fβ' G') .F-id' = to-pathp $ hom[] (F' .Fβ' (G' .Fβ' β°.id')) β‘β¨ reindex _ _ β sym (hom[]-β (ap F.Fβ G.F-id) F.F-id) β©β‘ hom[] (hom[] (F' .Fβ' (G' .Fβ' β°.id'))) β‘β¨ ap hom[] (shiftl _ Ξ» i β F' .Fβ' (G' .F-id' i)) β©β‘ hom[] (F' .Fβ' β±.id') β‘β¨ from-pathp (F' .F-id') β©β‘ β.id' β (F' Fβ' G') .F-β' {f = f} {g = g} {f' = f'} {g' = g'} = to-pathp $ hom[] (F' .Fβ' (G' .Fβ' (f' β°.β' g'))) β‘β¨ reindex _ _ β sym (hom[]-β (ap F.Fβ (G.F-β f g)) (F.F-β (G.β f) (G.β g))) β©β‘ hom[] (hom[] (F' .Fβ' (G' .Fβ' (f' β°.β' g')))) β‘β¨ ap hom[] (shiftl _ Ξ» i β F' .Fβ' (G' .F-β' {f' = f'} {g' = g'} i)) β©β‘ hom[] (F' .Fβ' ((G' .Fβ' f') β±.β' (G' .Fβ' g'))) β‘β¨ from-pathp (F' .F-β') β©β‘ F' .Fβ' (G' .Fβ' f') β.β' F' .Fβ' (G' .Fβ' g') β
Furthermore, there is a displayed identity functor that lies over the identity functor.
module _ {ob βb oe βe} {B : Precategory ob βb} {β° : Displayed B oe βe} where open Displayed-functor
Id' : Displayed-functor β° β° Id Id' .Fβ' x = x Id' .Fβ' f = f Id' .F-id' = refl Id' .F-β' = refl
The identity functor is obviously fibred.
Id'-fibred : is-fibred-functor Id' Id'-fibred f cart = cart Idf' : Fibred-functor β° β° Id Idf' .Fibred-functor.disp = Id' Idf' .Fibred-functor.F-cartesian = Id'-fibred
Vertical functorsπ
Functors displayed over the identity functor are of particular interest. Such functors are known as vertical functors, and are commonly used to define fibrewise structure. However, they are somewhat difficult to work with if we define them directly as such, as the composite of two identity functors is not definitionally equal to the identity functor! To avoid this problem, we provide the following specialized definition.
module _ {o β o' β' o'' β''} {B : Precategory o β} (β° : Displayed B o' β') (β± : Displayed B o'' β'') where private module B = Precategory B module β° = Displayed β° module β± = Displayed β±
record Vertical-functor : Type (o β β β o' β β' β o'' β β'') where no-eta-equality field Fβ' : β {x} (o : β°.Ob[ x ]) β β±.Ob[ x ] Fβ' : β {a b} {f : B.Hom a b} {a' b'} β β°.Hom[ f ] a' b' β β±.Hom[ f ] (Fβ' a') (Fβ' b') F-id' : β {x} {o : β°.Ob[ x ]} β PathP ( Ξ» _ β β±.Hom[ B.id ] (Fβ' o) (Fβ' o)) (Fβ' β°.id') β±.id' F-β' : β {a b c} {f : B.Hom b c} {g : B.Hom a b} {a' b' c'} {f' : β°.Hom[ f ] b' c'} {g' : β°.Hom[ g ] a' b'} β PathP (Ξ» _ β β±.Hom[ f B.β g ] (Fβ' a') (Fβ' c')) (Fβ' (f' β°.β' g')) (Fβ' f' β±.β' Fβ' g') β' = Fβ' β' = Fβ'
This definition is equivalent to a displayed functor over the identity functor.
module _ {o β o' β' o'' β''} {B : Precategory o β} {β° : Displayed B o' β'} {β± : Displayed B o'' β''} where private module B = Precategory B module β° = Displayed β° module β± = Displayed β±
Displayed-functorβVertical-functor : Displayed-functor β° β± Id β Vertical-functor β° β± Displayed-functorβVertical-functor F' = V where module F' = Displayed-functor F' open Vertical-functor V : Vertical-functor β° β± V .Fβ' = F'.β' V .Fβ' = F'.β' V .F-id' = F'.F-id' V .F-β' = F'.F-β' Vertical-functorβDisplayed-functor : Vertical-functor β° β± β Displayed-functor β° β± Id Vertical-functorβDisplayed-functor V = F' where module V = Vertical-functor V open Displayed-functor F' : Displayed-functor β° β± Id F' .Fβ' = V.β' F' .Fβ' = V.β' F' .F-id' = V.F-id' F' .F-β' = V.F-β'
We also provide a specialized definition for vertical fibred functors.
is-vertical-fibred : Vertical-functor β° β± β Type _ is-vertical-fibred F' = β {a b a' b'} {f : B.Hom a b} (f' : β°.Hom[ f ] a' b') β is-cartesian β° f f' β is-cartesian β± f (Fβ' f') where open Vertical-functor F'
open Vertical-functor Vertical-functor-path : {F G : Vertical-functor β° β±} β (p0 : β {x} β (x' : β°.Ob[ x ]) β F .Fβ' x' β‘ G .Fβ' x') β (p1 : β {x y x' y'} {f : B.Hom x y} β (f' : β°.Hom[ f ] x' y') β PathP (Ξ» i β β±.Hom[ f ] (p0 x' i) (p0 y' i)) (F .Fβ' f') (G .Fβ' f')) β F β‘ G Vertical-functor-path {F = F} {G = G} p0 p1 i .Fβ' x' = p0 x' i Vertical-functor-path {F = F} {G = G} p0 p1 i .Fβ' f' = p1 f' i Vertical-functor-path {F = F} {G = G} p0 p1 i .F-id' = is-propβpathp (Ξ» i β β±.Hom[ B.id ]-set _ _ (p1 β°.id' i) β±.id') (F .F-id') (G .F-id') i Vertical-functor-path {F = F} {G = G} p0 p1 i .F-β' {f' = f'} {g' = g'} = is-propβpathp (Ξ» i β β±.Hom[ _ ]-set _ _ (p1 (f' β°.β' g') i) (p1 f' i β±.β' p1 g' i)) (F .F-β' {f' = f'} {g' = g'}) (G .F-β' {f' = f'} {g' = g'}) i
module _ {o β o' β' o'' β''} {B : Precategory o β} (β° : Displayed B o' β') (β± : Displayed B o'' β'') where private module B = Precategory B module β° = Displayed β° module β± = Displayed β± lvl : Level lvl = o β β β o' β β' β o'' β β''
record Vertical-fibred-functor : Type lvl where no-eta-equality field vert : Vertical-functor β° β± F-cartesian : is-vertical-fibred vert open Vertical-functor vert public
module _ {o β o' β' o'' β''} {B : Precategory o β} {β° : Displayed B o' β'} {β± : Displayed B o'' β''} where private module B = Precategory B module β° = Displayed β° module β± = Displayed β±
A functor displayed over the identity functor is fibred if and only if it is a vertical fibred functor.
is-fibredβis-vertical-fibred : β (F' : Displayed-functor β° β± Id) β is-fibred-functor F' β is-vertical-fibred (Displayed-functorβVertical-functor F') is-fibredβis-vertical-fibred F' F-fib = F-fib is-vertical-fibredβis-fibred : β (F' : Vertical-functor β° β±) β is-vertical-fibred F' β is-fibred-functor (Vertical-functorβDisplayed-functor F') is-vertical-fibredβis-fibred F' F-fib = F-fib FibredβVertical-fibred : Fibred-functor β° β± Id β Vertical-fibred-functor β° β± FibredβVertical-fibred F' .Vertical-fibred-functor.vert = Displayed-functorβVertical-functor (Fibred-functor.disp F') FibredβVertical-fibred F' .Vertical-fibred-functor.F-cartesian = is-fibredβis-vertical-fibred (Fibred-functor.disp F') (Fibred-functor.F-cartesian F') Vertical-FibredβVertical : Vertical-fibred-functor β° β± β Fibred-functor β° β± Id Vertical-FibredβVertical F' .Fibred-functor.disp = Vertical-functorβDisplayed-functor (Vertical-fibred-functor.vert F') Vertical-FibredβVertical F' .Fibred-functor.F-cartesian = is-vertical-fibredβis-fibred (Vertical-fibred-functor.vert F') (Vertical-fibred-functor.F-cartesian F')
open Vertical-fibred-functor Vertical-fibred-functor-path : {F G : Vertical-fibred-functor β° β±} β (p0 : β {x} β (x' : β°.Ob[ x ]) β F .Fβ' x' β‘ G .Fβ' x') β (p1 : β {x y x' y'} {f : B.Hom x y} β (f' : β°.Hom[ f ] x' y') β PathP (Ξ» i β β±.Hom[ f ] (p0 x' i) (p0 y' i)) (F .Fβ' f') (G .Fβ' f')) β F β‘ G Vertical-fibred-functor-path {F = F} {G = G} p0 p1 i .vert = Vertical-functor-path {F = F .vert} {G = G .vert} p0 p1 i Vertical-fibred-functor-path {F = F} {G = G} p0 p1 i .F-cartesian f' cart = is-propβpathp (Ξ» i β is-cartesian-is-prop β± {f' = p1 f' i}) (F .F-cartesian f' cart) (G .F-cartesian f' cart) i
As promised, composition of vertical functors is much simpler.
module _ {ob βb oe βe of βf oh βh} {B : Precategory ob βb} {β° : Displayed B oe βe} {β± : Displayed B of βf} {β : Displayed B oh βh} where open Vertical-functor infixr 30 _Vβ_ infixr 30 _Vfβ_
_Vβ_ : Vertical-functor β± β β Vertical-functor β° β± β Vertical-functor β° β (F' Vβ G') .Fβ' x' = F' .Fβ' (G' .Fβ' x') (F' Vβ G') .Fβ' f' = F' .Fβ' (G' .Fβ' f') (F' Vβ G') .F-id' = ap (F' .Fβ') (G' .F-id') β F' .F-id' (F' Vβ G') .F-β' = ap (F' .Fβ') (G' .F-β') β (F' .F-β')
Furthermore, the composite of vertical fibred functors is also fibred.
Vβ-fibred : β (F' : Vertical-functor β± β) (G' : Vertical-functor β° β±) β is-vertical-fibred F' β is-vertical-fibred G' β is-vertical-fibred (F' Vβ G') Vβ-fibred F' G' F'-fib G'-fib f' cart = F'-fib (G' .Fβ' f') (G'-fib f' cart) _Vfβ_ : Vertical-fibred-functor β± β β Vertical-fibred-functor β° β± β Vertical-fibred-functor β° β (F' Vfβ G') .Vertical-fibred-functor.vert = Vertical-fibred-functor.vert F' Vβ Vertical-fibred-functor.vert G' (F' Vfβ G') .Vertical-fibred-functor.F-cartesian = Vβ-fibred (Vertical-fibred-functor.vert F') (Vertical-fibred-functor.vert G') (Vertical-fibred-functor.F-cartesian F') (Vertical-fibred-functor.F-cartesian G')
The identity functor is obviously fibred vertical.
IdV : Vertical-functor β° β° IdV = Displayed-functorβVertical-functor Id' IdV-fibred : is-vertical-fibred IdV IdV-fibred = is-fibredβis-vertical-fibred Id' Id'-fibred IdVf : Vertical-fibred-functor β° β° IdVf = FibredβVertical-fibred Idf'
Displayed natural transformationsπ
Just like we have defined a displayed functor lying over an ordinary functor we can define a displayed natural transformation. Assume are displayed functors over resp. and we have a natural transformation Than one can define a displayed natural transformation lying over
module _ {o β o' β' oβ ββ oβ' ββ'} {A : Precategory o β} {B : Precategory oβ ββ} {β° : Displayed A o' β'} {β± : Displayed B oβ' ββ'} where private module β° = Displayed β° module β± = Displayed β± open Displayed-functor open _=>_ lvl : Level lvl = o β o' β β β β' β ββ' infix 20 _=[_]=>_ record _=[_]=>_ {F : Functor A B} {G : Functor A B} (F' : Displayed-functor β° β± F) (Ξ± : F => G) (G' : Displayed-functor β° β± G) : Type lvl where no-eta-equality field Ξ·' : β {x} (x' : β°.Ob[ x ]) β β±.Hom[ Ξ± .Ξ· x ] (F' .Fβ' x') (G' .Fβ' x') is-natural' : β {x y f} (x' : β°.Ob[ x ]) (y' : β°.Ob[ y ]) (f' : β°.Hom[ f ] x' y') β Ξ·' y' β±.β' F' .Fβ' f' β±.β‘[ Ξ± .is-natural x y f ] G' .Fβ' f' β±.β' Ξ·' x'
Let be two vertical functors. A displayed natural transformation between and is called a vertical natural transformation if all components of the natural transformation are vertical.
module _ {ob βb oe βe of βf} {B : Precategory ob βb} {β° : Displayed B oe βe} {β± : Displayed B of βf} where private open CR B module β° = Displayed β° module β± = Displayed β± open Vertical-functor lvl : Level lvl = ob β βb β oe β βe β βf infix 20 _=>β_ infix 20 _=>fβ_
record _=>β_ (F' G' : Vertical-functor β° β±) : Type lvl where no-eta-equality field Ξ·' : β {x} (x' : β°.Ob[ x ]) β β±.Hom[ id ] (F' .Fβ' x') (G' .Fβ' x') is-natural' : β {x y f} (x' : β°.Ob[ x ]) (y' : β°.Ob[ y ]) (f' : β°.Hom[ f ] x' y') β Ξ·' y' β±.β' F' .Fβ' f' β±.β‘[ id-comm-sym ] G' .Fβ' f' β±.β' Ξ·' x'
This notion of natural transformation is also the correct one for fibred vertical functors, as there is no higher structure that needs to be preserved.
_=>fβ_ : (F' G' : Vertical-fibred-functor β° β±) β Type _ F' =>fβ G' = F' .vert =>β G' .vert where open Vertical-fibred-functor