Other Agda modules in this section (24)
- Coherence
- Composition
- CompositionCoherence
- CompositionEvaluation
- CompositionEvaluationFamily
- CompositionLawRestriction
- CompositionNaturality
- CompositionRestriction
- Core
- Currying
- CurryingRestriction
- EquivalenceDetection
- EvaluationCoherence
- EvaluationOverBase
- EvaluationRestriction
- Functoriality
- IdentityRestriction
- MappingAnimae
- MappingProducts
- MappingSpecialization
- Points
- Precomposition
- Uncurrying
- UncurryingRestriction
Chapter 1, rebuild2, checked 14 October 2026 · source revision b982f5a.
Corresponding book passages
# Composition laws for mapping terms The directly recovered laws at an anima parameter have specified complete relative evaluation images. Universal choices at mapping animae then give laws at arbitrary term sources by restriction. These choices are kept separate: recovery itself requires an anima parameter. ```agda {-# OPTIONS --without-K #-} module SCT.VolumeI.Chapter01.Section04.CompositionLaws where open import SCT.VolumeI.Chapter01.Section01.Vocabulary hiding (_=_) import SCT.VolumeI.Chapter01.Section01.Terms as Terms open Operations open import SCT.VolumeI.Chapter01.Section01.Terminal open Constructions open import SCT.VolumeI.Chapter01.Section02.Coherence open Composition open import SCT.VolumeI.Chapter01.Section02.Specialization using (const-pre) open import SCT.VolumeI.Chapter01.Section03.RelativeFunctors open import SCT.VolumeI.Chapter01.Section03.Identifications.OverBase open import SCT.VolumeI.Chapter01.Section03.Products.PairingOverBase using (product-over) open import SCT.VolumeI.Chapter01.Section04.MappingAnimae open import SCT.VolumeI.Chapter01.Section04.Composition open import SCT.VolumeI.Chapter01.Section04.EvaluationOverBase module _ {Γ : Context} where module _ {P : CAT Γ} where open Terms.InContext P using (Term) evaluation-unitˡ : {C D : CAT Γ} (x : Term (Map C D)) → IdentificationOver {A = One {Γ}} (evaluation-over (compose (identity-map D) x)) (evaluation-over x) evaluation-unitˡ {D = D} x = let F = evaluation-over x ε = evaluation-identity P D middle = identification-over (IdentificationOver.identification ε ▷ FunctorOverBase.functor F) (identification-over-pre F (IdentificationOver.over ε)) last = identification-over (comp-unitˡ (FunctorOverBase.functor F)) (identification-over-unitˡ F) in comp-identification-over last (comp-identification-over middle (evaluation-compose (identity-map D) x)) evaluation-unitʳ : {C D : CAT Γ} (x : Term (Map C D)) → IdentificationOver {A = One {Γ}} (evaluation-over (compose x (identity-map C))) (evaluation-over x) evaluation-unitʳ {C} x = let F = evaluation-over x ε = evaluation-identity P C middle = identification-over (FunctorOverBase.functor F ◁ IdentificationOver.identification ε) (identification-over-post F (IdentificationOver.over ε)) last = identification-over (comp-unitʳ (FunctorOverBase.functor F)) (identification-over-unitʳ F) in comp-identification-over last (comp-identification-over middle (evaluation-compose x (identity-map C))) evaluation-assoc : {A B C D : CAT Γ} (z : Term (Map C D)) (y : Term (Map B C)) (x : Term (Map A B)) → IdentificationOver {A = One {Γ}} (evaluation-over (compose (compose z y) x)) (evaluation-over (compose z (compose y x))) evaluation-assoc z y x = let H = evaluation-over z G = evaluation-over y F = evaluation-over x hg = evaluation-compose z y gf = evaluation-compose y x first = evaluation-compose (compose z y) x second = identification-over (IdentificationOver.identification hg ▷ FunctorOverBase.functor F) (identification-over-pre F (IdentificationOver.over hg)) third = identification-over (comp-assoc (FunctorOverBase.functor F) (FunctorOverBase.functor G) (FunctorOverBase.functor H)) (identification-over-assoc H G F) fourth = inverse-identification-over (identification-over (FunctorOverBase.functor H ◁ IdentificationOver.identification gf) (identification-over-post H (IdentificationOver.over gf))) fifth = inverse-identification-over (evaluation-compose z (compose y x)) in comp-identification-over fifth (comp-identification-over fourth (comp-identification-over third (comp-identification-over second first))) module Recovered {P : CAT Γ} (pAn : isAn P) where open Terms.InContext P using (Term) unitˡ : {C D : CAT Γ} (x : Term (Map C D)) → compose (identity-map D) x =₁ x unitˡ x = evaluation-recover pAn (evaluation-unitˡ x) unitʳ : {C D : CAT Γ} (x : Term (Map C D)) → compose x (identity-map C) =₁ x unitʳ x = evaluation-recover pAn (evaluation-unitʳ x) assoc : {A B C D : CAT Γ} (z : Term (Map C D)) (y : Term (Map B C)) (x : Term (Map A B)) → compose (compose z y) x =₁ compose z (compose y x) assoc z y x = evaluation-recover pAn (evaluation-assoc z y x) unitˡ-image : {C D : CAT Γ} (x : Term (Map C D)) → evaluation⁼ (unitˡ x) =₂ IdentificationOver.identification (evaluation-unitˡ x) unitˡ-image x = evaluation-recover-β pAn (evaluation-unitˡ x) unitʳ-image : {C D : CAT Γ} (x : Term (Map C D)) → evaluation⁼ (unitʳ x) =₂ IdentificationOver.identification (evaluation-unitʳ x) unitʳ-image x = evaluation-recover-β pAn (evaluation-unitʳ x) assoc-image : {A B C D : CAT Γ} (z : Term (Map C D)) (y : Term (Map B C)) (x : Term (Map A B)) → evaluation⁼ (assoc z y x) =₂ IdentificationOver.identification (evaluation-assoc z y x) assoc-image z y x = evaluation-recover-β pAn (evaluation-assoc z y x) mapComp-unitˡ : (C D : CAT Γ) → compose (identity-map D) (id (Map C D)) =₁ id (Map C D) mapComp-unitˡ C D = Recovered.unitˡ (map-isAn C D) (id (Map C D)) mapComp-unitʳ : (C D : CAT Γ) → compose (id (Map C D)) (identity-map C) =₁ id (Map C D) mapComp-unitʳ C D = Recovered.unitʳ (map-isAn C D) (id (Map C D)) mapComp-assoc : (A B C D : CAT Γ) → let P = (Map C D × Map B C) × Map A B z : MAP P (Map C D) z = pr₁ ∘ pr₁ y : MAP P (Map B C) y = pr₂ ∘ pr₁ x : MAP P (Map A B) x = pr₂ in compose (compose z y) x =₁ compose z (compose y x) mapComp-assoc A B C D = Recovered.assoc (product-isAn (product-isAn (map-isAn C D) (map-isAn B C)) (map-isAn A B)) (pr₁ ∘ pr₁) (pr₂ ∘ pr₁) pr₂ private specialize : {P Q Z : CAT Γ} {x y : MAP P Z} (α : x =₁ y) (r : MAP Q P) {x′ y′ : MAP Q Z} → (x ∘ r) =₁ x′ → (y ∘ r) =₁ y′ → x′ =₁ y′ specialize α r l t = t ∙ ((α ▷ r) ∙ (l ⁻¹)) compose-evaluate : {P Q A B C : CAT Γ} (y : MAP P (Map B C)) (x : MAP P (Map A B)) (r : MAP Q P) {y′ : MAP Q (Map B C)} {x′ : MAP Q (Map A B)} → (y ∘ r) =₁ y′ → (x ∘ r) =₁ x′ → (compose y x ∘ r) =₁ compose y′ x′ compose-evaluate y x r α β = compose⁼ α β ∙ compose-pre y x r module _ {P : CAT Γ} where open Terms.InContext P using (Term) compose-unitˡ : {C D : CAT Γ} (x : Term (Map C D)) → compose (identity-map D) x =₁ x compose-unitˡ {C} {D} x = specialize (mapComp-unitˡ C D) x (compose-evaluate (identity-map D) (id (Map C D)) x (const-pre (mapId D) x) (comp-unitˡ x)) (comp-unitˡ x) compose-unitʳ : {C D : CAT Γ} (x : Term (Map C D)) → compose x (identity-map C) =₁ x compose-unitʳ {C} {D} x = specialize (mapComp-unitʳ C D) x (compose-evaluate (id (Map C D)) (identity-map C) x (comp-unitˡ x) (const-pre (mapId C) x)) (comp-unitˡ x) compose-assoc : {A B C D : CAT Γ} (z : Term (Map C D)) (y : Term (Map B C)) (x : Term (Map A B)) → compose (compose z y) x =₁ compose z (compose y x) compose-assoc {A} {B} {C} {D} z y x = let triple = pair (pair z y) x first = pair-β₁ z y ∙ ((pr₁ ◁ pair-β₁ (pair z y) x) ∙ comp-assoc triple pr₁ pr₁) second = pair-β₂ z y ∙ ((pr₂ ◁ pair-β₁ (pair z y) x) ∙ comp-assoc triple pr₁ pr₂) third = pair-β₂ (pair z y) x in specialize (mapComp-assoc A B C D) triple (compose-evaluate (compose (pr₁ ∘ pr₁) (pr₂ ∘ pr₁)) pr₂ triple (compose-evaluate (pr₁ ∘ pr₁) (pr₂ ∘ pr₁) triple first second) third) (compose-evaluate (pr₁ ∘ pr₁) (compose (pr₂ ∘ pr₁) pr₂) triple first (compose-evaluate (pr₂ ∘ pr₁) pr₂ triple second third)) ``` The triangle and pentagon use the existing diagram types. Their vertices and routes are the default composition laws above. Defining these diagrams does not assert their commutativity. ```agda module _ {Γ : Context} {P : CAT Γ} where open Terms.InContext P using (Term) open Boundaries using (TriangleDiagram; triangle-diagram; PentagonDiagram; pentagon-diagram) compositionTriangle : {A B C : CAT Γ} (x : Term (Map A B)) (y : Term (Map B C)) → TriangleDiagram {X = One {Γ}} (compose (compose y (identity-map B)) x) (compose y (compose (identity-map B) x)) (compose y x) compositionTriangle x y = triangle-diagram (compose⁼ (compose-unitʳ y) (id₌ x)) (compose-assoc y (identity-map _) x) (compose⁼ (id₌ y) (compose-unitˡ x)) compositionPentagon : {A B C D E : CAT Γ} (x : Term (Map A B)) (y : Term (Map B C)) (z : Term (Map C D)) (w : Term (Map D E)) → PentagonDiagram {X = One {Γ}} (compose (compose (compose w z) y) x) (compose (compose w z) (compose y x)) (compose w (compose z (compose y x))) (compose (compose w (compose z y)) x) (compose w (compose (compose z y) x)) compositionPentagon x y z w = pentagon-diagram (compose-assoc (compose w z) y x) (compose-assoc w z (compose y x)) (compose⁼ (compose-assoc w z y) (id₌ x)) (compose-assoc w (compose z y) x) (compose⁼ (id₌ w) (compose-assoc z y x)) ```