Other Agda modules in this section (52)
# A functor transports the matching at a diagram corner

A corner consists of two interval edges and a specified identification of
their meeting points. Restriction to a diagram family retains the original
matching. The reflected comparisons between restricting and postcomposing
the two edges form a square over the functor image of that matching.
The same statement covers the middle and both outer corners of a triangle.

```agda
{-# OPTIONS --without-K #-}
module SCT.VolumeI.Chapter02.Section02.PostcompositionCorners where
open import SCT.VolumeI.Chapter01.Section01.Vocabulary
open Operations
open import SCT.VolumeI.Chapter01.Section02.Coherence using (id₌; comp-assoc; module Composition; module Boundaries)
open Composition
open Boundaries using (SquareCell₌)
open import SCT.VolumeI.Chapter01.Section02.Specialization
  using (comp₌-assoc; comp₌-cong; comp-inv-left; inv-comp-left; preWhisker-comp₌)
open import SCT.VolumeI.Chapter01.Section02.IdentificationSquares
  using (paste-square₌; inverse-square₌; post-square₌; replace-sides₌)
open import SCT.VolumeI.Chapter01.Section06.Cones using (Cone; cone-restrict)
open import SCT.VolumeI.Chapter01.Section07.FunctorCategories using (Fun)
open import SCT.VolumeI.Chapter01.Section07.Functoriality using (funPre; funPost)
open import SCT.VolumeI.Chapter02.Section01.WalkingMorphism using ([1])
open import SCT.VolumeI.Chapter02.Section01.Morphisms using (Ar; evAt; evAt-pre; evAt-cong)
open import SCT.VolumeI.Chapter02.Section02.TriangleCornerFrames using (module CornerRestriction)
open import SCT.VolumeI.Chapter02.Section01.PostcompositionRestriction using (module PostRestriction)
open import SCT.VolumeI.Chapter02.Section01.PostcompositionPointNaturality using (module PostcompositionPointsAt)

module CornerRoutes {Γ : Context} {J P : CAT Γ} (C : CAT Γ)
  (u v : MAP One ([1] {Γ = Γ})) (d k : MAP [1] J)
  (delta : (d ∘ u) =₁ (k ∘ v)) (sigma : MAP P (Fun J C)) where
  private
    p = evAt-pre {C = C} u d
    q = evAt-pre {C = C} v k
    point = evAt-cong {C = C} delta
  cone : Cone (evAt {C = C} u) (evAt v) (Fun J C)
  cone = record { left = funPre d; right = funPre k; match = q ⁻¹ ∙ (point ∙ p) }
  left-route : (evAt u ∘ (funPre d ∘ sigma)) =₁ (evAt (d ∘ u) ∘ sigma)
  left-route = (p ▷ sigma) ∙ (comp-assoc sigma (funPre d) (evAt u)) ⁻¹
  right-route : (evAt v ∘ (funPre k ∘ sigma)) =₁ (evAt (k ∘ v) ∘ sigma)
  right-route = (q ▷ sigma) ∙ (comp-assoc sigma (funPre k) (evAt v)) ⁻¹
  matching = Cone.match (cone-restrict sigma cone)
  private
    module Restriction = CornerRestriction (evAt u) (evAt v) cone (point ∙ p) q
      (comp-inv-left q (point ∙ p)) sigma
    normalize : Restriction.left-frame =₂ ((point ▷ sigma) ∙ left-route)
    normalize = comp₌-assoc (point ▷ sigma) (p ▷ sigma)
        ((comp-assoc sigma (funPre d) (evAt u)) ⁻¹) ∙
      comp₌-cong (preWhisker-comp₌ point p sigma)
        (id₌ ((comp-assoc sigma (funPre d) (evAt u)) ⁻¹))
  compatibility : SquareCell₌ matching (point ▷ sigma) left-route right-route
  compatibility = normalize ∙ Restriction.compatibility

module PostcompositionCorner {Γ : Context} {J P C D : CAT Γ}
  (F : MAP C D) (u v : MAP One ([1] {Γ = Γ})) (d k : MAP [1] J)
  (delta : (d ∘ u) =₁ (k ∘ v)) (sigma : MAP P (Fun J C)) where
  module Before = CornerRoutes C u v d k delta sigma
  module After = CornerRoutes D u v d k delta (funPost F ∘ sigma)
  module LeftEdge = PostRestriction F d sigma
  module RightEdge = PostRestriction F k sigma
  private
    module Point = PostcompositionPointsAt F sigma
    module LeftPoint = PostcompositionPointsAt F (funPre {D = C} d ∘ sigma)
    module RightPoint = PostcompositionPointsAt F (funPre {D = C} k ∘ sigma)
    module Left = LeftEdge.At u
    module Right = RightEdge.At v
    fa = F ◁ Before.left-route
    fb = F ◁ Before.right-route
    x = evAt {C = D} u ◁ LeftEdge.comparison
    y = evAt {C = D} v ◁ RightEdge.comparison
    la = LeftPoint.point u
    rb = RightPoint.point v
    raw = paste-square₌
      (paste-square₌ After.compatibility (Point.point-square delta))
      (inverse-square₌ (post-square₌ F Before.compatibility))
    left-normal : ((fa ⁻¹) ∙ (Point.point (d ∘ u) ∙ After.left-route)) =₂ (la ∙ x)
    left-normal = inv-comp-left fa (la ∙ x) ∙
      comp₌-cong (id₌ (fa ⁻¹)) (comp₌-assoc fa la x ∙ Left.compatibility ⁻¹)
    right-normal : ((fb ⁻¹) ∙ (Point.point (k ∘ v) ∙ After.right-route)) =₂ (rb ∙ y)
    right-normal = inv-comp-left fb (rb ∙ y) ∙
      comp₌-cong (id₌ (fb ⁻¹)) (comp₌-assoc fb rb y ∙ Right.compatibility ⁻¹)

  compatibility : SquareCell₌ After.matching (F ◁ Before.matching)
    (LeftPoint.point u ∙ (evAt u ◁ LeftEdge.comparison))
    (RightPoint.point v ∙ (evAt v ◁ RightEdge.comparison))
  compatibility = replace-sides₌ left-normal right-normal raw
```