Other Agda modules in this section (10)
# Specializing functors between mapping animae

A functor between mapping animae acts on external functors by naming, applying
that functor, and decoding. Its identification actions are the actual composites
of the naming, whiskering and decoding functors. Recovery uses their chosen
inverse and retains its image equation. Identification families have an
independent arbitrary parameter.

```agda
{-# OPTIONS --without-K #-}
module SCT.VolumeI.Chapter01.Section04.MappingSpecialization 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.Section02.Coherence using (comp-unitˡ; comp-assoc; module Composition)
open Composition
open import SCT.VolumeI.Chapter01.Section03.Equivalences using (equiv-compose; equiv-reflect)
import SCT.VolumeI.Chapter01.Section03.Factorizations as Fact
open import SCT.VolumeI.Chapter01.Section03.WhiskeringEquivalence
  using (postWhisker-isEquiv; factor-through-postWhisker)
open import SCT.VolumeI.Chapter01.Section04.MappingAnimae
open import SCT.VolumeI.Chapter01.Section04.Points

module _ {Γ : Context} where
  specialize-map : {A B C D : CAT Γ} → MAP (Map A B) (Map C D) → MAP A B → MAP C D
  specialize-map H f = decode (H ∘ name f)

  specialize-map-id : {A B : CAT Γ} (f : MAP A B)
    → specialize-map (id (Map A B)) f =₁ f
  specialize-map-id f = decode-name f ∙ decode⁼ (comp-unitˡ (name f))

  specialize-map-comp : {A B C D E F : CAT Γ}
    (H : MAP (Map A B) (Map C D)) (K : MAP (Map C D) (Map E F)) (f : MAP A B)
    → specialize-map (K ∘ H) f =₁ specialize-map K (specialize-map H f)
  specialize-map-comp H K f = decode⁼
    ((K ◁ name-decode (H ∘ name f)) ⁻¹ ∙ comp-assoc (name f) H K)

  specialize⁼-functor : {A B C D : CAT Γ} (H : MAP (Map A B) (Map C D))
    (f g : MAP A B) → MAP (Equal f g) (Equal (specialize-map H f) (specialize-map H g))
  specialize⁼-functor H f g = decode⁼-functor (H ∘ name f) (H ∘ name g) ∘
    (postWhisker H ∘ name⁼-functor f g)

  specialize-change⁼-functor : {A B C D : CAT Γ}
    (H K : MAP (Map A B) (Map C D)) (f : MAP A B)
    → MAP (Equal H K) (Equal (specialize-map H f) (specialize-map K f))
  specialize-change⁼-functor H K f =
    decode⁼-functor (H ∘ name f) (K ∘ name f) ∘ preWhisker (name f)

  specialize⁼-isEquiv : {A B C D : CAT Γ} (H : MAP (Map A B) (Map C D))
    → IsEquiv H → (f g : MAP A B) → IsEquiv (specialize⁼-functor H f g)
  specialize⁼-isEquiv H e f g =
    equiv-compose (postWhisker H ∘ name⁼-functor f g)
      (decode⁼-functor (H ∘ name f) (H ∘ name g))
      (equiv-compose (name⁼-functor f g) (postWhisker H)
        (name⁼-isEquiv f g) (postWhisker-isEquiv H e (name f) (name g)))
      (decode⁼-isEquiv (H ∘ name f) (H ∘ name g))

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

    specialize⁼ : {A B C D : CAT Γ} (H : MAP (Map A B) (Map C D))
      {f g : MAP A B} → f = g → specialize-map H f = specialize-map H g
    specialize⁼ H {f} {g} α = specialize⁼-functor H f g ∘ α

    specialize⁼-cong : {A B C D : CAT Γ} (H : MAP (Map A B) (Map C D))
      {f g : MAP A B} {α β : f = g}
      → α =₁ β → specialize⁼ H α =₁ specialize⁼ H β
    specialize⁼-cong H {f} {g} p = specialize⁼-functor H f g ◁ p

    specialize-change⁼ : {A B C D : CAT Γ} {H K : MAP (Map A B) (Map C D)}
      → H = K → (f : MAP A B) → specialize-map H f = specialize-map K f
    specialize-change⁼ {H = H} {K} τ f = specialize-change⁼-functor H K f ∘ τ

    specialization-reflection : {A B C D : CAT Γ} (H : MAP (Map A B) (Map C D))
      → IsEquiv H → (f g : MAP A B) → (α : specialize-map H f = specialize-map H g)
      → Fact.Factorization (specialize⁼-functor H f g) α
    specialization-reflection H e f g = Fact.factor-through-equiv (specialize⁼-isEquiv H e f g)

    specialize-reflect : {A B C D : CAT Γ} (H : MAP (Map A B) (Map C D))
      → IsEquiv H → (f g : MAP A B) → specialize-map H f = specialize-map H g → f = g
    specialize-reflect H e f g α = Fact.factor (specialization-reflection H e f g α)

    specialize-reflect-β : {A B C D : CAT Γ} (H : MAP (Map A B) (Map C D))
      (e : IsEquiv H) (f g : MAP A B) (α : specialize-map H f = specialize-map H g)
      → specialize⁼ H (specialize-reflect H e f g α) =₁ α
    specialize-reflect-β H e f g α = Fact.triangle (specialization-reflection H e f g α)

    specialize-reflect₂ : {A B C D : CAT Γ} (H : MAP (Map A B) (Map C D))
      → IsEquiv H → {f g : MAP A B} → (α β : f = g)
      → specialize⁼ H α =₁ specialize⁼ H β → α =₁ β
    specialize-reflect₂ H e {f} {g} α β =
      equiv-reflect (specialize⁼-isEquiv H e f g) α β

    factor-through-specialize⁼ : {A B C D : CAT Γ} (H : MAP (Map A B) (Map C D))
      (e : IsEquiv H) {f g : MAP A B} (α β : f = g)
      (p : specialize⁼ H α =₁ specialize⁼ H β)
      → Fact.Factorization (postWhisker (specialize⁼-functor H f g)) p
    factor-through-specialize⁼ H e {f} {g} α β p =
      factor-through-postWhisker (specialize⁼-functor H f g) (specialize⁼-isEquiv H e f g) p
```

## Factoring an external functor

The named functor factors through the supplied equivalence of mapping animae.
Decoding this factor gives an external functor with its specified triangle.

```agda
  record SpecializationFactorization {A B C D : CAT Γ}
    (H : MAP (Map A B) (Map C D)) (g : MAP C D) : Set m where
    field
      factor : MAP A B
      triangle : specialize-map H factor =₁ g

  factor-through-specialize-map : {A B C D : CAT Γ} (H : MAP (Map A B) (Map C D))
    → IsEquiv H → (g : MAP C D) → SpecializationFactorization H g
  factor-through-specialize-map H e g = record
    { factor = decode (Fact.factor named)
    ; triangle = decode-name g ∙ decode⁼
        (Fact.triangle named ∙ (H ◁ name-decode (Fact.factor named))) }
    where named = Fact.factor-through-equiv e (name g)
```