{-# OPTIONS --safe #-} module Cubical.Categories.Instances.Functors.Currying where open import Cubical.Foundations.Prelude open import Cubical.Foundations.Isomorphism open import Cubical.Foundations.Transport open import Cubical.Categories.Category renaming (isIso to isIsoC) open import Cubical.Categories.Constructions.BinProduct open import Cubical.Categories.Functor.Base open import Cubical.Categories.NaturalTransformation.Base open import Cubical.Foundations.Function renaming (_∘_ to _∘→_) open import Cubical.Categories.Instances.Functors open import Cubical.Categories.Equivalence.AdjointEquivalence open import Cubical.Categories.Adjoint private variable ℓC ℓC' ℓD ℓD' ℓE ℓE' : Level module _ (C : Category ℓC ℓC') (D : Category ℓD ℓD') where open Category open NatTrans open Functor open Iso module _ (E : Category ℓE ℓE') where λF : Functor (E ×C C) D → Functor E (FUNCTOR C D) λF F .F-ob e .F-ob c = F ⟅ e , c ⟆ λF F .F-ob e .F-hom f = F ⟪ (E .id) , f ⟫ λF F .F-ob e .F-id = F .F-id λF F .F-ob e .F-seq f g = F ⟪ E .id , g ∘⟨ C ⟩ f ⟫ ≡⟨ (λ i → F ⟪ (E .⋆IdL (E .id) (~ i)) , (g ∘⟨ C ⟩ f) ⟫) ⟩ (F ⟪ (E .id ∘⟨ E ⟩ E .id) , g ∘⟨ C ⟩ f ⟫) ≡⟨ F .F-seq (E .id , f) (E .id , g) ⟩ (F ⟪ E .id , g ⟫ ∘⟨ D ⟩ F ⟪ E .id , f ⟫) ∎ λF F .F-hom h .N-ob c = F ⟪ h , (C .id) ⟫ λF F .F-hom h .N-hom f = F ⟪ h , C .id ⟫ ∘⟨ D ⟩ F ⟪ E .id , f ⟫ ≡⟨ sym (F .F-seq _ _) ⟩ F ⟪ h ∘⟨ E ⟩ E .id , C .id ∘⟨ C ⟩ f ⟫ ≡⟨ (λ i → F ⟪ E .⋆IdL h i , C .⋆IdR f i ⟫) ⟩ F ⟪ h , f ⟫ ≡⟨ (λ i → F ⟪ (E .⋆IdR h (~ i)) , (C .⋆IdL f (~ i)) ⟫) ⟩ F ⟪ E .id ∘⟨ E ⟩ h , f ∘⟨ C ⟩ C .id ⟫ ≡⟨ F .F-seq _ _ ⟩ F ⟪ E .id , f ⟫ ∘⟨ D ⟩ F ⟪ h , C .id ⟫ ∎ λF F .F-id = makeNatTransPath (funExt λ c → F .F-id) λF F .F-seq f g = makeNatTransPath (funExt lem) where lem : (c : C .ob) → F ⟪ g ∘⟨ E ⟩ f , C .id ⟫ ≡ F ⟪ g , C .id ⟫ ∘⟨ D ⟩ F ⟪ f , C .id ⟫ lem c = F ⟪ g ∘⟨ E ⟩ f , C .id ⟫ ≡⟨ (λ i → F ⟪ (g ∘⟨ E ⟩ f) , (C .⋆IdR (C .id) (~ i)) ⟫) ⟩ F ⟪ g ∘⟨ E ⟩ f , C .id ∘⟨ C ⟩ C .id ⟫ ≡⟨ F .F-seq (f , C .id) (g , C .id) ⟩ (F ⟪ g , C .id ⟫) ∘⟨ D ⟩ (F ⟪ f , C .id ⟫) ∎ λFFunctor : Functor (FUNCTOR (E ×C C) D) (FUNCTOR E (FUNCTOR C D)) F-ob λFFunctor = λF N-ob (F-hom λFFunctor x) _ = natTrans (curry (N-ob x) _) (curry (N-hom x) _) N-hom ((F-hom λFFunctor) x) _ = makeNatTransPath (funExt λ _ → N-hom x (_ , C .id)) F-id λFFunctor = makeNatTransPath refl F-seq λFFunctor _ _ = makeNatTransPath refl λF⁻ : Functor E (FUNCTOR C D) → Functor (E ×C C) D F-ob (λF⁻ a) = uncurry (F-ob ∘→ F-ob a) F-hom (λF⁻ a) _ = N-ob (F-hom a _) _ ∘⟨ D ⟩ (F-hom (F-ob a _)) _ F-id (λF⁻ a) = cong₂ (seq' D) (F-id (F-ob a _)) (cong (flip N-ob _) (F-id a)) ∙ D .⋆IdL _ F-seq (λF⁻ a) _ (eG , cG) = cong₂ (seq' D) (F-seq (F-ob a _) _ _) (cong (flip N-ob _) (F-seq a _ _)) ∙ AssocCong₂⋆R D (N-hom ((F-hom a _) ●ᵛ (F-hom a _)) _ ∙ (⋆Assoc D _ _ _) ∙ cong (seq' D _) (sym (N-hom (F-hom a eG) cG))) λF⁻Functor : Functor (FUNCTOR E (FUNCTOR C D)) (FUNCTOR (E ×C C) D) F-ob λF⁻Functor = λF⁻ N-ob (F-hom λF⁻Functor x) = uncurry (N-ob ∘→ N-ob x) N-hom ((F-hom λF⁻Functor) {F} {F'} x) {xx} {yy} = uncurry λ hh gg → AssocCong₂⋆R D (cong N-ob (N-hom x hh) ≡$ _) ∙∙ cong (comp' D _) ((N-ob x (fst xx) .N-hom) gg) ∙∙ D .⋆Assoc _ _ _ F-id λF⁻Functor = makeNatTransPath refl F-seq λF⁻Functor _ _ = makeNatTransPath refl isoλF : Iso (Functor (E ×C C) D) (Functor E (FUNCTOR C D)) fun isoλF = λF inv isoλF = λF⁻ rightInv isoλF b = Functor≡ (λ _ → Functor≡ (λ _ → refl) λ _ → cong (seq' D _) (congS (flip N-ob _) (F-id b)) ∙ D .⋆IdR _) λ _ → makeNatTransPathP _ _ (funExt λ _ → cong (comp' D _) (F-id (F-ob b _)) ∙ D .⋆IdL _) leftInv isoλF a = Functor≡ (λ _ → refl) λ _ → sym (F-seq a _ _) ∙ cong (F-hom a) (cong₂ _,_ (E .⋆IdL _) (C .⋆IdR _)) open AdjointEquivalence 𝟙≅ᶜλF⁻∘λF : 𝟙⟨ FUNCTOR (E ×C C) D ⟩ ≅ᶜ λF⁻Functor ∘F λFFunctor 𝟙≅ᶜλF⁻∘λF = pathToNatIso $ Functor≡ (λ x → Functor≡ (λ _ → refl) λ _ → cong (F-hom x) (cong₂ _,_ (sym (E .⋆IdL _)) (sym (C .⋆IdR _))) ∙ F-seq x _ _) λ _ → makeNatTransPathP _ _ refl λF∘λF⁻≅ᶜ𝟙 : λFFunctor ∘F λF⁻Functor ≅ᶜ 𝟙⟨ FUNCTOR E (FUNCTOR C D) ⟩ λF∘λF⁻≅ᶜ𝟙 = pathToNatIso $ Functor≡ (λ x → Functor≡ (λ _ → Functor≡ (λ _ → refl) λ _ → cong (D ⋆ F-hom (F-ob x _) _) (cong N-ob (F-id x) ≡$ _) ∙ D .⋆IdR _) λ _ → makeNatTransPathP _ _ (funExt λ _ → cong (comp' D _) (F-id (F-ob x _)) ∙ D .⋆IdL _)) λ _ → makeNatTransPathP _ _ (funExt λ _ → makeNatTransPathP _ _ refl) open UnitCounit.TriangleIdentities FunctorCurryAdjointEquivalence : AdjointEquivalence (FUNCTOR (E ×C C) D) (FUNCTOR E (FUNCTOR C D)) fun FunctorCurryAdjointEquivalence = λFFunctor inv FunctorCurryAdjointEquivalence = λF⁻Functor η FunctorCurryAdjointEquivalence = 𝟙≅ᶜλF⁻∘λF ε FunctorCurryAdjointEquivalence = λF∘λF⁻≅ᶜ𝟙 Δ₁ (triangleIdentities FunctorCurryAdjointEquivalence) c = makeNatTransPath $ funExt λ _ → makeNatTransPath (funExt λ _ → cong (∘diag $ seq' D) (congP₂$ (transport-fillerExt⁻ (cong (D End[_] ∘→ c ⟅_⟆) (transportRefl _))) λ _ → D .id) ∙ D .⋆IdR _) Δ₂ (triangleIdentities FunctorCurryAdjointEquivalence) d = makeNatTransPath $ funExt λ _ → cong (∘diag $ seq' D) (congP₂$ (transport-fillerExt⁻ (cong (D End[_] ∘→ uncurry (F-ob ∘→ F-ob d)) (transportRefl _))) λ _ → D .id) ∙ D .⋆IdR _