Other Agda modules in this section (16)
Chapter 1, rebuild2, checked 14 October 2026 · source revision b982f5a.
# Substitution of a represented precomposition A supplied evaluation triangle defines the indexed precomposition comparison. Its compatibility with parameter restriction follows from the actual product separation and evaluation substitution calculations. A complete finite square for a selected compositor induces its indexed square, retaining both beta comparisons, the evaluated associator, and the product restriction compositor. The crossing calculation and intermediate routes are private. ```agda {-# OPTIONS --without-K --lossy-unification #-} module SCT.VolumeI.Chapter01.Section07.PreEvaluationSubstitution 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.Section03.Products.ProductRestriction open import SCT.VolumeI.Chapter01.Section07.Evaluation open import SCT.VolumeI.Chapter01.Section07.EvaluationRepresentation using (evaluate-restrict-inputs) open import SCT.VolumeI.Chapter01.Section07.EvaluationSubstitution using (evaluate-restrict-assoc) private module CrossingEvaluationCalculation where module _ {Γ : Context} where -- Two adjacent commuting crossings compare f/g with F/G through -- s₀/s₁/s₂. Supplied evaluation triangles at the two target functors -- and the outer parameter changes induce evaluation of their COMPLETE -- five-factor paste. The premise is the entire outer evaluation square; -- the result retains the induced input/output triangles and action. module EvaluatedCrossingPaste {A₀ A₁ A₂ B₀ B₁ B₂ E : CAT Γ} (f : MAP A₀ A₁) (g : MAP A₁ A₂) (F : MAP B₀ B₁) (G : MAP B₁ B₂) (s₀ : MAP A₀ B₀) (s₁ : MAP A₁ B₁) (s₂ : MAP A₂ B₂) (π : MAP B₂ E) (ρ : MAP A₂ E) (u : MAP B₁ E) (v : MAP A₁ E) (q : (π ∘ s₂) =₁ ρ) (b : (π ∘ G) =₁ u) (B : (ρ ∘ g) =₁ v) (β : (s₂ ∘ g) =₁ (G ∘ s₁)) (α : (s₁ ∘ f) =₁ (F ∘ s₀)) (ν : v =₁ (u ∘ s₁)) where source = restrict-triangle ρ g B f ∙ restrict-triangle π s₂ q (g ∘ f) first = restrict-triangle π (s₂ ∘ g) (B ∙ restrict-triangle π s₂ q g) f second = restrict-triangle π (G ∘ s₁) (restrict-triangle π G b s₁) f third = restrict-triangle π G b (s₁ ∘ f) fourth = restrict-triangle π G b (F ∘ s₀) target = restrict-triangle π (G ∘ F) (restrict-triangle π G b F) s₀ action = (comp-assoc s₀ F u) ⁻¹ ∙ ((u ◁ α) ∙ (comp-assoc f s₁ u ∙ (ν ▷ f))) r₁ = (comp-assoc f g s₂) ⁻¹ r₂ = β ▷ f r₃ = comp-assoc f s₁ G r₄ = G ◁ α r₅ = (comp-assoc s₀ F G) ⁻¹ chain = r₅ ∙ (r₄ ∙ (r₃ ∙ (r₂ ∙ r₁))) private composite-triangle : {X Y Z T : CAT Γ} (e : MAP Z T) (z : MAP Y Z) {x y : MAP Y T} (a : (e ∘ z) =₁ x) (c : x =₁ y) (r : MAP X Y) → restrict-triangle e z (c ∙ a) r =₂ ((c ▷ r) ∙ restrict-triangle e z a r) composite-triangle e z a c r = comp₌-assoc (c ▷ r) (a ▷ r) ((comp-assoc r z e) ⁻¹) ∙ comp₌-cong (preWhisker-comp₌ c a r) (id₌ ((comp-assoc r z e) ⁻¹)) nested : (source ∙ (π ◁ comp-assoc f g s₂)) =₂ first nested = (composite-triangle π (s₂ ∘ g) (restrict-triangle π s₂ q g) B f) ⁻¹ ∙ (comp₌-cong (id₌ (B ▷ f)) (inv-comp-left (comp-assoc f g ρ) (restrict-triangle π (s₂ ∘ g) (restrict-triangle π s₂ q g) f)) ∙ (comp₌-assoc (B ▷ f) ((comp-assoc f g ρ) ⁻¹) (comp-assoc f g ρ ∙ restrict-triangle π (s₂ ∘ g) (restrict-triangle π s₂ q g) f) ∙ (comp₌-cong (id₌ (restrict-triangle ρ g B f)) (restrict-triangle-assoc π s₂ q g f) ∙ comp₌-assoc (restrict-triangle ρ g B f) (restrict-triangle π s₂ q (g ∘ f)) (π ◁ comp-assoc f g s₂)))) first-square : SquareCell₌ (π ◁ r₁) (id₌ (v ∘ f)) source first first-square = (comp₌-unitˡ-One source) ⁻¹ ∙ (comp-inv-right source (π ◁ comp-assoc f g s₂) ∙ (comp₌-cong (nested ⁻¹) (id₌ ((π ◁ comp-assoc f g s₂) ⁻¹)) ∙ comp₌-cong (id₌ first) (postWhisker-inverse π (comp-assoc f g s₂)))) third-square : SquareCell₌ (π ◁ r₃) (comp-assoc f s₁ u) second third third-square = restrict-triangle-assoc π G b s₁ f fourth-square : SquareCell₌ (π ◁ r₄) (u ◁ α) third fourth fourth-square = restrict-change-square-One π G u b α fifth-square : SquareCell₌ (π ◁ r₅) ((comp-assoc s₀ F u) ⁻¹) fourth target fifth-square = replace-edges₌ ((postWhisker-inverse π (comp-assoc s₀ F G)) ⁻¹) (id₌ _) (transpose-square₌ (inverse-square₌ (transpose-square₌ (restrict-triangle-assoc π G b F s₀)))) compatibility : SquareCell₌ (π ◁ β) ν (B ∙ restrict-triangle π s₂ q g) (restrict-triangle π G b s₁) → SquareCell₌ (π ◁ chain) action source target compatibility square = let second-square = restrict-square-One π β ν (B ∙ restrict-triangle π s₂ q g) (restrict-triangle π G b s₁) f square first-two = replace-edges₌ (id₌ _) (comp₌-unitʳ-One (ν ▷ f)) (lies-over-comp π first-square second-square) in lies-over-comp π (lies-over-comp π (lies-over-comp π first-two third-square) fourth-square) fifth-square private module _ {Γ : Context} where inverse-three : {X Y : CAT Γ} {a₀ a₁ a₂ a₃ : MAP X Y} (c : a₂ =₁ a₃) (b : a₁ =₁ a₂) (a : a₀ =₁ a₁) → ((c ∙ (b ∙ a)) ⁻¹) =₂ (a ⁻¹ ∙ (b ⁻¹ ∙ c ⁻¹)) inverse-three c b a = comp₌-assoc (a ⁻¹) (b ⁻¹) (c ⁻¹) ∙ (comp₌-cong (inverse-composite b a) (id₌ (c ⁻¹)) ∙ inverse-composite c (b ∙ a)) inverse-five : {X Y : CAT Γ} {a₀ a₁ a₂ a₃ a₄ a₅ : MAP X Y} (e : a₄ =₁ a₅) (d : a₃ =₁ a₄) (c : a₂ =₁ a₃) (b : a₁ =₁ a₂) (a : a₀ =₁ a₁) → ((e ∙ (d ∙ (c ∙ (b ∙ a)))) ⁻¹) =₂ (a ⁻¹ ∙ (b ⁻¹ ∙ (c ⁻¹ ∙ (d ⁻¹ ∙ e ⁻¹)))) inverse-five e d c b a = comp₌-cong (id₌ (a ⁻¹)) (comp₌-assoc (b ⁻¹) (c ⁻¹) (d ⁻¹ ∙ e ⁻¹)) ∙ (comp₌-assoc (a ⁻¹) (b ⁻¹ ∙ c ⁻¹) (d ⁻¹ ∙ e ⁻¹) ∙ (comp₌-cong (inverse-three c b a) (id₌ (d ⁻¹ ∙ e ⁻¹)) ∙ inverse-three e d (c ∙ (b ∙ a)))) inverse-four : {X Y : CAT Γ} {a₀ a₁ a₂ a₃ a₄ : MAP X Y} (d : a₃ =₁ a₄) (c : a₂ =₁ a₃) (b : a₁ =₁ a₂) (a : a₀ =₁ a₁) → ((d ∙ (c ∙ (b ∙ a))) ⁻¹) =₂ (a ⁻¹ ∙ (b ⁻¹ ∙ (c ⁻¹ ∙ d ⁻¹))) inverse-four d c b a = comp₌-cong (id₌ (a ⁻¹)) (comp₌-assoc (b ⁻¹) (c ⁻¹) (d ⁻¹)) ∙ (comp₌-assoc (a ⁻¹) (b ⁻¹ ∙ c ⁻¹) (d ⁻¹) ∙ (comp₌-cong (inverse-three c b a) (id₌ (d ⁻¹)) ∙ inverse-composite d (c ∙ (b ∙ a)))) solve-square : {X Y : CAT Γ} {a₀ a₁ a₂ a₃ : MAP X Y} (a : a₂ =₁ a₃) (b : a₁ =₁ a₃) (c : a₀ =₁ a₂) (d : a₀ =₁ a₁) → (a ∙ c) =₂ (b ∙ d) → (a ⁻¹ ∙ b) =₂ (c ∙ d ⁻¹) solve-square a b c d square = comp₌-cong (inv-comp-left a c) (id₌ (d ⁻¹)) ∙ ((comp₌-assoc (a ⁻¹) (a ∙ c) (d ⁻¹)) ⁻¹ ∙ comp₌-cong (id₌ (a ⁻¹)) (comp₌-cong (square ⁻¹) (id₌ (d ⁻¹)) ∙ (comp-inv-right b d) ⁻¹)) private module _ {Γ : Context} {F C E : CAT Γ} (e : MAP (F × C) E) where scalar-restrict-inputs : {S T : CAT Γ} {h k : MAP T F} (α : h =₁ k) (r : MAP S T) → SquareCell₌ (evaluate-cong e (α ▷ r)) (evaluate-cong e α ▷ productMap r (id C)) (evaluate-restrict e h r) (evaluate-restrict e k r) scalar-restrict-inputs α r = replace-edges₌ (evaluate⁼-absolute e (α ▷ r)) (preWhisker (productMap r (id C)) ◁ evaluate⁼-absolute e α) (unconst-sides₌ (evaluate-restrict-inputs e α r)) module RepresentedPrecomposition {Γ : Context} {FA FB A B E : CAT Γ} (eA : MAP (FA × A) E) (eB : MAP (FB × B) E) (f : MAP A B) (H : MAP FB FA) (triangle : evaluate eA H =₁ (eB ∘ product-restriction {P = FB} f)) where comparison : {T : CAT Γ} (k : MAP T FB) → evaluate eA (H ∘ k) =₁ (evaluate eB k ∘ product-restriction {P = T} f) comparison {T} k = (comp-assoc (product-restriction {P = T} f) (productMap k (id B)) eB) ⁻¹ ∙ ((eB ◁ productMap-separate k f) ∙ (comp-assoc (productMap k (id A)) (product-restriction {P = FB} f) eB ∙ ((triangle ▷ productMap k (id A)) ∙ evaluate-restrict eA H k))) private module Calculation {X Y : CAT Γ} (k : MAP Y FB) (h : MAP X Y) where private Z : CAT Γ Z = FB HA = productMap h (id A) HB = productMap h (id B) KA = productMap k (id A) KB = productMap k (id B) LX = product-restriction {P = X} f LY = product-restriction {P = Y} f LZ = product-restriction {P = Z} f Sh = productMap-separate h f Sk = productMap-separate k f β = triangle uk = evaluate-restrict eA H k qk = comparison k e : MAP (Z × B) E e = eB module P = CrossingEvaluationCalculation.EvaluatedCrossingPaste HA KA HB KB LX LY LZ e (evaluate eA H) (evaluate eB k) (evaluate eA (H ∘ k)) (β ⁻¹) (id₌ (evaluate eB k)) (uk ⁻¹) Sk Sh qk using (action; chain; compatibility; source; target) out = (comp-assoc LY KB e) ⁻¹ inn = comp-assoc KA LZ e βk = β ▷ KA prefix = inn ∙ (βk ∙ uk) tail = uk ⁻¹ ∙ restrict-triangle e LZ (β ⁻¹) KA middle = out ∙ (e ◁ Sk) tail-normal : tail =₂ prefix ⁻¹ tail-normal = (inverse-three inn βk uk) ⁻¹ ∙ comp₌-cong (id₌ (uk ⁻¹)) (comp₌-cong (preWhisker-inverse β KA) (id₌ (inn ⁻¹))) normalize-left : (restrict-triangle e KB (id₌ (evaluate eB k)) LY ∙ (e ◁ Sk)) =₂ middle normalize-left = comp₌-cong (comp₌-unitˡ-One out ∙ comp₌-cong (preWhisker-id₌ (evaluate eB k) LY) (id₌ out)) (id₌ (e ◁ Sk)) normalize-right : (qk ∙ tail) =₂ middle normalize-right = comp-inv-right middle prefix ∙ comp₌-cong ((comp₌-assoc out (e ◁ Sk) prefix) ⁻¹) tail-normal outer-square : SquareCell₌ (e ◁ Sk) qk (uk ⁻¹ ∙ restrict-triangle e LZ (β ⁻¹) KA) (restrict-triangle e KB (id₌ (evaluate eB k)) LY) outer-square = normalize-right ⁻¹ ∙ normalize-left module M = ParameterSeparationComposition h k f using (compatibility; inverse-chain) V = comp-assoc HA KA LZ U = comp-assoc HA LY KB T = comp-assoc LX HB KB post-inverse-inverse = (postWhisker KB ◁ inverse-inverse Sh) ∙ (postWhisker-inverse KB (Sh ⁻¹)) ⁻¹ pre-inverse-inverse = (preWhisker HA ◁ inverse-inverse Sk) ∙ (preWhisker-inverse (Sk ⁻¹) HA) ⁻¹ chain = P.chain chain-bridge : (M.inverse-chain ⁻¹) =₂ chain chain-bridge = comp₌-cong (id₌ (T ⁻¹)) (comp₌-cong post-inverse-inverse (comp₌-cong (inverse-inverse U) (comp₌-cong pre-inverse-inverse (id₌ (V ⁻¹))))) ∙ inverse-five V (Sk ⁻¹ ▷ HA) (U ⁻¹) (KB ◁ Sh ⁻¹) T -- The complete pasted evaluation, with the original source/target triangles. pasted-evaluation : SquareCell₌ (e ◁ chain) P.action P.source P.target pasted-evaluation = P.compatibility outer-square -- Complete actual first-parameter compositor/separation rectangle after -- evaluation, using a proved bridge to the literal crossing paste. mixed-evaluation : SquareCell₌ (e ◁ (LZ ◁ productMap-first-comp {C = A} k h)) (e ◁ (productMap-first-comp {C = B} k h ▷ LX)) (e ◁ chain) (e ◁ productMap-separate (k ∘ h) f) mixed-evaluation = post-square₌ e (replace-sides₌ chain-bridge (id₌ (productMap-separate (k ∘ h) f)) M.compatibility) private uncurriedPre = evaluate eA H KHA = productMap (k ∘ h) (id A) KHB = productMap (k ∘ h) (id B) κA = productMap-first-comp {C = A} k h κB = productMap-first-comp {C = B} k h u₀ = evaluate-restrict eA (H ∘ k) h v₀ = evaluate-restrict eA H (k ∘ h) τ = evaluate-cong eA (comp-assoc h k H) w = evaluate-restrict eB k h a₁ = uk ▷ HA a₂ = comp-assoc HA KA uncurriedPre a₃ = β ▷ (KA ∘ HA) a₄ = comp-assoc (KA ∘ HA) LZ e prefix₀ = a₄ ∙ (a₃ ∙ (a₂ ∙ a₁)) z = prefix₀ ∙ u₀ source-normal : P.source =₂ prefix₀ ⁻¹ source-normal = ((comp₌-assoc (a₁ ⁻¹) (a₂ ⁻¹) (a₃ ⁻¹ ∙ a₄ ⁻¹)) ⁻¹ ∙ inverse-four a₄ a₃ a₂ a₁) ⁻¹ ∙ comp₌-cong (comp₌-cong (preWhisker-inverse uk HA) (id₌ (a₂ ⁻¹))) (comp₌-cong (preWhisker-inverse β (KA ∘ HA)) (id₌ (a₄ ⁻¹))) source-endpoint : (P.source ∙ z) =₂ u₀ source-endpoint = inv-comp-left prefix₀ u₀ ∙ comp₌-cong source-normal (id₌ z) input-action = e ◁ (LZ ◁ κA) output-action = e ◁ (κB ▷ LX) output-associator = (comp-assoc LX KHB e) ⁻¹ composite-input = comp-assoc KHA LZ e ∙ ((β ▷ KHA) ∙ (v₀ ∙ τ)) input-square : (comp-assoc KHA LZ e ∙ ((β ▷ KHA) ∙ (uncurriedPre ◁ κA))) =₂ (input-action ∙ (a₄ ∙ a₃)) input-square = comp₌-assoc input-action a₄ a₃ ∙ (comp₌-cong (postWhisker-comp-One κA LZ e) (id₌ a₃) ∙ ((comp₌-assoc (comp-assoc KHA LZ e) ((e ∘ LZ) ◁ κA) a₃) ⁻¹ ∙ comp₌-cong (id₌ (comp-assoc KHA LZ e)) (interchange β κA))) input-endpoint : composite-input =₂ (input-action ∙ z) input-endpoint = let inn₀ = comp-assoc KHA LZ e β₀ = β ▷ KHA act = uncurriedPre ◁ κA tail₀ = a₂ ∙ (a₁ ∙ u₀) regroup = comp₌-cong (comp₌-assoc a₄ a₃ (a₂ ∙ a₁)) (id₌ u₀) ∙ ((comp₌-assoc (a₄ ∙ a₃) (a₂ ∙ a₁) u₀) ⁻¹ ∙ comp₌-cong (id₌ (a₄ ∙ a₃)) ((comp₌-assoc a₂ a₁ u₀) ⁻¹)) in comp₌-cong (id₌ input-action) regroup ∙ (comp₌-assoc input-action (a₄ ∙ a₃) tail₀ ∙ (comp₌-cong input-square (id₌ tail₀) ∙ ((comp₌-assoc inn₀ (β₀ ∙ act) tail₀) ⁻¹ ∙ (comp₌-cong (id₌ inn₀) ((comp₌-assoc β₀ act tail₀) ⁻¹) ∙ comp₌-cong (id₌ inn₀) (comp₌-cong (id₌ β₀) (evaluate-restrict-assoc eA H k h)))))) output-endpoint : ((w ▷ LX) ∙ (output-associator ∙ output-action)) =₂ P.target output-endpoint = let before = (comp-assoc HB KB e) ⁻¹ final = (comp-assoc LX (KB ∘ HB) e) ⁻¹ image = e ◁ κB cancel = inv-comp-right before image ∙ comp₌-cong (comp₌-cong (id₌ before) (postWhisker-inverse e κB)) (id₌ image) restricted = (preWhisker LX ◁ cancel) ∙ (preWhisker-comp₌ w image LX) ⁻¹ target-normal = comp₌-cong (preWhisker LX ◁ (comp₌-unitˡ-One before ∙ comp₌-cong (preWhisker-id₌ (evaluate eB k) HB) (id₌ before))) (id₌ final) move = solve-square (comp-assoc LX KHB e) output-action (image ▷ LX) (comp-assoc LX (KB ∘ HB) e) (whisker-mixed-One κB LX e) in target-normal ⁻¹ ∙ (comp₌-cong restricted (id₌ final) ∙ ((comp₌-assoc (w ▷ LX) (image ▷ LX) final) ⁻¹ ∙ comp₌-cong (id₌ (w ▷ LX)) move)) normalize-input : (comparison (k ∘ h) ∙ τ) =₂ (output-associator ∙ ((e ◁ productMap-separate (k ∘ h) f) ∙ composite-input)) normalize-input = let S = e ◁ productMap-separate (k ∘ h) f a = comp-assoc KHA LZ e b = β ▷ KHA in comp₌-cong (id₌ output-associator) (comp₌-cong (id₌ S) (comp₌-cong (id₌ a) (comp₌-assoc b v₀ τ) ∙ comp₌-assoc a (b ∙ v₀) τ) ∙ comp₌-assoc S (a ∙ (b ∙ v₀)) τ) ∙ comp₌-assoc output-associator (S ∙ (a ∙ (b ∙ v₀))) τ move-product : ((e ◁ productMap-separate (k ∘ h) f) ∙ (input-action ∙ z)) =₂ (output-action ∙ ((e ◁ chain) ∙ z)) move-product = comp₌-assoc output-action (e ◁ chain) z ∙ (comp₌-cong mixed-evaluation (id₌ z) ∙ (comp₌-assoc (e ◁ productMap-separate (k ∘ h) f) input-action z) ⁻¹) close : ((w ▷ LX) ∙ (output-associator ∙ (output-action ∙ ((e ◁ chain) ∙ z)))) =₂ (P.action ∙ u₀) close = comp₌-cong (id₌ P.action) source-endpoint ∙ (comp₌-assoc P.action P.source z ∙ (comp₌-cong pasted-evaluation (id₌ z) ∙ ((comp₌-assoc P.target (e ◁ chain) z) ⁻¹ ∙ (comp₌-cong output-endpoint (id₌ ((e ◁ chain) ∙ z)) ∙ ((comp₌-assoc (w ▷ LX) (output-associator ∙ output-action) ((e ◁ chain) ∙ z)) ⁻¹ ∙ comp₌-cong (id₌ (w ▷ LX)) ((comp₌-assoc output-associator output-action ((e ◁ chain) ∙ z)) ⁻¹)))))) substitution-calculation : ((evaluate-restrict eB k h ▷ product-restriction {P = X} f) ∙ (comparison (k ∘ h) ∙ evaluate-cong eA (comp-assoc h k H))) =₂ (P.action ∙ evaluate-restrict eA (H ∘ k) h) substitution-calculation = close ∙ (comp₌-cong (id₌ (w ▷ LX)) (comp₌-cong (id₌ output-associator) move-product) ∙ (comp₌-cong (id₌ (w ▷ LX)) (comp₌-cong (id₌ output-associator) (comp₌-cong (id₌ (e ◁ productMap-separate (k ∘ h) f)) input-endpoint)) ∙ comp₌-cong (id₌ (w ▷ LX)) normalize-input)) private parameter-action : {S T : CAT Γ} (k : MAP T FB) (σ : MAP S T) → (evaluate eA (H ∘ k) ∘ productMap σ (id A)) =₁ ((evaluate eB k ∘ productMap σ (id B)) ∘ product-restriction {P = S} f) parameter-action {S} {T} k σ = (comp-assoc (product-restriction {P = S} f) (productMap σ (id B)) (evaluate eB k)) ⁻¹ ∙ ((evaluate eB k ◁ productMap-separate σ f) ∙ (comp-assoc (productMap σ (id A)) (product-restriction {P = T} f) (evaluate eB k) ∙ (comparison k ▷ productMap σ (id A)))) substitution : {S T : CAT Γ} (k : MAP T FB) (σ : MAP S T) → ((evaluate-restrict eB k σ ▷ product-restriction {P = S} f) ∙ (comparison (k ∘ σ) ∙ evaluate-cong eA (comp-assoc σ k H))) =₂ (parameter-action k σ ∙ evaluate-restrict eA (H ∘ k) σ) substitution k σ = Calculation.substitution-calculation k σ module PrecompositionCompositor {Γ : Context} {FA FB FC A B C E : CAT Γ} (eA : MAP (FA × A) E) (eB : MAP (FB × B) E) (eC : MAP (FC × C) E) (f : MAP A B) (g : MAP B C) (Hf : MAP FB FA) (Hg : MAP FC FB) (Hgf : MAP FC FA) (βf : evaluate eA Hf =₁ (eB ∘ product-restriction {P = FB} f)) (βg : evaluate eB Hg =₁ (eC ∘ product-restriction {P = FC} g)) (βgf : evaluate eA Hgf =₁ (eC ∘ product-restriction {P = FC} (g ∘ f))) (δ : (Hf ∘ Hg) =₁ Hgf) where private module F = RepresentedPrecomposition eA eB f Hf βf using (comparison; substitution) module G = RepresentedPrecomposition eB eC g Hg βg using (comparison) module GF = RepresentedPrecomposition eA eC (g ∘ f) Hgf βgf using (comparison) Jf = product-restriction {P = FC} f Jg = product-restriction {P = FC} g base-before = (βg ▷ Jf) ∙ F.comparison Hg base-after = βgf base-route = (eC ◁ restriction-compositor {P = FC} f g) ∙ comp-assoc Jf Jg eC module _ (base-square : SquareCell₌ (evaluate-cong eA δ) base-route base-before base-after) where private module Base where before = base-before after = base-after product-route = base-route square = base-square module Calculation {P : CAT Γ} (h : MAP P FC) where private Q : CAT Γ Q = FC e : MAP (Q × C) E e = eC U = evaluate eC h Ff = Hf Fg = Hg Uf = evaluate eB Fg RA = productMap h (id A) RB = productMap h (id B) RC = productMap h (id C) JPf = product-restriction {P = P} f JPg = product-restriction {P = P} g JQf = product-restriction {P = Q} f JQg = product-restriction {P = Q} g JQgf = product-restriction {P = Q} (g ∘ f) κP = restriction-compositor {P = P} f g κQ = restriction-compositor {P = Q} f g β = βg qg = G.comparison h νg = evaluate-restrict eB Fg h Sf = productMap-separate h f Sg = productMap-separate h g Sgf = productMap-separate h (g ∘ f) module Default = Base module Paste = CrossingEvaluationCalculation.EvaluatedCrossingPaste JPf JPg JQf JQg RA RB RC e U Uf (evaluate eB (Fg ∘ h)) (id₌ U) (β ⁻¹) (qg ⁻¹) (Sg ⁻¹) (Sf ⁻¹) νg using (action; chain; compatibility; source; target) ain = comp-assoc RB JQg e aout = comp-assoc JPg RC e βpre = β ▷ RB qprefix = e ◁ Sg ∙ (ain ∙ (βpre ∙ νg)) qinverse-normal : (qg ⁻¹) =₂ ((νg ⁻¹ ∙ (βpre ⁻¹ ∙ (ain ⁻¹ ∙ (e ◁ Sg) ⁻¹))) ∙ aout) qinverse-normal = comp₌-cong (inverse-four (e ◁ Sg) ain βpre νg) (inverse-inverse aout) ∙ inverse-composite (aout ⁻¹) qprefix source-triangle-normal : restrict-triangle e RC (id₌ U) JPg =₂ (aout ⁻¹) source-triangle-normal = comp₌-unitˡ-One (aout ⁻¹) ∙ comp₌-cong (preWhisker-id₌ U JPg) (id₌ (aout ⁻¹)) outer-right-normal : (νg ∙ ((qg ⁻¹) ∙ restrict-triangle e RC (id₌ U) JPg)) =₂ (βpre ⁻¹ ∙ (ain ⁻¹ ∙ (e ◁ Sg) ⁻¹)) outer-right-normal = comp-inv-left νg (βpre ⁻¹ ∙ (ain ⁻¹ ∙ (e ◁ Sg) ⁻¹)) ∙ comp₌-cong (id₌ νg) (comp-inv-right (νg ⁻¹ ∙ (βpre ⁻¹ ∙ (ain ⁻¹ ∙ (e ◁ Sg) ⁻¹))) aout ∙ comp₌-cong qinverse-normal source-triangle-normal) outer-left-normal : (restrict-triangle e JQg (β ⁻¹) RB ∙ (e ◁ Sg ⁻¹)) =₂ (βpre ⁻¹ ∙ (ain ⁻¹ ∙ (e ◁ Sg) ⁻¹)) outer-left-normal = comp₌-assoc (βpre ⁻¹) (ain ⁻¹) ((e ◁ Sg) ⁻¹) ∙ comp₌-cong (comp₌-cong (preWhisker-inverse β RB) (id₌ (ain ⁻¹))) (postWhisker-inverse e Sg) outer-square : SquareCell₌ (e ◁ Sg ⁻¹) νg (qg ⁻¹ ∙ restrict-triangle e RC (id₌ U) JPg) (restrict-triangle e JQg (β ⁻¹) RB) outer-square = outer-right-normal ⁻¹ ∙ outer-left-normal pasted-evaluation = Paste.compatibility outer-square chain = Paste.chain T = comp-assoc RA JQf JQg V = comp-assoc JPf JPg RC W = comp-assoc JPf RB JQg forward-chain = V ∙ ((Sg ▷ JPf) ∙ (W ⁻¹ ∙ ((JQg ◁ Sf) ∙ T))) chain-normal : (forward-chain ⁻¹) =₂ chain chain-normal = comp₌-cong (id₌ (T ⁻¹)) (comp₌-cong ((postWhisker-inverse JQg Sf) ⁻¹) (comp₌-cong (inverse-inverse W) (comp₌-cong ((preWhisker-inverse Sg JPf) ⁻¹) (id₌ (V ⁻¹))))) ∙ inverse-five V (Sg ▷ JPf) (W ⁻¹) (JQg ◁ Sf) T r = F.comparison (Fg ∘ h) ∙ evaluate-cong eA (comp-assoc h Fg Ff) ν₀ = evaluate-restrict eA (Ff ∘ Fg) h tail₀ = (F.comparison Fg ▷ RA) ∙ ν₀ am = comp-assoc JPf RB Uf bm = Uf ◁ Sf cm = comp-assoc RA JQf Uf mate = am ⁻¹ ∙ (bm ∙ cm) parameter-action = am ⁻¹ ∙ (bm ∙ (cm ∙ (F.comparison Fg ▷ RA))) parameter-action-normal : parameter-action =₂ (mate ∙ (F.comparison Fg ▷ RA)) parameter-action-normal = (comp₌-assoc (am ⁻¹) (bm ∙ cm) (F.comparison Fg ▷ RA)) ⁻¹ ∙ comp₌-cong (id₌ (am ⁻¹)) ((comp₌-assoc bm cm (F.comparison Fg ▷ RA)) ⁻¹) parameter-comparison : ((νg ▷ JPf) ∙ r) =₂ (mate ∙ tail₀) parameter-comparison = comp₌-assoc mate (F.comparison Fg ▷ RA) ν₀ ∙ (comp₌-cong parameter-action-normal (id₌ ν₀) ∙ F.substitution Hg h) action-normal : Paste.action =₂ (mate ⁻¹ ∙ (νg ▷ JPf)) action-normal = comp₌-cong ((inverse-three (am ⁻¹) bm cm) ⁻¹) (id₌ (νg ▷ JPf)) ∙ (comp₌-cong (comp₌-cong (id₌ (cm ⁻¹)) (comp₌-cong (id₌ (bm ⁻¹)) ((inverse-inverse am) ⁻¹))) (id₌ (νg ▷ JPf)) ∙ ((comp₌-assoc (cm ⁻¹) (bm ⁻¹ ∙ am) (νg ▷ JPf)) ⁻¹ ∙ (comp₌-cong (id₌ (cm ⁻¹)) ((comp₌-assoc (bm ⁻¹) am (νg ▷ JPf)) ⁻¹) ∙ comp₌-cong (id₌ (cm ⁻¹)) (comp₌-cong (postWhisker-inverse Uf Sf) (id₌ (am ∙ (νg ▷ JPf))))))) core : (Paste.action ∙ r) =₂ tail₀ core = inv-comp-left mate tail₀ ∙ (comp₌-cong (id₌ (mate ⁻¹)) parameter-comparison ∙ (comp₌-assoc (mate ⁻¹) (νg ▷ JPf) r ∙ comp₌-cong action-normal (id₌ r))) r₁ = qg ▷ JPf r₂ = comp-assoc JPf JPg U r₃ = comp-assoc (JPg ∘ JPf) RC e prefix₀ = r₃ ∙ (r₂ ∙ r₁) z = prefix₀ ∙ r source-normal : Paste.source =₂ prefix₀ ⁻¹ source-normal = ((comp₌-assoc (r₁ ⁻¹) (r₂ ⁻¹) (r₃ ⁻¹)) ⁻¹ ∙ inverse-three r₃ r₂ r₁) ⁻¹ ∙ comp₌-cong (comp₌-cong (preWhisker-inverse qg JPf) (id₌ (r₂ ⁻¹))) (comp₌-unitˡ-One (r₃ ⁻¹) ∙ comp₌-cong (preWhisker-id₌ U (JPg ∘ JPf)) (id₌ (r₃ ⁻¹))) source-endpoint : (Paste.source ∙ z) =₂ r source-endpoint = inv-comp-left prefix₀ r ∙ comp₌-cong source-normal (id₌ z) aQ = comp-assoc JQf JQg e βQ = β ▷ JQf pair-prefix = aQ ∙ βQ leading-prefix = (e ◁ κQ) ∙ pair-prefix leading = leading-prefix ∙ F.comparison Fg base-target-inverse = restrict-triangle e JQg (β ⁻¹) JQf base-target-normal : base-target-inverse =₂ pair-prefix ⁻¹ base-target-normal = (inverse-composite aQ βQ) ⁻¹ ∙ comp₌-cong (preWhisker-inverse β JQf) (id₌ (aQ ⁻¹)) prefix-cancel : (leading-prefix ∙ base-target-inverse) =₂ (e ◁ κQ) prefix-cancel = comp-inv-right (e ◁ κQ) pair-prefix ∙ comp₌-cong (id₌ leading-prefix) base-target-normal ain-gf = comp-assoc RA JQgf e projected-prefix = ain-gf ⁻¹ ∙ (e ◁ (κQ ▷ RA)) prefix-endpoint : projected-prefix =₂ ((leading-prefix ▷ RA) ∙ Paste.target) prefix-endpoint = let final = (comp-assoc RA (JQg ∘ JQf) e) ⁻¹ normalized = comp₌-cong ((preWhisker RA ◁ prefix-cancel) ∙ (preWhisker-comp₌ leading-prefix base-target-inverse RA) ⁻¹) (id₌ final) ∙ (comp₌-assoc (leading-prefix ▷ RA) (base-target-inverse ▷ RA) final) ⁻¹ in normalized ⁻¹ ∙ solve-square ain-gf (e ◁ (κQ ▷ RA)) ((e ◁ κQ) ▷ RA) (comp-assoc RA (JQg ∘ JQf) e) (whisker-mixed-One κQ RA e) leading-transfer : ((projected-prefix ∙ (e ◁ chain)) ∙ z) =₂ ((leading ▷ RA) ∙ ν₀) leading-transfer = comp₌-cong ((preWhisker-comp₌ leading-prefix (F.comparison Fg) RA) ⁻¹) (id₌ ν₀) ∙ ((comp₌-assoc (leading-prefix ▷ RA) (F.comparison Fg ▷ RA) ν₀) ⁻¹ ∙ (comp₌-cong (id₌ (leading-prefix ▷ RA)) core ∙ (comp₌-cong (id₌ (leading-prefix ▷ RA)) (comp₌-cong (id₌ Paste.action) source-endpoint) ∙ (comp₌-cong (id₌ (leading-prefix ▷ RA)) (comp₌-assoc Paste.action Paste.source z ∙ (comp₌-cong pasted-evaluation (id₌ z) ∙ (comp₌-assoc Paste.target (e ◁ chain) z) ⁻¹)) ∙ (comp₌-assoc (leading-prefix ▷ RA) Paste.target ((e ◁ chain) ∙ z) ∙ (comp₌-cong prefix-endpoint (id₌ ((e ◁ chain) ∙ z)) ∙ comp₌-assoc projected-prefix (e ◁ chain) z)))))) raw = evaluate-cong eA (δ ▷ h) ν-before = evaluate-restrict eA (Ff ∘ Fg) h ν-after = evaluate-restrict eA Hgf h lifted-before = (Default.before ▷ RA) ∙ ν-before lifted-after = (Default.after ▷ RA) ∙ ν-after lifted-square : SquareCell₌ raw (Default.product-route ▷ RA) lifted-before lifted-after lifted-square = paste-square₌ (scalar-restrict-inputs eA δ h) (pre-square₌ RA Default.square) out-gf = (comp-assoc (product-restriction {P = P} (g ∘ f)) RC e) ⁻¹ sep-gf = e ◁ Sgf image-prefix = out-gf ∙ (sep-gf ∙ ain-gf) after-normal : (image-prefix ∙ lifted-after) =₂ GF.comparison h after-normal = comp₌-cong (id₌ out-gf) (comp₌-assoc sep-gf ain-gf lifted-after) ∙ comp₌-assoc out-gf (sep-gf ∙ ain-gf) lifted-after lifted-image : (GF.comparison h ∙ raw) =₂ (image-prefix ∙ ((Default.product-route ▷ RA) ∙ lifted-before)) lifted-image = comp₌-cong (id₌ image-prefix) lifted-square ∙ (comp₌-assoc image-prefix lifted-after raw ∙ comp₌-cong (after-normal ⁻¹) (id₌ raw)) leading-normal : (Default.product-route ∙ Default.before) =₂ leading leading-normal = (comp₌-assoc (e ◁ κQ) pair-prefix (F.comparison Fg)) ⁻¹ ∙ (comp₌-cong (id₌ (e ◁ κQ)) ((comp₌-assoc aQ βQ (F.comparison Fg)) ⁻¹) ∙ comp₌-assoc (e ◁ κQ) aQ (βQ ∙ F.comparison Fg)) leading-restrict : ((Default.product-route ▷ RA) ∙ lifted-before) =₂ ((leading ▷ RA) ∙ ν₀) leading-restrict = comp₌-cong (preWhisker RA ◁ leading-normal) (id₌ ν₀) ∙ (comp₌-cong ((preWhisker-comp₌ Default.product-route Default.before RA) ⁻¹) (id₌ ν₀) ∙ (comp₌-assoc (Default.product-route ▷ RA) (Default.before ▷ RA) ν₀) ⁻¹) product-image : (sep-gf ∙ ((e ◁ (κQ ▷ RA)) ∙ (e ◁ chain))) =₂ (e ◁ (RC ◁ κP)) product-image = let Dimage = e ◁ forward-chain Cinverse = postWhisker-inverse e forward-chain ∙ (postWhisker e ◁ chain-normal ⁻¹) whole = post-square₌ e (parameter-separation-composition h f g) cancel = comp-inv-right (e ◁ (RC ◁ κP)) Dimage ∙ comp₌-cong (id₌ ((e ◁ (RC ◁ κP)) ∙ Dimage)) Cinverse in cancel ∙ (comp₌-cong whole (id₌ (e ◁ chain)) ∙ (comp₌-assoc sep-gf (e ◁ (κQ ▷ RA)) (e ◁ chain)) ⁻¹) remove-prefix : (image-prefix ∙ (projected-prefix ∙ (e ◁ chain))) =₂ (out-gf ∙ (e ◁ (RC ◁ κP))) remove-prefix = comp₌-cong (id₌ out-gf) product-image ∙ (comp₌-cong (id₌ out-gf) (comp₌-cong (id₌ sep-gf) (comp-inv-left ain-gf ((e ◁ (κQ ▷ RA)) ∙ (e ◁ chain))) ∙ comp₌-assoc sep-gf ain-gf (ain-gf ⁻¹ ∙ ((e ◁ (κQ ▷ RA)) ∙ (e ◁ chain)))) ∙ (comp₌-cong (id₌ out-gf) (comp₌-cong (id₌ (sep-gf ∙ ain-gf)) (comp₌-assoc (ain-gf ⁻¹) (e ◁ (κQ ▷ RA)) (e ◁ chain))) ∙ comp₌-assoc out-gf (sep-gf ∙ ain-gf) (projected-prefix ∙ (e ◁ chain)))) outer-move : (out-gf ∙ (e ◁ (RC ◁ κP))) =₂ ((U ◁ κP) ∙ (r₃ ⁻¹)) outer-move = solve-square (comp-assoc (product-restriction {P = P} (g ∘ f)) RC e) (e ◁ (RC ◁ κP)) (U ◁ κP) r₃ (postWhisker-comp-One κP RC e) finish : ((out-gf ∙ (e ◁ (RC ◁ κP))) ∙ z) =₂ (((U ◁ κP) ∙ r₂) ∙ (r₁ ∙ r)) finish = (comp₌-assoc (U ◁ κP) r₂ (r₁ ∙ r)) ⁻¹ ∙ (comp₌-cong (id₌ (U ◁ κP)) (comp₌-assoc r₂ r₁ r) ∙ (comp₌-cong (id₌ (U ◁ κP)) (inv-comp-left r₃ ((r₂ ∙ r₁) ∙ r) ∙ comp₌-cong (id₌ (r₃ ⁻¹)) (comp₌-assoc r₃ (r₂ ∙ r₁) r)) ∙ (comp₌-assoc (U ◁ κP) (r₃ ⁻¹) z ∙ comp₌-cong outer-move (id₌ z)))) before : evaluate eA ((Ff ∘ Fg) ∘ h) =₁ ((evaluate eC h ∘ JPg) ∘ JPf) before = (G.comparison h ▷ JPf) ∙ (F.comparison (Fg ∘ h) ∙ evaluate-cong eA (comp-assoc h Fg Ff)) after : evaluate eA (Hgf ∘ h) =₁ (evaluate eC h ∘ product-restriction (g ∘ f)) after = GF.comparison h product-route = (evaluate eC h ◁ κP) ∙ comp-assoc JPf JPg (evaluate eC h) comparison-calculation : SquareCell₌ (evaluate-cong eA (δ ▷ h)) product-route before after comparison-calculation = finish ∙ (comp₌-cong remove-prefix (id₌ z) ∙ ((comp₌-assoc image-prefix (projected-prefix ∙ (e ◁ chain)) z) ⁻¹ ∙ (comp₌-cong (id₌ image-prefix) (leading-transfer ⁻¹) ∙ (comp₌-cong (id₌ image-prefix) leading-restrict ∙ lifted-image)))) comparison : {P : CAT Γ} (h : MAP P FC) → SquareCell₌ (evaluate-cong eA (δ ▷ h)) ((evaluate eC h ◁ restriction-compositor {P = P} f g) ∙ comp-assoc (product-restriction {P = P} f) (product-restriction {P = P} g) (evaluate eC h)) ((G.comparison h ▷ product-restriction {P = P} f) ∙ (F.comparison (Hg ∘ h) ∙ evaluate-cong eA (comp-assoc h Hg Hf))) (GF.comparison h) comparison h = Calculation.comparison-calculation h ```