{-# OPTIONS --safe #-}
module Cubical.Categories.Displayed.Quantifiers where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function
open import Cubical.Data.Sigma
open import Cubical.Categories.Category
open import Cubical.Categories.Functor
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.Functor.More
open import Cubical.Categories.Displayed.Adjoint.More
open import Cubical.Categories.Displayed.Constructions.Reindex.Base
open import Cubical.Categories.Displayed.Fibration.Base
open import Cubical.Categories.Displayed.Presheaf
private
variable
ℓC ℓC' ℓCᴰ ℓCᴰ' : Level
module _
{C : Category ℓC ℓC'}
{Cᴰ : Categoryᴰ C ℓCᴰ ℓCᴰ'}
{a : C .Category.ob}
(bp : BinProductsWith C a)
(isFib : isFibration Cᴰ)
where
private
module bp = BinProductsWithNotation bp
module C = Category C
module Cᴰ = Fibers Cᴰ
module isFib = isFibrationNotation _ isFib
Cᴰ[-×a] : Categoryᴰ C ℓCᴰ ℓCᴰ'
Cᴰ[-×a] = reindex Cᴰ bp.×aF
open Functorᴰ
weakenⱽ : Functorⱽ Cᴰ Cᴰ[-×a]
weakenⱽ .F-obᴰ bᴰ = isFib.f*yᴰ bᴰ bp.π₁
weakenⱽ .F-homᴰ fᴰ =
isFib.introCL (Cᴰ.reind (sym $ bp.×β₁) (isFib.π Cᴰ.⋆ᴰ fᴰ))
weakenⱽ .F-idᴰ = Cᴰ.rectify $ Cᴰ.≡out $
isFib.introCL≡ (sym (Cᴰ.reind-filler _ _)
∙ Cᴰ.⋆IdR _
∙ (sym $ Cᴰ.⋆IdL _)
∙ Cᴰ.⟨ Cᴰ.reind-filler _ _ ⟩⋆⟨ refl ⟩)
weakenⱽ .F-seqᴰ fᴰ gᴰ = Cᴰ.rectify $ Cᴰ.≡out $
isFib.introCL≡
(sym (Cᴰ.reind-filler _ _)
∙ (sym $ Cᴰ.⋆Assoc _ _ _)
∙ Cᴰ.⟨ Cᴰ.reind-filler _ _ ∙ (sym isFib.βCL) ⟩⋆⟨ refl ⟩
∙ Cᴰ.⋆Assoc _ _ _
∙ Cᴰ.⟨ refl ⟩⋆⟨ Cᴰ.reind-filler _ _ ∙ (sym isFib.βCL) ⟩
∙ (sym $ Cᴰ.⋆Assoc _ _ _)
∙ Cᴰ.⟨ Cᴰ.reind-filler _ _ ⟩⋆⟨ refl ⟩
)
module _ {Γ} (pᴰ : Cᴰ.ob[ Γ bp.×a ]) where
open Functor
open Functorᴰ
UniversalQuantifierPshⱽ : Presheafⱽ Γ Cᴰ ℓCᴰ'
UniversalQuantifierPshⱽ = RightAdjointProfⱽ weakenⱽ .F-obᴰ pᴰ
UniversalQuantifier : Type _
UniversalQuantifier = UniversalElementⱽ Cᴰ Γ UniversalQuantifierPshⱽ
module UniversalQuantifierNotation {b}{pᴰ : Cᴰ.ob[ b bp.×a ]}
(∀pᴰ : UniversalQuantifier pᴰ) where
module ∀ueⱽ = UniversalElementⱽ ∀pᴰ
open Functor
open Functorᴰ
open isFibrationNotation Cᴰ isFib
vert : Cᴰ.ob[ b ]
vert = ∀ueⱽ.vertexᴰ
app : Cᴰ [ bp.×aF ⟪ C.id ⟫ ][ f*yᴰ vert bp.π₁ , pᴰ ]
app = ∀ueⱽ.elementⱽ
lda : ∀ {Γ}{Γᴰ : Cᴰ.ob[ Γ ]}{f} →
Cᴰ [ bp.×aF ⟪ f ⟫ ][ f*yᴰ Γᴰ bp.π₁ , pᴰ ]
→ Cᴰ [ f ][ Γᴰ , vert ]
lda = ∀ueⱽ.universalⱽ .fst
lda⟨_⟩⟨_⟩ : ∀ {Γ}{Γᴰ : Cᴰ.ob[ Γ ]}{f g}
{fᴰ : Cᴰ [ bp.×aF ⟪ f ⟫ ][ f*yᴰ Γᴰ bp.π₁ , pᴰ ]}
{gᴰ : Cᴰ [ bp.×aF ⟪ g ⟫ ][ f*yᴰ Γᴰ bp.π₁ , pᴰ ]}
→ f ≡ g
→ Path Cᴰ.Hom[ _ , _ ]
(_ , fᴰ)
(_ , gᴰ)
→ Path Cᴰ.Hom[ _ , _ ]
(_ , lda fᴰ)
(_ , lda gᴰ)
lda⟨ f≡g ⟩⟨ fᴰ≡gᴰ ⟩ =
∀ueⱽ.∫ue.intro⟨ ΣPathP (f≡g , (Cᴰ.rectify $ Cᴰ.≡out fᴰ≡gᴰ)) ⟩
∀β : ∀ {Γ}{Γᴰ : Cᴰ.ob[ Γ ]}{f} →
{fᴰ : Cᴰ [ bp.×aF ⟪ f ⟫ ][ f*yᴰ Γᴰ bp.π₁ , pᴰ ]}
→ Path Cᴰ.Hom[ _ , _ ]
((bp.×aF ⟪ f ⟫ C.⋆ bp.×aF ⟪ C.id ⟫) , (weakenⱽ .F-homᴰ (lda fᴰ) Cᴰ.⋆ᴰ app))
(bp.×aF ⟪ f ⟫ , fᴰ)
∀β =
Cᴰ.reind-filler _ _
∙ Cᴰ.reind-filler _ _
∙ (Cᴰ.≡in $ ∀ueⱽ.βⱽ)
∀η : ∀ {Γ}{Γᴰ : Cᴰ.ob[ Γ ]}{f}
{fᴰ : Cᴰ [ f ][ Γᴰ , vert ]}
→ Path Cᴰ.Hom[ _ , _ ]
(f , fᴰ)
(f , lda (Cᴰ.reind (sym (bp.×aF .F-seq _ _) ∙ cong (bp.×aF .F-hom) (C.⋆IdR _))
(weakenⱽ .F-homᴰ fᴰ Cᴰ.⋆ᴰ app)))
∀η = (Cᴰ.≡in $ ∀ueⱽ.ηⱽ)
∙ lda⟨ refl ⟩⟨ sym (Cᴰ.reind-filler _ _) ∙ sym (Cᴰ.reind-filler _ _) ∙ Cᴰ.reind-filler _ _ ⟩
lda≡ : ∀ {Γ}{Γᴰ : Cᴰ.ob[ Γ ]}{f g}
{fᴰ : Cᴰ [ bp.×aF ⟪ f ⟫ ][ f*yᴰ Γᴰ bp.π₁ , pᴰ ]}
{gᴰ : Cᴰ [ g ][ Γᴰ , vert ]}
→ f ≡ g
→ Path Cᴰ.Hom[ _ , _ ]
(bp.×aF ⟪ f ⟫ , fᴰ)
((bp.×aF ⟪ g ⟫ C.⋆ bp.×aF ⟪ C.id ⟫), (weakenⱽ .F-homᴰ gᴰ Cᴰ.⋆ᴰ app))
→ Path Cᴰ.Hom[ _ , _ ]
(f , lda fᴰ)
(g , gᴰ)
lda≡ f≡g fᴰ≡gᴰπ =
lda⟨ f≡g ⟩⟨ fᴰ≡gᴰπ ∙ Cᴰ.reind-filler _ _ ⟩
∙ sym ∀η
module _
{C : Category ℓC ℓC'}
{Cᴰ : Categoryᴰ C ℓCᴰ ℓCᴰ'}
(bp : BinProducts C)
(isFib : isFibration Cᴰ)
where
private
module Cᴰ = Categoryᴰ Cᴰ
UniversalQuantifiers : Type _
UniversalQuantifiers = ∀ a Γ pᴰ
→ UniversalQuantifier {a = a} (λ c → bp (c , a)) isFib {Γ = Γ} pᴰ