Other Agda modules in this section (5)
Chapter 1, rebuild2, checked 14 October 2026 · source revision b982f5a.
# Complete evaluation of mapping-out cones The represented cocone retains its whole matching and independent family image. Actual precomposition evaluation supports complete square recovery. ```agda {-# OPTIONS --without-K #-} module SCT.VolumeI.Chapter01.Section08.MappingOutEvaluation 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 using (module Constructions) open Constructions open import SCT.VolumeI.Chapter01.Section02.Coherence using (id₌; comp-unitˡ; comp-unitʳ; comp-assoc; preWhisker-id₌; postWhisker-id₌; module Composition; module Boundaries) open Composition open Boundaries using (SquareCell₌) open import SCT.VolumeI.Chapter01.Section02.Specialization open import SCT.VolumeI.Chapter01.Section02.Whiskering using (preWhisker-id; postWhisker-id) open import SCT.VolumeI.Chapter01.Section02.IdentificationSquares open import SCT.VolumeI.Chapter01.Section03.ProductConstructions using (productMap; productMap-comp) open import SCT.VolumeI.Chapter01.Section03.Products.ProductFunctor using (productMap-cong; productMap-cong₂; productMap-cong-triangle₁; productMap-cong-triangle₂; productMap-cong-comp; productMap-cong-id-One; productMap-cong-square) open import SCT.VolumeI.Chapter01.Section03.Squares using (Square; comp-square) open import SCT.VolumeI.Chapter01.Section03.Identifications.Inverses using (inverse-unique; inverse-composite; inverse-inverse; postWhisker-inverse; preWhisker-inverse; comp₌-unitˡ-One; comp₌-unitʳ-One; comp₌-inverseˡ-One; cancel-left; cancel-right) open import SCT.VolumeI.Chapter01.Section03.Identifications.FunctorCoherence using (pentagon-whiskered-right; whisker-mixed-One; postWhisker-comp-One; preWhisker-comp-One; triangle-whiskered; identity-unitors; right-unitor-comp; left-unitor-comp; postWhisker-id-One) open import SCT.VolumeI.Chapter01.Section03.Identifications.Triangles using (post-triangle; post-square-cell; post-square-cell-id; post-square-cell-comp; lies-over-comp; restrict-triangle; restrict-triangle-assoc; restrict-change-square-One; restrict-square-One) open import SCT.VolumeI.Chapter01.Section02.Products using (module Calculus) open Calculus open import SCT.VolumeI.Chapter01.Section03.Products.ProductFunctorCoherence using (productMap-separate; productMap-first-comp; productMap-comp-natural-outer-One; productMap-comp-natural-inner-One) open import SCT.VolumeI.Chapter01.Section03.Products.Pairing using (pair₌-unique) open import SCT.VolumeI.Chapter01.Section03.Products.PairingRestriction using (pair-evaluation-over₁-One; pair-evaluation-over₂-One) open import SCT.VolumeI.Chapter01.Section03.Identifications.EndpointTransport using (changeEndpoints; square-to-changeEndpoints; transport-square; reflect-transported-square; changeEndpoints-extend-square) open import SCT.VolumeI.Chapter01.Section04.MappingAnimae using (Map; map-isAn; mapEval; uncurry) open import SCT.VolumeI.Chapter01.Section04.Currying using (curry⁼-cong; uncurry⁼; uncurry⁼-cong; uncurry⁼-composition; uncurry⁼-constant; uncurry⁼-identity; uncurry⁼-evaluate; uncurry-reflect; uncurry-reflect-β; uncurry⁼-reflect; uncurry-restrict) open import SCT.VolumeI.Chapter01.Section04.Functoriality using (mapPre; mapPre-uncurry; mapPre-β; mapPre-comp; mapPre⁼; mapPre-β-natural) open import SCT.VolumeI.Chapter01.Section04.UncurryingRestriction using (uncurry-restrict-inputs; uncurry-restrict-iterated) open import SCT.VolumeI.Chapter01.Section04.Precomposition using (mapPre-uncurry-inputs) open import SCT.VolumeI.Chapter01.Section07.Evaluation using (evaluate-cong; evaluate⁼-absolute) import SCT.VolumeI.Chapter01.Section07.PreEvaluationSubstitution as Pre open import SCT.VolumeI.Chapter01.Section06.Cones open import SCT.VolumeI.Chapter01.Section08.Cocones open import SCT.VolumeI.Chapter01.Section08.PushoutSquares using (mappingOut; IsPushout) open import SCT.VolumeI.Chapter01.Section03.Products.ProductRestriction open import SCT.VolumeI.Chapter01.Section03.Identifications.TriangleCoherence using (post-triangle-change) private module _ {Γ : Context} where module RestrictionEvaluationAction (P : CAT Γ) where J : {A B : CAT Γ} → MAP A B → MAP (P × A) (P × B) J = product-restriction {P = P} R : {A B : CAT Γ} {f g : MAP A B} → f =₁ g → J f =₁ J g R = productMap-cong (id₌ (id P)) K : {A B C : CAT Γ} (f : MAP A B) (g : MAP B C) → (J g ∘ J f) =₁ J (g ∘ f) K = restriction-compositor {P = P} R-comp : {A B : CAT Γ} {f g h : MAP A B} (β : g =₁ h) (α : f =₁ g) → R (β ∙ α) =₂ (R β ∙ R α) R-comp = restriction-action-composition R-id : {A B : CAT Γ} (f : MAP A B) → R (id₌ f) =₂ id₌ (J f) R-id = productMap-cong-id-One (id P) outer-natural : {A B C : CAT Γ} (f : MAP A B) {g h : MAP B C} (α : g =₁ h) → SquareCell₌ (R α ▷ J f) (R (α ▷ f)) (K f g) (K f h) outer-natural = restriction-compositor-outer-natural inner-natural : {A B C : CAT Γ} {f g : MAP A B} (α : f =₁ g) (h : MAP B C) → SquareCell₌ (J h ◁ R α) (R (h ◁ α)) (K f h) (K g h) inner-natural = restriction-compositor-inner-natural private uncurry-inverse : {Γ : Context} {P C E : CAT Γ} {f g : MAP P (Map C E)} (α : f =₁ g) → uncurry⁼ (α ⁻¹) =₂ (uncurry⁼ α) ⁻¹ uncurry-inverse {f = f} α = (inverse-unique (uncurry⁼ α) (uncurry⁼ (α ⁻¹)) (uncurry⁼-identity f ∙ (uncurry⁼-cong (comp₌-inverseˡ α) ∙ (uncurry⁼-composition (α ⁻¹) α) ⁻¹))) ⁻¹ module _ {Γ : Context} where module MappingOutEvaluation {P A B C E : CAT Γ} (u : MAP A B) (l : MAP A C) where Ju : MAP (P × A) (P × B) Ju = productMap (id P) u Jl : MAP (P × A) (P × C) Jl = productMap (id P) l represented : Cone (mapPre {D = E} u) (mapPre l) P → Cocone Ju Jl E represented s = record { left = uncurry (Cone.left s) ; right = uncurry (Cone.right s) ; match = changeEndpoints (mapPre-uncurry u (Cone.left s)) (mapPre-uncurry l (Cone.right s)) (uncurry⁼ (Cone.match s)) } private module _ {X : CAT Γ} where open Terms.Equalities X using (_=_) matching-frame : (s : Cone (mapPre {D = E} u) (mapPre l) P) → changeEndpoints (const {P = X} (mapPre-uncurry u (Cone.left s))) (const (mapPre-uncurry l (Cone.right s))) (uncurry⁼ (const (Cone.match s))) =₁ const (Cocone.match (represented s)) matching-frame s = const-comp gs (uncurry⁼ τ ∙ fs ⁻¹) ∙ comp₌-cong (id₌ (const gs)) (const-comp (uncurry⁼ τ) (fs ⁻¹) ∙ comp₌-cong (uncurry⁼-constant τ) ((const-inv fs) ⁻¹)) where fs = mapPre-uncurry u (Cone.left s) gs = mapPre-uncurry l (Cone.right s) τ = Cone.match s module _ {X : CAT Γ} where open Terms.Equalities X using (_=_) evaluate-identification : {s t : Cone (mapPre {D = E} u) (mapPre l) P} → ConeIdentification X s t → CoconeIdentification X (represented s) (represented t) evaluate-identification {s} {t} Φ = record { left = uncurry⁼ α ; right = uncurry⁼ β ; compatible = replace-sides₌ (matching-frame {X = X} s) (matching-frame {X = X} t) (transport-square fs ft gs gt τs τt raw-left raw-right native-left native-right (mapPre-uncurry-inputs u α) (mapPre-uncurry-inputs l β) raw-square) } where α = ConeIdentification.left Φ β = ConeIdentification.right Φ fs : uncurry (mapPre u ∘ Cone.left s) = (uncurry (Cone.left s) ∘ Ju) fs = const {P = X} (mapPre-uncurry u (Cone.left s)) ft : uncurry (mapPre u ∘ Cone.left t) = (uncurry (Cone.left t) ∘ Ju) ft = const {P = X} (mapPre-uncurry u (Cone.left t)) gs : uncurry (mapPre l ∘ Cone.right s) = (uncurry (Cone.right s) ∘ Jl) gs = const {P = X} (mapPre-uncurry l (Cone.right s)) gt : uncurry (mapPre l ∘ Cone.right t) = (uncurry (Cone.right t) ∘ Jl) gt = const {P = X} (mapPre-uncurry l (Cone.right t)) τs : uncurry (mapPre u ∘ Cone.left s) = uncurry (mapPre l ∘ Cone.right s) τs = uncurry⁼ (const {P = X} (Cone.match s)) τt : uncurry (mapPre u ∘ Cone.left t) = uncurry (mapPre l ∘ Cone.right t) τt = uncurry⁼ (const {P = X} (Cone.match t)) raw-left = uncurry⁼ (mapPre u ◁ α) raw-right = uncurry⁼ (mapPre l ◁ β) native-left = uncurry⁼ α ▷ Ju native-right = uncurry⁼ β ▷ Jl raw-square : (τt ∙ raw-left) =₁ (raw-right ∙ τs) raw-square = uncurry⁼-composition (mapPre l ◁ β) (const (Cone.match s)) ∙ (uncurry⁼-cong (ConeIdentification.compatible Φ) ∙ (uncurry⁼-composition (const (Cone.match t)) (mapPre u ◁ α)) ⁻¹) module RecoveredIdentification (pAn : isAn P) (s t : Cone (mapPre {D = E} u) (mapPre l) P) (Φ : CoconeIdentification X (represented s) (represented t)) where left : Cone.left s = Cone.left t left = uncurry-reflect pAn _ _ (CoconeIdentification.left Φ) right : Cone.right s = Cone.right t right = uncurry-reflect pAn _ _ (CoconeIdentification.right Φ) left-image : uncurry⁼ left =₁ CoconeIdentification.left Φ left-image = uncurry-reflect-β pAn _ _ (CoconeIdentification.left Φ) right-image : uncurry⁼ right =₁ CoconeIdentification.right Φ right-image = uncurry-reflect-β pAn _ _ (CoconeIdentification.right Φ) private adjusted : CoconeIdentification X (represented s) (represented t) adjusted = record { left = uncurry⁼ left ; right = uncurry⁼ right ; compatible = replace-edges₌ ((preWhisker Ju ◁ left-image) ⁻¹) ((preWhisker Jl ◁ right-image) ⁻¹) (CoconeIdentification.compatible Φ) } fs : uncurry (mapPre u ∘ Cone.left s) = (uncurry (Cone.left s) ∘ Ju) fs = const {P = X} (mapPre-uncurry u (Cone.left s)) ft : uncurry (mapPre u ∘ Cone.left t) = (uncurry (Cone.left t) ∘ Ju) ft = const {P = X} (mapPre-uncurry u (Cone.left t)) gs : uncurry (mapPre l ∘ Cone.right s) = (uncurry (Cone.right s) ∘ Jl) gs = const {P = X} (mapPre-uncurry l (Cone.right s)) gt : uncurry (mapPre l ∘ Cone.right t) = (uncurry (Cone.right t) ∘ Jl) gt = const {P = X} (mapPre-uncurry l (Cone.right t)) τs : uncurry (mapPre u ∘ Cone.left s) = uncurry (mapPre l ∘ Cone.right s) τs = uncurry⁼ (const {P = X} (Cone.match s)) τt : uncurry (mapPre u ∘ Cone.left t) = uncurry (mapPre l ∘ Cone.right t) τt = uncurry⁼ (const {P = X} (Cone.match t)) α : uncurry (mapPre u ∘ Cone.left s) = uncurry (mapPre u ∘ Cone.left t) α = uncurry⁼ (mapPre u ◁ left) β : uncurry (mapPre l ∘ Cone.right s) = uncurry (mapPre l ∘ Cone.right t) β = uncurry⁼ (mapPre l ◁ right) raw-square : (τt ∙ α) =₁ (β ∙ τs) raw-square = reflect-transported-square fs gs ft gt τs τt α β (uncurry⁼ left ▷ Ju) (uncurry⁼ right ▷ Jl) (mapPre-uncurry-inputs u left) (mapPre-uncurry-inputs l right) (replace-sides₌ ((matching-frame {X = X} s) ⁻¹) ((matching-frame {X = X} t) ⁻¹) (CoconeIdentification.compatible adjusted)) identification : ConeIdentification X s t identification = record { left = left ; right = right ; compatible = uncurry⁼-reflect pAn _ _ ((uncurry⁼-composition (mapPre l ◁ right) (const (Cone.match s))) ⁻¹ ∙ (raw-square ∙ uncurry⁼-composition (const (Cone.match t)) (mapPre u ◁ left))) } ``` ## The actual supplied square under evaluation The selected precomposition compositor is recovered from its literal input. Its evaluation square and the specified precomposition action square give all three pieces of the mapping-out matching. Endpoint change then uses the actual evaluation beta legs, with no assumption that mapping-out is a coherent pseudofunctor. ```agda module _ {Γ : Context} where mapPre-comp-input : {A B C E : CAT Γ} (f : MAP A B) (g : MAP B C) → uncurry (mapPre {D = E} f ∘ mapPre g) =₁ uncurry (mapPre (g ∘ f)) mapPre-comp-input {C = C} {E} f g = (mapPre-β (g ∘ f)) ⁻¹ ∙ ((mapEval ◁ restriction-compositor {P = Map C E} f g) ∙ (comp-assoc (product-restriction f) (product-restriction g) mapEval ∙ ((mapPre-β g ▷ product-restriction f) ∙ mapPre-uncurry f (mapPre g)))) mapPre-comp-image : {A B C E : CAT Γ} (f : MAP A B) (g : MAP B C) → uncurry⁼ (mapPre-comp {D = E} f g) =₁ mapPre-comp-input f g mapPre-comp-image {C = C} {E} f g = uncurry-reflect-β (map-isAn C E) (mapPre {D = E} f ∘ mapPre g) (mapPre (g ∘ f)) (mapPre-comp-input f g) module CompositorEvaluation {A B C E : CAT Γ} (f : MAP A B) (g : MAP B C) where Jf : MAP (Map C E × A) (Map C E × B) Jf = product-restriction f Jg : MAP (Map C E × B) (Map C E × C) Jg = product-restriction g before : uncurry (mapPre {D = E} f ∘ mapPre g) =₁ ((mapEval ∘ Jg) ∘ Jf) before = (mapPre-β g ▷ Jf) ∙ mapPre-uncurry f (mapPre g) after : uncurry (mapPre {D = E} (g ∘ f)) =₁ (mapEval ∘ product-restriction (g ∘ f)) after = mapPre-β (g ∘ f) product-route : ((mapEval ∘ Jg) ∘ Jf) =₁ (mapEval ∘ product-restriction (g ∘ f)) product-route = (mapEval ◁ restriction-compositor f g) ∙ comp-assoc Jf Jg mapEval abstract square : SquareCell₌ (uncurry⁼ (mapPre-comp {D = E} f g)) product-route before after square = (comp₌-assoc (mapEval ◁ restriction-compositor f g) (comp-assoc Jf Jg mapEval) before) ⁻¹ ∙ (comp-inv-left after ((mapEval ◁ restriction-compositor f g) ∙ (comp-assoc Jf Jg mapEval ∙ before)) ∙ comp₌-cong (id₌ after) (mapPre-comp-image f g)) module ActualSquareEvaluation {A B C D E : CAT Γ} {l : MAP A C} {r : MAP B D} (s : Square l r) where private P : CAT Γ P = Map D E u : MAP A B u = Square.source-map s v : MAP C D v = Square.target-map s σ : (r ∘ u) =₁ (v ∘ l) σ = Square.cell s Ju = product-restriction {P = P} u Jl = product-restriction {P = P} l Jr = product-restriction {P = P} r Jv = product-restriction {P = P} v module Evaluation = MappingOutEvaluation {P = P} {E = E} u l module Left = CompositorEvaluation {E = E} u r module Right = CompositorEvaluation {E = E} l v source : Cocone Ju Jl E source = Evaluation.represented (mappingOut s E) target : Cocone Ju Jl E target = cocone-postcompose mapEval (square-cocone (product-square {P = P} s)) left : Cocone.left source =₁ Cocone.left target left = mapPre-β r right : Cocone.right source =₁ Cocone.right target right = mapPre-β v private Mu : uncurry (mapPre u ∘ mapPre {D = E} r) =₁ (uncurry (mapPre r) ∘ Ju) Mu = mapPre-uncurry u (mapPre r) Ml : uncurry (mapPre l ∘ mapPre {D = E} v) =₁ (uncurry (mapPre v) ∘ Jl) Ml = mapPre-uncurry l (mapPre v) Kleft = mapEval ◁ restriction-compositor {P = P} u r Kright = mapEval ◁ restriction-compositor {P = P} l v middle = mapEval ◁ productMap-cong (id₌ (id P)) σ Aleft = comp-assoc Ju Jr mapEval Aright = comp-assoc Jl Jv mapEval raw-left = uncurry⁼ (mapPre-comp {D = E} u r) raw-right = uncurry⁼ (mapPre-comp {D = E} l v) raw-middle = uncurry⁼ (mapPre⁼ {D = E} σ) raw-match = uncurry⁼ (Cone.match (mappingOut s E)) raw-expanded = raw-right ⁻¹ ∙ (raw-middle ∙ raw-left) native-expanded = (Kright ∙ Aright) ⁻¹ ∙ (middle ∙ (Kleft ∙ Aleft)) middle-square : SquareCell₌ raw-middle middle Left.after Right.after middle-square = replace-edges₌ (id₌ raw-middle) (postWhisker mapEval ◁ productMap-cong₂ (const-One (id₌ (id P))) (id₌ σ)) (unconst-sides₌ (mapPre-β-natural σ)) raw-normal : raw-match =₂ raw-expanded raw-normal = comp₌-cong (uncurry-inverse (mapPre-comp {D = E} l v)) (uncurry⁼-composition (mapPre⁼ σ) (mapPre-comp u r)) ∙ uncurry⁼-composition ((mapPre-comp l v) ⁻¹) (mapPre⁼ σ ∙ mapPre-comp u r) posted-cell : (mapEval ◁ Square.cell (product-square {P = P} s)) =₂ (Kright ⁻¹ ∙ (middle ∙ Kleft)) posted-cell = comp₌-cong (postWhisker-inverse mapEval (restriction-compositor l v)) (postWhisker-comp₌ mapEval (productMap-cong (id₌ (id P)) σ) (restriction-compositor u r)) ∙ postWhisker-comp₌ mapEval ((restriction-compositor l v) ⁻¹) (productMap-cong (id₌ (id P)) σ ∙ restriction-compositor u r) native-normal : native-expanded =₂ Cocone.match target native-normal = comp₌-cong (id₌ (Aright ⁻¹)) (comp₌-cong (posted-cell ⁻¹) (id₌ Aleft)) ∙ (comp₌-cong (id₌ (Aright ⁻¹)) ((comp₌-assoc (Kright ⁻¹) (middle ∙ Kleft) Aleft) ⁻¹ ∙ comp₌-cong (id₌ (Kright ⁻¹)) ((comp₌-assoc middle Kleft Aleft) ⁻¹)) ∙ (comp₌-assoc (Aright ⁻¹) (Kright ⁻¹) (middle ∙ (Kleft ∙ Aleft)) ∙ comp₌-cong (inverse-composite Kright Aright) (id₌ (middle ∙ (Kleft ∙ Aleft))))) raw-square : SquareCell₌ raw-match (Cocone.match target) Left.before Right.before raw-square = replace-edges₌ (raw-normal ⁻¹) native-normal (inv-comp-square₌ (adjoin-square₌ Left.square middle-square) Right.square) abstract identification : CoconeIdentification₁ source target identification = record { left = left ; right = right ; compatible = transpose-square₌ (replace-sides₌ (comp-inv-right (left ▷ Ju) Mu) (comp-inv-right (right ▷ Jl) Ml) (changeEndpoints-extend-square Mu Ml raw-match raw-square)) } ``` ## Input comparison at a categorical parameter The five literal factors of precomposition uncurrying each carry a square. Their paste compares the whole supplied input identification, with the actual precomposition uncurrying identifications on both sides. ```agda module _ {Γ : Context} where module ParameterizedInputEvaluation {P A B E : CAT Γ} (h : MAP P (Map B E)) {f g : MAP A B} (α : f =₁ g) where private Q : CAT Γ Q = Map B E RA = productMap h (id A) RB = productMap h (id B) JQf = product-restriction {P = Q} f JQg = product-restriction {P = Q} g JPf = product-restriction {P = P} f JPg = product-restriction {P = P} g δQ = productMap-cong (id₌ (id Q)) α δP = productMap-cong (id₌ (id P)) α e : MAP (Q × B) E e = mapEval first : SquareCell₌ (uncurry⁼ (mapPre⁼ {D = E} α ▷ h)) (uncurry⁼ (mapPre⁼ α) ▷ RA) (uncurry-restrict (mapPre f) h) (uncurry-restrict (mapPre g) h) first = unconst-sides₌ (uncurry-restrict-inputs (mapPre⁼ α) h) base : SquareCell₌ (uncurry⁼ (mapPre⁼ {D = E} α)) (e ◁ δQ) (mapPre-β f) (mapPre-β g) base = replace-edges₌ (id₌ _) (postWhisker e ◁ productMap-cong₂ (const-One (id₌ (id Q))) (id₌ α)) (unconst-sides₌ (mapPre-β-natural α)) second : SquareCell₌ (uncurry⁼ (mapPre⁼ {D = E} α) ▷ RA) ((e ◁ δQ) ▷ RA) (mapPre-β f ▷ RA) (mapPre-β g ▷ RA) second = pre-square₌ RA base third : SquareCell₌ ((e ◁ δQ) ▷ RA) (e ◁ (δQ ▷ RA)) (comp-assoc RA JQf e) (comp-assoc RA JQg e) third = whisker-mixed-One δQ RA e fourth : SquareCell₌ (e ◁ (δQ ▷ RA)) (e ◁ (RB ◁ δP)) (e ◁ productMap-separate h f) (e ◁ productMap-separate h g) fourth = post-square₌ e (SeparationSecondInput.compatibility h α) fifth : SquareCell₌ (e ◁ (RB ◁ δP)) (uncurry h ◁ δP) ((comp-assoc JPf RB e) ⁻¹) ((comp-assoc JPg RB e) ⁻¹) fifth = inverse-square₌ (postWhisker-comp-One δP RB e) compatibility : SquareCell₌ (uncurry⁼ (mapPre⁼ {D = E} α ▷ h)) (uncurry h ◁ productMap-cong (id₌ (id P)) α) (mapPre-uncurry f h) (mapPre-uncurry g h) compatibility = paste-square₌ (paste-square₌ (paste-square₌ (paste-square₌ first second) third) fourth) fifth ``` ## Parameter substitution and the selected compositor The shared represented-precomposition calculation retains the actual beta triangles. Its scalar evaluation action is compared explicitly with the selected uncurry action. Both the compositor and source associator are transported along this bridge; the public mapping formulas keep their literal uncurry action and selected product route. ```agda private module _ {Γ : Context} {T C E : CAT Γ} {h k : MAP T (Map C E)} where map-scalar-action : (α : h =₁ k) → uncurry⁼ α =₂ evaluate-cong mapEval α map-scalar-action α = evaluate⁼-absolute mapEval α ∙ uncurry⁼-evaluate α module _ {Γ : Context} where module ParameterChangeDiagram {X Y A B E : CAT Γ} (f : MAP A B) (k : MAP Y (Map B E)) (h : MAP X Y) where private module R = Pre.RepresentedPrecomposition (mapEval {C = A} {D = E}) (mapEval {C = B} {D = E}) f (mapPre f) (mapPre-β f) HA = productMap h (id A) HB = productMap h (id B) LX = product-restriction {P = X} f LY = product-restriction {P = Y} f action = (comp-assoc LX HB (uncurry k)) ⁻¹ ∙ ((uncurry k ◁ productMap-separate h f) ∙ (comp-assoc HA LY (uncurry k) ∙ (mapPre-uncurry f k ▷ HA))) source-bridge = comp₌-cong (id₌ (uncurry-restrict k h ▷ LX)) (comp₌-cong (id₌ (mapPre-uncurry f (k ∘ h))) (map-scalar-action (comp-assoc h k (mapPre f)))) comparison : ((uncurry-restrict k h ▷ LX) ∙ (mapPre-uncurry f (k ∘ h) ∙ uncurry⁼ (comp-assoc h k (mapPre f)))) =₂ (action ∙ uncurry-restrict (mapPre f ∘ k) h) comparison = R.substitution k h ∙ source-bridge module ParameterizedCompositorEvaluation {P A B C E : CAT Γ} (f : MAP A B) (g : MAP B C) (h : MAP P (Map C E)) where private eA = mapEval {C = A} {D = E} eB = mapEval {C = B} {D = E} eC = mapEval {C = C} {D = E} Ff = mapPre {D = E} f Fg = mapPre {D = E} g Fgf = mapPre {D = E} (g ∘ f) JPf = product-restriction {P = P} f JPg = product-restriction {P = P} g κP = restriction-compositor {P = P} f g module Default = CompositorEvaluation {E = E} f g module Calculation = Pre.PrecompositionCompositor eA eB eC f g Ff Fg Fgf (mapPre-β f) (mapPre-β g) (mapPre-β (g ∘ f)) (mapPre-comp f g) base-square = replace-edges₌ (map-scalar-action (mapPre-comp f g)) (id₌ Default.product-route) Default.square source-bridge = comp₌-cong (id₌ (mapPre-uncurry g h ▷ JPf)) (comp₌-cong (id₌ (mapPre-uncurry f (Fg ∘ h))) ((map-scalar-action (comp-assoc h Fg Ff)) ⁻¹)) before : uncurry ((Ff ∘ Fg) ∘ h) =₁ ((uncurry h ∘ JPg) ∘ JPf) before = (mapPre-uncurry g h ▷ JPf) ∙ (mapPre-uncurry f (Fg ∘ h) ∙ uncurry⁼ (comp-assoc h Fg Ff)) after : uncurry (mapPre (g ∘ f) ∘ h) =₁ (uncurry h ∘ product-restriction (g ∘ f)) after = mapPre-uncurry (g ∘ f) h product-route = (uncurry h ◁ κP) ∙ comp-assoc JPf JPg (uncurry h) square : SquareCell₌ (uncurry⁼ (mapPre-comp {D = E} f g ▷ h)) product-route before after square = replace-sides₌ source-bridge (id₌ after) (replace-edges₌ ((map-scalar-action (mapPre-comp f g ▷ h)) ⁻¹) (id₌ product-route) (Calculation.comparison base-square h)) ``` ## Complete evaluation of a restricted mapping-out square The supplied square is restricted along an arbitrary categorical mapping parameter. Both cone-restriction associators are retained and normalized, then the three compositor/input faces assemble the complete matching comparison. The legs are the actual precomposition uncurrying comparisons. ```agda module _ {Γ : Context} where module ParameterizedSquareEvaluation {P A B C D E : CAT Γ} {l : MAP A C} {r : MAP B D} (s : Square l r) (h : MAP P (Map D E)) where private u : MAP A B u = Square.source-map s v : MAP C D v = Square.target-map s σ : (r ∘ u) =₁ (v ∘ l) σ = Square.cell s Ju = product-restriction {P = P} u Jl = product-restriction {P = P} l Jr = product-restriction {P = P} r Jv = product-restriction {P = P} v module Evaluation = MappingOutEvaluation {P = P} {E = E} u l module Left = ParameterizedCompositorEvaluation u r h module Right = ParameterizedCompositorEvaluation l v h source : Cocone Ju Jl E source = Evaluation.represented (cone-restrict h (mappingOut s E)) target : Cocone Ju Jl E target = cocone-postcompose (uncurry h) (square-cocone (product-square {P = P} s)) left : Cocone.left source =₁ Cocone.left target left = mapPre-uncurry r h right : Cocone.right source =₁ Cocone.right target right = mapPre-uncurry v h private Mu : uncurry (mapPre u ∘ (mapPre {D = E} r ∘ h)) =₁ (uncurry (mapPre r ∘ h) ∘ Ju) Mu = mapPre-uncurry u (mapPre r ∘ h) Ml : uncurry (mapPre l ∘ (mapPre {D = E} v ∘ h)) =₁ (uncurry (mapPre v ∘ h) ∘ Jl) Ml = mapPre-uncurry l (mapPre v ∘ h) Kleft = uncurry h ◁ restriction-compositor {P = P} u r Kright = uncurry h ◁ restriction-compositor {P = P} l v middle = uncurry h ◁ productMap-cong (id₌ (id P)) σ Aleft = comp-assoc Ju Jr (uncurry h) Aright = comp-assoc Jl Jv (uncurry h) assoc-left = uncurry⁼ (comp-assoc h (mapPre r) (mapPre {D = E} u)) assoc-right = uncurry⁼ (comp-assoc h (mapPre v) (mapPre {D = E} l)) raw-left = uncurry⁼ (mapPre-comp {D = E} u r ▷ h) ∙ assoc-left ⁻¹ raw-right = uncurry⁼ (mapPre-comp {D = E} l v ▷ h) ∙ assoc-right ⁻¹ raw-middle = uncurry⁼ (mapPre⁼ {D = E} σ ▷ h) raw-match = uncurry⁼ (Cone.match (cone-restrict h (mappingOut s E))) raw-expanded = raw-right ⁻¹ ∙ (raw-middle ∙ raw-left) native-expanded = (Kright ∙ Aright) ⁻¹ ∙ (middle ∙ (Kleft ∙ Aleft)) before-left = (left ▷ Ju) ∙ Mu before-right = (right ▷ Jl) ∙ Ml -- Remove only the actual uncurry associator from the compositor face. strip : {K T : CAT Γ} {x y z x′ y′ : MAP K T} (a : x =₁ y) (t : x =₁ z) (b : x′ =₁ y′) (q : y =₁ x′) (r : z =₁ y′) → SquareCell₌ t b (q ∙ a) r → SquareCell₌ (t ∙ a ⁻¹) b q r strip a t b q r square = comp₌-cong (id₌ b) (comp-inv-right q a) ∙ (comp₌-assoc b (q ∙ a) (a ⁻¹) ∙ (comp₌-cong square (id₌ (a ⁻¹)) ∙ (comp₌-assoc r t (a ⁻¹)) ⁻¹)) left-square : SquareCell₌ raw-left (Kleft ∙ Aleft) before-left Left.after left-square = strip assoc-left (uncurry⁼ (mapPre-comp u r ▷ h)) (Kleft ∙ Aleft) before-left Left.after (replace-sides₌ ((comp₌-assoc (left ▷ Ju) Mu assoc-left) ⁻¹) (id₌ Left.after) Left.square) right-square : SquareCell₌ raw-right (Kright ∙ Aright) before-right Right.after right-square = strip assoc-right (uncurry⁼ (mapPre-comp l v ▷ h)) (Kright ∙ Aright) before-right Right.after (replace-sides₌ ((comp₌-assoc (right ▷ Jl) Ml assoc-right) ⁻¹) (id₌ Right.after) Right.square) middle-square : SquareCell₌ raw-middle middle Left.after Right.after middle-square = ParameterizedInputEvaluation.compatibility h σ -- Raw normalization below includes restriction's TWO actual associators. raw-normal : raw-match =₂ raw-expanded raw-normal = normalization where L = mapPre-comp {D = E} u r R = mapPre-comp {D = E} l v M = mapPre⁼ {D = E} σ x = uncurry⁼ (L ▷ h) y = uncurry⁼ (R ▷ h) z = raw-middle left-associator = assoc-left right-associator = assoc-right restrict-composite = comp₌-cong (preWhisker-inverse R h) (preWhisker-comp₌ M L h) ∙ preWhisker-comp₌ (R ⁻¹) (M ∙ L) h lifted = comp₌-cong (uncurry-inverse (R ▷ h)) (uncurry⁼-composition (M ▷ h) (L ▷ h)) ∙ uncurry⁼-composition ((R ▷ h) ⁻¹) ((M ▷ h) ∙ (L ▷ h)) raw = comp₌-cong (id₌ right-associator) (comp₌-cong (lifted ∙ uncurry⁼-cong restrict-composite) (uncurry-inverse (comp-assoc h (mapPre r) (mapPre u))) ∙ uncurry⁼-composition (Cone.match (mappingOut s E) ▷ h) ((comp-assoc h (mapPre r) (mapPre u)) ⁻¹)) ∙ uncurry⁼-composition (comp-assoc h (mapPre v) (mapPre l)) ((Cone.match (mappingOut s E) ▷ h) ∙ (comp-assoc h (mapPre r) (mapPre u)) ⁻¹) normalized = comp₌-cong (comp₌-cong (inverse-inverse right-associator) (id₌ (y ⁻¹)) ∙ inverse-composite y (right-associator ⁻¹)) (id₌ (z ∙ (x ∙ left-associator ⁻¹))) regroup = comp₌-cong (id₌ right-associator) (comp₌-cong (id₌ (y ⁻¹)) (comp₌-assoc z x (left-associator ⁻¹)) ∙ comp₌-assoc (y ⁻¹) (z ∙ x) (left-associator ⁻¹)) normalization = normalized ⁻¹ ∙ ((comp₌-assoc right-associator (y ⁻¹) (z ∙ (x ∙ left-associator ⁻¹))) ⁻¹ ∙ (regroup ∙ raw)) posted-cell : (uncurry h ◁ Square.cell (product-square {P = P} s)) =₂ (Kright ⁻¹ ∙ (middle ∙ Kleft)) posted-cell = comp₌-cong (postWhisker-inverse (uncurry h) (restriction-compositor l v)) (postWhisker-comp₌ (uncurry h) (productMap-cong (id₌ (id P)) σ) (restriction-compositor u r)) ∙ postWhisker-comp₌ (uncurry h) ((restriction-compositor l v) ⁻¹) (productMap-cong (id₌ (id P)) σ ∙ restriction-compositor u r) native-normal : native-expanded =₂ Cocone.match target native-normal = comp₌-cong (id₌ (Aright ⁻¹)) (comp₌-cong (posted-cell ⁻¹) (id₌ Aleft)) ∙ (comp₌-cong (id₌ (Aright ⁻¹)) ((comp₌-assoc (Kright ⁻¹) (middle ∙ Kleft) Aleft) ⁻¹ ∙ comp₌-cong (id₌ (Kright ⁻¹)) ((comp₌-assoc middle Kleft Aleft) ⁻¹)) ∙ (comp₌-assoc (Aright ⁻¹) (Kright ⁻¹) (middle ∙ (Kleft ∙ Aleft)) ∙ comp₌-cong (inverse-composite Kright Aright) (id₌ (middle ∙ (Kleft ∙ Aleft))))) raw-square : SquareCell₌ raw-match (Cocone.match target) before-left before-right raw-square = replace-edges₌ (raw-normal ⁻¹) native-normal (inv-comp-square₌ (adjoin-square₌ left-square middle-square) right-square) abstract matching : SquareCell₌ (left ▷ Ju) (right ▷ Jl) (Cocone.match source) (Cocone.match target) matching = transpose-square₌ (replace-sides₌ (comp-inv-right (left ▷ Ju) Mu) (comp-inv-right (right ▷ Jl) Ml) (changeEndpoints-extend-square Mu Ml raw-match raw-square)) identification : CoconeIdentification₁ source target identification = record { left = left ; right = right ; compatible = matching } ``` ## The actual precomposition action Evaluation reflects composition of the chosen action on identifications and its two compositor input squares. The associativity equation retains the actual precomposition associator image and the chosen compositor routes. ```agda private module PrecompositionCalculation where module _ {Γ : Context} where module At (E : CAT Γ) where F : CAT Γ → CAT Γ F C = Map C E J : {A B : CAT Γ} → MAP A B → MAP (F B) (F A) J = mapPre {D = E} R : {A B : CAT Γ} {f g : MAP A B} → f =₁ g → J f =₁ J g R = mapPre⁼ {D = E} R₂ : {A B : CAT Γ} {f g : MAP A B} {α β : f =₁ g} → α =₂ β → R α =₂ R β R₂ {B = B} p = curry⁼-cong (map-isAn B E) (postWhisker mapEval ◁ productMap-cong₂ (id₌ (const (id₌ (id (Map B E))))) p) K : {A B C : CAT Γ} (f : MAP A B) (g : MAP B C) → (J f ∘ J g) =₁ J (g ∘ f) K = mapPre-comp {D = E} module Identification {A B : CAT Γ} where private module Native = RestrictionEvaluationAction (F B) e : MAP (F B × B) E e = mapEval N : {f g : MAP A B} → f =₁ g → (e ∘ Native.J f) =₁ (e ∘ Native.J g) N α = e ◁ Native.R α evaluation : {f g : MAP A B} (α : f =₁ g) → SquareCell₌ (uncurry⁼ (R α)) (N α) (mapPre-β f) (mapPre-β g) evaluation α = replace-edges₌ (id₌ _) (postWhisker e ◁ productMap-cong₂ (const-One (id₌ (id (F B)))) (id₌ α)) (unconst-sides₌ (mapPre-β-natural α)) reflect : {f g : MAP A B} (α β : J f =₁ J g) (nα nβ : (e ∘ Native.J f) =₁ (e ∘ Native.J g)) → SquareCell₌ (uncurry⁼ α) nα (mapPre-β f) (mapPre-β g) → SquareCell₌ (uncurry⁼ β) nβ (mapPre-β f) (mapPre-β g) → nα =₂ nβ → α =₂ β reflect {f} {g} α β nα nβ first second p = uncurry⁼-reflect (map-isAn B E) α β (cancel-left (mapPre-β g) (second ⁻¹ ∙ (comp₌-cong p (id₌ (mapPre-β f)) ∙ first))) composition : {f g h : MAP A B} (β : g =₁ h) (α : f =₁ g) → R (β ∙ α) =₂ (R β ∙ R α) composition β α = reflect (R (β ∙ α)) (R β ∙ R α) (N (β ∙ α)) (N β ∙ N α) (evaluation (β ∙ α)) (replace-edges₌ ((uncurry⁼-composition (R β) (R α)) ⁻¹) (id₌ _) (adjoin-square₌ (evaluation α) (evaluation β))) (postWhisker-comp₌ e (Native.R β) (Native.R α) ∙ (postWhisker e ◁ Native.R-comp β α)) identity : (f : MAP A B) → R (id₌ f) =₂ id₌ (J f) identity f = let uc-id = const-One (id₌ (uncurry (J f))) ∙ (uncurry⁼-identity (J f) ∙ uncurry⁼-cong ((const-One (id₌ (J f))) ⁻¹)) candidate = replace-edges₌ (uc-id ⁻¹) (id₌ _) (transpose-square₌ (unconst-sides₌ (identity-square₌ (mapPre-β f)))) native-id = postWhisker-id₌ e (Native.J f) ∙ (postWhisker e ◁ Native.R-id f) in reflect (R (id₌ f)) (id₌ (J f)) (N (id₌ f)) (id₌ (e ∘ Native.J f)) (evaluation (id₌ f)) candidate native-id R-comp : {A B : CAT Γ} {f g h : MAP A B} (β : g =₁ h) (α : f =₁ g) → R (β ∙ α) =₂ (R β ∙ R α) R-comp = Identification.composition R-id : {A B : CAT Γ} (f : MAP A B) → R (id₌ f) =₂ id₌ (J f) R-id = Identification.identity R-inverse : {A B : CAT Γ} {f g : MAP A B} (α : f =₁ g) → R (α ⁻¹) =₂ (R α) ⁻¹ R-inverse {f = f} α = cancel-right (R α) ((comp₌-inverseˡ-One (R α)) ⁻¹ ∙ (R-id f ∙ (R₂ (comp₌-inverseˡ-One α) ∙ (R-comp (α ⁻¹) α) ⁻¹))) R-square : {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 l r → SquareCell₌ (R t) (R b) (R l) (R r) R-square {t = t} {b} {l} {r} square = R-comp b l ∙ (R₂ square ∙ (R-comp r t) ⁻¹) reflect-square : {P A : CAT Γ} {x y x′ y′ : MAP P (Map A E)} (pAn : isAn P) {t : x =₁ y} {b : x′ =₁ y′} {l : x =₁ x′} {r : y =₁ y′} → SquareCell₌ (uncurry⁼ t) (uncurry⁼ b) (uncurry⁼ l) (uncurry⁼ r) → SquareCell₌ t b l r reflect-square pAn {t = t} {b} {l} {r} square = uncurry⁼-reflect pAn (r ∙ t) (b ∙ l) ((uncurry⁼-composition b l) ⁻¹ ∙ (square ∙ uncurry⁼-composition r t)) module OuterInput {A B C : CAT Γ} (f : MAP A B) {g h : MAP B C} (α : g =₁ h) where private module N = RestrictionEvaluationAction (F C) module L = CompositorEvaluation {E = E} f g module H = CompositorEvaluation {E = E} f h e : MAP (F C × C) E e = mapEval Jf = N.J f Jg = N.J g Jh = N.J h source-action = (e ◁ N.R α) ▷ Jf target-action = e ◁ N.R (α ▷ f) source-square : SquareCell₌ (uncurry⁼ (J f ◁ R α)) source-action L.before H.before source-square = paste-square₌ (unconst-sides₌ (mapPre-uncurry-inputs f (R α))) (pre-square₌ Jf (Identification.evaluation α)) target-square = Identification.evaluation (α ▷ f) native-square : SquareCell₌ source-action target-action L.product-route H.product-route native-square = paste-square₌ (whisker-mixed-One (N.R α) Jf e) (post-square₌ e (N.outer-natural f α)) transported = replace-sides₌ ((square-to-changeEndpoints L.before L.after (uncurry⁼ (K f g)) L.product-route L.square) ⁻¹) ((square-to-changeEndpoints H.before H.after (uncurry⁼ (K f h)) H.product-route H.square) ⁻¹) native-square raw-square = reflect-transported-square L.before L.after H.before H.after (uncurry⁼ (K f g)) (uncurry⁼ (K f h)) (uncurry⁼ (J f ◁ R α)) (uncurry⁼ (R (α ▷ f))) source-action target-action source-square target-square transported compatibility : SquareCell₌ (J f ◁ R α) (R (α ▷ f)) (K f g) (K f h) compatibility = reflect-square (map-isAn C E) raw-square module InnerInput {A B C : CAT Γ} {f g : MAP A B} (α : f =₁ g) (h : MAP B C) where private module N = RestrictionEvaluationAction (F C) module L = CompositorEvaluation {E = E} f h module H = CompositorEvaluation {E = E} g h e : MAP (F C × C) E e = mapEval source-action = uncurry (J h) ◁ N.R α middle-action = (e ∘ N.J h) ◁ N.R α target-action = e ◁ N.R (h ◁ α) source-square = ParameterizedInputEvaluation.compatibility (J h) α beta-square : SquareCell₌ source-action middle-action (mapPre-β h ▷ N.J f) (mapPre-β h ▷ N.J g) beta-square = interchange (mapPre-β h) (N.R α) before-square : SquareCell₌ (uncurry⁼ (R α ▷ J h)) middle-action L.before H.before before-square = paste-square₌ source-square beta-square target-square = Identification.evaluation (h ◁ α) native-square : SquareCell₌ middle-action target-action L.product-route H.product-route native-square = paste-square₌ (postWhisker-comp-One (N.R α) (N.J h) e) (post-square₌ e (N.inner-natural α h)) transported = replace-sides₌ ((square-to-changeEndpoints L.before L.after (uncurry⁼ (K f h)) L.product-route L.square) ⁻¹) ((square-to-changeEndpoints H.before H.after (uncurry⁼ (K g h)) H.product-route H.square) ⁻¹) native-square raw-square = reflect-transported-square L.before L.after H.before H.after (uncurry⁼ (K f h)) (uncurry⁼ (K g h)) (uncurry⁼ (R α ▷ J h)) (uncurry⁼ (R (h ◁ α))) middle-action target-action before-square target-square transported compatibility : SquareCell₌ (R α ▷ J h) (R (h ◁ α)) (K f h) (K g h) compatibility = reflect-square (map-isAn C E) raw-square module Associativity {A B C D : CAT Γ} (f : MAP A B) (g : MAP B C) (h : MAP C D) where private module N = RestrictionEvaluationAction (F D) module Param = ParameterizedCompositorEvaluation f g (J h) module First = CompositorEvaluation {E = E} (g ∘ f) h module Middle = CompositorEvaluation {E = E} g h module Last = CompositorEvaluation {E = E} f (h ∘ g) e : MAP (F D × D) E e = mapEval Jf = N.J f Jg = N.J g Jh = N.J h Jgf = N.J (g ∘ f) Jhg = N.J (h ∘ g) δ = N.K f g b = N.K g h b′ = N.K (g ∘ f) h ρ = N.R (comp-assoc f g h) c′ = ρ ∙ N.K f (h ∘ g) T = comp-assoc Jf Jg Jh β = mapPre-β {D = E} h am = comp-assoc (J h) (J g) (J f) left = K (g ∘ f) h ∙ (K f g ▷ J h) right = R (comp-assoc f g h) ∙ (K f (h ∘ g) ∙ ((J f ◁ K g h) ∙ am)) native-inner = ((e ∘ Jh) ◁ δ) ∙ comp-assoc Jf Jg (e ∘ Jh) native-left = First.product-route ∙ native-inner native-right = (e ◁ ρ) ∙ (Last.product-route ∙ (Middle.product-route ▷ Jf)) triangle-change : (b′ ∙ (Jh ◁ δ)) =₂ (c′ ∙ restrict-triangle Jh Jg b Jf) triangle-change = comp₌-assoc c′ (b ▷ Jf) (T ⁻¹) ∙ (comp₌-cong ((comp₌-assoc ρ (N.K f (h ∘ g)) (b ▷ Jf)) ⁻¹ ∙ (restriction-associativity {P = F D} f g h ∙ comp₌-assoc b′ (Jh ◁ δ) T)) (id₌ (T ⁻¹)) ∙ (comp-inv-right (b′ ∙ (Jh ◁ δ)) T) ⁻¹) native-associativity : native-left =₂ native-right native-associativity = reassociateFour (e ◁ ρ) (e ◁ N.K f (h ∘ g)) (comp-assoc Jf Jhg e) (Middle.product-route ▷ Jf) ∙ (comp₌-cong (postWhisker-comp₌ e ρ (N.K f (h ∘ g))) (id₌ (comp-assoc Jf Jhg e ∙ (Middle.product-route ▷ Jf))) ∙ post-triangle-change e Jh Jg Jf Jgf δ b b′ c′ triangle-change) left-frame = ((β ▷ Jg) ▷ Jf) ∙ Param.before beta-frame : SquareCell₌ Param.product-route native-inner ((β ▷ Jg) ▷ Jf) (β ▷ Jgf) beta-frame = adjoin-square₌ (transpose-square₌ (preWhisker-comp-One β Jg Jf)) (interchange β δ) first-square : SquareCell₌ (uncurry⁼ (K f g ▷ J h)) native-inner left-frame First.before first-square = paste-square₌ Param.square beta-frame left-square : SquareCell₌ (uncurry⁼ left) native-left left-frame First.after left-square = replace-edges₌ ((uncurry⁼-composition (K (g ∘ f) h) (K f g ▷ J h)) ⁻¹) (id₌ native-left) (adjoin-square₌ first-square First.square) before-action = (Middle.before ▷ Jf) ∙ mapPre-uncurry f (J g ∘ J h) frame-assoc : (before-action ∙ uncurry⁼ am) =₂ left-frame frame-assoc = comp₌-assoc ((β ▷ Jg) ▷ Jf) (mapPre-uncurry g (J h) ▷ Jf) (mapPre-uncurry f (J g ∘ J h) ∙ uncurry⁼ am) ∙ (comp₌-cong (preWhisker-comp₌ (β ▷ Jg) (mapPre-uncurry g (J h)) Jf) (id₌ (mapPre-uncurry f (J g ∘ J h) ∙ uncurry⁼ am)) ∙ comp₌-assoc (Middle.before ▷ Jf) (mapPre-uncurry f (J g ∘ J h)) (uncurry⁼ am)) assoc-square : SquareCell₌ (uncurry⁼ am) (id₌ (((e ∘ Jh) ∘ Jg) ∘ Jf)) left-frame before-action assoc-square = (comp₌-unitˡ-One left-frame) ⁻¹ ∙ frame-assoc action-square : SquareCell₌ (uncurry⁼ (J f ◁ K g h)) (Middle.product-route ▷ Jf) before-action Last.before action-square = paste-square₌ (unconst-sides₌ (mapPre-uncurry-inputs f (K g h))) (pre-square₌ Jf Middle.square) first-two = replace-edges₌ (id₌ _) (comp₌-unitʳ-One (Middle.product-route ▷ Jf)) (adjoin-square₌ assoc-square action-square) all-right = adjoin-square₌ (adjoin-square₌ first-two Last.square) (Identification.evaluation (comp-assoc f g h)) raw-right-normal : uncurry⁼ right =₂ (uncurry⁼ (R (comp-assoc f g h)) ∙ (uncurry⁼ (K f (h ∘ g)) ∙ (uncurry⁼ (J f ◁ K g h) ∙ uncurry⁼ am))) raw-right-normal = comp₌-cong (id₌ (uncurry⁼ (R (comp-assoc f g h)))) (comp₌-cong (id₌ (uncurry⁼ (K f (h ∘ g)))) (uncurry⁼-composition (J f ◁ K g h) am) ∙ uncurry⁼-composition (K f (h ∘ g)) ((J f ◁ K g h) ∙ am)) ∙ uncurry⁼-composition (R (comp-assoc f g h)) (K f (h ∘ g) ∙ ((J f ◁ K g h) ∙ am)) right-square : SquareCell₌ (uncurry⁼ right) native-right left-frame First.after right-square = replace-edges₌ (raw-right-normal ⁻¹) (id₌ native-right) all-right compatibility : (K (g ∘ f) h ∙ (K f g ▷ J h)) =₂ (R (comp-assoc f g h) ∙ (K f (h ∘ g) ∙ ((J f ◁ K g h) ∙ comp-assoc (J h) (J g) (J f)))) compatibility = uncurry⁼-reflect (map-isAn D E) left right (cancel-left First.after (right-square ⁻¹ ∙ (comp₌-cong native-associativity (id₌ left-frame) ∙ left-square))) module _ {Γ : Context} where precomposition-action-composition : {A B E : CAT Γ} {f g h : MAP A B} (β : g =₁ h) (α : f =₁ g) → mapPre⁼ {D = E} (β ∙ α) =₂ (mapPre⁼ β ∙ mapPre⁼ α) precomposition-action-composition {E = E} = PrecompositionCalculation.At.R-comp E precomposition-compositor-outer : {A B C E : CAT Γ} (f : MAP A B) {g h : MAP B C} (α : g =₁ h) → SquareCell₌ (mapPre {D = E} f ◁ mapPre⁼ α) (mapPre⁼ (α ▷ f)) (mapPre-comp f g) (mapPre-comp f h) precomposition-compositor-outer {E = E} = PrecompositionCalculation.At.OuterInput.compatibility E precomposition-compositor-inner : {A B C E : CAT Γ} {f g : MAP A B} (α : f =₁ g) (h : MAP B C) → SquareCell₌ (mapPre⁼ {D = E} α ▷ mapPre h) (mapPre⁼ (h ◁ α)) (mapPre-comp f h) (mapPre-comp g h) precomposition-compositor-inner {E = E} = PrecompositionCalculation.At.InnerInput.compatibility E precomposition-compositor-associativity : {A B C D E : CAT Γ} (f : MAP A B) (g : MAP B C) (h : MAP C D) → (mapPre-comp {D = E} (g ∘ f) h ∙ (mapPre-comp f g ▷ mapPre h)) =₂ (mapPre⁼ (comp-assoc f g h) ∙ (mapPre-comp f (h ∘ g) ∙ ((mapPre f ◁ mapPre-comp g h) ∙ comp-assoc (mapPre h) (mapPre g) (mapPre f)))) precomposition-compositor-associativity {E = E} = PrecompositionCalculation.At.Associativity.compatibility E ``` ```agda module _ {Γ : Context} where precomposition-action-inverse : {A B E : CAT Γ} {f g : MAP A B} (α : f =₁ g) → mapPre⁼ {D = E} (α ⁻¹) =₂ (mapPre⁼ α) ⁻¹ precomposition-action-inverse {E = E} = PrecompositionCalculation.At.R-inverse E ```