# Coproduct decompositions in a subuniverse

```agda
module foundation.coproduct-decompositions-subuniverse where
```

<details><summary>Imports</summary>

```agda
open import foundation.coproduct-types
open import foundation.dependent-pair-types
open import foundation.empty-types
open import foundation.equivalence-extensionality
open import foundation.equivalences
open import foundation.functoriality-coproduct-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.structure-identity-principle
open import foundation.subuniverses
open import foundation.type-arithmetic-cartesian-product-types
open import foundation.type-arithmetic-coproduct-types
open import foundation.type-arithmetic-dependent-pair-types
open import foundation.type-arithmetic-empty-type
open import foundation.univalence
open import foundation.universe-levels

open import foundation-core.cartesian-product-types
open import foundation-core.equality-dependent-pair-types
open import foundation-core.function-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import foundation-core.propositions
open import foundation-core.torsorial-type-families
```

</details>

## Idea

Let `P` be a subuniverse and `X` a type in `P`. A binary coproduct decomposition
of `X` is defined to be two types `A` and `B` in `P` and an equivalence from `X`
to `A+B`.

## Definitions

### Binary coproduct decomposition

```agda
module _
  {l1 l2 : Level} (P : subuniverse l1 l2) (X : type-subuniverse P)
  where

  binary-coproduct-Decomposition-subuniverse : UU (lsuc l1  l2)
  binary-coproduct-Decomposition-subuniverse =
    Σ ( type-subuniverse P)
      ( λ k1 
        Σ ( type-subuniverse P)
          ( λ k2 
            ( inclusion-subuniverse P X) 
            ( inclusion-subuniverse P k1 + inclusion-subuniverse P k2)))

module _
  {l1 l2 : Level} (P : subuniverse l1 l2) (X : type-subuniverse P)
  (d : binary-coproduct-Decomposition-subuniverse P X)
  where

  left-summand-binary-coproduct-Decomposition-subuniverse : type-subuniverse P
  left-summand-binary-coproduct-Decomposition-subuniverse = pr1 d

  type-left-summand-binary-coproduct-Decomposition-subuniverse : UU l1
  type-left-summand-binary-coproduct-Decomposition-subuniverse =
    inclusion-subuniverse P
      left-summand-binary-coproduct-Decomposition-subuniverse

  right-summand-binary-coproduct-Decomposition-subuniverse : type-subuniverse P
  right-summand-binary-coproduct-Decomposition-subuniverse = pr1 (pr2 d)

  type-right-summand-binary-coproduct-Decomposition-subuniverse : UU l1
  type-right-summand-binary-coproduct-Decomposition-subuniverse =
    inclusion-subuniverse P
      right-summand-binary-coproduct-Decomposition-subuniverse

  matching-correspondence-binary-coproduct-Decomposition-subuniverse :
    inclusion-subuniverse P X 
    ( type-left-summand-binary-coproduct-Decomposition-subuniverse +
      type-right-summand-binary-coproduct-Decomposition-subuniverse)
  matching-correspondence-binary-coproduct-Decomposition-subuniverse =
    pr2 (pr2 d)
```

### Iterated binary coproduct decompositions

```agda
module _
  {l1 l2 : Level} (P : subuniverse l1 l2) (X : type-subuniverse P)
  where

  left-iterated-binary-coproduct-Decomposition-subuniverse : UU (lsuc l1  l2)
  left-iterated-binary-coproduct-Decomposition-subuniverse =
    Σ ( binary-coproduct-Decomposition-subuniverse P X)
      ( λ d 
        binary-coproduct-Decomposition-subuniverse P
          ( left-summand-binary-coproduct-Decomposition-subuniverse P X d))

  right-iterated-binary-coproduct-Decomposition-subuniverse : UU (lsuc l1  l2)
  right-iterated-binary-coproduct-Decomposition-subuniverse =
    Σ ( binary-coproduct-Decomposition-subuniverse P X)
      ( λ d 
        binary-coproduct-Decomposition-subuniverse P
          ( right-summand-binary-coproduct-Decomposition-subuniverse P X d))
```

### Ternary coproduct Decomposition-subuniverses

```agda
module _
  {l1 l2 : Level} (P : subuniverse l1 l2) (X : type-subuniverse P)
  where

  ternary-coproduct-Decomposition-subuniverse : UU (lsuc l1  l2)
  ternary-coproduct-Decomposition-subuniverse =
    Σ ( type-subuniverse P × (type-subuniverse P × type-subuniverse P))
      ( λ x 
        inclusion-subuniverse P X 
        ( inclusion-subuniverse P (pr1 x) +
          ( inclusion-subuniverse P (pr1 (pr2 x)) +
            inclusion-subuniverse P (pr2 (pr2 x)))))

  module _
    (d : ternary-coproduct-Decomposition-subuniverse)
    where

    types-ternary-coproduct-Decomposition-subuniverse :
      type-subuniverse P × (type-subuniverse P × type-subuniverse P)
    types-ternary-coproduct-Decomposition-subuniverse = pr1 d

    first-summand-ternary-coproduct-Decomposition-subuniverse :
      type-subuniverse P
    first-summand-ternary-coproduct-Decomposition-subuniverse =
      ( pr1 types-ternary-coproduct-Decomposition-subuniverse)

    second-summand-ternary-coproduct-Decomposition-subuniverse :
      type-subuniverse P
    second-summand-ternary-coproduct-Decomposition-subuniverse =
      ( pr1 (pr2 types-ternary-coproduct-Decomposition-subuniverse))

    third-summand-ternary-coproduct-Decomposition-subuniverse :
      type-subuniverse P
    third-summand-ternary-coproduct-Decomposition-subuniverse =
      ( pr2 (pr2 types-ternary-coproduct-Decomposition-subuniverse))

    matching-correspondence-ternary-coproductuct-Decomposition-subuniverse :
      ( inclusion-subuniverse P X) 
      ( ( inclusion-subuniverse P
          first-summand-ternary-coproduct-Decomposition-subuniverse) +
        ( ( inclusion-subuniverse P
            second-summand-ternary-coproduct-Decomposition-subuniverse) +
          ( inclusion-subuniverse P
            third-summand-ternary-coproduct-Decomposition-subuniverse)))
    matching-correspondence-ternary-coproductuct-Decomposition-subuniverse =
      pr2 d
```

## Propositions

### Characterization of equality of binary coproduct Decomposition of subuniverse

```agda
equiv-binary-coproduct-Decomposition-subuniverse :
  {l1 l2 : Level} (P : subuniverse l1 l2) (A : type-subuniverse P)
  (X : binary-coproduct-Decomposition-subuniverse P A)
  (Y : binary-coproduct-Decomposition-subuniverse P A) 
  UU (l1)
equiv-binary-coproduct-Decomposition-subuniverse P A X Y =
  Σ ( type-left-summand-binary-coproduct-Decomposition-subuniverse P A X 
      type-left-summand-binary-coproduct-Decomposition-subuniverse P A Y)
    ( λ el 
      Σ ( type-right-summand-binary-coproduct-Decomposition-subuniverse P A X 
          type-right-summand-binary-coproduct-Decomposition-subuniverse P A Y)
        ( λ er 
          ( map-coproduct (map-equiv el) (map-equiv er) 
            map-equiv
              ( matching-correspondence-binary-coproduct-Decomposition-subuniverse
                  P A X)) ~
          ( map-equiv
            ( matching-correspondence-binary-coproduct-Decomposition-subuniverse
                P A Y))))

module _
  {l1 l2 : Level} (P : subuniverse l1 l2) (A : type-subuniverse P)
  (X : binary-coproduct-Decomposition-subuniverse P A)
  (Y : binary-coproduct-Decomposition-subuniverse P A)
  (e : equiv-binary-coproduct-Decomposition-subuniverse P A X Y)
  where

  equiv-left-summand-equiv-binary-coproduct-Decomposition-subuniverse :
    type-left-summand-binary-coproduct-Decomposition-subuniverse P A X 
    type-left-summand-binary-coproduct-Decomposition-subuniverse P A Y
  equiv-left-summand-equiv-binary-coproduct-Decomposition-subuniverse = pr1 e

  map-equiv-left-summand-equiv-binary-coproduct-Decomposition-subuniverse :
    type-left-summand-binary-coproduct-Decomposition-subuniverse P A X 
    type-left-summand-binary-coproduct-Decomposition-subuniverse P A Y
  map-equiv-left-summand-equiv-binary-coproduct-Decomposition-subuniverse =
    map-equiv
      equiv-left-summand-equiv-binary-coproduct-Decomposition-subuniverse

  equiv-right-summand-equiv-binary-coproduct-Decomposition-subuniverse :
    type-right-summand-binary-coproduct-Decomposition-subuniverse P A X 
    type-right-summand-binary-coproduct-Decomposition-subuniverse P A Y
  equiv-right-summand-equiv-binary-coproduct-Decomposition-subuniverse =
    pr1 (pr2 e)

  map-equiv-right-summand-equiv-binary-coproduct-Decomposition-subuniverse :
    type-right-summand-binary-coproduct-Decomposition-subuniverse P A X 
    type-right-summand-binary-coproduct-Decomposition-subuniverse P A Y
  map-equiv-right-summand-equiv-binary-coproduct-Decomposition-subuniverse =
    map-equiv
      equiv-right-summand-equiv-binary-coproduct-Decomposition-subuniverse

module _
  {l1 l2 : Level} (P : subuniverse l1 l2) (A : type-subuniverse P)
  (X : binary-coproduct-Decomposition-subuniverse P A)
  where

  id-equiv-binary-coproduct-Decomposition-subuniverse :
    equiv-binary-coproduct-Decomposition-subuniverse P A X X
  pr1 id-equiv-binary-coproduct-Decomposition-subuniverse = id-equiv
  pr1 (pr2 id-equiv-binary-coproduct-Decomposition-subuniverse) = id-equiv
  pr2 (pr2 id-equiv-binary-coproduct-Decomposition-subuniverse) x =
    id-map-coproduct
      ( type-left-summand-binary-coproduct-Decomposition-subuniverse P A X)
      ( type-right-summand-binary-coproduct-Decomposition-subuniverse P A X)
      ( map-equiv
        ( matching-correspondence-binary-coproduct-Decomposition-subuniverse
          P A X)
        ( x))

  is-torsorial-equiv-binary-coproduct-Decomposition-subuniverse :
    is-torsorial (equiv-binary-coproduct-Decomposition-subuniverse P A X)
  is-torsorial-equiv-binary-coproduct-Decomposition-subuniverse =
    is-torsorial-Eq-structure
      ( is-torsorial-equiv-subuniverse P
        ( left-summand-binary-coproduct-Decomposition-subuniverse P A X))
      ( left-summand-binary-coproduct-Decomposition-subuniverse P A X ,
        id-equiv)
      ( is-torsorial-Eq-structure
        ( is-torsorial-equiv-subuniverse P
          ( right-summand-binary-coproduct-Decomposition-subuniverse P A X))
        ( right-summand-binary-coproduct-Decomposition-subuniverse P A X ,
          id-equiv)
        ( is-torsorial-htpy-equiv
          ( equiv-coproduct id-equiv id-equiv ∘e
            matching-correspondence-binary-coproduct-Decomposition-subuniverse
              P A X)))

  equiv-eq-binary-coproduct-Decomposition-subuniverse :
    (Y : binary-coproduct-Decomposition-subuniverse P A)  (X  Y) 
    equiv-binary-coproduct-Decomposition-subuniverse P A X Y
  equiv-eq-binary-coproduct-Decomposition-subuniverse .X refl =
    id-equiv-binary-coproduct-Decomposition-subuniverse

  is-equiv-equiv-eq-binary-coproduct-Decomposition-subuniverse :
    (Y : binary-coproduct-Decomposition-subuniverse P A) 
    is-equiv (equiv-eq-binary-coproduct-Decomposition-subuniverse Y)
  is-equiv-equiv-eq-binary-coproduct-Decomposition-subuniverse =
    fundamental-theorem-id
      is-torsorial-equiv-binary-coproduct-Decomposition-subuniverse
      equiv-eq-binary-coproduct-Decomposition-subuniverse

  extensionality-binary-coproduct-Decomposition-subuniverse :
    (Y : binary-coproduct-Decomposition-subuniverse P A) 
    (X  Y)  equiv-binary-coproduct-Decomposition-subuniverse P A X Y
  pr1 (extensionality-binary-coproduct-Decomposition-subuniverse Y) =
    equiv-eq-binary-coproduct-Decomposition-subuniverse Y
  pr2 (extensionality-binary-coproduct-Decomposition-subuniverse Y) =
    is-equiv-equiv-eq-binary-coproduct-Decomposition-subuniverse Y

  eq-equiv-binary-coproduct-Decomposition-subuniverse :
    (Y : binary-coproduct-Decomposition-subuniverse P A) 
    equiv-binary-coproduct-Decomposition-subuniverse P A X Y  (X  Y)
  eq-equiv-binary-coproduct-Decomposition-subuniverse Y =
    map-inv-equiv (extensionality-binary-coproduct-Decomposition-subuniverse Y)
```

### Equivalence between binary coproduct Decomposition-subuniverse induce by commutativiy of coproduct

```agda
module _
  {l1 l2 : Level} (P : subuniverse l1 l2) (X : type-subuniverse P)
  where

  equiv-commutative-binary-coproduct-Decomposition-subuniverse :
    binary-coproduct-Decomposition-subuniverse P X 
    binary-coproduct-Decomposition-subuniverse P X
  equiv-commutative-binary-coproduct-Decomposition-subuniverse =
    ( associative-Σ
      ( type-subuniverse P)
      ( λ _  type-subuniverse P)
      ( _)) ∘e
    ( ( equiv-Σ
        ( _)
        ( commutative-product)
        ( λ x 
          equiv-postcomp-equiv
            ( commutative-coproduct
              ( inclusion-subuniverse P (pr1 x))
              ( inclusion-subuniverse P (pr2 x)))
            (inclusion-subuniverse P X))) ∘e
      ( ( inv-associative-Σ
          ( type-subuniverse P)
          ( λ _  type-subuniverse P)
          ( _))))
```

### Equivalence between iterated coproduct and ternary coproduct decomposition

```agda
module _
  {l1 l2 : Level} (P : subuniverse l1 l2) (X : type-subuniverse P)
  (C1 : is-closed-under-coproducts-subuniverse P)
  where

  private
    map-reassociate-left-iterated-coproduct-Decomposition-subuniverse :
      left-iterated-binary-coproduct-Decomposition-subuniverse P X 
      Σ ( type-subuniverse P × (type-subuniverse P × type-subuniverse P))
        ( λ x 
          Σ ( Σ ( type-subuniverse P)
                ( λ A 
                  ( inclusion-subuniverse P A) 
                  ( inclusion-subuniverse P (pr1 (pr2 x)) +
                    inclusion-subuniverse P (pr2 (pr2 x)))))
            ( λ A 
              ( inclusion-subuniverse P X) 
              ( inclusion-subuniverse P (pr1 A) +
                inclusion-subuniverse P (pr1 x))))
    map-reassociate-left-iterated-coproduct-Decomposition-subuniverse
      ( (A , B , e) , C , D , f) =
      ( (B , C , D) , (A , f) , e)

    map-inv-reassociate-left-iterated-coproduct-Decomposition-subuniverse :
      Σ ( type-subuniverse P × (type-subuniverse P × type-subuniverse P))
        ( λ x 
          Σ ( Σ ( type-subuniverse P)
                ( λ A 
                  inclusion-subuniverse P A 
                  ( inclusion-subuniverse P (pr1 (pr2 x)) +
                    inclusion-subuniverse P (pr2 (pr2 x)))))
            ( λ A 
              inclusion-subuniverse P X 
              ( inclusion-subuniverse P (pr1 A) +
                inclusion-subuniverse P (pr1 x)))) 
      left-iterated-binary-coproduct-Decomposition-subuniverse P X
    map-inv-reassociate-left-iterated-coproduct-Decomposition-subuniverse
      ( (B , C , D) , (A , f) , e) =
      ( (A , B , e) , C , D , f)

    equiv-reassociate-left-iterated-coproduct-Decomposition-subuniverse :
      left-iterated-binary-coproduct-Decomposition-subuniverse P X 
      Σ ( type-subuniverse P × (type-subuniverse P × type-subuniverse P))
        ( λ x 
          Σ ( Σ ( type-subuniverse P)
                ( λ A 
                  inclusion-subuniverse P A 
                  ( inclusion-subuniverse P (pr1 (pr2 x)) +
                    inclusion-subuniverse P (pr2 (pr2 x)))))
            ( λ A 
              inclusion-subuniverse P X 
              ( inclusion-subuniverse P (pr1 A) +
                inclusion-subuniverse P (pr1 x))))
    pr1 equiv-reassociate-left-iterated-coproduct-Decomposition-subuniverse =
      map-reassociate-left-iterated-coproduct-Decomposition-subuniverse
    pr2 equiv-reassociate-left-iterated-coproduct-Decomposition-subuniverse =
      is-equiv-is-invertible
        map-inv-reassociate-left-iterated-coproduct-Decomposition-subuniverse
        refl-htpy
        refl-htpy

  equiv-ternary-left-iterated-coproduct-Decomposition-subuniverse :
    left-iterated-binary-coproduct-Decomposition-subuniverse P X 
    ternary-coproduct-Decomposition-subuniverse P X
  equiv-ternary-left-iterated-coproduct-Decomposition-subuniverse =
    ( equiv-tot
      ( λ x 
        ( ( equiv-postcomp-equiv
            ( commutative-coproduct _ _)
            ( inclusion-subuniverse P X)) ∘e
        ( ( left-unit-law-Σ-is-contr
            ( is-torsorial-equiv-subuniverse' P
              ( ( inclusion-subuniverse P (pr1 (pr2 x)) +
                  inclusion-subuniverse P (pr2 (pr2 x))) ,
                ( C1 (pr2 (pr1 (pr2 x))) (pr2 (pr2 (pr2 x)))))))
            ( ( ( inclusion-subuniverse P (pr1 (pr2 x)) +
                  inclusion-subuniverse P (pr2 (pr2 x))) ,
                ( C1 (pr2 (pr1 (pr2 x))) (pr2 (pr2 (pr2 x))))) ,
              ( id-equiv)))))) ∘e
    ( equiv-reassociate-left-iterated-coproduct-Decomposition-subuniverse)

  private
    map-reassociate-right-iterated-coproduct-Decomposition-subuniverse :
      right-iterated-binary-coproduct-Decomposition-subuniverse P X 
      Σ ( type-subuniverse P × (type-subuniverse P × type-subuniverse P))
        ( λ x 
          Σ ( Σ ( type-subuniverse P)
                ( λ B 
                  ( inclusion-subuniverse P B) 
                  ( inclusion-subuniverse P (pr1 (pr2 x)) +
                    inclusion-subuniverse P (pr2 (pr2 x)))))
            ( λ B 
              ( inclusion-subuniverse P X) 
              ( inclusion-subuniverse P (pr1 x) +
                inclusion-subuniverse P (pr1 B))))
    map-reassociate-right-iterated-coproduct-Decomposition-subuniverse
      ( (A , B , e) , C , D , f) =
      ( (A , C , D) , (B , f) , e)

    map-inv-reassociate-right-iterated-coproduct-Decomposition-subuniverse :
      Σ ( type-subuniverse P × (type-subuniverse P × type-subuniverse P))
        ( λ x 
          Σ ( Σ ( type-subuniverse P)
                ( λ B 
                  ( inclusion-subuniverse P B) 
                  ( inclusion-subuniverse P (pr1 (pr2 x)) +
                    inclusion-subuniverse P (pr2 (pr2 x)))))
            ( λ B 
              ( inclusion-subuniverse P X) 
              ( inclusion-subuniverse P (pr1 x) +
                inclusion-subuniverse P (pr1 B)))) 
      right-iterated-binary-coproduct-Decomposition-subuniverse P X
    map-inv-reassociate-right-iterated-coproduct-Decomposition-subuniverse
      ( (A , C , D) , (B , f) , e) =
      ( (A , B , e) , C , D , f)

    equiv-reassociate-right-iterated-coproduct-Decomposition-subuniverse :
      right-iterated-binary-coproduct-Decomposition-subuniverse P X 
      Σ ( type-subuniverse P × (type-subuniverse P × type-subuniverse P))
        ( λ x 
          Σ ( Σ ( type-subuniverse P)
                ( λ B 
                  ( inclusion-subuniverse P B) 
                  ( inclusion-subuniverse P (pr1 (pr2 x)) +
                    inclusion-subuniverse P (pr2 (pr2 x)))))
            ( λ B 
              ( inclusion-subuniverse P X) 
              ( inclusion-subuniverse P (pr1 x) +
                inclusion-subuniverse P (pr1 B))))
    pr1 equiv-reassociate-right-iterated-coproduct-Decomposition-subuniverse =
      map-reassociate-right-iterated-coproduct-Decomposition-subuniverse
    pr2 equiv-reassociate-right-iterated-coproduct-Decomposition-subuniverse =
      is-equiv-is-invertible
        map-inv-reassociate-right-iterated-coproduct-Decomposition-subuniverse
        refl-htpy
        refl-htpy

  equiv-ternary-right-iterated-coproduct-Decomposition-subuniverse :
    right-iterated-binary-coproduct-Decomposition-subuniverse P X 
    ternary-coproduct-Decomposition-subuniverse P X
  equiv-ternary-right-iterated-coproduct-Decomposition-subuniverse =
    ( equiv-tot
      ( λ x 
        left-unit-law-Σ-is-contr
          ( is-torsorial-equiv-subuniverse' P
            ( ( inclusion-subuniverse P (pr1 (pr2 x)) +
                inclusion-subuniverse P (pr2 (pr2 x))) ,
              ( C1 (pr2 (pr1 (pr2 x))) (pr2 (pr2 (pr2 x))))))
          ( ( ( inclusion-subuniverse P (pr1 (pr2 x)) +
                inclusion-subuniverse P (pr2 (pr2 x))) ,
              ( C1 (pr2 (pr1 (pr2 x))) (pr2 (pr2 (pr2 x))))) ,
            ( id-equiv)))) ∘e
    ( equiv-reassociate-right-iterated-coproduct-Decomposition-subuniverse)
```

### Coproduct-decomposition with empty right summand

```agda
module _
  {l1 l2 : Level} (P : subuniverse l1 l2) (X : type-subuniverse P)
  (C1 : is-in-subuniverse P (raise-empty l1))
  where

  equiv-is-empty-right-summand-binary-coproduct-Decomposition-subuniverse :
    Σ ( binary-coproduct-Decomposition-subuniverse P X)
      ( λ d 
        is-empty
          ( inclusion-subuniverse P
            ( right-summand-binary-coproduct-Decomposition-subuniverse
              P X d))) 
    Σ ( type-subuniverse P)
      ( λ Y  inclusion-subuniverse P X  pr1 Y)
  equiv-is-empty-right-summand-binary-coproduct-Decomposition-subuniverse =
    ( equiv-tot
      ( λ x 
        ( equiv-postcomp-equiv
          ( right-unit-law-coproduct-is-empty
            ( inclusion-subuniverse P x)
            ( raise-empty l1)
            ( is-empty-raise-empty))
          ( inclusion-subuniverse P X)) ∘e
        ( ( left-unit-law-Σ-is-contr
            ( ( ( raise-empty l1 , C1) , is-empty-raise-empty) ,
              ( λ x 
                eq-pair-Σ
                  ( eq-pair-Σ
                    ( eq-equiv (equiv-is-empty is-empty-raise-empty (pr2 x)))
                    ( eq-is-prop (is-prop-type-Prop (P _))))
                  ( eq-is-prop is-property-is-empty)))
            ( ( raise-empty l1 , C1) , is-empty-raise-empty)) ∘e
          ( ( inv-associative-Σ _ _ _) ∘e
            ( ( equiv-tot  _  commutative-product)) ∘e
              ( ( associative-Σ _ _ _))))))) ∘e
    ( ( associative-Σ _ _ _))
```