# The induction principle of pushouts

```agda
module synthetic-homotopy-theory.induction-principle-pushouts where
```

<details><summary>Imports</summary>

```agda
open import foundation.dependent-pair-types
open import foundation.identity-types
open import foundation.sections
open import foundation.universe-levels

open import synthetic-homotopy-theory.cocones-under-spans
open import synthetic-homotopy-theory.dependent-cocones-under-spans
```

</details>

## Idea

The **induction principle of pushouts** asserts that for every
[dependent cocone](synthetic-homotopy-theory.dependent-cocones-under-spans.md)
of a type family `P` over a type `X` equipped with a
[cocone](synthetic-homotopy-theory.cocones-under-spans.md) `c` there is a
section of `P` corresponding to `c`. More precisely, it asserts that the map

```text
  dependent-cocone-map f g c P : ((x : X) → P x) → dependent-cocone f g c P
```

has a [section](foundation.sections.md).

The fact that the induction principle of pushouts is
[logically equivalent](foundation.logical-equivalences.md) to the
[dependent universal property](synthetic-homotopy-theory.dependent-universal-property-pushouts.md)
of pushouts is shown in
[`dependent-universal-property-pushouts`](synthetic-homotopy-theory.dependent-universal-property-pushouts.md).

## Definition

### The induction principle of pushouts

```agda
induction-principle-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) 
  UUω
induction-principle-pushout {X = X} f g c =
  {l : Level} (P : X  UU l)  section (dependent-cocone-map f g c P)

module _
  { 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)
  ( ind-c : induction-principle-pushout f g c)
  {l : Level} ( P : X  UU l)
  where

  ind-induction-principle-pushout : dependent-cocone f g c P  (x : X)  P x
  ind-induction-principle-pushout = pr1 (ind-c P)

  eq-compute-ind-induction-principle-pushout :
    (h : dependent-cocone f g c P) 
    dependent-cocone-map f g c P (ind-induction-principle-pushout h)  h
  eq-compute-ind-induction-principle-pushout = pr2 (ind-c P)

  compute-ind-induction-principle-pushout :
    (h : dependent-cocone f g c P) 
    htpy-dependent-cocone f g c P
      ( dependent-cocone-map f g c P (ind-induction-principle-pushout h))
      ( h)
  compute-ind-induction-principle-pushout h =
    htpy-eq-dependent-cocone f g c P
      ( dependent-cocone-map f g c P (ind-induction-principle-pushout h))
      ( h)
      ( eq-compute-ind-induction-principle-pushout h)

  compute-horizontal-map-ind-induction-principle-pushout :
    ( h : dependent-cocone f g c P) (a : A) 
    ind-induction-principle-pushout h (horizontal-map-cocone f g c a) 
    horizontal-map-dependent-cocone f g c P h a
  compute-horizontal-map-ind-induction-principle-pushout h =
    pr1 (compute-ind-induction-principle-pushout h)

  compute-vertical-map-ind-induction-principle-pushout :
    ( h : dependent-cocone f g c P) (b : B) 
    ind-induction-principle-pushout h (vertical-map-cocone f g c b) 
    vertical-map-dependent-cocone f g c P h b
  compute-vertical-map-ind-induction-principle-pushout h =
    pr1 (pr2 (compute-ind-induction-principle-pushout h))

  compute-glue-ind-induction-principle-pushout :
    (h : dependent-cocone f g c P) 
    coherence-htpy-dependent-cocone f g c P
      ( dependent-cocone-map f g c P (ind-induction-principle-pushout h))
      ( h)
      ( compute-horizontal-map-ind-induction-principle-pushout h)
      ( compute-vertical-map-ind-induction-principle-pushout h)
  compute-glue-ind-induction-principle-pushout h =
    pr2 (pr2 (compute-ind-induction-principle-pushout h))
```