# Cones over cospan diagrams

```agda
module foundation.cones-over-cospan-diagrams where
```

<details><summary>Imports</summary>

```agda
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.dependent-universal-property-equivalences
open import foundation.function-extensionality
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopies
open import foundation.homotopy-induction
open import foundation.identity-types
open import foundation.multivariable-homotopies
open import foundation.structure-identity-principle
open import foundation.universe-levels
open import foundation.whiskering-homotopies-composition

open import foundation-core.commuting-squares-of-maps
open import foundation-core.contractible-types
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.torsorial-type-families
open import foundation-core.transport-along-identifications
open import foundation-core.whiskering-identifications-concatenation
```

</details>

## Idea

A {{#concept "cone" Disambiguation="cospan diagram" Agda=cone}} over a
[cospan diagram](foundation.cospans.md) `A -f-> X <-g- B` with domain `C` is a
triple `(p, q, H)` consisting of a map `p : C → A`, a map `q : C → B`, and a
[homotopy](foundation-core.homotopies.md) `H` witnessing that the square

```text
        q
    C -----> B
    |        |
  p |        | g
    ∨        ∨
    A -----> X
        f
```

[commutes](foundation-core.commuting-squares-of-maps.md).

## Definitions

### Cones over cospans

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (f : A  X) (g : B  X)
  where

  cone : {l4 : Level}  UU l4  UU (l1  l2  l3  l4)
  cone C = Σ (C  A)  p  Σ (C  B)  q  coherence-square-maps q p g f))

module _
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4}
  (f : A  X) (g : B  X) (c : cone f g C)
  where

  vertical-map-cone : C  A
  vertical-map-cone = pr1 c

  horizontal-map-cone : C  B
  horizontal-map-cone = pr1 (pr2 c)

  coherence-square-cone :
    coherence-square-maps horizontal-map-cone vertical-map-cone g f
  coherence-square-cone = pr2 (pr2 c)
```

### Dependent cones over cospan diagrams

```agda
cone-family :
  {l1 l2 l3 l4 l5 l6 l7 l8 : Level}
  {X : UU l1} {A : UU l2} {B : UU l3} {C : UU l4}
  (PX : X  UU l5) {PA : A  UU l6} {PB : B  UU l7}
  {f : A  X} {g : B  X} 
  (f' : (a : A)  PA a  PX (f a)) (g' : (b : B)  PB b  PX (g b)) 
  cone f g C  (C  UU l8)  UU (l4  l5  l6  l7  l8)
cone-family {C = C} PX {f = f} {g} f' g' c PC =
  (x : C) 
  cone
    ( ( tr PX (coherence-square-cone f g c x)) 
      ( f' (vertical-map-cone f g c x)))
    ( g' (horizontal-map-cone f g c x))
    ( PC x)
```

### Characterizing identifications of cones over cospan diagrams

```agda
module _
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (f : A  X) (g : B  X) {C : UU l4}
  where

  coherence-htpy-cone :
    (c c' : cone f g C)
    (K : vertical-map-cone f g c ~ vertical-map-cone f g c')
    (L : horizontal-map-cone f g c ~ horizontal-map-cone f g c')  UU (l4  l3)
  coherence-htpy-cone c c' K L =
    ( coherence-square-cone f g c ∙h (g ·l L)) ~
    ( (f ·l K) ∙h coherence-square-cone f g c')

  htpy-cone : cone f g C  cone f g C  UU (l1  l2  l3  l4)
  htpy-cone c c' =
    Σ ( vertical-map-cone f g c ~ vertical-map-cone f g c')
      ( λ K 
        Σ ( horizontal-map-cone f g c ~ horizontal-map-cone f g c')
          ( coherence-htpy-cone c c' K))

  htpy-vertical-map-htpy-cone :
    (c c' : cone f g C) (H : htpy-cone c c') 
    vertical-map-cone f g c ~ vertical-map-cone f g c'
  htpy-vertical-map-htpy-cone c c' H = pr1 H

  htpy-horizontal-map-htpy-cone :
    (c c' : cone f g C) (H : htpy-cone c c') 
    horizontal-map-cone f g c ~ horizontal-map-cone f g c'
  htpy-horizontal-map-htpy-cone c c' H = pr1 (pr2 H)

  coh-htpy-cone :
    (c c' : cone f g C) (H : htpy-cone c c') 
    coherence-htpy-cone c c'
      ( htpy-vertical-map-htpy-cone c c' H)
      ( htpy-horizontal-map-htpy-cone c c' H)
  coh-htpy-cone c c' H = pr2 (pr2 H)

  refl-htpy-cone : (c : cone f g C)  htpy-cone c c
  pr1 (refl-htpy-cone c) = refl-htpy
  pr1 (pr2 (refl-htpy-cone c)) = refl-htpy
  pr2 (pr2 (refl-htpy-cone c)) = right-unit-htpy

  htpy-eq-cone : (c c' : cone f g C)  c  c'  htpy-cone c c'
  htpy-eq-cone c .c refl = refl-htpy-cone c

  is-torsorial-htpy-cone :
    (c : cone f g C)  is-torsorial (htpy-cone c)
  is-torsorial-htpy-cone c =
    is-torsorial-Eq-structure
      ( is-torsorial-htpy (vertical-map-cone f g c))
      ( vertical-map-cone f g c , refl-htpy)
      ( is-torsorial-Eq-structure
        ( is-torsorial-htpy (horizontal-map-cone f g c))
        ( horizontal-map-cone f g c , refl-htpy)
        ( is-torsorial-htpy (coherence-square-cone f g c ∙h refl-htpy)))

  is-equiv-htpy-eq-cone : (c c' : cone f g C)  is-equiv (htpy-eq-cone c c')
  is-equiv-htpy-eq-cone c =
    fundamental-theorem-id (is-torsorial-htpy-cone c) (htpy-eq-cone c)

  extensionality-cone : (c c' : cone f g C)  (c  c')  htpy-cone c c'
  pr1 (extensionality-cone c c') = htpy-eq-cone c c'
  pr2 (extensionality-cone c c') = is-equiv-htpy-eq-cone c c'

  eq-htpy-cone : (c c' : cone f g C)  htpy-cone c c'  c  c'
  eq-htpy-cone c c' = map-inv-equiv (extensionality-cone c c')
```

### Precomposing cones over cospan diagrams with a map

```agda
module _
  {l1 l2 l3 l4 l5 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (f : A  X) (g : B  X)
  where

  cone-map :
    {C : UU l4}  cone f g C  {C' : UU l5}  (C'  C)  cone f g C'
  pr1 (cone-map c h) = vertical-map-cone f g c  h
  pr1 (pr2 (cone-map c h)) = horizontal-map-cone f g c  h
  pr2 (pr2 (cone-map c h)) = coherence-square-cone f g c ·r h
```

### Pasting cones horizontally

```agda
module _
  {l1 l2 l3 l4 l5 l6 : Level}
  {A : UU l1} {B : UU l2} {C : UU l3} {X : UU l4} {Y : UU l5} {Z : UU l6}
  (i : X  Y) (j : Y  Z) (h : C  Z)
  where

  pasting-horizontal-cone :
    (c : cone j h B)  cone i (vertical-map-cone j h c) A  cone (j  i) h A
  pr1 (pasting-horizontal-cone c (f , p , H)) = f
  pr1 (pr2 (pasting-horizontal-cone c (f , p , H))) =
    (horizontal-map-cone j h c)  p
  pr2 (pr2 (pasting-horizontal-cone c (f , p , H))) =
    pasting-horizontal-coherence-square-maps p
      ( horizontal-map-cone j h c)
      ( f)
      ( vertical-map-cone j h c)
      ( h)
      ( i)
      ( j)
      ( H)
      ( coherence-square-cone j h c)
```

### Vertical composition of cones

```agda
module _
  {l1 l2 l3 l4 l5 l6 : Level}
  {A : UU l1} {B : UU l2} {C : UU l3} {X : UU l4} {Y : UU l5} {Z : UU l6}
  (f : C  Z) (g : Y  Z) (h : X  Y)
  where

  pasting-vertical-cone :
    (c : cone f g B)  cone (horizontal-map-cone f g c) h A  cone f (g  h) A
  pr1 (pasting-vertical-cone c (p' , q' , H')) =
    ( vertical-map-cone f g c)  p'
  pr1 (pr2 (pasting-vertical-cone c (p' , q' , H'))) = q'
  pr2 (pr2 (pasting-vertical-cone c (p' , q' , H'))) =
    pasting-vertical-coherence-square-maps q' p' h
      ( horizontal-map-cone f g c)
      ( vertical-map-cone f g c)
      ( g)
      ( f)
      ( H')
      ( coherence-square-cone f g c)
```

### The swapping function on cones over cospans

```agda
swap-cone :
  {l1 l2 l3 l4 : Level}
  {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4}
  (f : A  X) (g : B  X)  cone f g C  cone g f C
pr1 (swap-cone f g c) = horizontal-map-cone f g c
pr1 (pr2 (swap-cone f g c)) = vertical-map-cone f g c
pr2 (pr2 (swap-cone f g c)) = inv-htpy (coherence-square-cone f g c)
```

### Parallel cones over parallel cospan diagrams

Two cones with the same domain over parallel cospans are considered
{{#concept "parallel" Disambiguation="cones over parallel cospan diagrams"}} if
they are part of a fully coherent diagram: there is a fully coherent cube where
all the vertical maps are identities, the top face is given by one cone, and the
bottom face is given by the other.

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  {f f' : A  X} (Hf : f ~ f') {g g' : B  X} (Hg : g ~ g')
  where

  coherence-htpy-parallel-cone :
    {l4 : Level} {C : UU l4} (c : cone f g C) (c' : cone f' g' C)
    (Hp : vertical-map-cone f g c ~ vertical-map-cone f' g' c')
    (Hq : horizontal-map-cone f g c ~ horizontal-map-cone f' g' c') 
    UU (l3  l4)
  coherence-htpy-parallel-cone c c' Hp Hq =
    ( ( coherence-square-cone f g c) ∙h
      ( (g ·l Hq) ∙h (Hg ·r horizontal-map-cone f' g' c'))) ~
    ( ( (f ·l Hp) ∙h (Hf ·r (vertical-map-cone f' g' c'))) ∙h
      ( coherence-square-cone f' g' c'))

  fam-htpy-parallel-cone :
    {l4 : Level} {C : UU l4} (c : cone f g C)  (c' : cone f' g' C) 
    (vertical-map-cone f g c ~ vertical-map-cone f' g' c')  UU (l2  l3  l4)
  fam-htpy-parallel-cone c c' Hp =
    Σ ( horizontal-map-cone f g c ~ horizontal-map-cone f' g' c')
      ( coherence-htpy-parallel-cone c c' Hp)

  htpy-parallel-cone :
    {l4 : Level} {C : UU l4} 
    cone f g C  cone f' g' C  UU (l1  l2  l3  l4)
  htpy-parallel-cone c c' =
    Σ ( vertical-map-cone f g c ~ vertical-map-cone f' g' c')
      ( fam-htpy-parallel-cone c c')
```

### The identity cone over the identity cospan

```agda
id-cone : {l : Level} (A : UU l)  cone (id {A = A}) (id {A = A}) A
id-cone A = (id , id , refl-htpy)
```

## Properties

### Relating `htpy-parallel-cone` to the identity type of cones

In the following part we relate the type `htpy-parallel-cone` to the identity
type of cones. We show that `htpy-parallel-cone` characterizes
[dependent identifications](foundation.dependent-identifications.md) of cones on
the same domain over parallel cospans.

**Note.** The characterization relies heavily on
[function extensionality](foundation.function-extensionality.md).

#### The type family of homotopies of parallel cones is torsorial

```agda
module _
  {l1 l2 l3 l4 : Level}
  {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4}
  {f : A  X} {g : B  X}
  where

  refl-htpy-parallel-cone :
    (c : cone f g C) 
    htpy-parallel-cone (refl-htpy' f) (refl-htpy' g) c c
  pr1 (refl-htpy-parallel-cone c) = refl-htpy
  pr1 (pr2 (refl-htpy-parallel-cone c)) = refl-htpy
  pr2 (pr2 (refl-htpy-parallel-cone c)) = right-unit-htpy

  htpy-eq-degenerate-parallel-cone :
    (c c' : cone f g C) 
    c  c' 
    htpy-parallel-cone (refl-htpy' f) (refl-htpy' g) c c'
  htpy-eq-degenerate-parallel-cone c .c refl = refl-htpy-parallel-cone c

  htpy-parallel-cone-refl-htpy-htpy-cone :
    (c c' : cone f g C) 
    htpy-cone f g c c' 
    htpy-parallel-cone (refl-htpy' f) (refl-htpy' g) c c'
  htpy-parallel-cone-refl-htpy-htpy-cone (p , q , H) (p' , q' , H') =
    tot
      ( λ K 
        tot
          ( λ L M 
            ( ap-concat-htpy H right-unit-htpy) ∙h
            ( M ∙h ap-concat-htpy' H' inv-htpy-right-unit-htpy)))

  abstract
    is-equiv-htpy-parallel-cone-refl-htpy-htpy-cone :
      (c c' : cone f g C) 
      is-equiv (htpy-parallel-cone-refl-htpy-htpy-cone c c')
    is-equiv-htpy-parallel-cone-refl-htpy-htpy-cone (p , q , H) (p' , q' , H') =
      is-equiv-tot-is-fiberwise-equiv
        ( λ K 
          is-equiv-tot-is-fiberwise-equiv
            ( λ L 
              is-equiv-comp
                ( concat-htpy
                  ( ap-concat-htpy H right-unit-htpy)
                  ( (f ·l K) ∙h refl-htpy ∙h H'))
                ( concat-htpy'
                  ( H ∙h (g ·l L))
                  ( ap-concat-htpy' H' inv-htpy-right-unit-htpy))
                ( is-equiv-concat-htpy'
                  ( H ∙h (g ·l L))
                  ( λ x  right-whisker-concat (inv right-unit) (H' x)))
                ( is-equiv-concat-htpy
                  ( λ x  left-whisker-concat (H x) right-unit)
                  ( (f ·l K) ∙h refl-htpy ∙h H'))))

  abstract
    is-torsorial-htpy-parallel-cone-refl-htpy-refl-htpy :
      (c : cone f g C) 
      is-torsorial (htpy-parallel-cone (refl-htpy' f) (refl-htpy' g) c)
    is-torsorial-htpy-parallel-cone-refl-htpy-refl-htpy c =
      is-contr-is-equiv'
        ( Σ (cone f g C) (htpy-cone f g c))
        ( tot (htpy-parallel-cone-refl-htpy-htpy-cone c))
        ( is-equiv-tot-is-fiberwise-equiv
          ( is-equiv-htpy-parallel-cone-refl-htpy-htpy-cone c))
        ( is-torsorial-htpy-cone f g c)

  abstract
    is-torsorial-htpy-parallel-cone-refl-htpy :
      {g' : B  X} (Hg : g ~ g') (c : cone f g C) 
      is-torsorial (htpy-parallel-cone (refl-htpy' f) Hg c)
    is-torsorial-htpy-parallel-cone-refl-htpy =
      ind-htpy
        ( g)
        ( λ g'' Hg' 
          (c : cone f g C) 
          is-torsorial (htpy-parallel-cone (refl-htpy' f) Hg' c))
        ( is-torsorial-htpy-parallel-cone-refl-htpy-refl-htpy)

  abstract
    is-torsorial-htpy-parallel-cone :
      {f' : A  X} (Hf : f ~ f') {g' : B  X} (Hg : g ~ g') (c : cone f g C) 
      is-torsorial (htpy-parallel-cone Hf Hg c)
    is-torsorial-htpy-parallel-cone Hf {g'} =
      ind-htpy
        ( f)
        ( λ f'' Hf' 
          (g' : B  X) (Hg : g ~ g') (c : cone f g C) 
          is-contr (Σ (cone f'' g' C) (htpy-parallel-cone Hf' Hg c)))
        ( λ g' Hg  is-torsorial-htpy-parallel-cone-refl-htpy Hg)
        ( Hf)
        ( g')
```

#### The type family of homotopies of parallel cones characterizes dependent identifications of cones on the same domain over parallel cospans

```agda
module _
  {l1 l2 l3 l4 : Level}
  {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4}
  {f : A  X} {g : B  X}
  where

  tr-right-tr-left-cone-eq-htpy :
    {f' : A  X}  f ~ f'  {g' : B  X}  g ~ g'  cone f g C  cone f' g' C
  tr-right-tr-left-cone-eq-htpy {f'} Hf Hg c =
    tr
      ( λ y  cone f' y C)
      ( eq-htpy Hg)
      ( tr  x  cone x g C) (eq-htpy Hf) c)

  compute-tr-right-tr-left-cone-eq-htpy-refl-htpy :
    (c : cone f g C) 
    tr-right-tr-left-cone-eq-htpy refl-htpy refl-htpy c  c
  compute-tr-right-tr-left-cone-eq-htpy-refl-htpy c =
    ( ap
      ( λ t 
        tr
          ( λ g''  cone f g'' C)
          ( t)
          ( tr  x  cone x g C) (eq-htpy (refl-htpy' f)) c))
      ( eq-htpy-refl-htpy g)) 
    ( ap  t  tr  f'''  cone f''' g C) t c) (eq-htpy-refl-htpy f))

  htpy-eq-parallel-cone-refl-htpy :
    (c c' : cone f g C) 
    tr-right-tr-left-cone-eq-htpy refl-htpy refl-htpy c  c' 
    htpy-parallel-cone (refl-htpy' f) (refl-htpy' g) c c'
  htpy-eq-parallel-cone-refl-htpy c c' =
    map-inv-is-equiv-precomp-Π-is-equiv
      ( is-equiv-concat (compute-tr-right-tr-left-cone-eq-htpy-refl-htpy c) c')
      ( λ p  htpy-parallel-cone (refl-htpy' f) (refl-htpy' g) c c')
      ( htpy-eq-degenerate-parallel-cone c c')

  left-map-triangle-eq-parallel-cone-refl-htpy :
    (c c' : cone f g C) 
    ( ( htpy-eq-parallel-cone-refl-htpy c c') 
      ( concat (compute-tr-right-tr-left-cone-eq-htpy-refl-htpy c) c')) ~
    ( htpy-eq-degenerate-parallel-cone c c')
  left-map-triangle-eq-parallel-cone-refl-htpy c c' =
    is-section-map-inv-is-equiv-precomp-Π-is-equiv
      ( is-equiv-concat (compute-tr-right-tr-left-cone-eq-htpy-refl-htpy c) c')
      ( λ p  htpy-parallel-cone (refl-htpy' f) (refl-htpy' g) c c')
      ( htpy-eq-degenerate-parallel-cone c c')

  abstract
    htpy-parallel-cone-dependent-eq' :
      {g' : B  X} (Hg : g ~ g') 
      (c : cone f g C) (c' : cone f g' C) 
      tr-right-tr-left-cone-eq-htpy refl-htpy Hg c  c' 
      htpy-parallel-cone (refl-htpy' f) Hg c c'
    htpy-parallel-cone-dependent-eq' =
      ind-htpy g
        ( λ g'' Hg' 
          ( c : cone f g C) (c' : cone f g'' C) 
          tr-right-tr-left-cone-eq-htpy refl-htpy Hg' c  c' 
          htpy-parallel-cone refl-htpy Hg' c c')
        ( htpy-eq-parallel-cone-refl-htpy)

    left-map-triangle-parallel-cone-eq' :
      (c c' : cone f g C) 
      ( ( htpy-parallel-cone-dependent-eq' refl-htpy c c') 
        ( concat (compute-tr-right-tr-left-cone-eq-htpy-refl-htpy c) c')) ~
      ( htpy-eq-degenerate-parallel-cone c c')
    left-map-triangle-parallel-cone-eq' c c' =
      ( right-whisker-comp
        ( multivariable-htpy-eq 3
          ( compute-ind-htpy g
            ( λ g'' Hg' 
              ( c : cone f g C) (c' : cone f g'' C) 
              tr-right-tr-left-cone-eq-htpy refl-htpy Hg' c  c' 
              htpy-parallel-cone refl-htpy Hg' c c')
            ( htpy-eq-parallel-cone-refl-htpy))
          ( c)
          ( c'))
        ( concat (compute-tr-right-tr-left-cone-eq-htpy-refl-htpy c) c')) ∙h
      ( left-map-triangle-eq-parallel-cone-refl-htpy c c')

  abstract
    htpy-parallel-cone-dependent-eq :
      {f' : A  X} (Hf : f ~ f') {g' : B  X} (Hg : g ~ g') 
      (c : cone f g C) (c' : cone f' g' C) 
      tr-right-tr-left-cone-eq-htpy Hf Hg c  c' 
      htpy-parallel-cone Hf Hg c c'
    htpy-parallel-cone-dependent-eq {f'} Hf {g'} Hg c c' p =
      ind-htpy f
        ( λ f'' Hf' 
          ( g' : B  X) (Hg : g ~ g') (c : cone f g C) (c' : cone f'' g' C) 
          ( tr-right-tr-left-cone-eq-htpy Hf' Hg c  c') 
          htpy-parallel-cone Hf' Hg c c')
        ( λ g'  htpy-parallel-cone-dependent-eq' {g' = g'})
        Hf g' Hg c c' p

    left-map-triangle-parallel-cone-eq :
      (c c' : cone f g C) 
      ( ( htpy-parallel-cone-dependent-eq refl-htpy refl-htpy c c') 
        ( concat (compute-tr-right-tr-left-cone-eq-htpy-refl-htpy c) c')) ~
      ( htpy-eq-degenerate-parallel-cone c c')
    left-map-triangle-parallel-cone-eq c c' =
      ( right-whisker-comp
        ( multivariable-htpy-eq 5
          ( compute-ind-htpy f
            ( λ f'' Hf' 
              ( g' : B  X) (Hg : g ~ g')
              (c : cone f g C) (c' : cone f'' g' C) 
              ( tr-right-tr-left-cone-eq-htpy Hf' Hg c  c') 
              htpy-parallel-cone Hf' Hg c c')
            ( λ g'  htpy-parallel-cone-dependent-eq' {g' = g'}))
          ( g)
          ( refl-htpy)
          ( c)
          ( c'))
        ( concat (compute-tr-right-tr-left-cone-eq-htpy-refl-htpy c) c')) ∙h
      ( left-map-triangle-parallel-cone-eq' c c')

  abstract
    is-fiberwise-equiv-htpy-parallel-cone-dependent-eq :
      {f' : A  X} (Hf : f ~ f') {g' : B  X} (Hg : g ~ g') 
      (c : cone f g C) (c' : cone f' g' C) 
      is-equiv (htpy-parallel-cone-dependent-eq Hf Hg c c')
    is-fiberwise-equiv-htpy-parallel-cone-dependent-eq {f'} Hf {g'} Hg c c' =
      ind-htpy f
        ( λ f' Hf 
          ( g' : B  X) (Hg : g ~ g') (c : cone f g C) (c' : cone f' g' C) 
            is-equiv (htpy-parallel-cone-dependent-eq Hf Hg c c'))
        ( λ g' Hg c c' 
          ind-htpy g
            ( λ g' Hg 
              ( c : cone f g C) (c' : cone f g' C) 
                is-equiv (htpy-parallel-cone-dependent-eq refl-htpy Hg c c'))
            ( λ c c' 
              is-equiv-right-map-triangle
                ( htpy-eq-degenerate-parallel-cone c c')
                ( htpy-parallel-cone-dependent-eq refl-htpy refl-htpy c c')
                ( concat (compute-tr-right-tr-left-cone-eq-htpy-refl-htpy c) c')
                ( inv-htpy (left-map-triangle-parallel-cone-eq c c'))
                ( fundamental-theorem-id
                  ( is-torsorial-htpy-parallel-cone
                    ( refl-htpy' f)
                    ( refl-htpy' g)
                    ( c))
                  ( htpy-eq-degenerate-parallel-cone c) c')
                ( is-equiv-concat
                  ( compute-tr-right-tr-left-cone-eq-htpy-refl-htpy c)
                  ( c')))
            ( Hg)
            ( c)
            ( c'))
        ( Hf)
        ( g')
        ( Hg)
        ( c)
        ( c')

  dependent-eq-htpy-parallel-cone :
    {f' : A  X} (Hf : f ~ f') {g' : B  X} (Hg : g ~ g') 
    (c : cone f g C) (c' : cone f' g' C) 
    htpy-parallel-cone Hf Hg c c' 
    tr-right-tr-left-cone-eq-htpy Hf Hg c  c'
  dependent-eq-htpy-parallel-cone Hf Hg c c' =
    map-inv-is-equiv
      ( is-fiberwise-equiv-htpy-parallel-cone-dependent-eq Hf Hg c c')
```

## Table of files about pullbacks

The following table lists files that are about pullbacks as a general concept.

{{#include tables/pullbacks.md}}