{-# OPTIONS --lossy-unification #-}
module Cubical.Categories.Displayed.Exponentials.Base where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function
open import Cubical.Foundations.Equiv
open import Cubical.Data.Sigma hiding (_×_)
open import Cubical.Categories.Category
open import Cubical.Categories.Functor
open import Cubical.Categories.Exponentials
open import Cubical.Categories.Instances.Sets
open import Cubical.Categories.Presheaf.Constructions hiding (π₁; π₂)
open import Cubical.Categories.Presheaf.Representable
open import Cubical.Categories.Presheaf.More
open import Cubical.Categories.Presheaf.Morphism.Alt
open import Cubical.Categories.Constructions.Fiber
open import Cubical.Categories.Limits.BinProduct.More
open import Cubical.Categories.Displayed.Base
open import Cubical.Categories.Displayed.Functor
open import Cubical.Categories.Displayed.Adjoint.More
open import Cubical.Categories.Displayed.Instances.Sets.Base
open import Cubical.Categories.Displayed.Limits.BinProduct.Base
open import Cubical.Categories.Displayed.Limits.BinProduct.Fiberwise
open import Cubical.Categories.Displayed.BinProduct hiding (_×ᴰ_)
open import Cubical.Categories.Displayed.Fibration.Base
open import Cubical.Categories.Displayed.Presheaf
open import Cubical.Categories.Displayed.Presheaf.CartesianLift using (isCatFibration')
private
variable
ℓC ℓC' ℓCᴰ ℓCᴰ' : Level
module _ {C : Category ℓC ℓC'} (Cᴰ : Categoryᴰ C ℓCᴰ ℓCᴰ') where
private
module C = Category C
module Cᴰ = Categoryᴰ Cᴰ
Exponentialᴰ :
∀ {c d} { -×c : BinProductsWith C c}
cᴰ (dᴰ : Cᴰ.ob[ d ]) (-×ᴰcᴰ : BinProductsWithᴰ Cᴰ -×c cᴰ)
→ (c⇒d : Exponential C c d -×c)
→ Type _
Exponentialᴰ cᴰ dᴰ -×ᴰcᴰ c⇒d = RightAdjointAtᴰ (BinProductWithFᴰ Cᴰ _ -×ᴰcᴰ) c⇒d dᴰ
Exponentialsᴰ : ∀ bp
→ Exponentials C bp
→ BinProductsᴰ Cᴰ bp
→ Type _
Exponentialsᴰ bp exps bpᴰ = ∀ {c d} (cᴰ : Cᴰ.ob[ c ])(dᴰ : Cᴰ.ob[ d ])
→ Exponentialᴰ cᴰ dᴰ (λ _ xᴰ → bpᴰ (xᴰ , cᴰ)) (AnExponential C bp exps)
Exponentialᴰ' :
∀ {c d} { -×c : BinProductsWith C c}
cᴰ (dᴰ : Cᴰ.ob[ d ]) (-×ᴰcᴰ : LocallyRepresentableᴰ (_ , -×c) (Cᴰ [-][-, cᴰ ]))
→ (c⇒d : Exponential' C c d -×c)
→ Type _
Exponentialᴰ' cᴰ dᴰ -×ᴰcᴰ c⇒d = UniversalElementᴰ Cᴰ c⇒d
((_ , -×ᴰcᴰ) ⇒PshSmallᴰ (Cᴰ [-][-, dᴰ ]))
module ExponentialsᴰNotation
{bps : BinProducts C}
{exps : Exponentials C bps}
{bpsᴰ : BinProductsᴰ Cᴰ bps}
(expsᴰ : Exponentialsᴰ bps exps bpsᴰ) where
open ExponentialsNotation bps (Exponentials→AllExponentiable _ bps exps)
open BinProductsNotation bps
open BinProductsᴰNotation bpsᴰ
_⇒ᴰ_ : ∀{c c'} → Cᴰ.ob[ c ] → Cᴰ.ob[ c' ] →
Cᴰ.ob[ c ⇒ c' ]
cᴰ ⇒ᴰ c'ᴰ = UniversalElementᴰ.vertexᴰ (expsᴰ cᴰ c'ᴰ)
appᴰ : ∀{c c'} {cᴰ : Cᴰ.ob[ c ]} {c'ᴰ : Cᴰ.ob[ c' ]} →
Cᴰ.Hom[ app ][ (cᴰ ⇒ᴰ c'ᴰ) ×ᴰ cᴰ , c'ᴰ ]
appᴰ = UniversalElementᴰ.elementᴰ (expsᴰ _ _)
ldaᴰ : ∀{Γ c c'} {f : C [ Γ × c , c' ]} →
{Γᴰ : Cᴰ.ob[ Γ ]} {cᴰ : Cᴰ.ob[ c ]} {c'ᴰ : Cᴰ.ob[ c' ]} →
Cᴰ.Hom[ f ][ Γᴰ ×ᴰ cᴰ , c'ᴰ ] →
Cᴰ.Hom[ lda f ][ Γᴰ , cᴰ ⇒ᴰ c'ᴰ ]
ldaᴰ = UniversalElementᴰ.introᴰ (expsᴰ _ _)
βᴰ : ∀{Γ c c'} {f : C [ Γ × c , c' ]} →
{Γᴰ : Cᴰ.ob[ Γ ]} {cᴰ : Cᴰ.ob[ c ]} {c'ᴰ : Cᴰ.ob[ c' ]} →
{fᴰ : Cᴰ.Hom[ f ][ Γᴰ ×ᴰ cᴰ , c'ᴰ ]} →
(_ , (((π₁ᴰ Cᴰ.⋆ᴰ ldaᴰ fᴰ) ,pᴰ π₂ᴰ) Cᴰ.⋆ᴰ appᴰ)) ≡ (f , fᴰ)
βᴰ = UniversalElementᴰ.βᴰ (expsᴰ _ _)
ηᴰ : ∀{Γ c c'} {f : C [ Γ , c ⇒ c' ]} →
{Γᴰ : Cᴰ.ob[ Γ ]} {cᴰ : Cᴰ.ob[ c ]} {c'ᴰ : Cᴰ.ob[ c' ]} →
{fᴰ : Cᴰ.Hom[ f ][ Γᴰ , cᴰ ⇒ᴰ c'ᴰ ]} →
(f , fᴰ) ≡ (_ , ldaᴰ (((π₁ᴰ Cᴰ.⋆ᴰ fᴰ) ,pᴰ π₂ᴰ) Cᴰ.⋆ᴰ appᴰ))
ηᴰ = UniversalElementᴰ.ηᴰ (expsᴰ _ _)
module _ {C : Category ℓC ℓC'} (Cᴰ : Categoryᴰ C ℓCᴰ ℓCᴰ') where
private
module C = Category C
module Cᴰ = Fibers Cᴰ
Exponentialⱽ' :
∀ {c} (cᴰ dᴰ : Cᴰ.ob[ c ])
→ (-×ⱽcᴰ : LocallyRepresentableⱽ (Cᴰ [-][-, cᴰ ]))
→ Type _
Exponentialⱽ' {c} cᴰ dᴰ -×ⱽcᴰ = UniversalElementⱽ Cᴰ c
((_ , -×ⱽcᴰ) ⇒PshSmallⱽ (Cᴰ [-][-, dᴰ ]))
module _ (bpⱽ : BinProductsⱽ Cᴰ) (isFib : isFibration Cᴰ)
where
private
module bpⱽ = BinProductsⱽNotation _ bpⱽ
module isFib = isFibrationNotation Cᴰ isFib
open bpⱽ
record Exponentialⱽ {c : C.ob} (cᴰ cᴰ' : Cᴰ.ob[ c ]) : Type (ℓ-max (ℓ-max (ℓ-max ℓC ℓC') ℓCᴰ) ℓCᴰ') where
no-eta-equality
field
vertex : Cᴰ.ob[ c ]
element : Cᴰ.v[ c ] [ vertex ×ⱽ cᴰ , cᴰ' ]
becomes-universal : ∀ {b} (f : C [ b , c ]) →
becomesExponential (isFib.f*F f)
(BinProductsWithⱽ→BinProductsWithFiber Cᴰ λ cᴰ'' → bpⱽ _ _)
(λ _ → cartesianLift-preserves-BinProductFiber Cᴰ isFib (bpⱽ _ _) f)
(BinProductsWithⱽ→BinProductsWithFiber Cᴰ λ cᴰ'' → bpⱽ _ _)
vertex
element
module _ {b} {f : C [ b , c ]} where
f*⟨cᴰ⇒cᴰ'⟩ : Exponential Cᴰ.v[ b ] (isFib.f*yᴰ cᴰ f) (isFib.f*yᴰ cᴰ' f) (BinProductsWithⱽ→BinProductsWithFiber Cᴰ (λ cᴰ'' → bpⱽ _ _))
f*⟨cᴰ⇒cᴰ'⟩ = becomesExponential→Exponential _ _ _ _ (becomes-universal f)
module f*⟨cᴰ⇒cᴰ'⟩ = ExponentialNotation _ f*⟨cᴰ⇒cᴰ'⟩
lda≡ :
∀ {x : C.ob}{f : C [ x , c ]}{g} →
{xᴰ : Cᴰ.ob[ x ]} →
{fᴰ : Cᴰ.Hom[ C.id ][ xᴰ ×ⱽ isFib.f*yᴰ cᴰ f , isFib.f*yᴰ cᴰ' f ]}
{gᴰ : Cᴰ.Hom[ g ][ xᴰ , f*⟨cᴰ⇒cᴰ'⟩.vert ]}
→ (p : g ≡ C.id)
→ Path Cᴰ.Hom[ _ , _ ]
(C.id , fᴰ)
((C.id C.⋆ C.id) , (((π₁ Cᴰ.⋆ⱽ Cᴰ.reind p gᴰ) ,ⱽ π₂) Cᴰ.⋆ᴰ f*⟨cᴰ⇒cᴰ'⟩.app))
→ Path Cᴰ.Hom[ _ , _ ]
(C.id , f*⟨cᴰ⇒cᴰ'⟩.lda fᴰ)
(g , gᴰ)
lda≡ {f = f} g≡id p =
Cᴰ.≡in (f*⟨cᴰ⇒cᴰ'⟩.⇒ue.intro≡ (Cᴰ.rectify $ Cᴰ.≡out $ p ∙ Cᴰ.reind-filler _ _)) ∙ (sym $ Cᴰ.reind-filler g≡id _)
Exponentialsⱽ : Type _
Exponentialsⱽ = ∀ {c} cᴰ cᴰ' → Exponentialⱽ {c} cᴰ cᴰ'
module _ (bpⱽ : BinProductsⱽ Cᴰ) (isFib : isCatFibration' Cᴰ)
where
open UniversalElementⱽ
bpⱽ+fib⇒AllReprLocallyRepresentableⱽ :
∀ {c} (cᴰ : Cᴰ.ob[ c ]) → LocallyRepresentableⱽ (Cᴰ [-][-, cᴰ ])
bpⱽ+fib⇒AllReprLocallyRepresentableⱽ cᴰ Γᴰ γ =
bpⱽ _ (Γᴰ , isFib cᴰ γ .vertexⱽ)
◁PshIsoⱽ (idPshIsoᴰ ×ⱽIso yoRecIsoⱽ (isFib cᴰ γ))
Exponentialsⱽ' : Type _
Exponentialsⱽ' = ∀ {c} cᴰ dᴰ → Exponentialⱽ' {c} cᴰ dᴰ (bpⱽ+fib⇒AllReprLocallyRepresentableⱽ cᴰ)