Other Agda modules in this section (8)

Chapter 1, rebuild2, checked 14 October 2026 · source revision b982f5a.

# Pulling back global relative functors

Pull back both categories over the base. Restrict the universal relative
family to the pulled-back source, then factor its complete matching cone
through the pulled-back target. The second pullback projection supplies the
relative base triangle. Chosen relative currying gives the categorical
base-change functor, with both its complete relative beta and its actual
evaluated pullback-cone image.

```agda
{-# OPTIONS --without-K #-}
module SCT.VolumeI.Chapter01.Section09.RelativePullbackBaseChange where

open import SCT.VolumeI.Chapter01.Section01.Vocabulary hiding (_=_)
open Operations
open import SCT.VolumeI.Chapter01.Section02.Coherence
  using (id₌; comp-assoc; module Composition)
open Composition
open import SCT.VolumeI.Chapter01.Section03.RelativeFunctors
open import SCT.VolumeI.Chapter01.Section06.Cones
open import SCT.VolumeI.Chapter01.Section06.Pullbacks
open import SCT.VolumeI.Chapter01.Section06.ConeIdentifications
  using (cone-action-One; cone-compose)
open import SCT.VolumeI.Chapter01.Section09.RelativeFunctorCategories
open import SCT.VolumeI.Chapter01.Section09.RelativeFamilyComparisons

module PullbackBaseChange {Γ : Context} {S T : CAT Γ}
  (u : MAP S T) (A B : CategoryOverBase T) where
  private
    C D : CAT Γ
    C = CategoryOverBase.category A
    D = CategoryOverBase.category B
    p : MAP C T
    p = CategoryOverBase.map A
    q : MAP D T
    q = CategoryOverBase.map B

  source-domain : CAT Γ
  source-domain = Pullback p u

  target-domain : CAT Γ
  target-domain = Pullback q u

  source-pullback : Cone p u source-domain
  source-pullback = pullback-cone p u

  target-pullback : Cone q u target-domain
  target-pullback = pullback-cone q u

  source-projection : MAP source-domain C
  source-projection = Cone.left source-pullback

  target-projection : MAP target-domain D
  target-projection = Cone.left target-pullback

  source-base : MAP source-domain S
  source-base = Cone.right source-pullback

  target-base : MAP target-domain S
  target-base = Cone.right target-pullback

  pulled-source : CategoryOverBase S
  pulled-source = category-over source-domain source-base

  pulled-target : CategoryOverBase S
  pulled-target = category-over target-domain target-base

  module Source = RelativeFunctorCategory A B
  module Target = RelativeFunctorCategory pulled-source pulled-target
  private
    module SourceFamilies = RelativeFamilies A B
  module TargetFamilies = RelativeFamilies pulled-source pulled-target

  parameter-category : CAT Γ
  parameter-category = Source.category

  universal-family : Source.Family parameter-category
  universal-family = functor-over
    (Cone.left (SourceFamilies.evaluated-cone Source.fiber))
    (Cone.match (SourceFamilies.evaluated-cone Source.fiber))

  private
    parameter : MAP (parameter-category × source-domain) parameter-category
    parameter = pr₁ {C = parameter-category} {D = source-domain}
    source-coordinate : MAP (parameter-category × source-domain) source-domain
    source-coordinate = pr₂ {C = parameter-category} {D = source-domain}
    ordinary-coordinate : MAP (parameter-category × C) C
    ordinary-coordinate = pr₂ {C = parameter-category} {D = C}
    evaluation : MAP (parameter-category × C) D
    evaluation = FunctorOverBase.functor universal-family
    structural-cell : (q ∘ evaluation) =₁ (p ∘ ordinary-coordinate)
    structural-cell = FunctorOverBase.cell universal-family

  restriction : MAP (parameter-category × source-domain) (parameter-category × C)
  restriction = pair parameter (source-projection ∘ source-coordinate)

  restriction-image : (ordinary-coordinate ∘ restriction) =₁
    (source-projection ∘ source-coordinate)
  restriction-image = pair-β₂ parameter (source-projection ∘ source-coordinate)

  private
    restricted-source : Cone p u (parameter-category × source-domain)
    restricted-source = cone-restrict source-coordinate source-pullback

  restriction-matching : (q ∘ (evaluation ∘ restriction)) =₁
    (u ∘ (source-base ∘ source-coordinate))
  restriction-matching = Cone.match restricted-source ∙
    ((p ◁ restriction-image) ∙
      (comp-assoc restriction ordinary-coordinate p ∙
        ((structural-cell ▷ restriction) ∙
          (comp-assoc restriction evaluation q) ⁻¹)))

  pulled-cone : Cone q u (parameter-category × source-domain)
  pulled-cone = record
    { left = evaluation ∘ restriction
    ; right = source-base ∘ source-coordinate
    ; match = restriction-matching }

  pulled-evaluation : MAP (parameter-category × source-domain) target-domain
  pulled-evaluation = pullback-factor pulled-cone

  pullback-computation : ConeIdentification₁
    (cone-restrict pulled-evaluation target-pullback) pulled-cone
  pullback-computation = pullback-factor-β pulled-cone

  underlying-pullback-image : (target-projection ∘ pulled-evaluation) =₁
    (evaluation ∘ restriction)
  underlying-pullback-image = ConeIdentification₁.left pullback-computation

  base-pullback-image : (target-base ∘ pulled-evaluation) =₁
    (source-base ∘ source-coordinate)
  base-pullback-image = ConeIdentification₁.right pullback-computation

  pulled-family : Target.Family parameter-category
  pulled-family = functor-over pulled-evaluation base-pullback-image

  private
    module Chosen = Target.ChosenFamily pulled-family

  functor : MAP Source.category Target.category
  functor = Chosen.factor

  recovered-family : Target.Family parameter-category
  recovered-family = Target.evaluated-family functor

  relative-computation : ConeIdentification₁
    (TargetFamilies.family-cone recovered-family)
    (TargetFamilies.family-cone pulled-family)
  relative-computation = TargetFamilies.FamilyComputation.comparison pulled-family

  evaluated-functor : MAP (parameter-category × source-domain) target-domain
  evaluated-functor = FunctorOverBase.functor recovered-family

  family-image : evaluated-functor =₁ pulled-evaluation
  family-image = Chosen.underlying-computation

  relative-matching-image : (base-pullback-image ∙ (target-base ◁ family-image)) =₂
    ((source-base ◁ id₌ source-coordinate) ∙ FunctorOverBase.cell recovered-family)
  relative-matching-image = ConeIdentification₁.compatible relative-computation

  evaluated-pullback-computation : ConeIdentification₁
    (cone-restrict evaluated-functor target-pullback) pulled-cone
  evaluated-pullback-computation = cone-compose pullback-computation
    (cone-action-One target-pullback family-image)
```

The two computation laws retain different specified data. The pullback
computation includes the target pullback's actual matching, while the
relative computation retains the selected triangle over the new base.
Its matching image relates the composed second projection to that selected
triangle with the explicit identity boundary. No agreement with a separately
chosen pointwise pullback factor or additional base-change coherence is
asserted here.