-- The graph of a profunctor {-# OPTIONS --safe -W noUnsupportedIndexedMatch #-} module Cubical.Categories.Constructions.CoGraph where -- open import Cubical.Categories.Category -- open import Cubical.Categories.Functor -- open import Cubical.Categories.Constructions.BinProduct -- open import Cubical.Foundations.Prelude hiding (Square) -- open import Cubical.Foundations.Structure -- open import Cubical.Foundations.Function -- open import Cubical.Foundations.HLevels -- open import Cubical.Data.Empty as Empty -- open import Cubical.Data.Sigma -- open import Cubical.Data.Sum -- open import Cubical.Categories.Profunctor.General -- open import Cubical.Categories.Functors.HomFunctor -- open import Cubical.Categories.Profunctor.Morphism -- private -- variable -- ℓC ℓC' ℓD ℓD' ℓS : Level -- open Category -- open Functor -- module _ {C : Category ℓC ℓC'} -- {D : Category ℓD ℓD'} -- (P : C o-[ ℓS ]-* D) where -- CoGraphOb : Type (ℓ-max ℓC ℓD) -- CoGraphOb = C .ob ⊎ D .ob -- data CoGraphHom : CoGraphOb → CoGraphOb → -- Type (ℓ-max ℓS (ℓ-max (ℓ-max ℓC ℓC') (ℓ-max ℓD ℓD'))) where -- ↑o : ∀ {A B} → C [ A , B ] → CoGraphHom (inl A) (inl B) -- ↑* : ∀ {A B} → D [ A , B ] → CoGraphHom (inr A) (inr B) -- ↑p : ∀ {A B} → ⟨ P ⟅ A , B ⟆ ⟩ → CoGraphHom (inl A) (inr B) -- CoGraphComp : ∀ {A B C} → CoGraphHom A B → CoGraphHom B C → CoGraphHom A C -- CoGraphComp (↑o f) (↑o f') = ↑o (f ⋆⟨ C ⟩ f') -- CoGraphComp (↑* g) (↑* g') = ↑* (g ⋆⟨ D ⟩ g') -- CoGraphComp (↑o f) (↑p p) = ↑p (P .F-hom (f , (D .id)) p) -- CoGraphComp (↑p p) (↑* g) = ↑p (P .F-hom ((C .id) , g) p) -- ↑p-r : ∀ {A B} → CoGraphHom (inl A) (inr B) → ⟨ P ⟅ A , B ⟆ ⟩ -- ↑p-r (↑p p) = p -- private -- ↑o-r : ∀ {A B} → CoGraphHom (inl A) (inl B) → C [ A , B ] -- ↑o-r (↑o f) = f -- ↑o-r-retract : ∀ {A B} → (f : CoGraphHom (inl A) (inl B)) → -- ↑o (↑o-r f) ≡ f -- ↑o-r-retract (↑o f) = refl -- ↑*-r : ∀ {A B} → CoGraphHom (inr A) (inr B) → D [ A , B ] -- ↑*-r (↑* g) = g -- ↑*-r-retract : ∀ {A B} → (f : CoGraphHom (inr A) (inr B)) → -- ↑* (↑*-r f) ≡ f -- ↑*-r-retract (↑* f) = refl -- ↑p-r-retract : ∀ {A B} → (f : CoGraphHom (inl A) (inr B)) → -- ↑p (↑p-r f) ≡ f -- ↑p-r-retract (↑p f) = refl -- absurd-r : ∀ {A B} → CoGraphHom (inr A) (inl B) → ⊥ -- absurd-r () -- CoGraph : Category (ℓ-max ℓC ℓD) -- (ℓ-max (ℓ-max (ℓ-max (ℓ-max ℓC ℓC') ℓD) ℓD') ℓS) -- CoGraph .ob = CoGraphOb -- CoGraph .Hom[_,_] = CoGraphHom -- CoGraph .id {inl A} = ↑o (C .id) -- CoGraph .id {inr B} = ↑* (D .id) -- CoGraph ._⋆_ = CoGraphComp -- CoGraph .⋆IdL (↑o f) = cong ↑o (C .⋆IdL f) -- CoGraph .⋆IdL (↑p p) = cong ↑p (λ i → (P .F-id i) p) -- CoGraph .⋆IdL (↑* g) = cong ↑* (D .⋆IdL g) -- CoGraph .⋆IdR (↑o f) = cong ↑o (C .⋆IdR f) -- CoGraph .⋆IdR (↑p p) = cong ↑p (λ i → (P .F-id i) p) -- CoGraph .⋆IdR (↑* g) = cong ↑* (D .⋆IdR g) -- CoGraph .⋆Assoc (↑o f) (↑o f') (↑o f'') = cong ↑o (C .⋆Assoc _ _ _) -- CoGraph .⋆Assoc (↑o f) (↑o f') (↑p p) = -- cong ↑p ((λ i → P .F-hom (f ⋆⟨ C ⟩ f' , D .⋆IdL (D .id) (~ i)) p) -- ∙ λ i → (P .F-seq (f' , D .id) (f , D .id) i) p) -- CoGraph .⋆Assoc (↑o f) (↑p p) (↑* g) = -- cong ↑p ((λ i → (P .F-seq (f , D .id) (C .id , g) (~ i)) p) -- ∙ (λ i → P .F-hom ((C .⋆IdL f ∙ sym (C .⋆IdR f)) i , -- (D .⋆IdL g ∙ sym (D .⋆IdR g)) i) p) -- ∙ λ i → (P .F-seq ((C .id) , g) (f , (D .id)) i ) p) -- CoGraph .⋆Assoc (↑p p) (↑* h) (↑* h') = -- cong ↑p ((λ i → (P .F-seq (C .id , h) (C .id , h') (~ i)) p) -- ∙ λ i → P .F-hom ( C .⋆IdL (C .id) i , h ⋆⟨ D ⟩ h' ) p) -- CoGraph .⋆Assoc (↑* h) (↑* h') (↑* h'') = cong ↑* (D .⋆Assoc _ _ _) -- CoGraph .isSetHom {inl A} {inl A'} = -- isSetRetract ↑o-r ↑o ↑o-r-retract (C .isSetHom) -- CoGraph .isSetHom {inl A} {inr B} = -- isSetRetract ↑p-r ↑p ↑p-r-retract ((P ⟅ _ ⟆ ) .snd) -- CoGraph .isSetHom {inr B} {inr B'} = -- isSetRetract ↑*-r ↑* ↑*-r-retract (D .isSetHom) -- CoGraph .isSetHom {inr B} {inl A} = λ f → Empty.rec (absurd-r f) -- ↑oF : Functor C CoGraph -- ↑oF .F-ob = inl -- ↑oF .F-hom = ↑o -- ↑oF .F-id = refl -- ↑oF .F-seq f g = refl -- ↑*F : Functor D CoGraph -- ↑*F .F-ob = inr -- ↑*F .F-hom = ↑* -- ↑*F .F-id = refl -- ↑*F .F-seq f g = refl -- open ProfHom -- ↑pH : ProfHom P ↑oF ↑*F (HomFunctor CoGraph) -- ↑pH .R-hom b c = ↑p -- ↑pH .R-nat b' b c c' f p g = -- cong ↑p ((λ i → (P ⟪ C .⋆IdL f (~ i) , D .⋆IdL g (~ i) ⟫) p) ∙ -- (λ i → P .F-seq (f , (D .id)) ((C .id) , g) i p)) -- ↑pH-r : ProfHom (HomFunctor CoGraph ∘F ((↑oF ^opF) ×F ↑*F)) -- (Id {C = C}) (Id {C = D}) P -- ↑pH-r .R-hom b c = ↑p-r -- ↑pH-r .R-nat b' b c c' f (↑p p) g = -- (λ i → P .F-seq (f , (D .id)) ((C .id) , g) (~ i) p) ∙ -- λ i → P .F-hom (C .⋆IdL f i , D .⋆IdL g i) p