Other Agda modules in this section (4)
# Identifications from coproduct restrictions

Restricting an identification to the two summands is an equivalence on the
full identification anima. First prove this for decoded names, using the
decoding–precomposition squares. Endpoint change along decode-name then
gives the result for arbitrary external functors. Factoring prescribed
restriction families through this equivalence retains their whole image
equation, and projecting it gives both summand equations.

```agda
{-# OPTIONS --without-K #-}
module SCT.VolumeI.Chapter01.Section05.IdentificationRestriction where

open import SCT.VolumeI.Chapter01.Section01.Vocabulary hiding (_⊔_; _=_)
import SCT.VolumeI.Chapter01.Section01.Terms as Terms
open Terms using (Equal)
open Operations
open import SCT.VolumeI.Chapter01.Section02.Coherence using (module Composition)
open Composition
open import SCT.VolumeI.Chapter01.Section02.Products
open Calculus using (pair-pre; project-pair₁; project-pair₂)
open import SCT.VolumeI.Chapter01.Section03.Equivalences
  using (equiv-cancel-right; equiv-transport)
open import SCT.VolumeI.Chapter01.Section03.Factorizations
  using (Factorization; factor; triangle; factor-through-equiv)
open import SCT.VolumeI.Chapter01.Section03.Identifications.EndpointTransport
  using (changeEndpoints₌; changeEndpoints₌-isEquiv; preWhisker-changeEndpoints-square)
open import SCT.VolumeI.Chapter01.Section03.Products.Equivalences
  using (pair-post-isEquiv; pair-squares-isEquiv; paired-postWhisker-isEquiv)
open import SCT.VolumeI.Chapter01.Section04.MappingAnimae using (Map)
open import SCT.VolumeI.Chapter01.Section04.Points
  using (name; decode; decode-name; decode⁼-functor; decode⁼-isEquiv)
open import SCT.VolumeI.Chapter01.Section04.Functoriality using (mapPre)
open import SCT.VolumeI.Chapter01.Section04.Precomposition using (decode-pre; decode-pre-square)
open import SCT.VolumeI.Chapter01.Section05.Coproducts

module _ {Γ : Context} where
  coproductRestriction₌ : {C D E : CAT Γ} (h k : MAP (C ⊔ D) E)
    → MAP (Equal h k) (Equal (h ∘ in₁) (k ∘ in₁) × Equal (h ∘ in₂) (k ∘ in₂))
  coproductRestriction₌ h k = pair (preWhisker in₁) (preWhisker in₂)

  private
    module _ {C D E : CAT Γ} where
      open Terms.InContext (One {Γ}) using (Term)

      decoded-restriction-isEquiv : (x y : Term (Map (C ⊔ D) E))
        → IsEquiv (coproductRestriction₌ (decode x) (decode y))
      decoded-restriction-isEquiv x y =
        equiv-cancel-right (decode⁼-functor x y) (coproductRestriction₌ (decode x) (decode y))
          (decode⁼-isEquiv x y)
          (equiv-transport ((pair-pre (preWhisker in₁) (preWhisker in₂) (decode⁼-functor x y)) ⁻¹)
            (pair-squares-isEquiv (decode-pre in₁ x) (decode-pre in₁ y)
              (decode-pre in₂ x) (decode-pre in₂ y)
              (D₁ ∘ postWhisker F) (D₂ ∘ postWhisker G)
              (preWhisker in₁ ∘ decode⁼-functor x y) (preWhisker in₂ ∘ decode⁼-functor x y)
              (decode-pre-square in₁ x y) (decode-pre-square in₂ x y)
              (pair-post-isEquiv D₁ D₂ (postWhisker F) (postWhisker G)
                (decode⁼-isEquiv (F ∘ x) (F ∘ y)) (decode⁼-isEquiv (G ∘ x) (G ∘ y))
                (paired-postWhisker-isEquiv F G (coproductRestriction-isEquiv C D E) x y))))
        where
        F : MAP (Map (C ⊔ D) E) (Map C E)
        F = mapPre (in₁ {C = C} {D = D})
        G : MAP (Map (C ⊔ D) E) (Map D E)
        G = mapPre (in₂ {C = C} {D = D})
        D₁ : MAP (Equal (F ∘ x) (F ∘ y)) (Equal (decode (F ∘ x)) (decode (F ∘ y)))
        D₁ = decode⁼-functor (F ∘ x) (F ∘ y)
        D₂ : MAP (Equal (G ∘ x) (G ∘ y)) (Equal (decode (G ∘ x)) (decode (G ∘ y)))
        D₂ = decode⁼-functor (G ∘ x) (G ∘ y)

  coproductRestriction₌-isEquiv : {C D E : CAT Γ} (h k : MAP (C ⊔ D) E)
    → IsEquiv (coproductRestriction₌ h k)
  coproductRestriction₌-isEquiv h k =
    equiv-cancel-right change (coproductRestriction₌ h k)
      (changeEndpoints₌-isEquiv p q)
      (equiv-transport ((pair-pre (preWhisker in₁) (preWhisker in₂) change) ⁻¹)
        (pair-squares-isEquiv (p ▷ in₁) (q ▷ in₁) (p ▷ in₂) (q ▷ in₂)
          (preWhisker in₁) (preWhisker in₂) (preWhisker in₁ ∘ change) (preWhisker in₂ ∘ change)
          (preWhisker-changeEndpoints-square in₁ p q) (preWhisker-changeEndpoints-square in₂ p q)
          (decoded-restriction-isEquiv (name h) (name k))))
    where
    p : decode (name h) =₁ h
    p = decode-name h
    q : decode (name k) =₁ k
    q = decode-name k
    change : MAP (Equal (decode (name h)) (decode (name k))) (Equal h k)
    change = changeEndpoints₌ p q
```

## Prescribed restrictions

The family parameter is independent of the coproduct source. The existing
Factorization view supplies the chosen recovered family and its full
restriction triangle. Both projected laws compare families, so their
equalities are =₁. At One they have the individual =₂ signatures.
This choice is distinct from the private preliminary reflection used by
the copair laws; no agreement between those choices is assumed.

```agda
  module _ {A : CAT Γ} where
    open Terms.Equalities A using (_=_)

    module IdentificationFromRestrictions {C D E : CAT Γ} (h k : MAP (C ⊔ D) E)
      (α : (h ∘ in₁) = (k ∘ in₁)) (β : (h ∘ in₂) = (k ∘ in₂)) where

      chosen : Factorization (coproductRestriction₌ h k) (pair α β)
      chosen = factor-through-equiv (coproductRestriction₌-isEquiv h k) (pair α β)

      identification : h = k
      identification = factor chosen

      restriction-law : (coproductRestriction₌ h k ∘ identification) =₁ pair α β
      restriction-law = triangle chosen

      restriction₁ : (identification ▷ in₁) =₁ α
      restriction₁ = pair-β₁ α β ∙ ((pr₁ ◁ restriction-law) ∙
        (project-pair₁ (preWhisker in₁) (preWhisker in₂) identification) ⁻¹)

      restriction₂ : (identification ▷ in₂) =₁ β
      restriction₂ = pair-β₂ α β ∙ ((pr₂ ◁ restriction-law) ∙
        (project-pair₂ (preWhisker in₁) (preWhisker in₂) identification) ⁻¹)
```