module GpdCont.WildCat.TypeOfHLevel where open import GpdCont.Prelude renaming (id to idfun) open import GpdCont.WildCat.Subtype open import GpdCont.WildCat.NatTrans open import GpdCont.WildCat.FunctorCategory public open import Cubical.Foundations.Function using (flip) renaming (_∘_ to _∘fun_) open import Cubical.Foundations.HLevels open import Cubical.Foundations.Isomorphism open import Cubical.WildCat.Base using (WildCat ; _[_,_] ; concatMor) open import Cubical.WildCat.Functor hiding (_$_) open import Cubical.WildCat.Instances.Types using (TypeCat) import Cubical.Foundations.GroupoidLaws as GL module _ (ℓ : Level) where open WildCat hiding (_⋆_) TypeOfHLevelCat : (n : HLevel) → WildCat (ℓ-suc ℓ) ℓ TypeOfHLevelCat n = SubtypeCat (TypeCat ℓ) (isOfHLevel n) hGroupoidCat : WildCat (ℓ-suc ℓ) ℓ hGroupoidCat = TypeOfHLevelCat 3 private 𝕋 = TypeCat ℓ module 𝕋 = WildCat 𝕋 𝔾 = hGroupoidCat module 𝔾 = WildCat 𝔾 Nat : (F G : WildFunctor hGroupoidCat hGroupoidCat) → Type _ Nat F G = WildNatTrans _ _ F G idNat : (F : WildFunctor hGroupoidCat hGroupoidCat) → Nat F F idNat F .WildNatTrans.N-ob x = idfun (F .WildFunctor.F-ob x .fst) idNat F .WildNatTrans.N-hom f = refl module composite {F G H : WildFunctor hGroupoidCat hGroupoidCat} (α : Nat F G) (β : Nat G H) where module G = WildFunctor G module F = WildFunctor F module H = WildFunctor H module α = WildNatTrans α module β = WildNatTrans β composite-ob : (x : hGroupoidCat .ob) → hGroupoidCat [ F.F-ob x , H.F-ob x ] composite-ob x = (β.N-ob x) ∘fun (α.N-ob x) composite-hom : ∀ (x y : hGroupoidCat .ob) (f : hGroupoidCat [ x , y ]) → (composite-ob y) ∘fun (F.F-hom f) ≡ H.F-hom f ∘fun (composite-ob x) composite-hom x y f = congS ((β.N-ob y) ∘fun_) (α.N-hom f) ∙ congS (_∘fun α.N-ob x) (β.N-hom f) composite : Nat F H composite .WildNatTrans.N-ob = composite-ob composite .WildNatTrans.N-hom {x} {y} = composite-hom x y open composite using () renaming (composite to _⊛_ ; composite-hom to ⊛-hom) public idNatTransₗ : ∀ {F G : WildFunctor hGroupoidCat hGroupoidCat} (α : Nat F G) → (idNat F) ⊛ α ≡ α idNatTransₗ {F} {G} α = WildNatTransPath (λ x → refl) (λ {x} {y} f → sym (GL.lUnit $ α .WildNatTrans.N-hom f)) idNatTransᵣ : ∀ {F G : WildFunctor hGroupoidCat hGroupoidCat} (α : Nat F G) → α ⊛ (idNat G) ≡ α idNatTransᵣ {F} {G} α = WildNatTransPath (λ x → refl) (λ {x} {y} f → sym (GL.rUnit $ α .WildNatTrans.N-hom f)) assocNatTrans : ∀ {F G H K : WildFunctor hGroupoidCat hGroupoidCat} (α : Nat F G) (β : Nat G H) (γ : Nat H K) → (α ⊛ β) ⊛ γ ≡ α ⊛ (β ⊛ γ) assocNatTrans {F} {G} {H} {K} α β γ = WildNatTransPath (λ x → refl) assoc where module F = WildFunctor F module G = WildFunctor G module H = WildFunctor H module K = WildFunctor K open WildNatTrans assoc : ∀ {x y} f → composite.composite-hom (α ⊛ β) γ x y f ≡ composite.composite-hom α (β ⊛ γ) x y f assoc {x} {y} f = congS ((γ .N-ob y) ∘fun_) ((α ⊛ β) .N-hom f) ∙ congS (_∘fun (α ⊛ β) .N-ob x) (γ .N-hom f) ≡⟨ cong (_∙ cong (_∘fun (α ⊛ β) .N-ob x) (γ .N-hom f)) (GL.cong-∙ (γ .N-ob y ∘fun_) _ _) ⟩ (_ ∙ _) ∙ cong (_∘fun (α ⊛ β) .N-ob x) (γ .N-hom f) ≡⟨ sym (GL.assoc _ _ _) ⟩ congS (((β ⊛ γ) .N-ob y) ∘fun_) (α .N-hom f) ∙ _ ≡⟨ cong (cong (((β ⊛ γ) .N-ob y) ∘fun_) (α .N-hom f) ∙_) (sym (GL.cong-∙ (_∘fun α .N-ob x) (congS ((γ .N-ob _) ∘fun_) (β .N-hom f)) (congS (_∘fun β .N-ob _) (γ .N-hom f))) )⟩ congS (((β ⊛ γ) .N-ob y) ∘fun_) (α .N-hom f) ∙ congS (_∘fun α .N-ob x) ( congS ((γ .N-ob _) ∘fun_) (β .N-hom f) ∙ congS (_∘fun β .N-ob _) (γ .N-hom f) ) ∎ hGroupoidEndo : WildCat (ℓ-suc ℓ) (ℓ-suc ℓ) hGroupoidEndo .ob = WildFunctor hGroupoidCat hGroupoidCat hGroupoidEndo .Hom[_,_] = WildNatTrans hGroupoidCat hGroupoidCat hGroupoidEndo .id = idNat _ hGroupoidEndo .WildCat._⋆_ = _⊛_ hGroupoidEndo .⋆IdL = idNatTransₗ hGroupoidEndo .⋆IdR = idNatTransᵣ hGroupoidEndo .⋆Assoc = assocNatTrans open WildFunctor open WildNatTrans isGroupoidEndoNatTrans : ∀ F G → isGroupoid (hGroupoidEndo [ F , G ]) isGroupoidEndoNatTrans F G = isGroupoidRetract {B = NatTrans′} toNatTrans′ fromNatTrans′ retr isGroupoidNatTrans′ where NatTrans′ = Σ[ α ∈ (∀ X → ⟨ F .F-ob X ⟩ → ⟨ G .F-ob X ⟩) ] ∀ X Y (H : ⟨ X ⟩ → ⟨ Y ⟩) → F .F-hom H ⋆ α Y ≡ α X ⋆ G .F-hom H isGroupoidNatTrans′ : isGroupoid NatTrans′ isGroupoidNatTrans′ = isGroupoidΣ (isGroupoidΠ2 λ X _ → str (G .F-ob X)) (λ α → isGroupoidΠ3 λ X Y H → isOfHLevelPath 3 (isGroupoidΠ λ _ → str (G .F-ob Y)) _ _) toNatTrans′ : hGroupoidEndo [ F , G ] → NatTrans′ toNatTrans′ α .fst = α .N-ob toNatTrans′ α .snd _ _ = α .N-hom fromNatTrans′ : NatTrans′ → hGroupoidEndo [ F , G ] fromNatTrans′ (α , α-hom) .N-ob = α fromNatTrans′ (α , α-hom) .N-hom = α-hom _ _ retr : ∀ α → fromNatTrans′ (toNatTrans′ α) ≡ α retr α i .N-ob = α .N-ob retr α i .N-hom = α .N-hom hGroupoidNatTransPath : ∀ {F G} {α β : hGroupoidEndo [ F , G ]} → (ob-path : ∀ X → α .N-ob X ≡ β .N-ob X) → (∀ {x} {y} (f : hGroupoidCat [ x , y ]) → PathP (λ i → F .F-hom f ⋆ (ob-path y i) ≡ (ob-path x i) ⋆ G .F-hom f) _ _) → α ≡ β hGroupoidNatTransPath = WildNatTransPath hGroupoidNatTransSquare : ∀ {F G} → {α₀₀ α₀₁ : hGroupoidEndo [ F , G ]} → {α₀₋ : α₀₀ ≡ α₀₁} → {α₁₀ α₁₁ : hGroupoidEndo [ F , G ]} → {α₁₋ : α₁₀ ≡ α₁₁} → {α₋₀ : α₀₀ ≡ α₁₀} → {α₋₁ : α₀₁ ≡ α₁₁} → (ob-square : ∀ X → Square (cong N-ob α₀₋ ≡$ X) (cong N-ob α₁₋ ≡$ X) (cong N-ob α₋₀ ≡$ X) (cong N-ob α₋₁ ≡$ X)) → Square α₀₋ α₁₋ α₋₀ α₋₁ hGroupoidNatTransSquare = isGroupoidHom→WildNatTransSquare (λ {x} {y} → isGroupoidΠ λ _ → str y) open WildCat hiding (_⋆_) hseq' : ∀ {ℓ} (x y z : hGroupoidCat ℓ .ob) (f : hGroupoidCat ℓ [ x , y ]) (g : hGroupoidCat ℓ [ y , z ]) → hGroupoidCat ℓ [ x , z ] hseq' x y z = concatMor (hGroupoidCat _) {x = x} {y = y} {z = z} syntax hseq' x y z f g = f ⋆⟨hGpd[ x , y , z ]⟩ g