# Arithmetic law for product decomposition and Π-decomposition

```agda
module foundation.arithmetic-law-product-and-pi-decompositions where
```

<details><summary>Imports</summary>

```agda
open import foundation.coproduct-decompositions
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.functoriality-cartesian-product-types
open import foundation.pi-decompositions
open import foundation.product-decompositions
open import foundation.type-arithmetic-dependent-pair-types
open import foundation.univalence
open import foundation.universal-property-coproduct-types
open import foundation.universe-levels

open import foundation-core.cartesian-product-types
open import foundation-core.contractible-types
open import foundation-core.coproduct-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.transport-along-identifications
```

</details>

## Idea

Let `X` be a type, we have the following equivalence :

```text
  Σ ( (U , V , e) : Π-Decomposition X)
    ( binary-product-Decomposition U) ≃
  Σ ( (A , B , e) : binary-product-Decomposition X)
    ( Π-Decomposition A ×
      Π-Decomposition B )
```

We also show a computational rule to simplify the use of this equivalence.

## Propositions

### Product decompositions of the indexing type of a Π-decomposition are equivalent to Π-decomposition of the left and right summand of a product decomposition

```agda
module _
  {l : Level} {X : UU l}
  where

  private
    reassociate :
      Σ (Π-Decomposition l l X)
        ( λ d  binary-coproduct-Decomposition l l
          ( indexing-type-Π-Decomposition d)) 
        Σ ( UU l)
          ( λ A 
            Σ ( UU l)
              ( λ B 
                Σ ( Σ ( UU l) λ U  ( U  (A + B)))
                  ( λ U  Σ (pr1 U  UU l)  Y  X  Π (pr1 U) Y))))
    pr1 reassociate ((U , V , f) , A , B , e) = (A , B , (U , e) , V , f)
    pr2 reassociate =
      is-equiv-is-invertible
        ( λ (A , B , (U , e) , V , f)  ((U , V , f) , A , B , e))
        ( refl-htpy)
        ( refl-htpy)

    reassociate' :
      Σ ( UU l)
        ( λ A 
          Σ ( UU l)
            ( λ B 
              Σ ( (A  UU l) × (B  UU l))
                ( λ (YA , YB) 
                  Σ ( Σ (UU l)  A'  A'  Π A YA))
                    ( λ A' 
                      Σ ( Σ (UU l)  B'  B'  Π B YB))
                        ( λ B'  X  (pr1 A' × pr1 B')))))) 
      Σ ( binary-product-Decomposition l l X)
      ( λ d 
        Π-Decomposition l l
          ( left-summand-binary-product-Decomposition d) ×
        Π-Decomposition l l
          ( right-summand-binary-product-Decomposition d))
    pr1 reassociate' (A , B , (YA , YB) , (A' , eA) , (B' , eB) , e) =
      (A' , B' , e) , ((A , YA , eA) , B , YB , eB)
    pr2 reassociate' =
      is-equiv-is-invertible
        ( λ ((A' , B' , e) , ((A , YA , eA) , B , YB , eB)) 
          (A , B , (YA , YB) , (A' , eA) , (B' , eB) , e))
        ( refl-htpy)
        ( refl-htpy)

  equiv-binary-product-Decomposition-Π-Decomposition :
    Σ ( Π-Decomposition l l X)
      ( λ d 
        binary-coproduct-Decomposition l l (indexing-type-Π-Decomposition d)) 
    Σ ( binary-product-Decomposition l l X)
      ( λ d 
        Π-Decomposition l l
          ( left-summand-binary-product-Decomposition d) ×
        Π-Decomposition l l
          ( right-summand-binary-product-Decomposition d))

  equiv-binary-product-Decomposition-Π-Decomposition =
    ( ( reassociate') ∘e
      ( ( equiv-tot
            ( λ A 
              equiv-tot
                ( λ B 
                  ( ( equiv-tot
                        ( λ ( YA , YB) 
                          ( ( equiv-tot
                              ( λ A' 
                                equiv-tot
                                  ( λ B' 
                                    equiv-postcomp-equiv
                                      ( equiv-product
                                        ( inv-equiv (pr2 A'))
                                        ( inv-equiv (pr2 B')))
                                      ( X))) ∘e
                            ( ( inv-left-unit-law-Σ-is-contr
                                  ( is-torsorial-equiv' (Π A YA))
                                  ( Π A YA , id-equiv)) ∘e
                              ( inv-left-unit-law-Σ-is-contr
                                  ( is-torsorial-equiv' (Π B YB))
                                  ( Π B YB , id-equiv)))))) ∘e
                    ( ( equiv-Σ-equiv-base
                        ( λ z  X  (Π A (pr1 z) × Π B (pr2 z)))
                        ( equiv-universal-property-coproduct (UU l))) ∘e
                      ( ( equiv-tot
                            ( λ Y 
                              equiv-postcomp-equiv
                                ( equiv-dependent-universal-property-coproduct
                                  ( Y))
                                ( X))) ∘e
                          ( left-unit-law-Σ-is-contr
                              ( is-torsorial-equiv' (A + B))
                              ((A + B) , id-equiv))))))))) ∘e
      ( reassociate)))

  module _
    ( D : Σ ( Π-Decomposition l l X)
            ( λ D 
              binary-coproduct-Decomposition
                l l
                ( indexing-type-Π-Decomposition D)))
    where

    private
      tr-total-equiv :
        {l1 l3 l4 : Level} {X Y : UU l1} (e : Y  X) 
        (h : Id {A = Σ (UU l1) λ Y  Y  X} (X , id-equiv) (Y , e)) 
        {C : (X : UU l1)  (X  UU l3)  UU l4} 
        {f : Σ (Y  UU l3)  Z  C Y Z)} 
        (x : X) 
        pr1
          ( tr
            ( λ Y 
              ( Σ ( pr1 Y  UU l3)
                  ( λ Z  C (pr1 Y) Z) 
                Σ ( X  UU l3)
                  ( λ Z  C X Z)))
            ( h)
            ( id)
            ( f))
          ( x) 
        pr1 f (map-inv-equiv e x)
      tr-total-equiv e refl x = refl

    compute-left-equiv-binary-product-Decomposition-Π-Decomposition :
      ( a : left-summand-binary-coproduct-Decomposition (pr2 D)) 
      cotype-Π-Decomposition
        ( pr1
          ( pr2
            ( map-equiv equiv-binary-product-Decomposition-Π-Decomposition
              ( D))))
        ( a) 
      cotype-Π-Decomposition
        ( pr1 D)
        ( map-inv-equiv
          ( matching-correspondence-binary-coproduct-Decomposition (pr2 D))
          ( inl a))
    compute-left-equiv-binary-product-Decomposition-Π-Decomposition a =
      tr-total-equiv
        ( matching-correspondence-binary-coproduct-Decomposition (pr2 D))
        ( inv
            ( contraction
                ( is-torsorial-equiv' (pr1 (pr2 D) + pr1 (pr2 (pr2 D))))
                ( (pr1 (pr2 D) + pr1 (pr2 (pr2 D))) , id-equiv)) 
          contraction
            ( is-torsorial-equiv' (pr1 (pr2 D) + pr1 (pr2 (pr2 D))))
                ( pr1 (pr1 D) , pr2 (pr2 (pr2 D))))
        ( inl a)

    compute-right-equiv-binary-product-Decomposition-Π-Decomposition :
      ( b : right-summand-binary-coproduct-Decomposition (pr2 D)) 
      cotype-Π-Decomposition
        ( pr2
          ( pr2
            ( map-equiv equiv-binary-product-Decomposition-Π-Decomposition
              ( D))))
        ( b) 
      cotype-Π-Decomposition (pr1 D)
        ( map-inv-equiv
          ( matching-correspondence-binary-coproduct-Decomposition (pr2 D))
          ( inr b))
    compute-right-equiv-binary-product-Decomposition-Π-Decomposition b =
      tr-total-equiv
          ( matching-correspondence-binary-coproduct-Decomposition (pr2 D))
          ( inv
              ( contraction
                  ( is-torsorial-equiv' (pr1 (pr2 D) + pr1 (pr2 (pr2 D))))
                  ( (pr1 (pr2 D) + pr1 (pr2 (pr2 D))) , id-equiv)) 
            contraction
              ( is-torsorial-equiv' (pr1 (pr2 D) + pr1 (pr2 (pr2 D))))
                  ( pr1 (pr1 D) , pr2 (pr2 (pr2 D))))
          ( inr b)
```