Skip to content

8. Families of maps

This is a literate rzk file:

#lang rzk-1

Fiber of total map

We now calculate the fiber of the map on total spaces associated to a family of maps.

#def total-map
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  : ( Σ (x : A) , B x) → (Σ (x : A) , C x)
  := \ z → (first z , f (first z) (second z))

#def total-map-to-fiber
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( w : (Σ (x : A) , C x))
  : fib (B (first w)) (C (first w)) (f (first w)) (second w) →
    ( fib (Σ (x : A) , B x) (Σ (x : A) , C x) (total-map A B C f) w)
  :=
    \ (b , p) →
      ( (first w , b) ,
        eq-eq-fiber-Σ A C (first w) (f (first w) b) (second w) p)

#def total-map-from-fiber
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( w : (Σ (x : A) , C x))
  : fib (Σ (x : A) , B x) (Σ (x : A) , C x) (total-map A B C f) w →
    fib (B (first w)) (C (first w)) (f (first w)) (second w)
  :=
    \ (z , p) →
    ind-path
      ( Σ (x : A) , C x)
      ( total-map A B C f z)
      ( \ w' p' → fib (B (first w')) (C (first w')) (f (first w')) (second w'))
      ( second z , refl)
      ( w)
      ( p)

#def total-map-to-fiber-retraction
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( w : (Σ (x : A) , C x))
  : has-retraction
    ( fib (B (first w)) (C (first w)) (f (first w)) (second w))
    ( fib (Σ (x : A) , B x) (Σ (x : A) , C x) (total-map A B C f) w)
    ( total-map-to-fiber A B C f w)
  :=
    ( ( total-map-from-fiber A B C f w) ,
      ( \ (b , p) →
        ind-path
          ( C (first w))
          ( f (first w) b)
          ( \ w1 p' 
            ( ( total-map-from-fiber A B C f ((first w , w1)))
              ( (total-map-to-fiber A B C f (first w , w1)) (b , p')))
            =_{(fib (B (first w)) (C (first w)) (f (first w)) (w1))}
            ( b , p'))
          ( refl)
          ( second w)
          ( p)))

#def total-map-to-fiber-section
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( w : (Σ (x : A) , C x))
  : has-section
    ( fib (B (first w)) (C (first w)) (f (first w)) (second w))
    ( fib (Σ (x : A) , B x) (Σ (x : A) , C x) (total-map A B C f) w)
    ( total-map-to-fiber A B C f w)
  :=
    ( ( total-map-from-fiber A B C f w) ,
      ( \ (z , p) →
        ind-path
          ( Σ (x : A) , C x)
          ( first z , f (first z) (second z))
          ( \ w' p' 
            ( ( total-map-to-fiber A B C f w')
              ( ( total-map-from-fiber A B C f w') (z , p'))) =
            ( z , p'))
          ( refl)
          ( w)
          ( p)))

#def total-map-to-fiber-is-equiv
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( w : (Σ (x : A) , C x))
  : is-equiv
    ( fib (B (first w)) (C (first w)) (f (first w)) (second w))
    ( fib (Σ (x : A) , B x) (Σ (x : A) , C x)
      ( total-map A B C f) w)
    ( total-map-to-fiber A B C f w)
  :=
    ( total-map-to-fiber-retraction A B C f w ,
      total-map-to-fiber-section A B C f w)

#def total-map-fiber-equiv
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( w : (Σ (x : A) , C x))
  : Equiv
    ( fib (B (first w)) (C (first w)) (f (first w)) (second w))
    ( fib (Σ (x : A) , B x) (Σ (x : A) , C x)
      ( total-map A B C f) w)
  := (total-map-to-fiber A B C f w , total-map-to-fiber-is-equiv A B C f w)

Families of equivalences

A family of equivalences induces an equivalence on total spaces and conversely. It will be easiest to work with the incoherent notion of two-sided-inverses.

#def invertible-family-total-inverse
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( invfamily : (a : A) → has-inverse (B a) (C a) (f a))
  : ( Σ (x : A) , C x) → (Σ (x : A) , B x)
  := \ (a , c) → (a , (map-inverse-has-inverse (B a) (C a) (f a) (invfamily a)) c)

#def invertible-family-total-retraction
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( invfamily : (a : A) → has-inverse (B a) (C a) (f a))
  : has-retraction
    ( Σ (x : A) , B x)
    ( Σ (x : A) , C x)
    ( total-map A B C f)
  :=
    ( invertible-family-total-inverse A B C f invfamily ,
      \ (a , b) →
        (eq-eq-fiber-Σ A B a
          ( (map-inverse-has-inverse (B a) (C a) (f a) (invfamily a)) (f a b)) b
          ( (first (second (invfamily a))) b)))

#def invertible-family-total-section
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( invfamily : (a : A) → has-inverse (B a) (C a) (f a))
  : has-section (Σ (x : A) , B x) (Σ (x : A) , C x) (total-map A B C f)
  :=
    ( invertible-family-total-inverse A B C f invfamily ,
      \ (a , c) →
        ( eq-eq-fiber-Σ A C a
          ( f a ((map-inverse-has-inverse (B a) (C a) (f a) (invfamily a)) c)) c
          ( (second (second (invfamily a))) c)))

#def invertible-family-total-invertible
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( invfamily : (a : A) → has-inverse (B a) (C a) (f a))
  : has-inverse
    ( Σ (x : A) , B x)
    ( Σ (x : A) , C x)
    ( total-map A B C f)
  :=
    ( invertible-family-total-inverse A B C f invfamily ,
      ( second (invertible-family-total-retraction A B C f invfamily) ,
        second (invertible-family-total-section A B C f invfamily)))

#def family-of-equiv-total-equiv
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( familyequiv : (a : A) → is-equiv (B a) (C a) (f a))
  : is-equiv
    ( Σ (x : A) , B x) (Σ (x : A) , C x) (total-map A B C f)
  :=
    is-equiv-has-inverse
    ( Σ (x : A) , B x) (Σ (x : A) , C x) (total-map A B C f)
    ( invertible-family-total-invertible A B C f
      ( \ a → has-inverse-is-equiv (B a) (C a) (f a) (familyequiv a)))

#def total-equiv-family-equiv
  ( A : U)
  ( B C : A → U)
  ( familyeq : (a : A) → Equiv (B a) (C a))
  : Equiv (Σ (x : A) , B x) (Σ (x : A) , C x)
  :=
    ( total-map A B C (\ a first (familyeq a)) ,
      family-of-equiv-total-equiv A B C
        ( \ a first (familyeq a))
        ( \ a second (familyeq a)))

The one-way result: that a family of equivalence gives an invertible map (and thus an equivalence) on total spaces.

#def total-has-inverse-family-equiv
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( familyequiv : (a : A) → is-equiv (B a) (C a) (f a))
  : has-inverse (Σ (x : A) , B x) (Σ (x : A) , C x) (total-map A B C f)
  :=
    invertible-family-total-invertible A B C f
    ( \ a → has-inverse-is-equiv (B a) (C a) (f a) (familyequiv a))

For the converse, we make use of our calculation on fibers. The first implication could be proven similarly.

#def total-contr-map-family-of-contr-maps
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( totalcontrmap :
    is-contr-map
      ( Σ (x : A) , B x)
      ( Σ (x : A) , C x)
      ( total-map A B C f))
  ( a : A)
  : is-contr-map (B a) (C a) (f a)
  :=
    \ c 
      is-contr-equiv-is-contr'
        ( fib (B a) (C a) (f a) c)
        ( fib (Σ (x : A) , B x) (Σ (x : A) , C x)
          ( total-map A B C f) ((a , c)))
        ( total-map-fiber-equiv A B C f ((a , c)))
        ( totalcontrmap ((a , c)))

#def total-equiv-family-of-equiv
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( totalequiv : is-equiv
                ( Σ (x : A) , B x)
                ( Σ (x : A) , C x)
                ( total-map A B C f))
  (a : A)
  : is-equiv (B a) (C a) (f a)
  :=
    is-equiv-is-contr-map (B a) (C a) (f a)
    ( total-contr-map-family-of-contr-maps A B C f
      ( is-contr-map-is-equiv
        ( Σ (x : A) , B x) (Σ (x : A) , C x)
        ( total-map A B C f) totalequiv) a)

#def family-equiv-total-equiv
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  ( totalequiv : is-equiv
                ( Σ (x : A) , B x)
                ( Σ (x : A) , C x)
                ( total-map A B C f))
  ( a : A)
  : Equiv (B a) (C a)
  := ( f a , total-equiv-family-of-equiv A B C f totalequiv a)

In summary, a family of maps is an equivalence iff the map on total spaces is an equivalence.

#def total-equiv-iff-family-of-equiv
  ( A : U)
  ( B C : A → U)
  ( f : (a : A) → (B a) → (C a))
  : iff
      ( (a : A) → is-equiv (B a) (C a) (f a))
      ( is-equiv (Σ (x : A) , B x) (Σ (x : A) , C x)
        ( total-map A B C f))
  := (family-of-equiv-total-equiv A B C f , total-equiv-family-of-equiv A B C f)

Codomain based path spaces

#def equiv-rev
  ( A : U)
  ( x y : A)
  : Equiv (x = y) (y = x)
  := (rev A x y , ((rev A y x , rev-rev A x y) , (rev A y x , rev-rev A y x)))
An equivalence between the based path spaces
#def equiv-based-paths
  ( A : U)
  ( a : A)
  : Equiv (Σ (x : A) , x = a) (Σ (x : A) , a = x)
  := total-equiv-family-equiv A (\ x → x = a) (\ x → a = x) (\ x → equiv-rev A x a)
Codomain based path spaces are contractible
#def is-contr-codomain-based-paths
  ( A : U)
  ( a : A)
  : is-contr (Σ (x : A) , x = a)
  :=
    is-contr-equiv-is-contr' (Σ (x : A) , x = a) (Σ (x : A) , a = x)
      ( equiv-based-paths A a)
      ( is-contr-based-paths A a)

Pullback of a type family

A family of types over B pulls back along any function f : A → B to define a family of types over A.

#def pullback
  ( A B : U)
  ( f : A → B)
  ( C : B → U)
  : A → U
  := \ a → C (f a)

The pullback of a family along homotopic maps is equivalent.

#section is-equiv-pullback-htpy

#variables A B : U
#variables f g : A → B
#variable α : homotopy A B f g
#variable C : B → U
#variable a : A

#def pullback-homotopy
  : (pullback A B f C a) → (pullback A B g C a)
  := transport B C (f a) (g a) (α a)

#def map-inverse-pullback-homotopy
  : (pullback A B g C a) → (pullback A B f C a)
  := transport B C (g a) (f a) (rev B (f a) (g a) (α a))

#def has-retraction-pullback-homotopy
  : has-retraction
    ( pullback A B f C a)
    ( pullback A B g C a)
    ( pullback-homotopy)
  :=
    ( map-inverse-pullback-homotopy ,
      \ c 
        concat
        ( pullback A B f C a)
        ( transport B C (g a) (f a)
          ( rev B (f a) (g a) (α a))
          ( transport B C (f a) (g a) (α a) c))
        ( transport B C (f a) (f a)
          ( concat B (f a) (g a) (f a) (α a) (rev B (f a) (g a) (α a))) c)
        ( c)
        ( transport-concat-rev B C (f a) (g a) (f a) (α a)
          ( rev B (f a) (g a) (α a)) c)
        ( transport2 B C (f a) (f a)
          ( concat B (f a) (g a) (f a) (α a) (rev B (f a) (g a) (α a))) refl
          ( right-inverse-concat B (f a) (g a) (α a)) c))

#def has-section-pullback-homotopy
  : has-section (pullback A B f C a) (pullback A B g C a)
    ( pullback-homotopy)
  :=
    ( map-inverse-pullback-homotopy ,
      \ c 
      concat
        ( pullback A B g C a)
        ( transport B C (f a) (g a) (α a)
          ( transport B C (g a) (f a) (rev B (f a) (g a) (α a)) c))
        ( transport B C (g a) (g a)
          ( concat B (g a) (f a) (g a) (rev B (f a) (g a) (α a)) (α a)) c)
        ( c)
        ( transport-concat-rev B C (g a) (f a) (g a)
          ( rev B (f a) (g a) (α a)) (α a) (c))
        ( transport2 B C (g a) (g a)
          ( concat B (g a) (f a) (g a) (rev B (f a) (g a) (α a)) (α a))
          ( refl)
          ( left-inverse-concat B (f a) (g a) (α a)) c))

#def is-equiv-pullback-homotopy uses (α)
  : is-equiv
      ( pullback A B f C a)
      ( pullback A B g C a)
      ( pullback-homotopy)
  := ( has-retraction-pullback-homotopy , has-section-pullback-homotopy)

#def equiv-pullback-homotopy uses (α)
  : Equiv (pullback A B f C a) (pullback A B g C a)
  := (pullback-homotopy , is-equiv-pullback-homotopy)

#end is-equiv-pullback-htpy

The total space of a pulled back family of types maps to the original total space.

#def pullback-comparison-map
  ( A B : U)
  ( f : A → B)
  ( C : B → U)
  : (Σ (a : A) , (pullback A B f C) a) → (Σ (b : B) , C b)
  := \ (a , c) → (f a , c)

Now we show that if a family is pulled back along an equivalence, the total spaces are equivalent by proving that the comparison is a contractible map. For this, we first prove that each fiber is equivalent to a fiber of the original map.

#def pullback-comparison-fiber
  ( A B : U)
  ( f : A → B)
  ( C : B → U)
  ( z : Σ (b : B) , C b)
  : U
  :=
    fib
      ( Σ (a : A) , (pullback A B f C) a)
      ( Σ (b : B) , C b)
      ( pullback-comparison-map A B f C) z

#def pullback-comparison-fiber-to-fiber
  ( A B : U)
  ( f : A → B)
  ( C : B → U)
  ( z : Σ (b : B) , C b)
  : (pullback-comparison-fiber A B f C z) → (fib A B f (first z))
  :=
    \ (w , p) →
    ind-path
      ( Σ (b : B) , C b)
      ( pullback-comparison-map A B f C w)
      ( \ z' p' 
        ( fib A B f (first z')))
      ( first w , refl)
      ( z)
      ( p)

#def from-base-fiber-to-pullback-comparison-fiber
  ( A B : U)
  ( f : A → B)
  ( C : B → U)
  ( b : B)
  : (fib A B f b) → (c : C b) → (pullback-comparison-fiber A B f C (b , c))
  :=
    \ (a , p) →
    ind-path
      ( B)
      ( f a)
      ( \ b' p' →
          (c : C b') → (pullback-comparison-fiber A B f C ((b' , c))))
      ( \ c → ((a , c) , refl))
      ( b)
      ( p)

#def pullback-comparison-fiber-to-fiber-inv
  ( A B : U)
  ( f : A → B)
  ( C : B → U)
  ( z : Σ (b : B) , C b)
  : (fib A B f (first z)) → (pullback-comparison-fiber A B f C z)
  :=
    \ (a , p) →
      from-base-fiber-to-pullback-comparison-fiber A B f C
      ( first z) (a , p) (second z)

#def pullback-comparison-fiber-to-fiber-retracting-homotopy
  ( A B : U)
  ( f : A → B)
  ( C : B → U)
  ( z : Σ (b : B) , C b)
  ( (w , p) : pullback-comparison-fiber A B f C z)
  : ( (pullback-comparison-fiber-to-fiber-inv A B f C z)
      ( (pullback-comparison-fiber-to-fiber A B f C z) (w , p))) = (w , p)
  :=
    ind-path
      ( Σ (b : B) , C b)
      ( pullback-comparison-map A B f C w)
      ( \ z' p' 
        ( ( pullback-comparison-fiber-to-fiber-inv A B f C z')
          ( ( pullback-comparison-fiber-to-fiber A B f C z') (w , p'))) =
        ( w , p'))
      ( refl)
      ( z)
      ( p)

#def pullback-comparison-fiber-to-fiber-section-homotopy-map
  ( A B : U)
  ( f : A → B)
  ( C : B → U)
  ( b : B)
  ( (a , p) : fib A B f b)
  : (c : C b) →
      ((pullback-comparison-fiber-to-fiber A B f C (b , c))
        ((pullback-comparison-fiber-to-fiber-inv A B f C (b , c)) (a , p))) =
      (a , p)
  :=
    ind-path
      ( B)
      ( f a)
      ( \ b' p' →
        ( c : C b') →
        ( ( pullback-comparison-fiber-to-fiber A B f C (b' , c))
          ( (pullback-comparison-fiber-to-fiber-inv A B f C (b' , c)) (a , p'))) =
        ( a , p'))
      ( \ c refl)
      ( b)
      ( p)

#def pullback-comparison-fiber-to-fiber-section-homotopy
  ( A B : U)
  ( f : A → B)
  ( C : B → U)
  ( z : Σ (b : B) , C b)
  ( (a , p) : fib A B f (first z))
  : ( pullback-comparison-fiber-to-fiber A B f C z
      ( pullback-comparison-fiber-to-fiber-inv A B f C z (a , p))) = (a , p)
  :=
    pullback-comparison-fiber-to-fiber-section-homotopy-map A B f C
      ( first z) (a , p) (second z)

#def equiv-pullback-comparison-fiber
  ( A B : U)
  ( f : A → B)
  ( C : B → U)
  ( z : Σ (b : B) , C b)
  : Equiv (pullback-comparison-fiber A B f C z) (fib A B f (first z))
  :=
    ( pullback-comparison-fiber-to-fiber A B f C z ,
      ( ( pullback-comparison-fiber-to-fiber-inv A B f C z ,
          pullback-comparison-fiber-to-fiber-retracting-homotopy A B f C z) ,
        ( pullback-comparison-fiber-to-fiber-inv A B f C z ,
          pullback-comparison-fiber-to-fiber-section-homotopy A B f C z)))

As a corollary, we show that pullback along an equivalence induces an equivalence of total spaces.

#def total-equiv-pullback-is-equiv
  ( A B : U)
  ( f : A → B)
  ( is-equiv-f : is-equiv A B f)
  ( C : B → U)
  : Equiv (Σ (a : A) , (pullback A B f C) a) (Σ (b : B) , C b)
  :=
    ( pullback-comparison-map A B f C ,
      is-equiv-is-contr-map
        ( Σ (a : A) , (pullback A B f C) a)
        ( Σ (b : B) , C b)
        ( pullback-comparison-map A B f C)
        ( \ z 
          ( is-contr-equiv-is-contr'
            ( pullback-comparison-fiber A B f C z)
            ( fib A B f (first z))
            ( equiv-pullback-comparison-fiber A B f C z)
            ( is-contr-map-is-equiv A B f is-equiv-f (first z)))))

Fundamental theorem of identity types

#section fundamental-thm-id-types

#variable A : U
#variable a : A
#variable B : A → U
#variable f : (x : A) → (a = x) → B x

#def fund-id-fam-of-eqs-implies-sum-over-codomain-contr
  : ((x : A) → (is-equiv (a = x) (B x) (f x))) → (is-contr (Σ (x : A) , B x))
  :=
    ( \ familyequiv →
      ( equiv-with-contractible-domain-implies-contractible-codomain
        ( Σ (x : A) , a = x) (Σ (x : A) , B x)
        ( ( total-map A ( \ x → (a = x)) B f) ,
          ( is-equiv-has-inverse (Σ (x : A) , a = x) (Σ (x : A) , B x)
            ( total-map A ( \ x → (a = x)) B f)
            ( total-has-inverse-family-equiv A
              ( \ x → (a = x)) B f familyequiv)))
        ( is-contr-based-paths A a)))

#def fund-id-sum-over-codomain-contr-implies-fam-of-eqs
  : ( is-contr (Σ (x : A) , B x)) →
    ( (x : A) → (is-equiv (a = x) (B x) (f x)))
  :=
    ( \ is-contr-Σ-A-B x 
      total-equiv-family-of-equiv A
        ( \ x' → (a = x'))
        ( B)
        ( f)
        ( is-equiv-are-contr
          ( Σ (x' : A) , (a = x'))
          ( Σ (x' : A) , (B x'))
          ( is-contr-based-paths A a)
          ( is-contr-Σ-A-B)
          ( total-map A (\ x' → (a = x')) B f))
        ( x))

This allows us to apply "based path induction" to a family satisfying the fundamental theorem:

-- Please suggest a better name.
#def ind-based-path
  ( familyequiv : (z : A) → (is-equiv (a = z) (B z) (f z)))
  ( P : (z : A) → B z → U)
  ( p0 : P a (f a refl))
  ( u : A)
  ( p : B u)
  : P u p
  :=
    ind-sing
      ( Σ (v : A) , B v)
      ( a , f a refl)
      ( \ (u' , p') → P u' p')
      ( contr-implies-singleton-induction-pointed
        ( Σ (z : A) , B z)
        ( fund-id-fam-of-eqs-implies-sum-over-codomain-contr familyequiv)
        ( \ (x' , p') → P x' p'))
      ( p0)
      ( u , p)

#end fundamental-thm-id-types

2-of-3 for equivalences

The following functions refine equiv-right-cancel and equiv-left-cancel by providing control over the underlying maps of the equivalence.

#def is-equiv-right-factor
  ( A B C : U)
  ( f : A → B)
  ( g : B → C)
  ( is-equiv-g : is-equiv B C g)
  ( is-equiv-gf : is-equiv A C (comp A B C g f))
  : is-equiv A B f
  :=
    ( ( comp B C A
        (retraction-is-equiv A C (comp A B C g f) is-equiv-gf) g ,
        (second (first is-equiv-gf))) ,
      ( comp B C A
        (section-is-equiv A C (comp A B C g f) is-equiv-gf) g ,
        \ b 
          inv-ap-is-emb
            B C g
            ( is-emb-is-equiv B C g is-equiv-g)
            ( f ((section-is-equiv A C (comp A B C g f) is-equiv-gf) (g b)))
            b
            ( (second (second is-equiv-gf)) (g b))))

#def is-equiv-left-factor
  ( A B C : U)
  ( f : A → B)
  ( is-equiv-f : is-equiv A B f)
  ( g : B → C)
  ( is-equiv-gf : is-equiv A C (comp A B C g f))
  : is-equiv B C g
  :=
    ( ( comp C A B
          f (retraction-is-equiv A C (comp A B C g f) is-equiv-gf) ,
        \ b 
          triple-concat B
            ( f ((retraction-is-equiv A C (comp A B C g f) is-equiv-gf)
              (g b)))
            ( f ((retraction-is-equiv A C (comp A B C g f) is-equiv-gf)
              (g (f ((section-is-equiv A B f is-equiv-f) b)))))
            ( f ((section-is-equiv A B f is-equiv-f) b))
            ( b)
            ( ap B B
              ( b)
              ( f ((section-is-equiv A B f is-equiv-f) b))
              ( \ b0 
                ( f ((retraction-is-equiv A C
                      ( comp A B C g f) is-equiv-gf) (g b0))))
              ( rev B (f ((section-is-equiv A B f is-equiv-f) b)) b
                ( (second (second is-equiv-f)) b)))
            ( ( whisker-homotopy B A A B
                ( \ a 
                  ( retraction-is-equiv A C
                    ( comp A B C g f) is-equiv-gf) (g (f a)))
                ( \ a → a)
                ( second (first is-equiv-gf))
                ( section-is-equiv A B f is-equiv-f)
                f) b)
            ( (second (second is-equiv-f)) b)) ,
      ( comp C A B
        ( f)
        ( section-is-equiv A C (comp A B C g f) is-equiv-gf) ,
        ( second (second is-equiv-gf))))

Maps over product types

For later use, we specialize the previous results to the case of a family of types over a product type.

#section fibered-map-over-product

#variables A A' B B' : U
#variable C : A → B → U
#variable C' : A' → B' → U
#variable f : A → A'
#variable g : B → B'
#variable h : (a : A) → (b : B) → (c : C a b) → C' (f a) (g b)

#def total-map-fibered-map-over-product
  : (Σ (a : A) , (Σ (b : B) , C a b)) → (Σ (a' : A') , (Σ (b' : B') , C' a' b'))
  := \ (a , (b , c)) → (f a , (g b , h a b c))

#def pullback-is-equiv-base-is-equiv-total-is-equiv
  ( is-equiv-total :
    is-equiv
      ( Σ (a : A) , (Σ (b : B) , C a b))
      ( Σ (a' : A') , (Σ (b' : B') , C' a' b'))
      ( total-map-fibered-map-over-product))
  ( is-equiv-f : is-equiv A A' f)
  : is-equiv
      ( Σ (a : A) , (Σ (b : B) , C a b))
      ( Σ (a : A) , (Σ (b' : B') , C' (f a) b'))
      ( \ (a , (b , c)) → (a , (g b , h a b c)))
  :=
    is-equiv-right-factor
    ( Σ (a : A) , (Σ (b : B) , C a b))
    ( Σ (a : A) , (Σ (b' : B') , C' (f a) b'))
    ( Σ (a' : A') , (Σ (b' : B') , C' a' b'))
    ( \ (a , (b , c)) → (a , (g b , h a b c)))
    ( \ (a , (b' , c')) → (f a , (b' , c')))
    ( second
      ( total-equiv-pullback-is-equiv
        ( A) (A')
        ( f) (is-equiv-f)
        ( \ a' → (Σ (b' : B') , C' a' b'))))
    ( is-equiv-total)

#def pullback-is-equiv-bases-are-equiv-total-is-equiv
  ( is-equiv-total :
      is-equiv
        ( Σ (a : A) , (Σ (b : B) , C a b))
        ( Σ (a' : A') , (Σ (b' : B') , C' a' b'))
        ( total-map-fibered-map-over-product))
  ( is-equiv-f : is-equiv A A' f)
  ( is-equiv-g : is-equiv B B' g)
  : is-equiv
      ( Σ (a : A) , (Σ (b : B) , C a b))
      ( Σ (a : A) , (Σ (b : B) , C' (f a) (g b)))
      ( \ (a , (b , c)) → (a , (b , h a b c)))
  :=
    is-equiv-right-factor
    ( Σ (a : A) , (Σ (b : B) , C a b))
    ( Σ (a : A) , (Σ (b : B) , C' (f a) (g b)))
    ( Σ (a : A) , (Σ (b' : B') , C' (f a) b'))
    ( \ (a , (b , c)) → (a , (b , h a b c)))
    ( \ (a , (b , c)) → (a , (g b , c)))
    ( family-of-equiv-total-equiv A
      ( \ a → (Σ (b : B) , C' (f a) (g b)))
      ( \ a → (Σ (b' : B') , C' (f a) b'))
      ( \ a (b , c) → (g b , c))
      ( \ a 
        ( second
          ( total-equiv-pullback-is-equiv
            ( B) (B')
            ( g) (is-equiv-g)
            ( \ b' → C' (f a) b')))))
    ( pullback-is-equiv-base-is-equiv-total-is-equiv is-equiv-total is-equiv-f)

#def fibered-map-is-equiv-bases-are-equiv-total-map-is-equiv
  ( is-equiv-total :
      is-equiv
        ( Σ (a : A) , (Σ (b : B) , C a b))
        ( Σ (a' : A') , (Σ (b' : B') , C' a' b'))
        ( total-map-fibered-map-over-product))
  ( is-equiv-f : is-equiv A A' f)
  ( is-equiv-g : is-equiv B B' g)
  ( a0 : A)
  ( b0 : B)
  : is-equiv (C a0 b0) (C' (f a0) (g b0)) (h a0 b0)
  :=
    total-equiv-family-of-equiv B
      ( \ b → C a0 b)
      ( \ b → C' (f a0) (g b))
      ( \ b c → h a0 b c)
      ( total-equiv-family-of-equiv
        ( A)
        ( \ a → (Σ (b : B) , C a b))
        ( \ a → (Σ (b : B) , C' (f a) (g b)))
        ( \ a (b , c) → (b , h a b c))
        ( pullback-is-equiv-bases-are-equiv-total-is-equiv
            is-equiv-total is-equiv-f is-equiv-g)
        ( a0))
      ( b0)

#end fibered-map-over-product