# The dependent binomial theorem for types (distributivity of dependent function types over coproduct types)

```agda
module foundation.dependent-binomial-theorem where
```

<details><summary>Imports</summary>

```agda
open import foundation.action-on-identifications-functions
open import foundation.contractible-types
open import foundation.coproduct-decompositions
open import foundation.dependent-pair-types
open import foundation.equality-dependent-pair-types
open import foundation.functoriality-cartesian-product-types
open import foundation.functoriality-dependent-function-types
open import foundation.raising-universe-levels
open import foundation.transport-along-identifications
open import foundation.universal-property-coproduct-types
open import foundation.universal-property-dependent-pair-types
open import foundation.universe-levels

open import foundation-core.cartesian-product-types
open import foundation-core.coproduct-types
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.homotopies
open import foundation-core.type-theoretic-principle-of-choice
open import foundation-core.univalence

open import univalent-combinatorics.equality-standard-finite-types
open import univalent-combinatorics.standard-finite-types
```

</details>

## Idea

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

  fam-coproduct :
    Fin 2  UU (l1  l2)
  fam-coproduct (inl (inr _)) = raise l2 A
  fam-coproduct (inr _) = raise l1 B

  map-compute-total-fam-coproduct :
    Σ (Fin 2) fam-coproduct  A + B
  map-compute-total-fam-coproduct (pair (inl (inr _)) y) = inl (map-inv-raise y)
  map-compute-total-fam-coproduct (pair (inr _) y) = inr (map-inv-raise y)

  map-inv-compute-total-fam-coproduct :
    A + B  Σ (Fin 2) fam-coproduct
  pr1 (map-inv-compute-total-fam-coproduct (inl x)) = zero-Fin 1
  pr2 (map-inv-compute-total-fam-coproduct (inl x)) = map-raise x
  pr1 (map-inv-compute-total-fam-coproduct (inr x)) = one-Fin 1
  pr2 (map-inv-compute-total-fam-coproduct (inr x)) = map-raise x

  is-section-map-inv-compute-total-fam-coproduct :
    (map-compute-total-fam-coproduct  map-inv-compute-total-fam-coproduct) ~ id
  is-section-map-inv-compute-total-fam-coproduct (inl x) =
    ap inl (is-retraction-map-inv-raise {l2} x)
  is-section-map-inv-compute-total-fam-coproduct (inr x) =
    ap inr (is-retraction-map-inv-raise {l1} x)

  is-retraction-map-inv-compute-total-fam-coproduct :
    map-inv-compute-total-fam-coproduct  map-compute-total-fam-coproduct ~ id
  is-retraction-map-inv-compute-total-fam-coproduct (pair (inl (inr _)) y) =
    eq-pair-eq-fiber (is-section-map-inv-raise y)
  is-retraction-map-inv-compute-total-fam-coproduct (pair (inr _) y) =
    eq-pair-eq-fiber (is-section-map-inv-raise y)

  is-equiv-map-compute-total-fam-coproduct :
    is-equiv map-compute-total-fam-coproduct
  is-equiv-map-compute-total-fam-coproduct =
    is-equiv-is-invertible
      map-inv-compute-total-fam-coproduct
      is-section-map-inv-compute-total-fam-coproduct
      is-retraction-map-inv-compute-total-fam-coproduct

  compute-total-fam-coproduct :
    (Σ (Fin 2) fam-coproduct)  (A + B)
  pr1 compute-total-fam-coproduct = map-compute-total-fam-coproduct
  pr2 compute-total-fam-coproduct = is-equiv-map-compute-total-fam-coproduct

  inv-compute-total-fam-coproduct :
    (A + B)  Σ (Fin 2) fam-coproduct
  inv-compute-total-fam-coproduct =
    inv-equiv compute-total-fam-coproduct

module _
  {l1 l2 l3 : Level} {X : UU l1} {A : X  UU l2} {B : X  UU l3}
  where

  type-distributive-Π-coproduct : UU (l1  l2  l3)
  type-distributive-Π-coproduct =
    Σ ( X  Fin 2)
      ( λ f  ((x : X) (p : is-zero-Fin 2 (f x))  A x) ×
              ((x : X) (p : is-one-Fin 2 (f x))  B x))

  distributive-Π-coproduct :
    ((x : X)  A x + B x)  type-distributive-Π-coproduct
  distributive-Π-coproduct =
    ( ( equiv-tot
        ( λ f 
          ( ( equiv-product
              ( equiv-Π-equiv-family
                ( λ x 
                  equiv-Π-equiv-family
                    ( λ p 
                      ( inv-equiv (compute-raise l3 (A x))) ∘e
                      ( equiv-tr (fam-coproduct (A x) (B x)) p))))
              ( equiv-Π-equiv-family
                ( λ x 
                  equiv-Π-equiv-family
                    ( λ p 
                      ( inv-equiv (compute-raise l2 (B x))) ∘e
                      ( equiv-tr (fam-coproduct (A x) (B x)) p))))) ∘e
            ( distributive-Π-Σ)) ∘e
          ( equiv-Π-equiv-family
            ( λ x 
              ( equiv-universal-property-coproduct
                ( fam-coproduct (A x) (B x) (f x))) ∘e
              ( equiv-diagonal-exponential-is-contr
                ( fam-coproduct (A x) (B x) (f x))
                ( is-contr-is-zero-or-one-Fin-two-ℕ (f x))))))) ∘e
      ( distributive-Π-Σ)) ∘e
    ( equiv-Π-equiv-family
      ( λ x  inv-compute-total-fam-coproduct (A x) (B x)))

  type-distributive-Π-coproduct-binary-coproduct-Decomposition :
    UU (l1  l2  l3  lsuc l1  lsuc l1)
  type-distributive-Π-coproduct-binary-coproduct-Decomposition =
    Σ ( binary-coproduct-Decomposition l1 l1 X)
      ( λ d 
        ( ( (u : left-summand-binary-coproduct-Decomposition d) 
            ( A
              ( map-inv-equiv
                ( matching-correspondence-binary-coproduct-Decomposition d)
                ( inl u)))) ×
          ( ( v : right-summand-binary-coproduct-Decomposition d) 
            ( B
              ( map-inv-equiv
                ( matching-correspondence-binary-coproduct-Decomposition d)
                ( inr v))))))

  equiv-type-distributive-Π-coproduct-binary-coproduct-Decomposition :
    type-distributive-Π-coproduct 
    type-distributive-Π-coproduct-binary-coproduct-Decomposition
  equiv-type-distributive-Π-coproduct-binary-coproduct-Decomposition =
    equiv-Σ
    ( λ d 
      ( (u : left-summand-binary-coproduct-Decomposition d) 
        A
          ( map-inv-equiv
            ( matching-correspondence-binary-coproduct-Decomposition d)
            ( inl u))) ×
      ( (v : right-summand-binary-coproduct-Decomposition d) 
        B
          ( map-inv-equiv
            ( matching-correspondence-binary-coproduct-Decomposition d)
            ( inr v))))
      ( equiv-binary-coproduct-Decomposition-map-into-Fin-Two-ℕ X)
      ( λ f 
        equiv-product
          ( equiv-Π
              ( λ z 
                  A
                  ( map-inv-equiv
                    ( matching-correspondence-binary-coproduct-Decomposition-map-into-Fin-Two-ℕ
                      ( X)
                      ( f))
                    ( inl z)))
              ( id-equiv)
              ( λ a 
                equiv-eq
                  ( ap
                      ( A)
                      ( compute-left-inv-matching-correspondence-binary-coporducd-Decomposition-map-into-Fin-Two-ℕ
                        ( X)
                        ( f)
                        ( a)))) ∘e
            inv-equiv equiv-ev-pair)
          ( equiv-Π
              ( λ z 
                  B
                  ( map-inv-equiv
                    ( matching-correspondence-binary-coproduct-Decomposition-map-into-Fin-Two-ℕ
                      X f)
                    ( inr z)))
              ( id-equiv)
              ( λ a 
                equiv-eq
                  ( ap
                      ( B)
                      ( compute-right-inv-matching-correspondence-binary-coporducd-Decomposition-map-into-Fin-Two-ℕ
                        ( X)
                        ( f)
                        ( a)))) ∘e
            inv-equiv equiv-ev-pair))

  distributive-Π-coproduct-binary-coproduct-Decomposition :
    ((x : X)  A x + B x) 
    type-distributive-Π-coproduct-binary-coproduct-Decomposition
  distributive-Π-coproduct-binary-coproduct-Decomposition =
    equiv-type-distributive-Π-coproduct-binary-coproduct-Decomposition ∘e
    distributive-Π-coproduct
```