module Cat.Displayed.GenericObject {o β o' β'} {B : Precategory o β} (E : Displayed B o' β') where
open Precategory B open Cat.Displayed.Morphism E open Cat.Displayed.Reasoning E open Displayed E open Functor
Generic objectsπ
There are 2 perspectives one can take on generic objects. The first is a purely logical one: generic objects provide us a tool for giving categorical models of higher order logics. The second perspective is that generic objects are a categorical way of describing the size of fibrations, and their ability to be internalized in the base category. We shall use both perspectives interchangeably!
The terminology surrounding generic objects is a bit of a disaster. What we refer to as a generic object is referred to as a weak generic object in (Jacobs 2001). However, we follow the terminology set out in (Sterling 2023), as generic objects in the sense of Jacobs are quite rare.
With that caveat out of the way, we define a generic object to be some object with the property that for any we have a (not necessarily unique) cartesian map Note that this means that generic objects are a structure in a fibration!
record Generic-object {t} (t' : Ob[ t ]) : Type (o β β β o' β β') where no-eta-equality field classify : β {x} β (x' : Ob[ x ]) β Hom x t classify' : β {x} β (x' : Ob[ x ]) β Hom[ classify x' ] x' t' classify-cartesian : β {x} (x' : Ob[ x ]) β is-cartesian E (classify x') (classify' x') module classify-cartesian {x} (x' : Ob[ x ]) = is-cartesian (classify-cartesian x')
The intuition for this definition is that if has a generic object, then every object of arises as a reindexing of along some morphism in the base.
If we think of as some sort of logic over some syntactic category, then a generic object behaves like the type of propositions. To see why, recall that an object over a classifying category is a proposition in ranging over some free variables of type The classifying map in the base yields a substitution or in other words, a term of type in context Furthermore, the classifying map upstairs gives an implication between the original proposition in and a proof of the corresponding element of
The size-based perspective on generic objects hinges on the fact that the family fibration on has a generic object if and only if is equivalent to a small, strict category. Fibred structure in the family fibration corresponds to structure in so we can see the generic objects as a generalization of both a strictness and size condition.
With this size-based perspective in mind, we say that a displayed category is globally small if it has a generic object.
record Globally-small : Type (o β β β o' β β') where no-eta-equality field {U} : Ob Gen : Ob[ U ] has-generic-ob : Generic-object Gen open Generic-object has-generic-ob public
We can also prove the aforementioned characterisation in terms of base changes: If there exists an object such that, for every there is a map exhibiting β then is a generic object. The quantifier complexity of this sentence is a bit high, so please refer to the code:
vertical-isoβGeneric-object : β {t} (t' : Ob[ t ]) β (β {x} (x' : Ob[ x ]) β Ξ£[ u β Hom x t ] (base-change E fib u .Fβ t' β β x')) β Generic-object t'
vertical-isoβGeneric-object {t} t' viso = gobj where open Generic-object open has-lift module viso {x} (x' : Ob[ x ]) = _β [_]_ (viso x' .snd) gobj : Generic-object t' gobj .classify x' = viso x' .fst gobj .classify' x' = hom[ idr _ ] (has-lift.lifting _ t' β' viso.from' x') gobj .classify-cartesian x' .is-cartesian.universal m h' = hom[ idl _ ] (viso.to' x' β' universal (viso x' .fst) t' m h') gobj .classify-cartesian x' .is-cartesian.commutes m h' = hom[] (lifting _ _ β' viso.from' x') β' hom[] (viso.to' x' β' universal _ _ _ _) β‘Λβ¨ split _ _ β©β‘Λ hom[] ((lifting _ _ β' viso.from' x') β' (viso.to' x' β' universal _ _ _ _)) β‘β¨ weave _ _ refl (cancel-inner[] _ (viso.invr' x')) β©β‘ hom[] (lifting _ _ β' universal _ _ _ _) β‘β¨ shiftl _ (has-lift.commutes _ _ _ _) β©β‘ h' β gobj .classify-cartesian x' .is-cartesian.unique {m = m} {h' = h'} m' p = m' β‘β¨ shiftr (sym (idl _) β sym (idl _)) (insertl' _ (viso.invl' x')) β©β‘ hom[] (viso.to' x' β' viso.from' x' β' m') β‘β¨ reindex _ _ β sym (hom[]-β (idl _) (idl _)) β ap hom[] (unwhisker-r (idl _) (idl _)) β©β‘ hom[] (viso.to' x' β' β hom[ idl _ ] (viso.from' x' β' m') β) β‘β¨ ap! (unique _ _ _ (whisker-r _ β assoc[] β unwhisker-l (ap (_β m) (idr _)) _ β p)) β©β‘ hom[] (viso.to' x' β' universal _ _ _ h') β
Skeletal generic objectsπ
We say that a generic object is skeletal if the classifying map in the base category is unique: if underlies a Cartesian map then it must be the map coming from the generic object structure of
This condition is quite strong: for instance, the family fibration of a strict category has a skeletal generic object if and only if is skeletal.1
is-skeletal-generic-object : β {t} {t' : Ob[ t ]} β Generic-object t' β Type _ is-skeletal-generic-object {t} {t'} gobj = β {x} {x' : Ob[ x ]} {u : Hom x t} {f' : Hom[ u ] x' t'} β is-cartesian E u f' β u β‘ classify x' where open Generic-object gobj
(Jacobs 2001) refers to βskeletal generic objectsβ as simply βgeneric objectsβ.
is-skeletal-generic-object-is-prop : β {t} {t' : Ob[ t ]} {gobj : Generic-object t'} β is-prop (is-skeletal-generic-object gobj) is-skeletal-generic-object-is-prop = hlevel 1
Gaunt generic objectsπ
A generic object is gaunt if the classifying maps themselves are unique. This condition expands on that of skeletality: if is a Cartesian map into the generic object then not only must be generated by the structure we have equipped with, but must, as well.
We can also expand on what this means for the family fibration: has a gaunt generic object if and only if is itself gaunt (See here for the proof).
record is-gaunt-generic-object {t} {t' : Ob[ t ]} (gobj : Generic-object t') : Type (o β β β o' β β') where no-eta-equality open Generic-object gobj
field classify-unique : is-skeletal-generic-object gobj classify-unique' : β {x} {x' : Ob[ x ]} {u : Hom x t} {f' : Hom[ u ] x' t'} β (cart : is-cartesian E u f') β f' β‘[ classify-unique cart ] classify' x'
gaunt-generic-objectβskeletal-generic-object : β {t} {t' : Ob[ t ]} {gobj : Generic-object t'} β is-gaunt-generic-object gobj β is-skeletal-generic-object gobj gaunt-generic-objectβskeletal-generic-object = is-gaunt-generic-object.classify-unique
(Jacobs 2001) refers to βgaunt generic objectsβ as βstrong generic objectsβ.
unquoteDecl H-Level-is-gaunt-generic-object = declare-record-hlevel 1 H-Level-is-gaunt-generic-object (quote is-gaunt-generic-object)
References
- Jacobs, Bart. 2001. Categorical Logic and Type Theory. Studies in Logic and the Foundations of Mathematics 141. Elsevier.
- Sterling, Jonathan. 2023. βWhat Should a Generic Object Be?β arXiv. http://arxiv.org/abs/2210.04202.