module Cat.Functor.Dense where

Dense subcategories🔗

A subcategory of a locally category (hence a fully faithful functor is called dense if objects of are generated under colimits by those of in a certain canonical way. In particular, any functor and object can be put into a diagram

where is the projection functor from the corresponding comma category, in such a way that the object is the nadir of a cocone over

  dense-cocone :  d  F F∘ Dom F (!Const d) => Const d
  dense-cocone d .η x = x .map
  dense-cocone d .is-natural _ _ f = f .sq

  is-dense : Type _
  is-dense =  d  is-colimit {J = F  d} (F F∘ Dom _ _) d (dense-cocone d)

The functor is called dense if this cocone is colimiting for every The importance of density is that, for a dense functor the induced nerve functor is fully faithful.

  is-dense→nerve-is-ff : is-dense  is-fully-faithful (Nerve F)
  is-dense→nerve-is-ff is-dense = is-iso→is-equiv $ iso inv invr invl where
    module is-dense d = is-colimit (is-dense d)

    inv :  {x y}  (Nerve F .F₀ x => Nerve F .F₀ y)  D.Hom x y
    inv nt =
      is-dense.universal _
         j  nt .η _ (j .map))
        λ f  sym (nt .is-natural _ _ _ $ₚ _)  ap (nt .η _) (f .sq  D.idl _)

    invr :  {x y} (f : Nerve F .F₀ x => Nerve F .F₀ y)  Nerve F .F₁ (inv f)  f
    invr f = ext λ x i  is-dense.factors _ {j = ↓obj i} _ _

    invl :  {x y} (f : D.Hom x y)  inv (Nerve F .F₁ f)  f
    invl f = sym $ is-dense.unique _ _ _ f  _  refl)

Another way of putting this is that probes by a dense subcategory are enough to tell morphisms (and so objects) in the ambient category apart.

  dense→separating
    : is-dense
     {X Y : D.Ob} {f g : D.Hom X Y}
     (∀ {Z} (h : D.Hom (F.₀ Z) X)  f D.∘ h  g D.∘ h)
     f  g
  dense→separating dense h =
    ff→faithful {F = Nerve F} (is-dense→nerve-is-ff dense) $
      ext λ x g  h g