{-# OPTIONS --without-K --safe #-}
open import Level
open import Categories.Category
module Categories.Functor.Power.Functorial {o ℓ e : Level} (C : Category o ℓ e) where
open import Relation.Binary.PropositionalEquality using (_≡_; refl; trans)
open import Categories.Functor renaming (id to idF)
open import Categories.Category.Construction.StrictDiscrete
open import Categories.Category.Equivalence
open import Categories.Category.Construction.Functors
open import Categories.NaturalTransformation using (NaturalTransformation; ntHelper)
open import Categories.NaturalTransformation.NaturalIsomorphism as NI
using (module NaturalIsomorphism; _≃_; refl)
import Categories.Morphism.Reasoning as MR
open MR C
import Categories.Functor.Power as Power
open Power C
open Category using (Obj)
open Category C using (_⇒_; _∘_; module Equiv)
module C = Category C
module CE = Equiv
private
variable
i : Level
I : Set i
exp→functor₀ : Obj (Exp I) → Functor (Discrete I) C
exp→functor₀ X = record
{ F₀ = X
; F₁ = λ { refl → C.id }
; identity = CE.refl
; homomorphism = λ { {_} {_} {_} {refl} {refl} → CE.sym C.identityˡ}
; F-resp-≈ = λ { {_} {_} {refl} {refl} refl → CE.refl}
}
exp→functor₁ : {X Y : I → C.Obj} → Exp I [ X , Y ] → NaturalTransformation (exp→functor₀ X) (exp→functor₀ Y)
exp→functor₁ F = record { η = F ; commute = λ { refl → id-comm } ; sym-commute = λ { refl → id-comm-sym } }
exp→functor : Functor (Exp I) (Functors (Discrete I) C)
exp→functor = record
{ F₀ = exp→functor₀
; F₁ = exp→functor₁
; identity = CE.refl
; homomorphism = CE.refl
; F-resp-≈ = λ eqs {x} → eqs x
}
functor→exp : Functor (Functors (Discrete I) C) (Exp I)
functor→exp = record
{ F₀ = Functor.F₀
; F₁ = NaturalTransformation.η
; identity = λ _ → CE.refl
; homomorphism = λ _ → CE.refl
; F-resp-≈ = λ eqs i → eqs {i}
}
exp≋functor : StrongEquivalence (Exp I) (Functors (Discrete I) C)
exp≋functor = record
{ F = exp→functor
; G = functor→exp
; weak-inverse = record
{ F∘G≈id = record
{ F⇒G = ntHelper record
{ η = λ DI → record
{ η = λ _ → C.id
; commute = λ { refl → C.∘-resp-≈ˡ (CE.sym (Functor.identity DI))}
; sym-commute = λ { refl → C.∘-resp-≈ˡ (Functor.identity DI)}
}
; commute = λ _ → id-comm-sym
}
; F⇐G = ntHelper record
{ η = λ DI → ntHelper record { η = λ _ → C.id ; commute = λ { refl → C.∘-resp-≈ʳ (Functor.identity DI)} }
; commute = λ _ → id-comm-sym
}
; iso = λ X → record { isoˡ = C.identity²; isoʳ = C.identity² }
}
; G∘F≈id = record
{ F⇒G = record { η = λ _ _ → C.id ; commute = λ _ _ → id-comm-sym ; sym-commute = λ _ _ → id-comm }
; F⇐G = record { η = λ _ _ → C.id ; commute = λ _ _ → id-comm-sym ; sym-commute = λ _ _ → id-comm }
; iso = λ X → record { isoˡ = λ _ → C.identity² ; isoʳ = λ _ → C.identity² }
}
}
}
where
open C.HomReasoning