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
module _ {o ℓ} {C : Precategory ℓ ℓ} {D : Precategory o ℓ} (F : Functor C D) where open Functor open ↓Obj open ↓Hom open _=>_ private module C = Precategory C module D = Precategory D module F = Fr F
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