module Cat.Displayed.Instances.Subobjects.Reasoning {o β} {C : Precategory o β} (pb : has-pullbacks C) where
open is-pullback-along open Subobj C public open Pullback open Cat C private module Ix = Cat.Displayed.Cartesian.Indexing Subobjects (with-pullbacks.Subobject-fibration pb) variable X Y Z : Ob f g h : Hom X Y l m n : Subobject X open Sub renaming (_β _ to _β β_) using () public β ββiso : m β β n β m .domain β n .domain β ββiso p .to = p .Sub.to .map β ββiso p .from = p .Sub.from .map β ββiso p .inverses = record { invl = ap β€-over.map (p .Sub.invl) ; invr = ap β€-over.map (p .Sub.invr) }
Subobjects in a cartesian categoryπ
open with-pullbacks pb renaming (pullback-subobject to infixr 35 _^*_) public
^*-univ : β€-over f m n β m β€β f ^* n ^*-univ = Cartesian-lift.universalv (Subobject-fibration _ _) ^*-id : id ^* m β β m ^*-id .to = Ix.^*-id-to ^*-id .from = Ix.^*-id-from ^*-id .inverses = record { invl = prop! ; invr = prop! } ^*-assoc : f ^* (g ^* m) β β (g β f) ^* m ^*-assoc .to = Ix.^*-comp-from ^*-assoc .from = Ix.^*-comp-to ^*-assoc .inverses = record { invl = prop! ; invr = prop! } β€β : Subobject X β€β .domain = _ β€β .map = id β€β .monic = id-monic opaque !β : m β€β β€β !β {m = m} = record { map = m .map ; sq = refl } module _ {X} where open Binary-products (Sub X) (Sub-products pb) public renaming ( _ββ_ to infixr 30 _β©β_ ; Οβ to β©ββ€l ; Οβ to β©ββ€r ; β¨_,_β© to β©β-univ ) opaque β©β-idl : β€β β©β m β β m β©β-idl = Sub-antisym β©ββ€r (β©β-univ !β Sub.id) β©β-idr : m β©β β€β β β m β©β-idr = Sub-antisym β©ββ€l (β©β-univ Sub.id !β) β©β-assoc : l β©β m β©β n β β (l β©β m) β©β n β©β-assoc = Sub-antisym (β©β-univ (β©β-univ β©ββ€l (β©ββ€l Sub.β β©ββ€r)) (β©ββ€r Sub.β β©ββ€r)) (β©β-univ (β©ββ€l Sub.β β©ββ€l) (β©β-univ (β©ββ€r Sub.β β©ββ€l) β©ββ€r)) opaque ^*-β©β : f ^* (m β©β n) β β f ^* m β©β f ^* n ^*-β©β {f = f} {m = m} {n = n} = Sub-antisym (β©β-univ (^*-univ record { sq = pb _ _ .square β pullr refl }) (^*-univ record { sq = pb _ _ .square β pullr refl β extendl (pb _ _ .square) })) record { map = pb _ _ .universal {pβ' = pb _ _ .pβ β pb _ _ .pβ} {pβ' = pb _ _ .universal {pβ' = pb _ _ .pβ β pb _ _ .pβ} {pβ' = pb _ _ .pβ β pb _ _ .pβ} (pulll (sym (pb _ _ .square)) β pullr (pb _ _ .square) β extendl (pb _ _ .square))} (sym (pullr (pb _ _ .pββuniversal) β extendl (sym (pb _ _ .square)))) ; sq = sym (pb _ _ .pββuniversal β introl refl) } ^*-β€β : f ^* β€β β β β€β ^*-β€β {f = f} = Sub-antisym !β record { map = pb _ _ .universal {pβ' = id} {pβ' = f} id-comm ; sq = sym (pb _ _ .pββuniversal β introl refl) } opaque is-pullback-alongβiso : is-pullback-along C (m .map) h (n .map) β m β β h ^* n is-pullback-alongβiso pba = Sub-antisym record { map = pb _ _ .universal (pba .square) ; sq = sym (pb _ _ .pββuniversal β introl refl) } record { map = pba .universal (pb _ _ .square) ; sq = sym (pba .pββuniversal β introl refl) } isoβis-pullback-along : m β β h ^* n β is-pullback-along C (m .map) h (n .map) isoβis-pullback-along _ .top = _ isoβis-pullback-along {h = h} {n = n} m .has-is-pb = subst-is-pullback (sym (m .Sub.to .sq) β idl _) refl refl refl (is-pullback-iso record { to = m .Sub.from .map ; from = m .Sub.to .map ; inverses = record { invl = ap β€-over.map (m .Sub.invr) ; invr = ap β€-over.map (m .Sub.invl) } } (pb h (n .map) .has-is-pb))