# Product decompositions of types in a subuniverse

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

<details><summary>Imports</summary>

```agda
open import foundation.cartesian-product-types
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.subuniverses
open import foundation.type-arithmetic-cartesian-product-types
open import foundation.type-arithmetic-dependent-pair-types
open import foundation.unit-type
open import foundation.univalence
open import foundation.universe-levels

open import foundation-core.contractible-types
open import foundation-core.equality-dependent-pair-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.homotopies
open import foundation-core.propositions
```

</details>

## Definitions

### Binary product decomposition of types in a subuniverse

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

  binary-product-Decomposition-Subuniverse : UU (lsuc l1  l2)
  binary-product-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-product-Decomposition-Subuniverse P X)
  where

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

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

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

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

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

### Iterated binary product decompositions

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

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

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

### Ternary product Decomposition-subuniverses

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

  ternary-product-Decomposition-Subuniverse : UU (lsuc l1  l2)
  ternary-product-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-product-Decomposition-Subuniverse)
    where

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

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

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

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

    matching-correspondence-ternary-productuct-Decomposition-Subuniverse :
      inclusion-subuniverse P X 
      ( inclusion-subuniverse
        P
        first-summand-ternary-product-Decomposition-Subuniverse ×
        ( ( inclusion-subuniverse
            P
            second-summand-ternary-product-Decomposition-Subuniverse) ×
          inclusion-subuniverse
            P
            third-summand-ternary-product-Decomposition-Subuniverse))
    matching-correspondence-ternary-productuct-Decomposition-Subuniverse = pr2 d
```

## Propositions

### Equivalence between binary product Decomposition-Subuniverse induce by

commutativiy of product

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

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

### Equivalence between iterated product and ternary product decomposition

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

  private
    map-reassociate-left-iterated-product-Decomposition-Subuniverse :
      left-iterated-binary-product-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-product-Decomposition-Subuniverse
      ( (A , B , e) , C , D , f) =
      ( (B , C , D) , (A , f) , e)

    map-inv-reassociate-left-iterated-product-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-product-Decomposition-Subuniverse P X
    map-inv-reassociate-left-iterated-product-Decomposition-Subuniverse
      ( (B , C , D) , (A , f) , e) =
      ( (A , B , e) , C , D , f)

    equiv-reassociate-left-iterated-product-Decomposition-Subuniverse :
      left-iterated-binary-product-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-product-Decomposition-Subuniverse =
      map-reassociate-left-iterated-product-Decomposition-Subuniverse
    pr2 equiv-reassociate-left-iterated-product-Decomposition-Subuniverse =
      is-equiv-is-invertible
        map-inv-reassociate-left-iterated-product-Decomposition-Subuniverse
        refl-htpy
        refl-htpy

  equiv-ternary-left-iterated-product-Decomposition-Subuniverse :
    left-iterated-binary-product-Decomposition-Subuniverse P X 
    ternary-product-Decomposition-Subuniverse P X
  equiv-ternary-left-iterated-product-Decomposition-Subuniverse =
    ( ( equiv-tot
        ( λ x 
          ( ( equiv-postcomp-equiv
              ( commutative-product)
              ( 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-product-Decomposition-Subuniverse)))

  private
    map-reassociate-right-iterated-product-Decomposition-Subuniverse :
      right-iterated-binary-product-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-product-Decomposition-Subuniverse
      ( (A , B , e) , C , D , f) =
      ( (A , C , D) , (B , f) , e)

    map-inv-reassociate-right-iterated-product-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-product-Decomposition-Subuniverse P X
    map-inv-reassociate-right-iterated-product-Decomposition-Subuniverse
      ( (A , C , D) , (B , f) , e) =
      ( (A , B , e) , C , D , f)

    equiv-reassociate-right-iterated-product-Decomposition-Subuniverse :
      right-iterated-binary-product-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-product-Decomposition-Subuniverse =
      map-reassociate-right-iterated-product-Decomposition-Subuniverse
    pr2 equiv-reassociate-right-iterated-product-Decomposition-Subuniverse =
      is-equiv-is-invertible
        map-inv-reassociate-right-iterated-product-Decomposition-Subuniverse
        refl-htpy
        refl-htpy

  equiv-ternary-right-iterated-product-Decomposition-Subuniverse :
    right-iterated-binary-product-Decomposition-Subuniverse P X 
    ternary-product-Decomposition-Subuniverse P X
  equiv-ternary-right-iterated-product-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-product-Decomposition-Subuniverse)))
```

### Product-decomposition with contractible right summand

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

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