packages feed

FiniteCategories-0.1.0.0: src/YonedaEmbedding/YonedaEmbedding.hs

-- {-# LANGUAGE FlexibleContexts, MultiParamTypeClasses #-}

{-| Module  : FiniteCategories
Description : The Yoneda embedding of a category.
Copyright   : Guillaume Sabbagh 2021
License     : GPL-3
Maintainer  : guillaumesabbagh@protonmail.com
Stability   : experimental
Portability : portable

The Yoneda embedding of a category.
-}

module YonedaEmbedding.YonedaEmbedding where
    import FiniteCategory.FiniteCategory
    import FunctorCategory.FunctorCategory
    import Diagram.Diagram
    import OppositeCategory.OppositeCategory
    import Set.FinSet
    import Utils.AssociationList
    import Subcategories.Subcategory
    import Currying.Currying
    import OppositeCategory.OppositeCategory
    import Limit.Limit
    import ConeCategory.ConeCategory
    import DiagonalFunctor.DiagonalFunctor
    import Utils.Tuple
    
    import IO.PrettyPrint
    
    -- | A presheaf on a category @C@ is a diagram from @C^op@ to __Set__.
    type PreSheaf c m o = Diagram (OppositeCategory c m o) (OppositeMorphism m o) o (FinSetCat m) (FinMap m) (FinSet m)
    
    -- | Natural transformation between presheaves.
    type PreSheavesNatTransfo c m o = NaturalTransformation (OppositeCategory c m o) (OppositeMorphism m o) o (FinSetCat m) (FinMap m) (FinSet m)
    
    -- | The type of the category of presheaves.
    type PreSheavesCategory c m o = FunctorCategory (OppositeCategory c m o) (OppositeMorphism m o) o (FinSetCat m) (FinMap m) (FinSet m)
    
    -- | Returns the presheaf category generated by a Yoneda embedding and an insertion functor full and faithful.
    yonedaEmbedding :: (FiniteCategory c m o, Morphism m o, Eq m, Eq o) => c -> (PreSheavesCategory c m o, Diagram c m o (PreSheavesCategory c m o) (PreSheavesNatTransfo c m o) (PreSheaf c m o))
    yonedaEmbedding cat = (presheavesCat, functor)
        where
            hom x = fromList $ fromList <$> (\s -> Elem <$> ar cat s x) <$> (ob cat)
            omapPresheaf x s = fromList $ Elem <$> ar cat s x
            mmapPresheaf x m = FinMap{codomain = omapPresheaf x (target m)
                                    , finMap = zip (toList (omapPresheaf x (source m))) ((\f -> fmap (@ (opOpMorph m)) f) <$> (toList (omapPresheaf x (source m))))}
            presheaf x = Diagram {    src = Op cat
                                    , tgt = FinSetCat $ toList $ union $ hom <$> ob cat
                                    , omap = functToAssocList (omapPresheaf x) (ob (Op cat))
                                    , mmap = functToAssocList (mmapPresheaf x) (arrows (Op cat))}
                                        
            ntFromMorph m o = FinMap {codomain = (omap $ presheaf (target m)) !-! o
                                    , finMap = zip (toList domain) (toList postcom) }
                where
                    domain = (omap $ presheaf (source m)) !-! o
                    postcom = (m @) `fmap` domain
            mmapFunctor m = NaturalTransformation {   srcNT = presheaf (source m)
                                                    , tgtNT = presheaf (target m)
                                                    , component = ntFromMorph m}
                                                        
            presheavesCat = FunctorCategory { sourceCat = Op cat
                                            , targetCat = FinSetCat $ concat (toList <$> (hom <$> ob cat))}
            functor = Diagram {   src = cat
                                , tgt = presheavesCat
                                , omap = functToAssocList presheaf (ob cat)
                                , mmap = functToAssocList mmapFunctor (arrows cat)
                              }