Formalisation of the Symmetry Book - 26 descent

module synthetic-homotopy-theory.26-descent where
Imports
open import foundation.commuting-squares-of-maps
open import foundation.cones-over-cospans
open import foundation.contractible-maps
open import foundation.contractible-types
open import foundation.dependent-pair-types
open import foundation.equality-dependent-function-types
open import foundation.equality-dependent-pair-types
open import foundation.equivalence-extensionality
open import foundation.equivalences
open import foundation.fibers-of-maps
open import foundation.function-extensionality
open import foundation.functions
open import foundation.functoriality-dependent-function-types
open import foundation.functoriality-dependent-pair-types
open import foundation.functoriality-function-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopies
open import foundation.identity-types
open import foundation.pullbacks
open import foundation.sections
open import foundation.structure-identity-principle
open import foundation.type-theoretic-principle-of-choice
open import foundation.univalence
open import foundation.universe-levels

open import synthetic-homotopy-theory.cocones-under-spans
open import synthetic-homotopy-theory.universal-property-pushouts

Section 18.1 Five equivalent characterizations of pushouts

dep-cocone :
  { l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  ( f : S  A) (g : S  B) (c : cocone f g X) (P : X  UU l5) 
  UU (l1  l2  l3  l5)
dep-cocone {S = S} {A} {B} f g c P =
  Σ ( (a : A)  P ((pr1 c) a))
    ( λ hA 
      Σ ( (b : B)  P (pr1 (pr2 c) b))
        ( λ hB  (s : S)  Id (tr P (pr2 (pr2 c) s) (hA (f s))) (hB (g s))))

dep-cocone-map :
  { l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  ( f : S  A) (g : S  B) (c : cocone f g X) (P : X  UU l5) 
  ( (x : X)  P x)  dep-cocone f g c P
dep-cocone-map f g c P h =
  ( λ a  h (pr1 c a)) ,
  ( λ b  h (pr1 (pr2 c) b)) ,
  ( λ s  apd h (pr2 (pr2 c) s))

Definition 18.1.1 The induction principle of pushouts

Ind-pushout :
  { l1 l2 l3 l4 : Level} (l : Level) 
  { S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4} 
  ( f : S  A) (g : S  B) (c : cocone f g X) 
  UU (lsuc l  l1  l2  l3  l4)
Ind-pushout l {X = X} f g c =
  (P : X  UU l)  sec (dep-cocone-map f g c P)

Definition 18.1.2 The dependent universal property of pushouts

dependent-universal-property-pushout :
  {l1 l2 l3 l4 : Level} (l : Level) {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) 
  UU (l1  l2  l3  l4  lsuc l)
dependent-universal-property-pushout l f g {X} c =
  (P : X  UU l)  is-equiv (dep-cocone-map f g c P)

Remark 18.1.3 Computation of the identity type of dep-cocone

We compute the identity type of dep-cocone in order to express the computation rules of the induction principle for pushouts.

coherence-htpy-dep-cocone :
  {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X)
  (P : X  UU l5) (c' c'' : dep-cocone f g c P)
  (K : (pr1 c') ~ (pr1 c'')) (L : (pr1 (pr2 c')) ~ (pr1 (pr2 c''))) 
  UU (l1  l5)
coherence-htpy-dep-cocone {S = S} f g c P
  h h' K L =
  (s : S) 
  Id ( ((pr2 (pr2 h)) s)  (L (g s)))
     ( (ap (tr P (pr2 (pr2 c) s)) (K (f s)))  ((pr2 (pr2 h')) s))

htpy-dep-cocone :
  {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) (P : X  UU l5) 
  (s t : dep-cocone f g c P)  UU (l1  l2  l3  l5)
htpy-dep-cocone {S = S} f g c P h h' =
  Σ ( (pr1 h) ~ (pr1 h'))  K 
    Σ ( (pr1 (pr2 h)) ~ (pr1 (pr2 h')))
      ( coherence-htpy-dep-cocone f g c P h h' K))

reflexive-htpy-dep-cocone :
  {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) (P : X  UU l5) 
  (s : dep-cocone f g c P) 
  htpy-dep-cocone f g c P s s
reflexive-htpy-dep-cocone f g (pair i (pair j H)) P
  (pair hA (pair hB hS)) =
  pair refl-htpy (pair refl-htpy right-unit-htpy)

htpy-dep-cocone-eq :
  {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) (P : X  UU l5) 
  {s t : dep-cocone f g c P} 
  Id s t  htpy-dep-cocone f g c P s t
htpy-dep-cocone-eq f g c P {s} {.s} refl =
  reflexive-htpy-dep-cocone f g c P s

abstract
  is-contr-total-htpy-dep-cocone :
    {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
    (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) (P : X  UU l5) 
    (s : dep-cocone f g c P) 
    is-contr
      ( Σ (dep-cocone f g c P)
        ( htpy-dep-cocone f g c P s))
  is-contr-total-htpy-dep-cocone
    {S = S} {A} {B} f g {X} (pair i (pair j H)) P (pair hA (pair hB hS)) =
    is-contr-total-Eq-structure
      ( λ α βγ K 
          Σ (hB ~ (pr1 βγ))  L 
          coherence-htpy-dep-cocone f g
            ( pair i (pair j H)) P (pair hA (pair hB hS)) (pair α βγ) K L))
      ( is-contr-total-htpy hA)
      ( pair hA refl-htpy)
      ( is-contr-total-Eq-structure
        ( λ β γ L 
          coherence-htpy-dep-cocone f g
            ( pair i (pair j H))
            ( P)
            ( pair hA (pair hB hS))
            ( pair hA (pair β γ))
            ( refl-htpy)
            ( L))
        ( is-contr-total-htpy hB)
        ( pair hB refl-htpy)
        ( is-contr-equiv
          ( Σ ((s : S)  Id (tr P (H s) (hA (f s))) (hB (g s)))  γ  hS ~ γ))
          ( equiv-tot (equiv-concat-htpy inv-htpy-right-unit-htpy))
          ( is-contr-total-htpy hS)))

abstract
  is-equiv-htpy-dep-cocone-eq :
    {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
    (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) (P : X  UU l5) 
    (s t : dep-cocone f g c P)  is-equiv (htpy-dep-cocone-eq f g c P {s} {t})
  is-equiv-htpy-dep-cocone-eq f g c P s =
    fundamental-theorem-id
      ( is-contr-total-htpy-dep-cocone f g c P s)
      ( λ t  htpy-dep-cocone-eq f g c P {s} {t})

  eq-htpy-dep-cocone :
    {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
    (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) (P : X  UU l5) 
    (s t : dep-cocone f g c P) 
      htpy-dep-cocone f g c P s t  Id s t
  eq-htpy-dep-cocone f g c P s t =
    map-inv-is-equiv (is-equiv-htpy-dep-cocone-eq f g c P s t)

  issec-eq-htpy-dep-cocone :
    {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
      (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) (P : X  UU l5) 
    (s t : dep-cocone f g c P) 
    ( ( htpy-dep-cocone-eq f g c P {s} {t}) 
      ( eq-htpy-dep-cocone f g c P s t)) ~ id
  issec-eq-htpy-dep-cocone f g c P s t =
    issec-map-inv-is-equiv
    ( is-equiv-htpy-dep-cocone-eq f g c P s t)

  isretr-eq-htpy-dep-cocone :
    {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
    (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) (P : X  UU l5) 
    (s t : dep-cocone f g c P) 
    ( ( eq-htpy-dep-cocone f g c P s t) 
      ( htpy-dep-cocone-eq f g c P {s} {t})) ~ id
  isretr-eq-htpy-dep-cocone f g c P s t =
    isretr-map-inv-is-equiv
      ( is-equiv-htpy-dep-cocone-eq f g c P s t)

ind-pushout :
  { l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4} 
  ( f : S  A) (g : S  B) (c : cocone f g X) 
  Ind-pushout l f g c  (P : X  UU l) 
  dep-cocone f g c P  (x : X)  P x
ind-pushout f g c ind-c P =
  pr1 (ind-c P)

compute-pushout :
  { l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4} 
  ( f : S  A) (g : S  B) (c : cocone f g X) 
  ( ind-c : Ind-pushout l f g c) (P : X  UU l) (h : dep-cocone f g c P) 
  htpy-dep-cocone f g c P
    ( dep-cocone-map f g c P (ind-pushout f g c ind-c P h))
    ( h)
compute-pushout f g c ind-c P h =
  htpy-dep-cocone-eq f g c P (pr2 (ind-c P) h)

left-compute-pushout :
  { l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4} 
  ( f : S  A) (g : S  B) (c : cocone f g X) 
  ( ind-c : Ind-pushout l f g c) (P : X  UU l) (h : dep-cocone f g c P) 
  ( a : A)  Id (ind-pushout f g c ind-c P h (pr1 c a)) (pr1 h a)
left-compute-pushout f g c ind-c P h =
  pr1 (compute-pushout f g c ind-c P h)

right-compute-pushout :
  { l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4} 
  ( f : S  A) (g : S  B) (c : cocone f g X) 
  ( ind-c : Ind-pushout l f g c) (P : X  UU l) (h : dep-cocone f g c P) 
  ( b : B)  Id (ind-pushout f g c ind-c P h (pr1 (pr2 c) b)) (pr1 (pr2 h) b)
right-compute-pushout f g c ind-c P h =
  pr1 (pr2 (compute-pushout f g c ind-c P h))

path-compute-pushout :
  { l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4} 
  ( f : S  A) (g : S  B) (c : cocone f g X) 
  ( ind-c : Ind-pushout l f g c) (P : X  UU l) (h : dep-cocone f g c P) 
  coherence-htpy-dep-cocone f g c P
    ( dep-cocone-map f g c P (ind-pushout f g c ind-c P h))
    ( h)
    ( left-compute-pushout f g c ind-c P h)
    ( right-compute-pushout f g c ind-c P h)
path-compute-pushout f g c ind-c P h =
  pr2 (pr2 (compute-pushout f g c ind-c P h))

abstract
  uniqueness-dependent-universal-property-pushout :
    { l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4} 
    ( f : S  A) (g : S  B) (c : cocone f g X)
    ( dup-c : dependent-universal-property-pushout l f g c) 
    ( P : X  UU l) ( h : dep-cocone f g c P) 
    is-contr
      ( Σ ((x : X)  P x)  k 
          htpy-dep-cocone f g c P (dep-cocone-map f g c P k) h))
  uniqueness-dependent-universal-property-pushout f g c dup-c P h =
    is-contr-is-equiv'
      ( fib (dep-cocone-map f g c P) h)
      ( tot  k  htpy-dep-cocone-eq f g c P))
      ( is-equiv-tot-is-fiberwise-equiv
        ( λ k  is-equiv-htpy-dep-cocone-eq f g c P
          ( dep-cocone-map f g c P k) h))
      ( is-contr-map-is-equiv (dup-c P) h)

Before we state the main theorem of this section, we also state a dependent version of the pullback property of pushouts.

cone-dependent-pullback-property-pushout :
  {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) (P : X  UU l5) 
  let i = pr1 c
      j = pr1 (pr2 c)
      H = pr2 (pr2 c)
  in
  cone
    ( λ (h : (a : A)  P (i a))  λ (s : S)  tr P (H s) (h (f s)))
    ( λ (h : (b : B)  P (j b))  λ s  h (g s))
    ( (x : X)  P x)
cone-dependent-pullback-property-pushout f g (pair i (pair j H)) P =
  pair
    ( λ h  λ a  h (i a))
    ( pair
      ( λ h  λ b  h (j b))
      ( λ h  eq-htpy  s  apd h (H s))))

dependent-pullback-property-pushout :
  {l1 l2 l3 l4 : Level} (l : Level) {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) 
  UU (l1  l2  l3  l4  lsuc l)
dependent-pullback-property-pushout l {S} {A} {B} f g {X}
  (pair i (pair j H)) =
  (P : X  UU l) 
  is-pullback
    ( λ (h : (a : A)  P (i a))  λ s  tr P (H s) (h (f s)))
    ( λ (h : (b : B)  P (j b))  λ s  h (g s))
    ( cone-dependent-pullback-property-pushout f g (pair i (pair j H)) P)

Theorem 18.1.4

The following properties are all equivalent:

1. universal-property-pushout
2. pullback-property-pushout
3. dependent-pullback-property-pushout
4. dependent-universal-property-pushout
5. Ind-pushout

We have already shown (1) ↔ (2). Therefore we will first show (3) ↔ (4) ↔ (5). Finally, we will show (2) ↔ (3). Here are the precise references to the proofs of those parts:

  • Proof of (1) → (2): pullback-property-pushout-universal-property-pushout
  • Proof of (2) → (1): universal-property-pushout-pullback-property-pushout
  • Proof of (2) → (3): dependent-pullback-property-pullback-property-pushout
  • Proof of (3) → (2): pullback-property-dependent-pullback-property-pushout
  • Proof of (3) → (4): dependent-universal-property-dependent-pullback-property-pushout
  • Proof of (4) → (3): dependent-pullback-property-dependent-universal-property-pushout
  • Proof of (4) → (5): Ind-pushout-dependent-universal-property-pushout
  • Proof of (5) → (4): dependent-universal-property-pushout-Ind-pushout

Proof of Theorem 18.1.4, (5) implies (4)

dependent-naturality-square :
  {l1 l2 : Level} {A : UU l1} {B : A  UU l2} (f f' : (x : A)  B x)
  {x x' : A} (p : Id x x') {q : Id (f x) (f' x)} {q' : Id (f x') (f' x')} 
  Id ((apd f p)  q') ((ap (tr B p) q)  (apd f' p)) 
  Id (tr  y  Id (f y) (f' y)) p q) q'
dependent-naturality-square f f' refl {q} {q'} s =
  inv (s  (right-unit  (ap-id q)))

htpy-eq-dep-cocone-map :
  { l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  ( f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) 
  ( H : Ind-pushout l f g c) { P : X  UU l} (h h' : (x : X)  P x) 
  Id (dep-cocone-map f g c P h) (dep-cocone-map f g c P h')  h ~ h'
htpy-eq-dep-cocone-map f g c ind-c {P} h h' p =
  ind-pushout f g c ind-c
    ( λ x  Id (h x) (h' x))
    ( pair
      ( pr1 (htpy-dep-cocone-eq f g c P p))
      ( pair
        ( pr1 (pr2 (htpy-dep-cocone-eq f g c P p)))
        ( λ s 
          dependent-naturality-square h h' (pr2 (pr2 c) s)
            ( pr2 (pr2 (htpy-dep-cocone-eq f g c P p)) s))))

dependent-universal-property-pushout-Ind-pushout :
  {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) 
  ((l : Level)  Ind-pushout l f g c) 
  ((l : Level)  dependent-universal-property-pushout l f g c)
dependent-universal-property-pushout-Ind-pushout f g c ind-c l P =
  is-equiv-has-inverse
    ( ind-pushout f g c (ind-c l) P)
    ( pr2 (ind-c l P))
    ( λ h  eq-htpy (htpy-eq-dep-cocone-map f g c (ind-c l)
      ( ind-pushout f g c (ind-c l) P (dep-cocone-map f g c P h))
      ( h)
      ( pr2 (ind-c l P) (dep-cocone-map f g c P h))))

Proof of Theorem 18.1.4, (4) implies (5)

Ind-pushout-dependent-universal-property-pushout :
  {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) 
  ((l : Level)  dependent-universal-property-pushout l f g c) 
  ((l : Level)  Ind-pushout l f g c)
Ind-pushout-dependent-universal-property-pushout f g c dup-c l P =
  pr1 (dup-c l P)

Proof of Theorem 18.1.4, (4) implies (3)

triangle-dependent-pullback-property-pushout :
  {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) (P : X  UU l5) 
  let i = pr1 c
      j = pr1 (pr2 c)
      H = pr2 (pr2 c)
  in
  ( dep-cocone-map f g c P) ~
  ( ( tot  h  tot  h'  htpy-eq))) 
    ( gap
      ( λ (h : (a : A)  P (i a))  λ s  tr P (H s) (h (f s)))
      ( λ (h : (b : B)  P (j b))  λ s  h (g s))
      ( cone-dependent-pullback-property-pushout f g c P)))
triangle-dependent-pullback-property-pushout f g (pair i (pair j H)) P h =
  eq-pair-Σ refl (eq-pair-Σ refl (inv (issec-eq-htpy (apd h  H))))

dependent-pullback-property-dependent-universal-property-pushout :
  {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) 
  ((l : Level)  dependent-universal-property-pushout l f g c) 
  ((l : Level)  dependent-pullback-property-pushout l f g c)
dependent-pullback-property-dependent-universal-property-pushout
  f g (pair i (pair j H)) I l P =
  let c = (pair i (pair j H)) in
  is-equiv-right-factor-htpy
    ( dep-cocone-map f g c P)
    ( tot  h  tot λ h'  htpy-eq))
    ( gap
      ( λ h x  tr P (H x) (h (f x)))
      ( _∘ g)
      ( cone-dependent-pullback-property-pushout f g c P))
    ( triangle-dependent-pullback-property-pushout f g c P)
    ( is-equiv-tot-is-fiberwise-equiv
      ( λ h  is-equiv-tot-is-fiberwise-equiv
        ( λ h'  funext  x  tr P (H x) (h (f x))) (h'  g))))
    ( I l P)

Proof of Theorem 18.1.4, (4) implies (3)

dependent-universal-property-dependent-pullback-property-pushout :
  {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) 
  ((l : Level)  dependent-pullback-property-pushout l f g c) 
  ((l : Level)  dependent-universal-property-pushout l f g c)
dependent-universal-property-dependent-pullback-property-pushout
  f g (pair i (pair j H)) dpullback-c l P =
  let c = (pair i (pair j H)) in
  is-equiv-comp-htpy
    ( dep-cocone-map f g c P)
    ( tot  h  tot λ h'  htpy-eq))
    ( gap
      ( λ h x  tr P (H x) (h (f x)))
      ( _∘ g)
      ( cone-dependent-pullback-property-pushout f g c P))
    ( triangle-dependent-pullback-property-pushout f g c P)
    ( dpullback-c l P)
    ( is-equiv-tot-is-fiberwise-equiv
      ( λ h  is-equiv-tot-is-fiberwise-equiv
        ( λ h'  funext  x  tr P (H x) (h (f x))) (h'  g))))

Proof of Theorem 18.1.4, (3) implies (2)

concat-eq-htpy :
  {l1 l2 : Level} {A : UU l1} {B : A  UU l2} {f g h : (x : A)  B x}
  (H : f ~ g) (K : g ~ h)  Id (eq-htpy (H ∙h K)) ((eq-htpy H)  (eq-htpy K))
concat-eq-htpy {A = A} {B} {f} H K =
  ind-htpy f
    ( λ g H 
      ( h : (x : A)  B x) (K : g ~ h) 
      Id (eq-htpy (H ∙h K)) ((eq-htpy H)  (eq-htpy K)))
    ( λ h K  ap (concat' f (eq-htpy K)) (inv (eq-htpy-refl-htpy _))) H _ K

tr-triv :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} {x y : A} (p : Id x y) (b : B) 
  Id (tr  a  B) p b) b
tr-triv refl b = refl

apd-triv :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A  B) {x y : A} (p : Id x y) 
  Id (apd f p) (tr-triv p (f x)  ap f p)
apd-triv f refl = refl

pullback-property-dependent-pullback-property-pushout :
  {l1 l2 l3 l4 : Level} (l : Level) {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B) {X : UU l4} (c : cocone f g X) 
  dependent-pullback-property-pushout l f g c 
  pullback-property-pushout l f g c
pullback-property-dependent-pullback-property-pushout
  l f g (pair i (pair j H)) dpb Y =
  is-pullback-htpy
    -- ( λ h s → tr (λ x → Y) (H s) (h (f s)))
    ( λ h  eq-htpy  s  inv (tr-triv (H s) (h (f s)))))
    -- ( _∘ g)
    ( refl-htpy)
    { c = pair
      ( _∘ i)
      ( pair (_∘ j)  h  eq-htpy (h ·l H)))}
    ( cone-dependent-pullback-property-pushout
      f g (pair i (pair j H))  x  Y))
    ( pair
      ( λ h  refl)
      ( pair
        ( λ h  refl)
        ( λ h  right-unit 
          ( ( ap eq-htpy
              ( eq-htpy  s 
                inv-con
                  ( tr-triv (H s) (h (i (f s))))
                  ( ap h (H s))
                  ( apd h (H s))
                  ( inv (apd-triv h (H s)))))) 
            ( concat-eq-htpy
              ( λ s  inv (tr-triv (H s) (h (i (f s)))))
              ( λ s  apd h (H s)))))))
    ( dpb  x  Y))

Proof of Theorem 18.1.4, (2) implies (3)

We first define the family of lifts, which is indexed by maps .

fam-lifts :
  {l1 l2 l3 : Level} (Y : UU l1) {X : UU l2} (P : X  UU l3) 
  (Y  X)  UU (l1  l3)
fam-lifts Y P h = (y : Y)  P (h y)

tr-fam-lifts' :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4) 
  (h : B  X) {f g : A  B} (H : f ~ g) 
  fam-lifts A P (h  f)  fam-lifts A P (h  g)
tr-fam-lifts' P h {f} {g} H k s = tr (P  h) (H s) (k s)

TR-EQ-HTPY-FAM-LIFTS :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4) 
  (h : B  X) {f g : A  B} (H : f ~ g)  UU (l1  l4)
TR-EQ-HTPY-FAM-LIFTS {A = A} P h H =
  tr (fam-lifts A P) (eq-htpy (h ·l H)) ~ (tr-fam-lifts' P h H)

tr-eq-htpy-fam-lifts-refl-htpy :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4) 
  (h : B  X) (f : A  B)  TR-EQ-HTPY-FAM-LIFTS P h (refl-htpy' f)
tr-eq-htpy-fam-lifts-refl-htpy P h f k =
  ap  t  tr (fam-lifts _ P) t k) (eq-htpy-refl-htpy (h  f))

abstract
  tr-eq-htpy-fam-lifts :
    {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4) 
    (h : B  X) {f g : A  B} (H : f ~ g) 
    TR-EQ-HTPY-FAM-LIFTS P h H
  tr-eq-htpy-fam-lifts P h {f} =
    ind-htpy f
      ( λ g H  TR-EQ-HTPY-FAM-LIFTS P h H)
      ( tr-eq-htpy-fam-lifts-refl-htpy P h f)

  compute-tr-eq-htpy-fam-lifts :
    {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4) 
    (h : B  X) (f : A  B) 
    Id ( tr-eq-htpy-fam-lifts P h (refl-htpy' f))
        ( tr-eq-htpy-fam-lifts-refl-htpy P h f)
  compute-tr-eq-htpy-fam-lifts P h f =
    compute-ind-htpy f
      ( λ g H  TR-EQ-HTPY-FAM-LIFTS P h H)
      ( tr-eq-htpy-fam-lifts-refl-htpy P h f)

One of the basic operations on lifts is precomposition by an ordinary function.

precompose-lifts :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (P : X  UU l4)  (f : A  B)  (h : B  X) 
  (fam-lifts B P h)  (fam-lifts A P (h  f))
precompose-lifts P f h h' a = h' (f a)

Given two homotopic maps, their precomposition functions have different codomains. However, there is a commuting triangle. We obtain this triangle by homotopy induction.

TRIANGLE-PRECOMPOSE-LIFTS :
  { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  ( P : X  UU l4) {f g : A  B} (H : f ~ g)  UU (l1  l2  l3  l4)
TRIANGLE-PRECOMPOSE-LIFTS {A = A} {B} {X} P {f} {g} H =
  (h : B  X) 
    ( (tr (fam-lifts A P) (eq-htpy (h ·l H)))  (precompose-lifts P f h)) ~
    ( precompose-lifts P g h)

triangle-precompose-lifts-refl-htpy :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (P : X  UU l4) (f : A  B)  TRIANGLE-PRECOMPOSE-LIFTS P (refl-htpy' f)
triangle-precompose-lifts-refl-htpy {A = A} P f h h' =
  tr-eq-htpy-fam-lifts-refl-htpy P h f  a  h' (f a))

triangle-precompose-lifts :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (P : X  UU l4) {f g : A  B} (H : f ~ g) 
  TRIANGLE-PRECOMPOSE-LIFTS P H
triangle-precompose-lifts {A = A} P {f} =
  ind-htpy f
    ( λ g H  TRIANGLE-PRECOMPOSE-LIFTS P H)
    ( triangle-precompose-lifts-refl-htpy P f)

compute-triangle-precompose-lifts :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (P : X  UU l4) (f : A  B) 
  Id
    ( triangle-precompose-lifts P (refl-htpy' f))
    ( triangle-precompose-lifts-refl-htpy P f)
compute-triangle-precompose-lifts P f =
  compute-ind-htpy f
    ( λ g  TRIANGLE-PRECOMPOSE-LIFTS P)
    ( triangle-precompose-lifts-refl-htpy P f)

There is a similar commuting triangle with the computed transport function. This time we don't use homotopy induction to construct the homotopy. We give an explicit definition instead.

triangle-precompose-lifts' :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (P : X  UU l4) {f g : A  B} (H : f ~ g)  (h : B  X) 
  ( (tr-fam-lifts' P h H)  (precompose-lifts P f h)) ~
  ( precompose-lifts P g h)
triangle-precompose-lifts' P H h k = eq-htpy  a  apd k (H a))

compute-triangle-precompose-lifts' :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (P : X  UU l4) (f : A  B)  (h : B  X) 
  ( triangle-precompose-lifts' P (refl-htpy' f) h) ~
  ( refl-htpy' ( precompose-lifts P f h))
compute-triangle-precompose-lifts' P f h k = eq-htpy-refl-htpy _

There is a coherence between the two commuting triangles. This coherence is again constructed by homotopy induction.

COHERENCE-TRIANGLE-PRECOMPOSE-LIFTS :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4)
  {f g : A  B} (H : f ~ g)  UU (l1  l2  l3  l4)
COHERENCE-TRIANGLE-PRECOMPOSE-LIFTS {A = A} {B} {X} P {f} {g} H =
  (h : B  X) 
    ( triangle-precompose-lifts P H h) ~
    ( ( ( tr-eq-htpy-fam-lifts P h H) ·r (precompose-lifts P f h)) ∙h
      ( triangle-precompose-lifts' P H h))

coherence-triangle-precompose-lifts-refl-htpy :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4)
  (f : A  B)  COHERENCE-TRIANGLE-PRECOMPOSE-LIFTS P (refl-htpy' f)
coherence-triangle-precompose-lifts-refl-htpy P f h =
  ( htpy-eq (htpy-eq (compute-triangle-precompose-lifts P f) h)) ∙h
  ( ( ( inv-htpy-right-unit-htpy) ∙h
      ( ap-concat-htpy
        ( λ h'  tr-eq-htpy-fam-lifts-refl-htpy P h f  a  h' (f a)))
        ( refl-htpy)
        ( triangle-precompose-lifts' P refl-htpy h)
        ( inv-htpy (compute-triangle-precompose-lifts' P f h)))) ∙h
    ( htpy-eq
      ( ap
        ( λ t 
          ( t ·r (precompose-lifts P f h)) ∙h
          ( triangle-precompose-lifts' P refl-htpy h))
        ( inv (compute-tr-eq-htpy-fam-lifts P h f)))))

abstract
  coherence-triangle-precompose-lifts :
    {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4)
    {f g : A  B} (H : f ~ g)  COHERENCE-TRIANGLE-PRECOMPOSE-LIFTS P H
  coherence-triangle-precompose-lifts P {f} =
    ind-htpy f
      ( λ g H  COHERENCE-TRIANGLE-PRECOMPOSE-LIFTS P H)
      ( coherence-triangle-precompose-lifts-refl-htpy P f)

  compute-coherence-triangle-precompose-lifts :
    {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4)
    (f : A  B) 
      Id ( coherence-triangle-precompose-lifts P (refl-htpy' f))
          ( coherence-triangle-precompose-lifts-refl-htpy P f)
  compute-coherence-triangle-precompose-lifts P f =
    compute-ind-htpy f
      ( λ g H  COHERENCE-TRIANGLE-PRECOMPOSE-LIFTS P H)
      ( coherence-triangle-precompose-lifts-refl-htpy P f)

total-lifts :
  {l1 l2 l3 : Level} (A : UU l1) {X : UU l2} (P : X  UU l3) 
  UU (l1  l2  l3)
total-lifts A {X} P = universally-structured-Π {A = A} {B = λ a  X}  a  P)

precompose-total-lifts :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (P : X  UU l4)  (A  B) 
  total-lifts B P  total-lifts A P
precompose-total-lifts {A = A} P f =
  map-Σ
    ( λ h  (a : A)  P (h a))
    ( λ h  h  f)
    ( precompose-lifts P f)

coherence-square-map-inv-distributive-Π-Σ :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (P : X  UU l4) (f : A  B) 
  coherence-square-maps
    ( precompose-total-lifts P f)
    ( map-inv-distributive-Π-Σ {A = B} {B = λ x  X} {C = λ x y  P y})
    ( map-inv-distributive-Π-Σ)
    ( λ h  h  f)
coherence-square-map-inv-distributive-Π-Σ P f = refl-htpy

Our goal is now to produce a homotopy between precompose-total-lifts P f and precompose-total-lifts P g for homotopic maps f and g, and a coherence filling a cylinder.

HTPY-PRECOMPOSE-TOTAL-LIFTS :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (P : X  UU l4) {f g : A  B} (H : f ~ g) 
  UU (l1  l2  l3  l4)
HTPY-PRECOMPOSE-TOTAL-LIFTS P {f} {g} H =
  (precompose-total-lifts P f) ~ (precompose-total-lifts P g)

htpy-precompose-total-lifts :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4)
  {f g : A  B} (H : f ~ g)  HTPY-PRECOMPOSE-TOTAL-LIFTS P H
htpy-precompose-total-lifts {A = A} {B} P {f} {g} H =
  htpy-map-Σ
    ( fam-lifts A P)
    ( λ h  eq-htpy (h ·l H))
    ( precompose-lifts P f)
    ( triangle-precompose-lifts P H)

We show that when htpy-precompose-total-lifts is applied to refl-htpy, it computes to refl-htpy.

tr-id-left-subst :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A  B} {x y : A}
  (p : Id x y) (b : B)  (q : Id (f x) b) 
  Id (tr  (a : A)  Id (f a) b) p q) ((inv (ap f p))  q)
tr-id-left-subst refl b q = refl

compute-htpy-precompose-total-lifts :
  { l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4)
  ( f : A  B) 
  ( htpy-precompose-total-lifts P (refl-htpy {f = f})) ~
  ( refl-htpy' (map-Σ (fam-lifts A P)  h  h  f) (precompose-lifts P f)))
compute-htpy-precompose-total-lifts {A = A} P f (pair h h') =
  let α = λ (t : Id (h  f) (h  f))  tr (fam-lifts A P) t  a  h' (f a))
  in
  ap eq-pair-Σ'
    ( eq-pair-Σ
      ( eq-htpy-refl-htpy (h  f))
      ( ( tr-id-left-subst
          { f = α}
          ( eq-htpy-refl-htpy (h  f))
          ( λ a  h' (f a))
          ( triangle-precompose-lifts P refl-htpy h h')) 
        ( ( ap
            ( λ t  inv (ap α (eq-htpy-refl-htpy  a  h (f a))))  t)
            ( htpy-eq
              ( htpy-eq (compute-triangle-precompose-lifts P f) h) h')) 
          ( left-inv (triangle-precompose-lifts-refl-htpy P f h h')))))

COHERENCE-INV-HTPY-DISTRIBUTIVE-Π-Σ :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4)
  {f g : A  B} (H : f ~ g)  UU (l1  l2  l3  l4)
COHERENCE-INV-HTPY-DISTRIBUTIVE-Π-Σ P {f} {g} H =
  ( ( coherence-square-map-inv-distributive-Π-Σ P f) ∙h
    ( map-inv-distributive-Π-Σ ·l ( htpy-precompose-total-lifts P H))) ~
  ( ( ( λ h  eq-htpy (h ·l H)) ·r map-inv-distributive-Π-Σ) ∙h
    ( coherence-square-map-inv-distributive-Π-Σ P g))

coherence-inv-htpy-distributive-Π-Σ-refl-htpy :
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4)
  (f : A  B)  COHERENCE-INV-HTPY-DISTRIBUTIVE-Π-Σ P (refl-htpy' f)
coherence-inv-htpy-distributive-Π-Σ-refl-htpy {X = X} P f =
  ( ap-concat-htpy
    ( coherence-square-map-inv-distributive-Π-Σ P f)
    ( map-inv-distributive-Π-Σ ·l ( htpy-precompose-total-lifts P refl-htpy))
    ( refl-htpy)
    ( λ h 
      ap
        ( ap map-inv-distributive-Π-Σ)
        ( compute-htpy-precompose-total-lifts P f h))) ∙h
  ( ap-concat-htpy'
    ( refl-htpy)
    ( ( htpy-precomp refl-htpy (Σ X P)) ·r map-inv-distributive-Π-Σ)
    ( refl-htpy)
    ( inv-htpy
      ( λ h  compute-htpy-precomp f (Σ X P) (map-inv-distributive-Π-Σ h))))

abstract
  coherence-inv-htpy-distributive-Π-Σ :
    {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (P : X  UU l4)
    {f g : A  B} (H : f ~ g)  COHERENCE-INV-HTPY-DISTRIBUTIVE-Π-Σ P H
  coherence-inv-htpy-distributive-Π-Σ P {f} =
    ind-htpy f
      ( λ g H  COHERENCE-INV-HTPY-DISTRIBUTIVE-Π-Σ P H)
      ( coherence-inv-htpy-distributive-Π-Σ-refl-htpy P f)

cone-family-dependent-pullback-property :
  {l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  (f : S  A) (g : S  B) (c : cocone f g X) (P : X  UU l) 
  cone-family
    ( fam-lifts S P)
    ( precompose-lifts P f)
    ( precompose-lifts P g)
    ( cone-pullback-property-pushout f g c X)
    ( fam-lifts X P)
cone-family-dependent-pullback-property f g c P γ =
  pair
    ( precompose-lifts P (pr1 c) γ)
    ( pair
      ( precompose-lifts P (pr1 (pr2 c)) γ)
      ( triangle-precompose-lifts P (pr2 (pr2 c)) γ))

is-pullback-cone-family-dependent-pullback-property :
  {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  (f : S  A) (g : S  B) (c : cocone f g X) 
  ((l : Level)  pullback-property-pushout l f g c) 
  {l : Level} (P : X  UU l) (γ : X  X) 
  is-pullback
    ( ( tr (fam-lifts S P) (eq-htpy (γ ·l (pr2 (pr2 c))))) 
      ( precompose-lifts P f (γ  (pr1 c))))
    ( precompose-lifts P g (γ  (pr1 (pr2 c))))
    ( cone-family-dependent-pullback-property f g c P γ)
is-pullback-cone-family-dependent-pullback-property {S = S} {A} {B} {X}
  f g (pair i (pair j H)) pb-c P =
  let c = pair i (pair j H) in
  is-pullback-family-is-pullback-tot
    ( fam-lifts S P)
    ( precompose-lifts P f)
    ( precompose-lifts P g)
    ( cone-pullback-property-pushout f g c X)
    ( cone-family-dependent-pullback-property f g c P)
    ( pb-c _ X)
    ( is-pullback-top-is-pullback-bottom-cube-is-equiv
      ( precomp i (Σ X P))
      ( precomp j (Σ X P))
      ( precomp f (Σ X P))
      ( precomp g (Σ X P))
      ( map-Σ (fam-lifts A P) (precomp i X) (precompose-lifts P i))
      ( map-Σ (fam-lifts B P) (precomp j X) (precompose-lifts P j))
      ( map-Σ (fam-lifts S P) (precomp f X) (precompose-lifts P f))
      ( map-Σ (fam-lifts S P) (precomp g X) (precompose-lifts P g))
      ( map-inv-distributive-Π-Σ)
      ( map-inv-distributive-Π-Σ)
      ( map-inv-distributive-Π-Σ)
      ( map-inv-distributive-Π-Σ)
      ( htpy-precompose-total-lifts P H)
      ( refl-htpy)
      ( refl-htpy)
      ( refl-htpy)
      ( refl-htpy)
      ( htpy-precomp H (Σ X P))
      ( coherence-inv-htpy-distributive-Π-Σ P H)
      ( is-equiv-map-inv-distributive-Π-Σ)
      ( is-equiv-map-inv-distributive-Π-Σ)
      ( is-equiv-map-inv-distributive-Π-Σ)
      ( is-equiv-map-inv-distributive-Π-Σ)
      ( pb-c _ (Σ X P)))

dependent-pullback-property-pullback-property-pushout :
  {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  (f : S  A) (g : S  B) (c : cocone f g X) 
  ((l : Level)  pullback-property-pushout l f g c) 
  ((l : Level)  dependent-pullback-property-pushout l f g c)
dependent-pullback-property-pullback-property-pushout
  {S = S} {A} {B} {X}
  f g (pair i (pair j H)) pullback-c l P =
  let c = pair i (pair j H) in
  is-pullback-htpy'
    -- ( (tr (fam-lifts S P) (eq-htpy (id ·l H))) ∘ (precompose-lifts P f i))
    ( (tr-eq-htpy-fam-lifts P id H) ·r (precompose-lifts P f i))
    -- ( precompose-lifts P g j)
    ( refl-htpy)
    ( cone-family-dependent-pullback-property f g c P id)
    { c' = cone-dependent-pullback-property-pushout f g c P}
    ( pair refl-htpy
      ( pair refl-htpy
        ( right-unit-htpy ∙h (coherence-triangle-precompose-lifts P H id))))
    ( is-pullback-cone-family-dependent-pullback-property f g c pullback-c P id)

This concludes the proof of Theorem 18.1.4.

We give some further useful implications.

dependent-universal-property-universal-property-pushout :
  { l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  ( f : S  A) (g : S  B) (c : cocone f g X) 
  ( (l : Level)  universal-property-pushout l f g c) 
  ( (l : Level)  dependent-universal-property-pushout l f g c)
dependent-universal-property-universal-property-pushout f g c up-X =
  dependent-universal-property-dependent-pullback-property-pushout f g c
    ( dependent-pullback-property-pullback-property-pushout f g c
      ( λ l  pullback-property-pushout-universal-property-pushout l f g c
        ( up-X l)))

Section 16.2 Families over pushouts

Definition 18.2.1

Fam-pushout :
  {l1 l2 l3 : Level} (l : Level) {S : UU l1} {A : UU l2} {B : UU l3}
  (f : S  A) (g : S  B)  UU (l1  l2  l3  lsuc l)
Fam-pushout l {S} {A} {B} f g =
  Σ ( A  UU l)
    ( λ PA  Σ (B  UU l)
      ( λ PB  (s : S)  PA (f s)  PB (g s)))

Characterizing the identity type of Fam-pushout

coherence-equiv-Fam-pushout :
  { l1 l2 l3 l l' : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  { f : S  A} {g : S  B}
  ( P : Fam-pushout l f g) (Q : Fam-pushout l' f g) 
  ( eA : (a : A)  (pr1 P a)  (pr1 Q a))
  ( eB : (b : B)  (pr1 (pr2 P) b)  (pr1 (pr2 Q) b)) 
  UU (l1  l  l')
coherence-equiv-Fam-pushout {S = S} {f = f} {g} P Q eA eB =
  ( s : S) 
    ( (map-equiv (eB (g s)))  (map-equiv (pr2 (pr2 P) s))) ~
    ( (map-equiv (pr2 (pr2 Q) s))  (map-equiv (eA (f s))))

equiv-Fam-pushout :
  {l1 l2 l3 l l' : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  {f : S  A} {g : S  B} 
  Fam-pushout l f g  Fam-pushout l' f g  UU (l1  l2  l3  l  l')
equiv-Fam-pushout {S = S} {A} {B} {f} {g} P Q =
  Σ ( (a : A)  (pr1 P a)  (pr1 Q a)) ( λ eA 
    Σ ( (b : B)  (pr1 (pr2 P) b)  (pr1 (pr2 Q) b))
      ( coherence-equiv-Fam-pushout P Q eA))

reflexive-equiv-Fam-pushout :
  {l1 l2 l3 l : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  {f : S  A} {g : S  B} (P : Fam-pushout l f g) 
  equiv-Fam-pushout P P
reflexive-equiv-Fam-pushout (pair PA (pair PB PS)) =
  pair
    ( λ a  id-equiv)
    ( pair
      ( λ b  id-equiv)
      ( λ s  refl-htpy))

equiv-Fam-pushout-eq :
  {l1 l2 l3 l : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  {f : S  A} {g : S  B} {P Q : Fam-pushout l f g} 
  Id P Q  equiv-Fam-pushout P Q
equiv-Fam-pushout-eq {P = P} {.P} refl =
  reflexive-equiv-Fam-pushout P

is-contr-total-equiv-Fam-pushout :
  {l1 l2 l3 l : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  {f : S  A} {g : S  B} (P : Fam-pushout l f g) 
  is-contr (Σ (Fam-pushout l f g) (equiv-Fam-pushout P))
is-contr-total-equiv-Fam-pushout {S = S} {A} {B} {f} {g} P =
  is-contr-total-Eq-structure
    ( λ PA' t eA 
      Σ ( (b : B)  (pr1 (pr2 P) b)  (pr1 t b))
        ( coherence-equiv-Fam-pushout P (pair PA' t) eA))
    ( is-contr-total-Eq-Π
      ( λ a X  (pr1 P a)  X)
      ( λ a  is-contr-total-equiv (pr1 P a)))
    ( pair (pr1 P)  a  id-equiv))
    ( is-contr-total-Eq-structure
      ( λ PB' PS' eB 
        coherence-equiv-Fam-pushout
          P (pair (pr1 P) (pair PB' PS'))  a  id-equiv) eB)
      ( is-contr-total-Eq-Π
        ( λ b Y  (pr1 (pr2 P) b)  Y)
        ( λ b  is-contr-total-equiv (pr1 (pr2 P) b)))
      ( pair (pr1 (pr2 P))  b  id-equiv))
      ( is-contr-total-Eq-Π
        ( λ s e  (map-equiv (pr2 (pr2 P) s)) ~ (map-equiv e))
        ( λ s  is-contr-total-htpy-equiv (pr2 (pr2 P) s))))

is-equiv-equiv-Fam-pushout-eq :
  {l1 l2 l3 l : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  {f : S  A} {g : S  B} (P Q : Fam-pushout l f g) 
  is-equiv (equiv-Fam-pushout-eq {P = P} {Q})
is-equiv-equiv-Fam-pushout-eq P =
  fundamental-theorem-id
    ( is-contr-total-equiv-Fam-pushout P)
    ( λ Q  equiv-Fam-pushout-eq {P = P} {Q})

equiv-equiv-Fam-pushout :
  {l1 l2 l3 l : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  {f : S  A} {g : S  B} (P Q : Fam-pushout l f g) 
  Id P Q  equiv-Fam-pushout P Q
equiv-equiv-Fam-pushout P Q =
  pair
    ( equiv-Fam-pushout-eq)
    ( is-equiv-equiv-Fam-pushout-eq P Q)

eq-equiv-Fam-pushout :
  {l1 l2 l3 l : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  {f : S  A} {g : S  B} {P Q : Fam-pushout l f g} 
  (equiv-Fam-pushout P Q)  Id P Q
eq-equiv-Fam-pushout {P = P} {Q} =
  map-inv-is-equiv (is-equiv-equiv-Fam-pushout-eq P Q)

issec-eq-equiv-Fam-pushout :
  { l1 l2 l3 l : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  { f : S  A} {g : S  B} {P Q : Fam-pushout l f g} 
  ( ( equiv-Fam-pushout-eq {P = P} {Q}) 
    ( eq-equiv-Fam-pushout {P = P} {Q})) ~ id
issec-eq-equiv-Fam-pushout {P = P} {Q} =
  issec-map-inv-is-equiv (is-equiv-equiv-Fam-pushout-eq P Q)

isretr-eq-equiv-Fam-pushout :
  {l1 l2 l3 l : Level} {S : UU l1} {A : UU l2} {B : UU l3}
  {f : S  A} {g : S  B} {P Q : Fam-pushout l f g} 
  ( ( eq-equiv-Fam-pushout {P = P} {Q}) 
    ( equiv-Fam-pushout-eq {P = P} {Q})) ~ id
isretr-eq-equiv-Fam-pushout {P = P} {Q} =
  isretr-map-inv-is-equiv (is-equiv-equiv-Fam-pushout-eq P Q)

This concludes the characterization of the identity type of Fam-pushout.

Definition 18.2.2

desc-fam :
  {l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  {f : S  A} {g : S  B} (c : cocone f g X) 
  (P : X  UU l)  Fam-pushout l f g
desc-fam c P =
  pair
    ( P  (pr1 c))
    ( pair
      ( P  (pr1 (pr2 c)))
      ( λ s  (pair (tr P (pr2 (pr2 c) s)) (is-equiv-tr P (pr2 (pr2 c) s)))))

Theorem 18.2.3

Fam-pushout-cocone-UU :
  {l1 l2 l3 : Level} (l : Level) {S : UU l1} {A : UU l2} {B : UU l3}
  {f : S  A} {g : S  B}  cocone f g (UU l)  Fam-pushout l f g
Fam-pushout-cocone-UU l =
  tot  PA  (tot  PB H s  equiv-eq (H s))))

is-equiv-Fam-pushout-cocone-UU :
  {l1 l2 l3 : Level} (l : Level) {S : UU l1} {A : UU l2} {B : UU l3}
  {f : S  A} {g : S  B} 
  is-equiv (Fam-pushout-cocone-UU l {f = f} {g})
is-equiv-Fam-pushout-cocone-UU l {f = f} {g} =
  is-equiv-tot-is-fiberwise-equiv
    ( λ PA  is-equiv-tot-is-fiberwise-equiv
      ( λ PB  is-equiv-map-Π
        ( λ s  equiv-eq)
        ( λ s  univalence (PA (f s)) (PB (g s)))))

htpy-equiv-eq-ap-fam :
  {l1 l2 : Level} {A : UU l1} (B : A  UU l2) {x y : A} (p : Id x y) 
  htpy-equiv (equiv-tr B p) (equiv-eq (ap B p))
htpy-equiv-eq-ap-fam B {x} {.x} refl =
  refl-htpy-equiv id-equiv

triangle-desc-fam :
  {l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  {f : S  A} {g : S  B} (c : cocone f g X) 
  ( desc-fam {l = l} c) ~
  ( ( Fam-pushout-cocone-UU l {f = f} {g})  ( cocone-map f g {Y = UU l} c))
triangle-desc-fam {l = l} {S} {A} {B} {X} (pair i (pair j H)) P =
  eq-equiv-Fam-pushout
    ( pair
      ( λ a  id-equiv)
      ( pair
        ( λ b  id-equiv)
        ( λ s  htpy-equiv-eq-ap-fam P (H s))))

is-equiv-desc-fam :
  {l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  {f : S  A} {g : S  B} (c : cocone f g X) 
  ((l' : Level)  universal-property-pushout l' f g c) 
  is-equiv (desc-fam {l = l} {f = f} {g} c)
is-equiv-desc-fam {l = l} {f = f} {g} c up-c =
  is-equiv-comp-htpy
    ( desc-fam c)
    ( Fam-pushout-cocone-UU l)
    ( cocone-map f g c)
    ( triangle-desc-fam c)
    ( up-c (lsuc l) (UU l))
    ( is-equiv-Fam-pushout-cocone-UU l)

equiv-desc-fam :
  {l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  {f : S  A} {g : S  B} (c : cocone f g X) 
  ((l' : Level)  universal-property-pushout l' f g c) 
  (X  UU l)  Fam-pushout l f g
equiv-desc-fam c up-c =
  pair
    ( desc-fam c)
    ( is-equiv-desc-fam c up-c)

Corollary 18.2.4

uniqueness-Fam-pushout :
  {l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  (f : S  A) (g : S  B) (c : cocone f g X) 
  ((l' : Level)  universal-property-pushout l' f g c) 
  ( P : Fam-pushout l f g) 
  is-contr
    ( Σ (X  UU l)  Q 
      equiv-Fam-pushout P (desc-fam c Q)))
uniqueness-Fam-pushout {l = l} f g c up-c P =
  is-contr-equiv'
    ( fib (desc-fam c) P)
    ( equiv-tot  Q 
      ( equiv-equiv-Fam-pushout P (desc-fam c Q)) ∘e
      ( equiv-inv (desc-fam c Q) P)))
    ( is-contr-map-is-equiv (is-equiv-desc-fam c up-c) P)

fam-Fam-pushout :
  {l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  {f : S  A} {g : S  B} (c : cocone f g X) 
  (up-X : (l' : Level)  universal-property-pushout l' f g c) 
  Fam-pushout l f g  (X  UU l)
fam-Fam-pushout {f = f} {g} c up-X P =
  pr1 (center (uniqueness-Fam-pushout f g c up-X P))

issec-fam-Fam-pushout :
  {l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  {f : S  A} {g : S  B} (c : cocone f g X) 
  (up-X : (l' : Level)  universal-property-pushout l' f g c) 
  ((desc-fam {l = l} c)  (fam-Fam-pushout c up-X)) ~ id
issec-fam-Fam-pushout {f = f} {g} c up-X P =
  inv
    ( eq-equiv-Fam-pushout (pr2 (center (uniqueness-Fam-pushout f g c up-X P))))

compute-left-fam-Fam-pushout :
  { l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  { f : S  A} {g : S  B} (c : cocone f g X) 
  ( up-X : (l' : Level)  universal-property-pushout l' f g c) 
  ( P : Fam-pushout l f g) 
  ( a : A)  (pr1 P a)  (fam-Fam-pushout c up-X P (pr1 c a))
compute-left-fam-Fam-pushout {f = f} {g} c up-X P =
  pr1 (pr2 (center (uniqueness-Fam-pushout f g c up-X P)))

compute-right-fam-Fam-pushout :
  { l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  { f : S  A} {g : S  B} (c : cocone f g X) 
  ( up-X : (l' : Level)  universal-property-pushout l' f g c) 
  ( P : Fam-pushout l f g) 
  ( b : B)  (pr1 (pr2 P) b)  (fam-Fam-pushout c up-X P (pr1 (pr2 c) b))
compute-right-fam-Fam-pushout {f = f} {g} c up-X P =
  pr1 (pr2 (pr2 (center (uniqueness-Fam-pushout f g c up-X P))))

compute-path-fam-Fam-pushout :
  { l1 l2 l3 l4 l : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  { f : S  A} {g : S  B} (c : cocone f g X) 
  ( up-X : (l' : Level)  universal-property-pushout l' f g c) 
  ( P : Fam-pushout l f g) 
  ( s : S) 
    ( ( map-equiv (compute-right-fam-Fam-pushout c up-X P (g s))) 
      ( map-equiv (pr2 (pr2 P) s))) ~
    ( ( tr (fam-Fam-pushout c up-X P) (pr2 (pr2 c) s)) 
      ( map-equiv (compute-left-fam-Fam-pushout c up-X P (f s))))
compute-path-fam-Fam-pushout {f = f} {g} c up-X P =
  pr2 (pr2 (pr2 (center (uniqueness-Fam-pushout f g c up-X P))))

Section 18.3 The Flattening lemma for pushouts

Definition 18.3.1

{-
cocone-flattening-pushout :
  { l1 l2 l3 l4 l5 : Level}
  { S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  ( f : S → A) (g : S → B) (c : cocone f g X)
  ( P : Fam-pushout l5 f g)
  ( Q : X → UU l5)
  ( e : equiv-Fam-pushout P (desc-fam f g c Q)) →
  cocone
    ( map-Σ (pr1 P) f (λ s → id))
    ( map-Σ (pr1 (pr2 P)) g (λ s → map-equiv (pr2 (pr2 P) s)))
    ( Σ X Q)
cocone-flattening-pushout f g c P Q e =
  pair
    ( map-Σ Q
      ( pr1 c)
      ( λ a → map-equiv (pr1 e a)))
    ( pair
      ( map-Σ Q
        ( pr1 (pr2 c))
        ( λ b → map-equiv (pr1 (pr2 e) b)))
      ( htpy-map-Σ Q
        ( pr2 (pr2 c))
        ( λ s → map-equiv (pr1 e (f s)))
        ( λ s → inv-htpy (pr2 (pr2 e) s))))
-}

Theorem 18.3.2 The flattening lemma

{-
coherence-bottom-flattening-lemma' :
  {l1 l2 l3 : Level} {B : UU l1} {Q : B → UU l2} {T : UU l3}
  {b b' : B} (α : Id b b') {y : Q b} {y' : Q b'} (β : Id (tr Q α y) y')
  (h : (b : B) → Q b → T) → Id (h b y) (h b' y')
coherence-bottom-flattening-lemma' refl refl h = refl

coherence-bottom-flattening-lemma :
  {l1 l2 l3 l4 l5 : Level}
  {A : UU l1} {B : UU l2} {P : A → UU l3} {Q : B → UU l4} {T : UU l5}
  {f f' : A → B} (H : f ~ f')
  {g : (a : A) → P a → Q (f a)}
  {g' : (a : A) → P a → Q (f' a)}
  (K : (a : A) → ((tr Q (H a)) ∘ (g a)) ~ (g' a))
  (h : (b : B) → Q b → T) → (a : A) (p : P a) →
  Id (h (f a) (g a p)) (h (f' a) (g' a p))
coherence-bottom-flattening-lemma H K h a p =
  coherence-bottom-flattening-lemma' (H a) (K a p) h
coherence-cube-flattening-lemma :
  {l1 l2 l3 l4 l5 : Level}
  {A : UU l1} {B : UU l2} {P : A → UU l3} {Q : B → UU l4} {T : UU l5}
  {f f' : A → B} (H : f ~ f')
  {g : (a : A) → P a → Q (f a)}
  {g' : (a : A) → P a → Q (f' a)}
  (K : (a : A) → ((tr Q (H a)) ∘ (g a)) ~ (g' a))
  (h : Σ B Q → T) →
  Id ( eq-htpy
       ( λ a → eq-htpy
         ( coherence-bottom-flattening-lemma H K (ev-pair h) a)))
     ( ap ev-pair
       ( htpy-precomp (htpy-map-Σ Q H g K) T h))
coherence-cube-flattening-lemma
  {A = A} {B} {P} {Q} {T} {f = f} {f'} H {g} {g'} K =
  ind-htpy f
    ( λ f' H' →
      (g : (a : A) → P a → Q (f a)) (g' : (a : A) → P a → Q (f' a))
      (K : (a : A) → ((tr Q (H' a)) ∘ (g a)) ~ (g' a)) (h : Σ B Q → T) →
      Id ( eq-htpy
           ( λ a → eq-htpy
             ( coherence-bottom-flattening-lemma H' K (ev-pair h) a)))
         ( ap ev-pair
           ( htpy-precomp (htpy-map-Σ Q H' g K) T h)))
    ( λ g g' K h → {!ind-htpy g (λ g' K' → (h : Σ B Q → T) →
      Id ( eq-htpy
           ( λ a → eq-htpy
             ( coherence-bottom-flattening-lemma
                refl-htpy (λ a → htpy-eq (K' a)) (ev-pair h) a)))
         ( ap ev-pair
           ( htpy-precomp
              ( htpy-map-Σ Q refl-htpy g
                (λ a → htpy-eq (K' a))) T h))) ? (λ a → eq-htpy (K a)) h!})
    H g g' K

flattening-pushout' :
  {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  (f : S → A) (g : S → B) (c : cocone f g X) →
  ( P : Fam-pushout l5 f g)
  ( Q : X → UU l5)
  ( e : equiv-Fam-pushout P (desc-fam f g c Q)) →
  (l : Level) →
  pullback-property-pushout l
    ( map-Σ (pr1 P) f (λ s → id))
    ( map-Σ (pr1 (pr2 P)) g (λ s → map-equiv (pr2 (pr2 P) s)))
    ( cocone-flattening-pushout f g c P Q e)
flattening-pushout' f g c P Q e l T =
  is-pullback-top-is-pullback-bottom-cube-is-equiv
    ( ( map-Π (λ x → precomp-Π (map-equiv (pr1 e x)) (λ q → T))) ∘
      ( precomp-Π (pr1 c) (λ x → (Q x) → T)))
    ( ( map-Π (λ x → precomp-Π (map-equiv (pr1 (pr2 e) x)) (λ q → T))) ∘
      ( precomp-Π (pr1 (pr2 c)) (λ x → (Q x) → T)))
    ( precomp-Π f (λ a → (pr1 P a) → T))
    ( ( map-Π (λ s → precomp (map-equiv (pr2 (pr2 P) s)) T)) ∘
      ( precomp-Π g (λ b → (pr1 (pr2 P) b) → T)))
    ( precomp (map-Σ Q (pr1 c) (λ a → map-equiv (pr1 e a))) T)
    ( precomp (map-Σ Q (pr1 (pr2 c)) (λ b → map-equiv (pr1 (pr2 e) b))) T)
    ( precomp (map-Σ (pr1 P) f (λ s → id)) T)
    ( precomp (map-Σ (pr1 (pr2 P)) g (λ s → map-equiv (pr2 (pr2 P) s))) T)
    ev-pair
    ev-pair
    ev-pair
    ev-pair
    ( htpy-precomp
      ( htpy-map-Σ Q
        ( pr2 (pr2 c))
        ( λ s → map-equiv (pr1 e (f s)))
        ( λ s → inv-htpy (pr2 (pr2 e) s)))
      ( T))
    refl-htpy
    refl-htpy
    refl-htpy
    refl-htpy
    ( λ h → eq-htpy (λ s → eq-htpy
      ( coherence-bottom-flattening-lemma
        ( pr2 (pr2 c))
        ( λ s → inv-htpy (pr2 (pr2 e) s))
        ( h)
        ( s))))
    {!!}
    is-equiv-ev-pair
    is-equiv-ev-pair
    is-equiv-ev-pair
    is-equiv-ev-pair
    {!!}

flattening-pushout :
  {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4}
  (f : S → A) (g : S → B) (c : cocone f g X) →
  ( P : Fam-pushout l5 f g)
  ( Q : X → UU l5)
  ( e : equiv-Fam-pushout P (desc-fam f g c Q)) →
  (l : Level) →
  universal-property-pushout l
    ( map-Σ (pr1 P) f (λ s → id))
    ( map-Σ (pr1 (pr2 P)) g (λ s → map-equiv (pr2 (pr2 P) s)))
    ( cocone-flattening-pushout f g c P Q e)
flattening-pushout f g c P Q e l =
  universal-property-pushout-pullback-property-pushout l
    ( map-Σ (pr1 P) f (λ s → id))
    ( map-Σ (pr1 (pr2 P)) g (λ s → map-equiv (pr2 (pr2 P) s)))
    ( cocone-flattening-pushout f g c P Q e)
    ( flattening-pushout' f g c P Q e l)
-}