module Cat.Displayed.Cartesian.Street where

Street fibrations🔗

  is-street-cartesian : ∀ {x y} → E.Hom x y → Type _
  is-street-cartesian {x} {y} f =
    ∀ {x'} (h : E.Hom x' y) (u : B.Hom (P · x') (P · x))
    → P.₁ h ≡ P.₁ f B.∘ u
    → is-contr (Σ[ v ∈ E.Hom x' x ] (f E.∘ v ≡ h) × (P.₁ v ≡ u))

  is-street-fibration : Type _
  is-street-fibration =
    ∀ {a b} (f : B.Hom a b) (b' : P[] ʻ b) →
    Σ[ a' ∈ P[] ʻ a ]
    Σ[ f' ∈ E.Hom (a' .fst) (b' .fst) ]
        is-street-cartesian f'
      × b' .snd .to B.∘ P.₁ f' ≡ f B.∘ a' .snd .to

  is-street-cartesian→is-cartesian
    : ∀ {x y} (f : E.Hom x y)
    → is-street-cartesian f
    → is-cartesian P[] {a' = inc₀ _} {inc₀ _} (P.₁ f) (inc₁ f)
  is-street-cartesian→is-cartesian f cart = record where
    universal {u' = u' , ui} m (g , α) =
      let
        contr (m , _ , c) _ = cart g (m B.∘ ui .to) $
          B.introl refl ∙∙ α ∙∙ B.pullr refl
       in m , B.eliml refl ∙ c
    commutes {u' = u' , ui} m (g , α) = Σ-prop-path! $ cart _ _ _ .centre .snd .fst
    unique {u' = u' , ui} {m} (m' , α) β = Σ-prop-path! $ ap fst $
      cart _ _ _ .paths (m' , ap fst β , B.introl refl ∙ α)

The short calculation above shows that a map generates a Cartesian map over only when its domain and codomain in are lifted from and

However, to show that is a Cartesian fibration, we will require a technical lemma extending this result to the case where is considered as a map with (resp. given an external witness that commutes with the maps (resp.
  private
    adjust-cartesian'
      : ∀ {x y x' y'} {f : B.Hom x y} {f' : E.Hom (x' .fst) (y' .fst)}
      → is-cartesian P[] {a' = inc₀ _} {inc₀ _} (P.₁ f') (inc₁ f')
      → (α : y' .snd .to B.∘ P.₁ f' ≡ f B.∘ x' .snd .to)
      → is-cartesian P[] {a' = x'} {y'} f (f' , α)
    adjust-cartesian' {x' = x' , xi} {y' , yi} {f' = f} cart α = mk where
      module cart = is-cartesian cart
      mk : is-cartesian P[] {a' = x' , xi} {y' , yi} _ _
      mk .universal {u' = u'@(_ , ui)} m (g , β) = m' , q where
        abstract
          p : B.id B.∘ P.₁ g ≡ (P.₁ f B.∘ xi .from B.∘ m) B.∘ ui .to
          p = B.eliml refl ∙ B.iso→monic yi _ _
            (β ∙ sym (B.pulll (B.extendl α) ∙ B.cdar (B.cancell (xi .invl))))

        open Σ (cart.universal {u' = u'} (xi .from B.∘ m) (g , p))
          renaming (fst to m' ; snd to γ)

        abstract
          q : xi .to B.∘ P.₁ m' ≡ m B.∘ ui .to
          q = B.pushr (B.introl refl ∙ γ) ∙ B.car (B.cancell (xi .invl))

      mk .commutes {u' = u'} m (g , β) =
        Σ-prop-path! $ ap fst $ cart.commutes {u' = u'} _ _

      mk .unique {u' = u' , ui} {m} (m' , β) γ =
        Σ-prop-path! $ ap fst $ cart.unique (m' , p) (Σ-prop-path! (ap fst γ))
        where
          p : B.id B.∘ P.₁ m' ≡ (xi .from B.∘ m) B.∘ ui .to
          p = B.eliml refl ∙ B.iso→monic xi _ _
            (β ∙ sym (B.pulll (B.cancell (xi .invl))))
  Cartesian-street-fibration : is-street-fibration → Cartesian-fibration P[]
  Cartesian-street-fibration lifts f y' =
    let (a' , f' , f'c , α) = lifts f y' in record where
      x'        = a'
      lifting   = f' , α
      cartesian = adjust-cartesian' (is-street-cartesian→is-cartesian f' f'c) α