Other Agda modules in this section (16)
Chapter 1, rebuild2, checked 14 October 2026 · source revision b982f5a.
Corresponding book passages
# The core of a functor category Evaluation at the terminal test category, followed by terminal insertion, gives an equivalence `Core (Fun C D) → Map C D`. Its inverse compares the mapping anima with the core. We retain the comparison with the canonical inclusion and the actual evaluation, rather than only the equivalence of the two animae (`core_of_Fun_is_Map`). ```agda {-# OPTIONS --without-K #-} module SCT.VolumeI.Chapter01.Section07.CoreOfFun 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.IdentificationSquares using (paste-square₌; replace-sides₌; replace-edges₌) open import SCT.VolumeI.Chapter01.Section02.Products using (module Calculus) open Calculus open import SCT.VolumeI.Chapter01.Section03.ProductConstructions open import SCT.VolumeI.Chapter01.Section03.Products.ProductFunctor using (productMap-cong) open import SCT.VolumeI.Chapter01.Section03.Equivalences using (equiv-compose; equiv-inverse) open import SCT.VolumeI.Chapter01.Section04.MappingAnimae import SCT.VolumeI.Chapter01.Section04.Currying as Mapping import SCT.VolumeI.Chapter01.Section04.Functoriality as Maps open import SCT.VolumeI.Chapter01.Section04.Points open import SCT.VolumeI.Chapter01.Section04.Core using (Core; coreInclusion) open import SCT.VolumeI.Chapter01.Section07.Evaluation open import SCT.VolumeI.Chapter01.Section07.EvaluationRepresentation using (evaluate-restrict-substitution) open import SCT.VolumeI.Chapter01.Section07.FunctorCategories open import SCT.VolumeI.Chapter01.Section07.Currying open import SCT.VolumeI.Chapter01.Section07.Functoriality using (funPost; funPost-uncurry) module _ {Γ : Context} where mappingInclusion : (C D : CAT Γ) → MAP (Map C D) (Fun C D) mappingInclusion C D = funCurry {C = C} {D = D} mapEval mappingInclusion-β : (C D : CAT Γ) → funUncurry {C = C} {D = D} (mappingInclusion C D) =₁ mapEval mappingInclusion-β C D = funCurry-β {C = C} {D = D} mapEval module _ (C D : CAT Γ) where coreFunUncurrying : MAP (Core (Fun C D)) (Map C D) coreFunUncurrying = Maps.mapPre (product-unitˡ-inverse C) ∘ evaluation-forward (funEval {C = C} {D = D}) One coreFunUncurrying-isEquiv : IsEquiv coreFunUncurrying coreFunUncurrying-isEquiv = equiv-compose (evaluation-forward (funEval {C = C} {D = D}) One) (Maps.mapPre (product-unitˡ-inverse C)) (funUniversal C D One) (Maps.mapPre-isEquiv (product-unitˡ-inverse C) (product-unitˡ-inverse-isEquiv C)) private A : CAT Γ A = Core (Fun C D) terminal-regroup : (Associativity.backward A One C ∘ productMap (id A) (product-unitˡ-inverse C)) =₁ productMap (product-unitʳ-inverse A) (id C) terminal-regroup = right-normal ⁻¹ ∙ left-normal where k : MAP (A × C) (A × (One × C)) k = productMap (id A) (product-unitˡ-inverse C) first : (pr₁ ∘ k) =₁ pr₁ first = comp-unitˡ pr₁ ∙ pair-β₁ (id A ∘ pr₁) (product-unitˡ-inverse C ∘ pr₂) third : ((pr₂ ∘ pr₂) ∘ k) =₁ pr₂ third = comp-unitˡ pr₂ ∙ ((product-unitˡ-pr₂-inverse C ▷ pr₂) ∙ ((comp-assoc pr₂ (product-unitˡ-inverse C) pr₂) ⁻¹ ∙ ((pr₂ ◁ pair-β₂ (id A ∘ pr₁) (product-unitˡ-inverse C ∘ pr₂)) ∙ comp-assoc k pr₂ pr₂))) normal : MAP (A × C) ((A × One) × C) normal = pair (pair pr₁ (terminate (A × C))) pr₂ left-normal : (Associativity.backward A One C ∘ k) =₁ normal left-normal = pair⁼ (pair⁼ first (terminal-identification _ (terminate (A × C))) ∙ pair-pre pr₁ (pr₁ ∘ pr₂) k) third ∙ pair-pre (pair pr₁ (pr₁ ∘ pr₂)) (pr₂ ∘ pr₂) k right-normal : productMap (product-unitʳ-inverse A) (id C) =₁ normal right-normal = pair⁼ (pair⁼ (comp-unitˡ pr₁) (terminal-identification _ _) ∙ pair-pre (id A) (terminate A) pr₁) (comp-unitˡ pr₂) coreFunUncurrying-evaluation : uncurry coreFunUncurrying =₁ funUncurry {C = C} {D = D} (coreInclusion (Fun C D)) coreFunUncurrying-evaluation = (evaluate-restrict (funEval {C = C} {D = D}) mapEval (product-unitʳ-inverse A)) ⁻¹ ∙ ((evaluate (funEval {C = C} {D = D}) mapEval ◁ terminal-regroup) ∙ (comp-assoc (productMap (id A) (product-unitˡ-inverse C)) (Associativity.backward A One C) (evaluate (funEval {C = C} {D = D}) mapEval) ∙ ((mapCurry-β (map-isAn One (Fun C D)) (evaluation-universal (funEval {C = C} {D = D}) One) ▷ productMap (id A) (product-unitˡ-inverse C)) ∙ Maps.mapPre-uncurry (product-unitˡ-inverse C) (evaluation-forward (funEval {C = C} {D = D}) One)))) mappingInclusion-coreUncurrying : (mappingInclusion C D ∘ coreFunUncurrying) =₁ coreInclusion (Fun C D) mappingInclusion-coreUncurrying = reflect (funEval {C = C} {D = D}) (funUniversal C D) _ _ (coreFunUncurrying-evaluation ∙ ((mappingInclusion-β C D ▷ productMap coreFunUncurrying (id C)) ∙ evaluate-restrict (funEval {C = C} {D = D}) (mappingInclusion C D) coreFunUncurrying)) coreFunComparison : MAP (Map C D) (Core (Fun C D)) coreFunComparison = IsEquiv.inverse coreFunUncurrying-isEquiv coreFunComparison-isEquiv : IsEquiv coreFunComparison coreFunComparison-isEquiv = equiv-inverse coreFunUncurrying-isEquiv coreFunComparison-inclusion : (coreInclusion (Fun C D) ∘ coreFunComparison) =₁ mappingInclusion C D coreFunComparison-inclusion = comp-unitʳ (mappingInclusion C D) ∙ ((mappingInclusion C D ◁ (IsEquiv.right-inverse-law coreFunUncurrying-isEquiv) ⁻¹) ∙ (comp-assoc coreFunComparison coreFunUncurrying (mappingInclusion C D) ∙ (mappingInclusion-coreUncurrying ⁻¹ ▷ coreFunComparison))) ``` ## The inclusion on arbitrary indexed functors Its evaluation comparison holds for every categorical source `T`. The full family square compares native functor-category evaluation with the actual mapping-anima action, including its evaluation normalization. ```agda mappingInclusion-uncurry : {T C D : CAT Γ} (g : MAP T (Map C D)) → funUncurry {C = C} {D = D} (mappingInclusion C D ∘ g) =₁ uncurry g mappingInclusion-uncurry {C = C} {D} g = (mappingInclusion-β C D ▷ productMap g (id C)) ∙ evaluate-restrict (funEval {C = C} {D = D}) (mappingInclusion C D) g module _ {X : CAT Γ} where open Terms.Equalities X using (_=_) mappingInclusion-uncurry-inputs : {T C D : CAT Γ} {g h : MAP T (Map C D)} (α : g = h) → SquareCell₌ (evaluate⁼ (funEval {C = C} {D = D}) (mappingInclusion C D ◁ α)) (Mapping.uncurry⁼ α) (const (mappingInclusion-uncurry g)) (const (mappingInclusion-uncurry h)) mappingInclusion-uncurry-inputs {C = C} {D} {g} {h} α = replace-edges₌ (id₌ (evaluate⁼ (funEval {C = C} {D = D}) (mappingInclusion C D ◁ α))) ((Mapping.uncurry⁼-evaluate α) ⁻¹) (replace-sides₌ (const-comp (mappingInclusion-β C D ▷ productMap g (id C)) (evaluate-restrict (funEval {C = C} {D = D}) (mappingInclusion C D) g)) (const-comp (mappingInclusion-β C D ▷ productMap h (id C)) (evaluate-restrict (funEval {C = C} {D = D}) (mappingInclusion C D) h)) (paste-square₌ (evaluate-restrict-substitution (funEval {C = C} {D = D}) (mappingInclusion C D) α) (interchange-fixedOuter (mappingInclusion-β C D) (productMap-cong α (const (id₌ (id C))))))) ``` ## Actual postcomposition Both composites evaluate to postcomposition of the mapping evaluation. Their specified routes determine the inclusion comparison. Its native image law retains that route, for clients which use the comparison in a matching condition. ```agda module _ {C D E : CAT Γ} (f : MAP D E) where private left-route : funUncurry {C = C} {D = E} (funPost {C = C} f ∘ mappingInclusion C D) =₁ (f ∘ mapEval {C = C} {D = D}) left-route = (f ◁ mappingInclusion-β C D) ∙ funPost-uncurry f (mappingInclusion C D) right-route : funUncurry {C = C} {D = E} (mappingInclusion C E ∘ Maps.mapPost {C = C} f) =₁ (f ∘ mapEval {C = C} {D = D}) right-route = Maps.mapPost-β {C = C} f ∙ mappingInclusion-uncurry (Maps.mapPost {C = C} f) mappingInclusion-post-evaluation : funUncurry {C = C} {D = E} (funPost {C = C} f ∘ mappingInclusion C D) =₁ funUncurry {C = C} {D = E} (mappingInclusion C E ∘ Maps.mapPost {C = C} f) mappingInclusion-post-evaluation = right-route ⁻¹ ∙ left-route mappingInclusion-post : (funPost {C = C} f ∘ mappingInclusion C D) =₁ (mappingInclusion C E ∘ Maps.mapPost {C = C} f) mappingInclusion-post = reflect (funEval {C = C} {D = E}) (funUniversal C E) _ _ mappingInclusion-post-evaluation mappingInclusion-post-image : evaluate-cong (funEval {C = C} {D = E}) mappingInclusion-post =₂ mappingInclusion-post-evaluation mappingInclusion-post-image = reflect-β-One (funEval {C = C} {D = E}) (funUniversal C E) _ _ mappingInclusion-post-evaluation ``` ## Named points and the canonical core inclusion The functor-category name curries the terminally indexed functor. Naming in the mapping anima and then including gives this chosen point, by their two evaluation triangles. The core comparison retains the resulting canonical-inclusion triangle. Postcomposition uses the established inclusion comparison and the existing mapping-anima naming law. ```agda funName : {C D : CAT Γ} → MAP C D → MAP One (Fun C D) funName {C} {D} g = funCurry {C = C} {D = D} (g ∘ pr₂ {C = One} {D = C}) funName-β : {C D : CAT Γ} (g : MAP C D) → funUncurry {C = C} {D = D} (funName g) =₁ (g ∘ pr₂ {C = One} {D = C}) funName-β {C} {D} g = funCurry-β {C = C} {D = D} (g ∘ pr₂ {C = One} {D = C}) mappingInclusion-name : {C D : CAT Γ} (g : MAP C D) → (mappingInclusion C D ∘ name g) =₁ funName g mappingInclusion-name {C} {D} g = reflect (funEval {C = C} {D = D}) (funUniversal C D) _ _ ((funName-β g) ⁻¹ ∙ (Mapping.CurriedRepresentation.evaluation (name-representation g) ∙ mappingInclusion-uncurry (name g))) coreFunComparison-name : {C D : CAT Γ} (g : MAP C D) → (coreInclusion (Fun C D) ∘ (coreFunComparison C D ∘ name g)) =₁ funName g coreFunComparison-name {C} {D} g = mappingInclusion-name g ∙ ((coreFunComparison-inclusion C D ▷ name g) ∙ (comp-assoc (name g) (coreFunComparison C D) (coreInclusion (Fun C D))) ⁻¹) funName-post : {C D E : CAT Γ} (f : MAP D E) (g : MAP C D) → (funPost {C = C} f ∘ funName g) =₁ funName (f ∘ g) funName-post {C} {D} {E} f g = mappingInclusion-name (f ∘ g) ∙ ((mappingInclusion C E ◁ Maps.mapPost-name f g) ∙ (comp-assoc (name g) (Maps.mapPost {C = C} f) (mappingInclusion C E) ∙ ((mappingInclusion-post {C = C} f ▷ name g) ∙ ((comp-assoc (name g) (mappingInclusion C D) (funPost {C = C} f)) ⁻¹ ∙ (funPost {C = C} f ◁ (mappingInclusion-name g) ⁻¹))))) ```