module Cubical.Categories.Instances.FullSubcategory where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Equiv.Properties
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Powerset
open import Cubical.Functions.Embedding
open import Cubical.Data.Sigma
open import Cubical.Categories.Category renaming (isIso to isCatIso)
open import Cubical.Categories.Isomorphism
open import Cubical.Categories.Functor renaming (đâš_â© to funcId)
open import Cubical.Categories.NaturalTransformation
open import Cubical.Categories.Equivalence.Base
private
variable
âC âC' âD âD' âE âE' âP âQ âR : Level
open isCatIso
module _ (C : Category âC âC') (P : Category.ob C â Type âP) where
private
module C = Category C
open Category
open Functor
FullSubcategory : Category (â-max âC âP) âC'
ob FullSubcategory = ÎŁ[ x â C.ob ] P x
Hom[_,_] FullSubcategory (x , p) (y , q) = C.Hom[ x , y ]
id FullSubcategory = C.id
_â_ FullSubcategory = C._â_
âIdL FullSubcategory = C.âIdL
âIdR FullSubcategory = C.âIdR
âAssoc FullSubcategory = C.âAssoc
isSetHom FullSubcategory = C.isSetHom
FullInclusion : Functor FullSubcategory C
F-ob FullInclusion = fst
F-hom FullInclusion = idfun _
F-id FullInclusion = refl
F-seq FullInclusion f g = refl
isFullyFaithfulIncl : isFullyFaithful FullInclusion
isFullyFaithfulIncl _ _ = idEquiv _ .snd
module _ (x y : FullSubcategory .ob) where
Incl-Iso = F-Iso {F = FullInclusion} {x = x} {y = y}
Incl-Iso-inv : CatIso C (x .fst) (y .fst) â CatIso FullSubcategory x y
Incl-Iso-inv f .fst = f .fst
Incl-Iso-inv f .snd .inv = f .snd .inv
Incl-Iso-inv f .snd .sec = f .snd .sec
Incl-Iso-inv f .snd .ret = f .snd .ret
Incl-Iso-sec : â f â Incl-Iso (Incl-Iso-inv f) ⥠f
Incl-Iso-sec f = CatIso⥠_ _ refl
Incl-Iso-ret : â f â Incl-Iso-inv (Incl-Iso f) ⥠f
Incl-Iso-ret f = CatIso⥠_ _ refl
Incl-Iso-Iso : Iso (CatIso FullSubcategory x y) (CatIso C (x .fst) (y .fst))
Incl-Iso-Iso = iso Incl-Iso Incl-Iso-inv Incl-Iso-sec Incl-Iso-ret
Incl-Isoâ : CatIso FullSubcategory x y â CatIso C (x .fst) (y .fst)
Incl-Isoâ = isoToEquiv Incl-Iso-Iso
isEquivIncl-Iso : isEquiv Incl-Iso
isEquivIncl-Iso = Incl-Isoâ .snd
module _ (C : Category âC âC')
(D : Category âD âD') (Q : Category.ob D â Type âQ) where
private
module C = Category C
module D = Category D
open Category
open Functor
ToFullSubcategory : (F : Functor C D) â ((c : C.ob) â Q (F-ob F c)) â Functor C (FullSubcategory D Q)
F-ob (ToFullSubcategory F f) c = F-ob F c , f c
F-hom (ToFullSubcategory F f) = F-hom F
F-id (ToFullSubcategory F f) = F-id F
F-seq (ToFullSubcategory F f) = F-seq F
module _ (C : Category âC âC') (P : Category.ob C â Type âP)
(D : Category âD âD') (Q : Category.ob D â Type âQ) where
private
module C = Category C
module D = Category D
open Category
open Functor
MapFullSubcategory : (F : Functor C D) â ((c : C.ob) â P c â Q (F-ob F c))
â Functor (FullSubcategory C P) (FullSubcategory D Q)
MapFullSubcategory F f = ToFullSubcategory (FullSubcategory C P) D Q
(funcComp F (FullInclusion C P) )
λ (c , p) â f c p
module _ (C : Category âC âC') (P : Category.ob C â Type âP) where
private
module C = Category C
open Category
open Functor
MapFullSubcategory-id :
MapFullSubcategory C P C P (funcId C) (λ c p â p) ⥠funcId (FullSubcategory C P)
MapFullSubcategory-id = FunctorâĄ
(λ (c , p) â refl)
(λ Îł â refl)
module _ (C : Category âC âC') (P : Category.ob C â Type âP)
(D : Category âD âD') (Q : Category.ob D â Type âQ)
(E : Category âE âE') (R : Category.ob E â Type âR) where
private
module C = Category C
module D = Category D
module E = Category E
open Category
open Functor
MapFullSubcategory-seq :
(F : Functor C D) â (f : (c : C.ob) â P c â Q (F-ob F c)) â
(G : Functor D E) â (g : (d : D.ob) â Q d â R (F-ob G d)) â
MapFullSubcategory C P E R (funcComp G F) (λ c p â g (F-ob F c) (f c p)) âĄ
funcComp
(MapFullSubcategory D Q E R G g)
(MapFullSubcategory C P D Q F f)
MapFullSubcategory-seq F f G g = FunctorâĄ
(λ (c , p) â refl)
(λ Îł â refl)
open Category
module _
(C : Category âC âC')
{P : C .ob â Type âP}(isPropP : (c : C .ob) â isProp (P c))
where
open Functor
open isUnivalent
isEmbdIncl-ob : isEmbedding (FullInclusion C P .F-ob)
isEmbdIncl-ob _ _ = isEmbeddingFstÎŁProp isPropP
isUnivalentFullSub : isUnivalent C â isUnivalent (FullSubcategory C P)
isUnivalentFullSub isUnivC .univ _ _ = isEquiv[equivFunAâBâf]âisEquiv[f] _ (Incl-Isoâ C P _ _)
(subst isEquiv (sym (F-pathToIso-â {F = FullInclusion C P}))
(compEquiv (_ , isEmbdIncl-ob _ _) (_ , isUnivC .univ _ _) .snd))
open Functor
ÎŁPropCat : (C : Category âC âC') (P : â (ob C)) â Category âC âC'
ÎŁPropCat C P = FullSubcategory C (_â P)
forgetÎŁPropCat : (C : Category âC âC') (prop : â (C .ob)) â Functor (ÎŁPropCat C prop) C
forgetÎŁPropCat C prop = FullInclusion C _
ÎŁPropCatFunc : {C : Category âC âC'}{D : Category âD âD'}
{P : â (ob C)} {Q : â (ob D)} (F : Functor C D)
â (â c â c â P â F .F-ob c â Q)
â Functor (ÎŁPropCat C P) (ÎŁPropCat D Q)
ÎŁPropCatFunc = MapFullSubcategory _ _ _ _
module _ {C : Category âC âC'} {D : Category âD âD'} (F : Functor C D) (invF : WeakInverse F) where
open NatTrans
open NatIso
open WeakInverse
open _âá¶_
private
Fâ»Âč = invF .invFunc
ηᎱ = invF .η
ΔᎱ = invF .Δ
ÎŁPropCatEquiv : {P : â (ob C)} {Q : â (ob D)}
â (presF : â c â c â P â F .F-ob c â Q)
â (â d â d â Q â Fâ»Âč .F-ob d â P)
â WeakInverse (ÎŁPropCatFunc {P = P} {Q = Q} F presF)
invFunc (ÎŁPropCatEquiv {P} {Q} _ presFâ»Âč) = ÎŁPropCatFunc {P = Q} {Q = P} Fâ»Âč presFâ»Âč
N-ob (trans (η (ΣPropCatEquiv _ _))) (x , _) = ηᎱ .trans .N-ob x
N-hom (trans (η (ΣPropCatEquiv _ _))) f = ηᎱ .trans .N-hom f
inv (nIso (η (ΣPropCatEquiv _ _)) (x , _)) = ηᎱ .nIso x .inv
sec (nIso (η (ΣPropCatEquiv _ _)) (x , _)) = ηᎱ .nIso x .sec
ret (nIso (η (ΣPropCatEquiv _ _)) (x , _)) = ηᎱ .nIso x .ret
N-ob (trans (Δ (ΣPropCatEquiv _ _))) (x , _) = ΔᎱ .trans .N-ob x
N-hom (trans (Δ (ΣPropCatEquiv _ _))) f = ΔᎱ .trans .N-hom f
inv (nIso (Δ (ΣPropCatEquiv _ _)) (x , _)) = ΔᎱ .nIso x .inv
sec (nIso (Δ (ΣPropCatEquiv _ _)) (x , _)) = ΔᎱ .nIso x .sec
ret (nIso (Δ (ΣPropCatEquiv _ _)) (x , _)) = ΔᎱ .nIso x .ret
isIsoÎŁPropCat : {C : Category âC âC'} {P : â (ob C)}
{x y : ob C} (p : x â P) (q : y â P)
(f : C [ x , y ])
â isCatIso C f â isCatIso (ÎŁPropCat C P) {x , p} {y , q} f
inv (isIsoÎŁPropCat p q f isIsoF) = isIsoF .inv
sec (isIsoÎŁPropCat p q f isIsoF) = isIsoF .sec
ret (isIsoÎŁPropCat p q f isIsoF) = isIsoF .ret