open import Cubical.Foundations.Prelude
open import Cubical.Categories.Category
open import Cubical.Categories.Displayed.Base
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.HLevels
open import Cubical.Data.Sigma
open import Cubical.HITs.PropositionalTruncation
module Categories.CartesianMorphism where
module Contravariant
{ℓB ℓ'B ℓE ℓ'E}
{B : Category ℓB ℓ'B}
(E : Categoryᴰ B ℓE ℓ'E) where
open Category B
open Categoryᴰ E
opaque
isCartesian :
{a b : ob} (f : B [ a , b ])
{aᴰ : ob[ a ]} {bᴰ : ob[ b ]}
(fᴰ : Hom[ f ][ aᴰ , bᴰ ]) →
Type (ℓ-max (ℓ-max ℓB ℓ'B) (ℓ-max ℓE ℓ'E))
isCartesian {a} {b} f {aᴰ} {bᴰ} fᴰ =
∀ {c : ob} {cᴰ : ob[ c ]} (g : B [ c , a ]) → isEquiv λ (gᴰ : Hom[ g ][ cᴰ , aᴰ ]) → gᴰ ⋆ᴰ fᴰ
opaque
unfolding isCartesian
isPropIsCartesian :
{a b : ob} (f : B [ a , b ])
{aᴰ : ob[ a ]} {bᴰ : ob[ b ]}
(fᴰ : Hom[ f ][ aᴰ , bᴰ ]) →
isProp (isCartesian f fᴰ)
isPropIsCartesian f fᴰ = isPropImplicitΠ2 λ c cᴰ → isPropΠ λ g → isPropIsEquiv (_⋆ᴰ fᴰ)
opaque
isCartesian' :
{a b : ob} (f : B [ a , b ])
{aᴰ : ob[ a ]} {bᴰ : ob[ b ]}
(fᴰ : Hom[ f ][ aᴰ , bᴰ ]) →
Type (ℓ-max (ℓ-max ℓB ℓ'B) (ℓ-max ℓE ℓ'E))
isCartesian' {a} {b} f {aᴰ} {bᴰ} fᴰ =
∀ {c : ob} {cᴰ : ob[ c ]} (g : B [ c , a ]) →
(∀ (hᴰ : Hom[ g ⋆ f ][ cᴰ , bᴰ ]) → ∃![ gᴰ ∈ Hom[ g ][ cᴰ , aᴰ ] ] gᴰ ⋆ᴰ fᴰ ≡ hᴰ)
opaque
unfolding isCartesian'
isPropIsCartesian' :
{a b : ob} {f : B [ a , b ]}
{aᴰ : ob[ a ]} {bᴰ : ob[ b ]}
(fᴰ : Hom[ f ][ aᴰ , bᴰ ]) →
isProp (isCartesian' f fᴰ)
isPropIsCartesian' {a} {b} {f} {aᴰ} {bᴰ} fᴰ =
isPropImplicitΠ2 λ c cᴰ → isPropΠ2 λ g hᴰ → isPropIsContr
opaque
unfolding isCartesian
unfolding isCartesian'
isCartesian→isCartesian' :
{a b : ob} (f : B [ a , b ])
{aᴰ : ob[ a ]} {bᴰ : ob[ b ]}
(fᴰ : Hom[ f ][ aᴰ , bᴰ ]) →
isCartesian f fᴰ →
isCartesian' f fᴰ
isCartesian→isCartesian' {a} {b} f {aᴰ} {bᴰ} fᴰ cartfᴰ g hᴰ =
((invIsEq (cartfᴰ g) hᴰ) , (secIsEq (cartfᴰ g) hᴰ)) ,
(λ { (gᴰ , gᴰ⋆fᴰ≡hᴰ) → cartfᴰ g .equiv-proof hᴰ .snd (gᴰ , gᴰ⋆fᴰ≡hᴰ) })
opaque
unfolding isCartesian
unfolding isCartesian'
isCartesian'→isCartesian :
{a b : ob} (f : B [ a , b ])
{aᴰ : ob[ a ]} {bᴰ : ob[ b ]}
(fᴰ : Hom[ f ][ aᴰ , bᴰ ]) →
isCartesian' f fᴰ →
isCartesian f fᴰ
equiv-proof (isCartesian'→isCartesian {a} {b} f {aᴰ} {bᴰ} fᴰ cart'fᴰ g) hᴰ = (cart'fᴰ g hᴰ .fst) , (cart'fᴰ g hᴰ .snd)
isCartesian≃isCartesian' :
{a b : ob} (f : B [ a , b ])
{aᴰ : ob[ a ]} {bᴰ : ob[ b ]}
(fᴰ : Hom[ f ][ aᴰ , bᴰ ]) →
isCartesian f fᴰ ≃ isCartesian' f fᴰ
isCartesian≃isCartesian' {a} {b} f {aᴰ} {bᴰ} fᴰ =
propBiimpl→Equiv (isPropIsCartesian f fᴰ) (isPropIsCartesian' fᴰ) (isCartesian→isCartesian' f fᴰ) (isCartesian'→isCartesian f fᴰ)
cartesianLift : {a b : ob} (f : B [ a , b ]) (bᴰ : ob[ b ]) → Type _
cartesianLift {a} {b} f bᴰ = Σ[ aᴰ ∈ ob[ a ] ] Σ[ fᴰ ∈ Hom[ f ][ aᴰ , bᴰ ] ] isCartesian f fᴰ
isCartesianFibration : Type _
isCartesianFibration =
∀ {a b : ob} {bᴰ : ob[ b ]}
→ (f : Hom[ a , b ])
→ ∥ cartesianLift f bᴰ ∥₁
isPropIsCartesianFibration : isProp isCartesianFibration
isPropIsCartesianFibration = isPropImplicitΠ3 λ a b bᴰ → isPropΠ λ f → isPropPropTrunc
cleavage : Type _
cleavage = {a b : ob} (f : Hom[ a , b ]) (bᴰ : ob[ b ]) → cartesianLift f bᴰ