Other Agda modules in this section (52)
# Transporting a framed corner through a functor

A comparison from the two diagram edges to framed arrow families carries a
corner to the matching prescribed by their common endpoint. Postcomposition
preserves this entire square. The proof pastes the native corner comparison
with the functor image of the given square, then cancels the point-evaluation
frames. No matching witness is replaced.

```agda
{-# OPTIONS --without-K #-}
module SCT.VolumeI.Chapter02.Section02.FramedCornerPostcomposition 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; postWhisker-comp₌; inv-comp-left)
open import SCT.VolumeI.Chapter01.Section02.IdentificationSquares
  using (paste-square₌; inverse-square₌; transpose-square₌; post-square₌; replace-sides₌; replace-edges₌; inv-comp-square₌)
open import SCT.VolumeI.Chapter01.Section03.Identifications.Inverses using (postWhisker-inverse; comp₌-unitˡ-One)
open import SCT.VolumeI.Chapter01.Section03.Identifications.FunctorCoherence using (postWhisker-comp-One)
open import SCT.VolumeI.Chapter01.Section03.Identifications.Triangles using (restrict-change-square-One)
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)
open import SCT.VolumeI.Chapter02.Section01.MorphismFunctor using (evAt-post)
open import SCT.VolumeI.Chapter02.Section01.PostcompositionPointNaturality using (module PostcompositionPointsAt)
open import SCT.VolumeI.Chapter02.Section02.PostcompositionCorners using (module PostcompositionCorner)

private
  module EvaluationInputs {Γ : Context} {P C D : CAT Γ}
    (F : MAP C D) (a : MAP One ([1] {Γ = Γ})) {h k : MAP P (Ar C)} (delta : h =₁ k) where
    compatibility : SquareCell₌ (evAt {C = D} a ◁ (funPost F ◁ delta))
      (F ◁ (evAt {C = C} a ◁ delta))
      (PostcompositionPointsAt.point F h a) (PostcompositionPointsAt.point F k a)
    compatibility = paste-square₌
      (restrict-change-square-One (evAt a) (funPost F) (F ∘ evAt a) (evAt-post a F) delta)
      (postWhisker-comp-One delta (evAt a) F)

module FramedCornerImage {Γ : 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))
  (h l : MAP P (Ar C)) {x : MAP P C}
  (a : (evAt u ∘ h) =₁ x) (b : (evAt v ∘ l) =₁ x)
  (first : (funPre d ∘ sigma) =₁ h) (second : (funPre k ∘ sigma) =₁ l) where
  module Native = PostcompositionCorner F u v d k delta sigma
  private
    K = funPost {C = [1]} F
    lp = PostcompositionPointsAt.point F (funPre d ∘ sigma) u
    rp = PostcompositionPointsAt.point F (funPre k ∘ sigma) v
    lh = PostcompositionPointsAt.point F h u
    rl = PostcompositionPointsAt.point F l v
    e = Native.LeftEdge.comparison
    f = Native.RightEdge.comparison
    ca = evAt {C = D} u ◁ e
    cb = evAt {C = D} v ◁ f
    fa = F ◁ (evAt {C = C} u ◁ first)
    fb = F ◁ (evAt {C = C} v ◁ second)
  first-image : (funPre {D = D} d ∘ (funPost F ∘ sigma)) =₁ (K ∘ h)
  first-image = (K ◁ first) ∙ e
  second-image : (funPre {D = D} k ∘ (funPost F ∘ sigma)) =₁ (K ∘ l)
  second-image = (K ◁ second) ∙ f
  source-frame = (F ◁ a) ∙ lh
  target-frame = (F ◁ b) ∙ rl

  private
    normalize-left : (fa ∙ (lp ∙ ca)) =₂ (lh ∙ (evAt u ◁ first-image))
    normalize-left = comp₌-cong (id₌ lh) ((postWhisker-comp₌ (evAt u) (K ◁ first) e) ⁻¹) ∙
      (comp₌-assoc lh (evAt u ◁ (K ◁ first)) ca ∙
        (comp₌-cong ((EvaluationInputs.compatibility F u first) ⁻¹) (id₌ ca) ∙
          (comp₌-assoc fa lp ca) ⁻¹))
    normalize-right : (fb ∙ (rp ∙ cb)) =₂ (rl ∙ (evAt v ◁ second-image))
    normalize-right = comp₌-cong (id₌ rl) ((postWhisker-comp₌ (evAt v) (K ◁ second) f) ⁻¹) ∙
      (comp₌-assoc rl (evAt v ◁ (K ◁ second)) cb ∙
        (comp₌-cong ((EvaluationInputs.compatibility F v second) ⁻¹) (id₌ cb) ∙
          (comp₌-assoc fb rp cb) ⁻¹))
    quotient = (b ⁻¹) ∙ a
    quotient-image : (F ◁ quotient) =₂ (((F ◁ b) ⁻¹) ∙ (F ◁ a))
    quotient-image = comp₌-cong (postWhisker-inverse F b) (id₌ (F ◁ a)) ∙
      postWhisker-comp₌ F (b ⁻¹) a
    frame-square : SquareCell₌ ((target-frame ⁻¹) ∙ source-frame) (F ◁ quotient) lh rl
    frame-square = replace-edges₌ (id₌ _) (quotient-image ⁻¹)
      (inv-comp-square₌ (comp₌-unitˡ-One source-frame) (comp₌-unitˡ-One target-frame))

  compatibility :
    SquareCell₌ (evAt u ◁ first) (evAt v ◁ second) Native.Before.matching quotient
    → SquareCell₌ (evAt u ◁ first-image) (evAt v ◁ second-image)
        Native.After.matching ((target-frame ⁻¹) ∙ source-frame)
  compatibility given = transpose-square₌
    (replace-sides₌ (inv-comp-left lh (evAt u ◁ first-image))
      (inv-comp-left rl (evAt v ◁ second-image))
      (paste-square₌
        (replace-sides₌ normalize-left normalize-right
          (paste-square₌ Native.compatibility (post-square₌ F (transpose-square₌ given))))
        (inverse-square₌ frame-square)))
```