module Cat.Displayed.Cocartesian
{o ℓ o' ℓ'} {ℬ : Precategory o ℓ} (ℰ : Displayed ℬ o' ℓ') where
open Cat.Reasoning ℬ
open Displayed ℰ
open Cat.Displayed.Morphism ℰ
open Cat.Displayed.Morphism.Duality ℰ
open DR ℰ
Cocartesian morphisms and opfibrations🔗
Cartesian fibrations provide a way of describing pseudofunctorial families of categories purely in terms of displayed structure. It’s then natural to ask: what about covariant pseudofunctorial families of categories? Such pseudofunctors can be encoded by dualising cartesian fibrations.
To do this, we must first dualise the notion of a cartesian map to a cocartesian map. Fix a map in objects and displayed over and resp., and a map over We say that is cocartesian if it has the shape of a “pushout diagram”, in contrast to the “pullback diagrams” shape associated with cartesian maps.
record is-cocartesian
{a b a' b'} (f : Hom a b) (f' : Hom[ f ] a' b')
: Type (o ⊔ ℓ ⊔ o' ⊔ ℓ')
where
no-eta-equality
Concretely, let and be displayed over Furthermore, suppose we have a map (highlighted in violet below), along with a map displayed over (highlighted in red). For to be cocartesian, every such situation must give rise to a unique universal factorisation of through a map (highlighted in green).
field
universal: ∀ {u u'} (m : Hom b u) (h' : Hom[ m ∘ f ] a' u')
→ Hom[ m ] b' u'
commutes: ∀ {u u'} (m : Hom b u) (h' : Hom[ m ∘ f ] a' u')
→ universal m h' ∘' f' ≡ h'
unique: ∀ {u u'} {m : Hom b u} {h' : Hom[ m ∘ f ] a' u'}
→ (m' : Hom[ m ] b' u') → m' ∘' f' ≡ h'
→ m' ≡ universal m h'
Duality🔗
As noted before, cocartesian maps the are duals to cartesian maps. We can make this correspondence precise by showing that cartesian maps in the total opposite of are cocartesian maps, and vice versa.
co-cartesian→cocartesian: ∀ {x y} {f : Hom x y} {x' y'} {f' : Hom[ f ] x' y'}
→ is-cartesian (ℰ ^total-op) f f'
→ is-cocartesian f f'
cocartesian→co-cartesian: ∀ {x y} {f : Hom x y} {x' y'} {f' : Hom[ f ] x' y'}
→ is-cocartesian f f'
→ is-cartesian (ℰ ^total-op) f f'
These functions just unpack and repack data, they are not particularly interesting.
.is-cocartesian.universal m h' =
co-cartesian→cocartesian cart^op .universal cart^op m h'
is-cartesian.is-cocartesian.commutes m h' =
co-cartesian→cocartesian cart^op .commutes cart^op m h'
is-cartesian.is-cocartesian.unique m' p =
co-cartesian→cocartesian cart^op .unique cart^op m' p
is-cartesian
.is-cartesian.universal m h' =
cocartesian→co-cartesian cocart .universal cocart m h'
is-cocartesian.is-cartesian.commutes m h' =
cocartesian→co-cartesian cocart .commutes cocart m h'
is-cocartesian.is-cartesian.unique m' p =
cocartesian→co-cartesian cocart .unique cocart m' p is-cocartesian
Furthermore, these 2 functions form an equivalence, which we can extend to a path via univalence.
co-cartesian→cocartesian-is-equiv: ∀ {x y} {f : Hom x y} {x' y'} {f' : Hom[ f ] x' y'}
→ is-equiv (co-cartesian→cocartesian {f' = f'})
{f' = f'} =
co-cartesian→cocartesian-is-equiv
is-iso→is-equiv $ iso cocartesian→co-cartesian cocart-invl cocart-invrwhere
cocart-invl: ∀ f
→ co-cartesian→cocartesian {f' = f'} (cocartesian→co-cartesian f) ≡ f
.is-cocartesian.universal m h' = is-cocartesian.universal f m h'
cocart-invl f i .is-cocartesian.commutes m h' = is-cocartesian.commutes f m h'
cocart-invl f i .is-cocartesian.unique m' p = is-cocartesian.unique f m' p
cocart-invl f i
cocart-invr: ∀ f
→ cocartesian→co-cartesian {f' = f'} (co-cartesian→cocartesian f) ≡ f
.is-cartesian.universal m h' = is-cartesian.universal f m h'
cocart-invr f i .is-cartesian.commutes m h' = is-cartesian.commutes f m h'
cocart-invr f i .is-cartesian.unique m' p = is-cartesian.unique f m' p
cocart-invr f i
co-cartesian≡cocartesian: ∀ {x y} {f : Hom x y} {x' y'} {f' : Hom[ f ] x' y'}
→ is-cartesian (ℰ ^total-op) f f' ≡ is-cocartesian f f'
=
co-cartesian≡cocartesian (co-cartesian→cocartesian , co-cartesian→cocartesian-is-equiv) ua
Properties of cocartesian morphisms🔗
We shall now prove the following properties of cocartesian morphisms.
cocartesian-∘: ∀ {x y z} {f : Hom y z} {g : Hom x y}
→ ∀ {x' y' z'} {f' : Hom[ f ] y' z'} {g' : Hom[ g ] x' y'}
→ is-cocartesian f f' → is-cocartesian g g'
→ is-cocartesian (f ∘ g) (f' ∘' g')
: ∀ {x x'} → is-cocartesian id (id' {x} {x'})
cocartesian-id
invertible→cocartesian: ∀ {x y} {f : Hom x y} {x' y'} {f' : Hom[ f ] x' y'}
→ (f-inv : is-invertible f)
→ is-invertible[ f-inv ] f'
→ is-cocartesian f f'
cocartesian→weak-epic: ∀ {x y} {f : Hom x y}
→ ∀ {x' y'} {f' : Hom[ f ] x' y'}
→ is-cocartesian f f'
→ is-weak-epic f'
cocartesian-codomain-unique: ∀ {x y} {f : Hom x y}
→ ∀ {x' y' y''} {f' : Hom[ f ] x' y'} {f'' : Hom[ f ] x' y''}
→ is-cocartesian f f'
→ is-cocartesian f f''
→ y' ≅↓ y''
cocartesian-vertical-section-stable: ∀ {x y} {f : Hom x y}
→ ∀ {x' y' y''} {f' : Hom[ f ] x' y'} {f'' : Hom[ f ] x' y''} {ϕ : Hom[ id ] y'' y'}
→ is-cocartesian f f'
→ has-retract↓ ϕ
→ ϕ ∘' f'' ≡[ idl _ ] f'
→ is-cocartesian f f''
cocartesian-pasting: ∀ {x y z} {f : Hom y z} {g : Hom x y}
→ ∀ {x' y' z'} {f' : Hom[ f ] y' z'} {g' : Hom[ g ] x' y'}
→ is-cocartesian g g'
→ is-cocartesian (f ∘ g) (f' ∘' g')
→ is-cocartesian f f'
vertical+cocartesian→invertible: ∀ {x} {x' x'' : Ob[ x ]} {f' : Hom[ id ] x' x''}
→ is-cocartesian id f'
→ is-invertible↓ f'
The proofs are all applications of duality, as we have already done the hard work of proving these properties for cartesian morphisms.
=
cocartesian-∘ f-cocart g-cocart
co-cartesian→cocartesian $_
cartesian-∘ (cocartesian→co-cartesian g-cocart)
(cocartesian→co-cartesian f-cocart)
= co-cartesian→cocartesian (cartesian-id _)
cocartesian-id
=
invertible→cocartesian f-inv f'-inv
co-cartesian→cocartesian $_ _ (invertible[]→co-invertible[] f'-inv)
invertible→cartesian
=
cocartesian→weak-epic cocart
(ℰ ^total-op) (cocartesian→co-cartesian cocart)
cartesian→weak-monic
=
cocartesian-codomain-unique f'-cocart f''-cocart
vertical-co-iso→vertical-iso $(ℰ ^total-op)
cartesian-domain-unique (cocartesian→co-cartesian f''-cocart)
(cocartesian→co-cartesian f'-cocart)
=
cocartesian-vertical-section-stable cocart ret factor
co-cartesian→cocartesian $(ℰ ^total-op)
cartesian-vertical-retraction-stable (cocartesian→co-cartesian cocart)
(vertical-retract→vertical-co-section ret)
factor
=
cocartesian-pasting g-cocart fg-cocart
co-cartesian→cocartesian $(ℰ ^total-op)
cartesian-pasting (cocartesian→co-cartesian g-cocart)
(cocartesian→co-cartesian fg-cocart)
=
vertical+cocartesian→invertible cocart
vertical-co-invertible→vertical-invertible $(ℰ ^total-op)
vertical+cartesian→invertible (cocartesian→co-cartesian cocart)
Furthermore, is cocartesian if and only if the function is an equivalence.
precompose-equiv→cocartesian: ∀ {x y x' y'} {f : Hom x y}
→ (f' : Hom[ f ] x' y')
→ (∀ {z z'} {g : Hom y z} → is-equiv {A = Hom[ g ] y' z'} (_∘' f'))
→ is-cocartesian f f'
=
precompose-equiv→cocartesian f' cocart
co-cartesian→cocartesian $(ℰ ^total-op) f' cocart
postcompose-equiv→cartesian
cocartesian→precompose-equiv: ∀ {x y z x' y' z'} {g : Hom y z} {f : Hom x y} {f' : Hom[ f ] x' y'}
→ is-cocartesian f f'
→ is-equiv {A = Hom[ g ] y' z'} (_∘' f')
=
cocartesian→precompose-equiv cocart (ℰ ^total-op) $
cartesian→postcompose-equiv cocartesian→co-cartesian cocart
Cocartesian lifts🔗
We call an object over together with a cartesian arrow a cocartesian lift of
record Cocartesian-lift {x y} (f : Hom x y) (x' : Ob[ x ]) : Type (o ⊔ ℓ ⊔ o' ⊔ ℓ')
where
no-eta-equality
field
{y'} : Ob[ y ]
: Hom[ f ] x' y'
lifting : is-cocartesian f lifting
cocartesian open is-cocartesian cocartesian public
We also can apply duality to cocartesian lifts.
co-cartesian-lift→cocartesian-lift: ∀ {x y} {f : Hom x y} {x' : Ob[ x ]}
→ Cartesian-lift (ℰ ^total-op) f x'
→ Cocartesian-lift f x'
cocartesian-lift→co-cartesian-lift: ∀ {x y} {f : Hom x y} {x' : Ob[ x ]}
→ Cocartesian-lift f x'
→ Cartesian-lift (ℰ ^total-op) f x'
The proofs are simply applying duality, so they are not particularly interesting.
.Cocartesian-lift.y' =
co-cartesian-lift→cocartesian-lift cart .x' cart
Cartesian-lift.Cocartesian-lift.lifting =
co-cartesian-lift→cocartesian-lift cart .lifting cart
Cartesian-lift.Cocartesian-lift.cocartesian =
co-cartesian-lift→cocartesian-lift cart (Cartesian-lift.cartesian cart)
co-cartesian→cocartesian
.Cartesian-lift.x' =
cocartesian-lift→co-cartesian-lift cocart .y' cocart
Cocartesian-lift.Cartesian-lift.lifting =
cocartesian-lift→co-cartesian-lift cocart .lifting cocart
Cocartesian-lift.Cartesian-lift.cartesian =
cocartesian-lift→co-cartesian-lift cocart (Cocartesian-lift.cocartesian cocart) cocartesian→co-cartesian
We can use this notion to define cocartesian fibrations (sometimes referred to as opfibrations).
record Cocartesian-fibration : Type (o ⊔ ℓ ⊔ o' ⊔ ℓ') where
no-eta-equality
field
: ∀ {x y} (f : Hom x y) (x' : Ob[ x ]) → Cocartesian-lift f x'
has-lift
module has-lift {x y} (f : Hom x y) (x' : Ob[ x ]) =
(has-lift f x') Cocartesian-lift
As expected, opfibrations are dual to fibrations.
: Cartesian-fibration (ℰ ^total-op) → Cocartesian-fibration
op-fibration→opfibration
: Cocartesian-fibration → Cartesian-fibration (ℰ ^total-op) opfibration→op-fibration
The proofs here are just further applications of duality, so we omit them.
.Cocartesian-fibration.has-lift f x' =
op-fibration→opfibration fib (Cartesian-fibration.has-lift fib f x')
co-cartesian-lift→cocartesian-lift
.Cartesian-fibration.has-lift f y' =
opfibration→op-fibration opfib (Cocartesian-fibration.has-lift opfib f y') cocartesian-lift→co-cartesian-lift