Other Agda modules in this section (16)

Chapter 1, rebuild2, checked 14 October 2026 · source revision b982f5a.

Corresponding book passages
# Functoriality of functor categories

Postcomposition and precomposition curry the corresponding evaluations.
Their formulas on arbitrary indexed functors retain the chosen beta
triangles. The family squares of these formulas are proved before the
identity, composition and equivalence laws. Precomposition reuses the
existing square for separating the two product coordinates.

```agda
{-# OPTIONS --without-K #-}
module SCT.VolumeI.Chapter01.Section07.Functoriality where

open import SCT.VolumeI.Chapter01.Section01.Vocabulary hiding (_=_)
import SCT.VolumeI.Chapter01.Section01.Terms as Terms
open Terms using (Equal)
open Operations
open import SCT.VolumeI.Chapter01.Section01.Terminal
open Constructions
open import SCT.VolumeI.Chapter01.Section02.Coherence
  using (id₌; comp-unitˡ; comp-unitʳ; comp-assoc; module Composition; module Boundaries)
open Composition
open Boundaries using (SquareCell₌)
open import SCT.VolumeI.Chapter01.Section02.Specialization
open import SCT.VolumeI.Chapter01.Section02.Whiskering
open import SCT.VolumeI.Chapter01.Section02.IdentificationSquares
open import SCT.VolumeI.Chapter01.Section03.ProductConstructions
open import SCT.VolumeI.Chapter01.Section03.Products.ProductFunctor
open import SCT.VolumeI.Chapter01.Section03.Products.ProductFunctorCoherence
open import SCT.VolumeI.Chapter01.Section07.Evaluation
open import SCT.VolumeI.Chapter01.Section07.EvaluationRepresentation
open import SCT.VolumeI.Chapter01.Section07.FunctorCategories
open import SCT.VolumeI.Chapter01.Section07.Currying

module _ {Γ : Context} where
  funPost : {C D E : CAT Γ} → MAP D E → MAP (Fun C D) (Fun C E)
  funPost {C} {D} {E} f = funCurry {C = C} {D = E} (f ∘ funEval {C = C} {D = D})

  funPre : {B C D : CAT Γ} → MAP B C → MAP (Fun C D) (Fun B D)
  funPre {B} {C} {D} k = funCurry {C = B} {D = D}
    (funEval {C = C} {D = D} ∘ productMap (id (Fun C D)) k)

  funPost-β : {C D E : CAT Γ} (f : MAP D E)
    → funUncurry {C = C} {D = E} (funPost {C = C} f) =₁ (f ∘ funEval {C = C} {D = D})
  funPost-β {C} {D} {E} f = funCurry-β {C = C} {D = E} (f ∘ funEval {C = C} {D = D})

  funPre-β : {B C D : CAT Γ} (k : MAP B C)
    → funUncurry {C = B} {D = D} (funPre {D = D} k) =₁
        (funEval {C = C} {D = D} ∘ productMap (id (Fun C D)) k)
  funPre-β {B} {C} {D} k = funCurry-β {C = B} {D = D}
    (funEval {C = C} {D = D} ∘ productMap (id (Fun C D)) k)

  module _ {X : CAT Γ} where
    open Terms.Equalities X using (_=_)

    funPost⁼ : {C D E : CAT Γ} {f g : MAP D E}
      → f = g → funPost {C = C} f = funPost {C = C} g
    funPost⁼ {C} {D} {E} γ = curry⁼ (funEval {C = C} {D = E}) (funUniversal C E)
      (γ ▷ funEval {C = C} {D = D})

    funPre⁼ : {B C D : CAT Γ} {k l : MAP B C}
      → k = l → funPre {D = D} k = funPre {D = D} l
    funPre⁼ {B} {C} {D} γ = curry⁼ (funEval {C = B} {D = D}) (funUniversal B D)
      (funEval {C = C} {D = D} ◁ productMap-cong (const (id₌ (id (Fun C D)))) γ)

    funPost⁼-evaluation : {C D E : CAT Γ} {f g : MAP D E} (γ : f = g)
      → SquareCell₌ (evaluate⁼ (funEval {C = C} {D = E}) (funPost⁼ {C = C} γ))
          (γ ▷ funEval {C = C} {D = D}) (const (funPost-β {C = C} f)) (const (funPost-β {C = C} g))
    funPost⁼-evaluation {C} {D} {E} γ =
      curry⁼-evaluation (funEval {C = C} {D = E}) (funUniversal C E)
        (γ ▷ funEval {C = C} {D = D})

    funPre⁼-evaluation : {B C D : CAT Γ} {k l : MAP B C} (γ : k = l)
      → SquareCell₌ (evaluate⁼ (funEval {C = B} {D = D}) (funPre⁼ {D = D} γ))
          (funEval {C = C} {D = D} ◁ productMap-cong (const (id₌ (id (Fun C D)))) γ)
          (const (funPre-β {D = D} k)) (const (funPre-β {D = D} l))
    funPre⁼-evaluation {B} {C} {D} γ =
      curry⁼-evaluation (funEval {C = B} {D = D}) (funUniversal B D)
        (funEval {C = C} {D = D} ◁ productMap-cong (const (id₌ (id (Fun C D)))) γ)
```

## Evaluation on indexed functors

The parameter `T` is arbitrary. In the precomposition formula, the
coordinate-separation comparison retains both product-composition
comparisons and their unitors.

```agda
  funPost-uncurry : {T C D E : CAT Γ} (f : MAP D E) (g : MAP T (Fun C D))
    → funUncurry {C = C} {D = E} (funPost {C = C} f ∘ g) =₁
        (f ∘ funUncurry {C = C} {D = D} g)
  funPost-uncurry {C = C} {D} {E} f g =
    comp-assoc (productMap g (id C)) (funEval {C = C} {D = D}) f ∙
      ((funPost-β {C = C} f ▷ productMap g (id C)) ∙
        evaluate-restrict (funEval {C = C} {D = E}) (funPost {C = C} f) g)

  funPre-uncurry : {T B C D : CAT Γ} (k : MAP B C) (g : MAP T (Fun C D))
    → funUncurry {C = B} {D = D} (funPre {D = D} k ∘ g) =₁
        (funUncurry {C = C} {D = D} g ∘ productMap (id T) k)
  funPre-uncurry {T} {B} {C} {D} k g =
    (comp-assoc (productMap (id T) k) (productMap g (id C)) (funEval {C = C} {D = D})) ⁻¹ ∙
      ((funEval {C = C} {D = D} ◁ productMap-separate g k) ∙
        (comp-assoc (productMap g (id B)) (productMap (id (Fun C D)) k) (funEval {C = C} {D = D}) ∙
          ((funPre-β {D = D} k ▷ productMap g (id B)) ∙
            evaluate-restrict (funEval {C = B} {D = D}) (funPre {D = D} k) g)))
```

## Family squares of the evaluation triangles

The parameter `X` of a family of `T`-indexed functors is independent of
`T`. These are the full squares of the preceding chosen comparisons, with
native evaluation on both edges. Constant-side normalization is local to
this argument.

```agda
  private
    module _ {X : CAT Γ} where
      open Terms.Equalities X using (_=_)

      paste-fixed : {A B : CAT Γ} {x y x′ y′ x″ y″ : MAP A B}
        {t : x = y} {b : x′ = y′} {u : x″ = y″}
        {l : x =₁ x′} {r : y =₁ y′} {l′ : x′ =₁ x″} {r′ : y′ =₁ y″}
        → SquareCell₌ t b (const l) (const r) → SquareCell₌ b u (const l′) (const r′)
        → SquareCell₌ t u (const (l′ ∙ l)) (const (r′ ∙ r))
      paste-fixed {l = l} {r} {l′} {r′} p q =
        replace-sides₌ (const-comp l′ l) (const-comp r′ r) (paste-square₌ p q)

      inverse-fixed : {A B : CAT Γ} {x y x′ y′ : MAP A B}
        {t : x = y} {b : x′ = y′} {l : x =₁ x′} {r : y =₁ y′}
        → SquareCell₌ t b (const l) (const r)
        → SquareCell₌ b t (const (l ⁻¹)) (const (r ⁻¹))
      inverse-fixed {l = l} {r} p =
        replace-sides₌ ((const-inv l) ⁻¹) ((const-inv r) ⁻¹) (inverse-square₌ p)

      post-fixed : {A B Z : CAT Γ} (H : MAP B Z) {f g f′ g′ : MAP A B}
        {t : f = g} {b : f′ = g′} {l : f =₁ f′} {r : g =₁ g′}
        → SquareCell₌ t b (const l) (const r)
        → SquareCell₌ (H ◁ t) (H ◁ b) (const (H ◁ l)) (const (H ◁ r))
      post-fixed H {l = l} {r} p =
        replace-sides₌ (post-constant H l) (post-constant H r) (post-square₌ H p)

  module _ {X : CAT Γ} where
    open Terms.Equalities X using (_=_)

    funPost-uncurry-inputs : {T C D E : CAT Γ} (f : MAP D E)
      {g h : MAP T (Fun C D)} (α : g = h)
      → SquareCell₌ (evaluate⁼ (funEval {C = C} {D = E}) (funPost {C = C} f ◁ α))
          (f ◁ evaluate⁼ (funEval {C = C} {D = D}) α)
          (const (funPost-uncurry f g)) (const (funPost-uncurry f h))
    funPost-uncurry-inputs {C = C} {D} {E} f α = paste-fixed (paste-fixed
      (evaluate-restrict-substitution (funEval {C = C} {D = E}) (funPost {C = C} f) α)
      (interchange-fixedOuter (funPost-β {C = C} f) (productMap-cong α (const (id₌ (id C))))))
      (postWhisker-comp (productMap-cong α (const (id₌ (id C)))) (funEval {C = C} {D = D}) f)

    funPre-uncurry-inputs : {T B C D : CAT Γ} (k : MAP B C)
      {g h : MAP T (Fun C D)} (α : g = h)
      → SquareCell₌ (evaluate⁼ (funEval {C = B} {D = D}) (funPre {D = D} k ◁ α))
          (evaluate⁼ (funEval {C = C} {D = D}) α ▷ productMap (id T) k)
          (const (funPre-uncurry k g)) (const (funPre-uncurry k h))
    funPre-uncurry-inputs {T} {B} {C} {D} k α = paste-fixed (paste-fixed (paste-fixed (paste-fixed
      (evaluate-restrict-substitution (funEval {C = B} {D = D}) (funPre {D = D} k) α)
      (interchange-fixedOuter (funPre-β {D = D} k) (productMap-cong α (const (id₌ (id B))))))
      (postWhisker-comp (productMap-cong α (const (id₌ (id B))))
        (productMap (id (Fun C D)) k) (funEval {C = C} {D = D})))
      (post-fixed (funEval {C = C} {D = D}) (productMap-separate-inputs α k)))
      (inverse-fixed (whisker-mixed (productMap-cong α (const (id₌ (id C))))
        (productMap (id T) k) (funEval {C = C} {D = D})))
```

## Identity and composition

Reflect the evaluated equations at the actual categorical test source.
The congruences below use the already chosen family actions at `One`;
there is no separate absolute recovery choice.

```agda
  funPost-cong : {C D E : CAT Γ} {f g : MAP D E}
    → f =₁ g → funPost {C = C} f =₁ funPost {C = C} g
  funPost-cong {C = C} = funPost⁼ {C = C}

  funPre-cong : {B C D : CAT Γ} {k l : MAP B C}
    → k =₁ l → funPre {D = D} k =₁ funPre {D = D} l
  funPre-cong {D = D} = funPre⁼ {D = D}

  funPost-id : (C D : CAT Γ) → funPost {C = C} (id D) =₁ id (Fun C D)
  funPost-id C D = reflect (funEval {C = C} {D = D}) (funUniversal C D) _ _
    ((evaluate-id (funEval {C = C} {D = D})) ⁻¹ ∙
      (comp-unitˡ (funEval {C = C} {D = D}) ∙ funPost-β {C = C} (id D)))

  funPre-id : (C D : CAT Γ) → funPre {D = D} (id C) =₁ id (Fun C D)
  funPre-id C D = reflect (funEval {C = C} {D = D}) (funUniversal C D) _ _
    ((evaluate-id (funEval {C = C} {D = D})) ⁻¹ ∙
      (comp-unitʳ (funEval {C = C} {D = D}) ∙
        ((funEval {C = C} {D = D} ◁ productMap-id (Fun C D) C) ∙ funPre-β {D = D} (id C))))

  funPost-comp : {A B C D : CAT Γ} (f : MAP B C) (g : MAP C D)
    → (funPost {C = A} g ∘ funPost {C = A} f) =₁ funPost {C = A} (g ∘ f)
  funPost-comp {A} {B} {C} {D} f g = reflect (funEval {C = A} {D = D}) (funUniversal A D) _ _
    ((funPost-β {C = A} (g ∘ f)) ⁻¹ ∙
      ((comp-assoc (funEval {C = A} {D = B}) f g) ⁻¹ ∙
        ((g ◁ funPost-β {C = A} f) ∙ funPost-uncurry g (funPost {C = A} f))))

  funPre-comp : {A B C D : CAT Γ} (f : MAP A B) (g : MAP B C)
    → (funPre {D = D} f ∘ funPre {D = D} g) =₁ funPre {D = D} (g ∘ f)
  funPre-comp {A} {B} {C} {D} f g = reflect (funEval {C = A} {D = D}) (funUniversal A D) _ _
    ((funPre-β {D = D} (g ∘ f)) ⁻¹ ∙
      ((funEval {C = C} {D = D} ◁
        (productMap-cong (comp-unitˡ (id (Fun C D))) (id₌ (g ∘ f)) ∙
          productMap-comp (id (Fun C D)) (id (Fun C D)) f g)) ∙
        (comp-assoc (productMap (id (Fun C D)) f) (productMap (id (Fun C D)) g)
          (funEval {C = C} {D = D}) ∙
          ((funPre-β {D = D} g ▷ productMap (id (Fun C D)) f) ∙ funPre-uncurry f (funPre {D = D} g)))))
```

## The two variables commute

Evaluate both composites to postcomposition after precomposition of the
original evaluation. Their specified beta comparisons, with one associator,
identify the two routes. Reflection gives the actual functor comparison.

```agda
  module _ {B C D E : CAT Γ} (k : MAP B C) (f : MAP D E) where
    private
      left-evaluation : funUncurry {C = B} {D = E}
        (funPre {D = E} k ∘ funPost {C = C} f) =₁
          (f ∘ (funEval {C = C} {D = D} ∘ productMap (id (Fun C D)) k))
      left-evaluation = comp-assoc (productMap (id (Fun C D)) k) (funEval {C = C} {D = D}) f ∙
        ((funPost-β {C = C} f ▷ productMap (id (Fun C D)) k) ∙ funPre-uncurry k (funPost {C = C} f))

      right-evaluation : funUncurry {C = B} {D = E}
        (funPost {C = B} f ∘ funPre {D = D} k) =₁
          (f ∘ (funEval {C = C} {D = D} ∘ productMap (id (Fun C D)) k))
      right-evaluation = (f ◁ funPre-β {D = D} k) ∙ funPost-uncurry f (funPre {D = D} k)

    funPost-funPre : (funPre {D = E} k ∘ funPost {C = C} f) =₁
      (funPost {C = B} f ∘ funPre {D = D} k)
    funPost-funPre = reflect (funEval {C = B} {D = E}) (funUniversal B E) _ _
      (right-evaluation ⁻¹ ∙ left-evaluation)
```

## Equivalences in either variable

Postcompose or precompose with the supplied inverse. The actual composition
laws, the chosen family congruences, and the identity laws give its two
inverse triangles.

```agda
  funPost-isEquiv : {A C D : CAT Γ} (f : MAP C D) → IsEquiv f
    → IsEquiv (funPost {C = A} f)
  funPost-isEquiv {A} {C} {D} f e = record
    { inverse = funPost {C = A} (IsEquiv.inverse e)
    ; left-inverse-law = (funPost-comp {A = A} f (IsEquiv.inverse e)) ⁻¹ ∙
        (funPost-cong {C = A} (IsEquiv.left-inverse-law e) ∙ (funPost-id A C) ⁻¹)
    ; right-inverse-law = (funPost-comp {A = A} (IsEquiv.inverse e) f) ⁻¹ ∙
        (funPost-cong {C = A} (IsEquiv.right-inverse-law e) ∙ (funPost-id A D) ⁻¹) }

  funPre-isEquiv : {C D E : CAT Γ} (f : MAP C D) → IsEquiv f
    → IsEquiv (funPre {D = E} f)
  funPre-isEquiv {C} {D} {E} f e = record
    { inverse = funPre {D = E} (IsEquiv.inverse e)
    ; left-inverse-law = (funPre-comp {D = E} (IsEquiv.inverse e) f) ⁻¹ ∙
        (funPre-cong {D = E} (IsEquiv.right-inverse-law e) ∙ (funPre-id D E) ⁻¹)
    ; right-inverse-law = (funPre-comp {D = E} f (IsEquiv.inverse e)) ⁻¹ ∙
        (funPre-cong {D = E} (IsEquiv.left-inverse-law e) ∙ (funPre-id C E) ⁻¹) }
```