# Iterated cartesian product types
```agda
module foundation.iterated-cartesian-product-types where
```
<details><summary>Imports</summary>
```agda
open import elementary-number-theory.natural-numbers
open import finite-group-theory.permutations-standard-finite-types
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.functoriality-cartesian-product-types
open import foundation.functoriality-dependent-function-types
open import foundation.type-arithmetic-cartesian-product-types
open import foundation.type-arithmetic-dependent-function-types
open import foundation.unit-type
open import foundation.univalence
open import foundation.universal-property-coproduct-types
open import foundation.universal-property-empty-type
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.equivalences
open import foundation-core.function-types
open import foundation-core.identity-types
open import lists.arrays
open import lists.concatenation-lists
open import lists.lists
open import lists.permutation-lists
open import univalent-combinatorics.standard-finite-types
```
</details>
## Idea
In this file, we give three definitions of the iterated cartesian product
`A₁ × ... × Aₙ` of `n` types `A₁ , ... , Aₙ`. Two use a family of types over
`Fin n`: the first uses recursion over `Fin n` and the second is just
`Π (Fin n) A`. The last one uses lists.
We show that :
- all of these definitions are equivalent
- iterated cartesian product of types is closed under permutations
## Definitions
### Via a family of types over `Fin n`
#### Using recursion
```agda
iterated-product-Fin-recursive :
{l : Level} (n : ℕ) →
((Fin n) → UU l) → UU l
iterated-product-Fin-recursive {l} zero-ℕ A = raise-unit l
iterated-product-Fin-recursive (succ-ℕ n) A =
A (inr star) × iterated-product-Fin-recursive n (A ∘ inl)
```
#### Using `Π`-types
```agda
iterated-product-Fin-Π :
{l : Level} (n : ℕ) →
((Fin n) → UU l) → UU l
iterated-product-Fin-Π n A = (i : Fin n) → A i
```
### Via lists
```agda
iterated-product-lists :
{l : Level} → list (UU l) → UU l
iterated-product-lists {l} nil = raise-unit l
iterated-product-lists (cons A p) = A × iterated-product-lists p
```
## Properties
### The definitions using recursion and `Π`-types are equivalent
```agda
equiv-iterated-product-Fin-recursive-Π :
{l : Level} (n : ℕ) (A : (Fin n → UU l)) →
iterated-product-Fin-recursive n A ≃
iterated-product-Fin-Π n A
equiv-iterated-product-Fin-recursive-Π zero-ℕ A =
equiv-is-contr is-contr-raise-unit (dependent-universal-property-empty' A)
equiv-iterated-product-Fin-recursive-Π (succ-ℕ n) A =
( ( inv-equiv (equiv-dependent-universal-property-coproduct A)) ∘e
( ( commutative-product) ∘e
( ( equiv-product
( inv-equiv (left-unit-law-Π-is-contr is-contr-unit star))
( id-equiv)) ∘e
( ( equiv-product
( id-equiv)
( equiv-iterated-product-Fin-recursive-Π n (A ∘ inl)))))))
```
### The definitions using recursion and lists are equivalent
```agda
equiv-iterated-product-Fin-recursive-lists :
{l : Level} (l : list (UU l)) →
iterated-product-Fin-recursive
( length-array (array-list l))
( functional-vec-array (array-list l)) ≃
iterated-product-lists l
equiv-iterated-product-Fin-recursive-lists nil = id-equiv
equiv-iterated-product-Fin-recursive-lists (cons x l) =
equiv-product id-equiv (equiv-iterated-product-Fin-recursive-lists l)
```
### The cartesian product of two iterated cartesian products (via list) is the iterated cartesian product of the concatenation of the corresponding lists
```agda
equiv-product-iterated-product-lists :
{l : Level} (p q : list (UU l)) →
(iterated-product-lists p × iterated-product-lists q) ≃
iterated-product-lists (concat-list p q)
equiv-product-iterated-product-lists nil q =
left-unit-law-product-is-contr (is-contr-raise-unit)
equiv-product-iterated-product-lists (cons x p) q =
( ( equiv-product
( id-equiv)
( equiv-product-iterated-product-lists p q)) ∘e
( associative-product
( x)
( iterated-product-lists p)
( iterated-product-lists q)))
```
### Iterated cartesian product is closed under permutations
```agda
permutation-iterated-product-Fin-Π :
{l : Level} (n : ℕ) (A : (Fin n → UU l)) (t : Permutation n) → UU l
permutation-iterated-product-Fin-Π n A t =
iterated-product-Fin-Π n (A ∘ map-equiv t)
equiv-permutation-iterated-product-Fin-Π :
{l : Level} (n : ℕ) (A : (Fin n → UU l)) (t : Permutation n) →
permutation-iterated-product-Fin-Π n A t ≃ iterated-product-Fin-Π n A
equiv-permutation-iterated-product-Fin-Π n A t =
equiv-Π (λ z → A z) t (λ a → id-equiv)
eq-permutation-iterated-product-Fin-Π :
{l : Level} (n : ℕ) (A : (Fin n → UU l)) (t : Permutation n) →
permutation-iterated-product-Fin-Π n A t = iterated-product-Fin-Π n A
eq-permutation-iterated-product-Fin-Π n A t =
eq-equiv (equiv-permutation-iterated-product-Fin-Π n A t)
permutation-iterated-product-Fin-recursive :
{l : Level} (n : ℕ) (A : (Fin n → UU l)) (t : Permutation n) → UU l
permutation-iterated-product-Fin-recursive n A t =
iterated-product-Fin-recursive n (A ∘ map-equiv t)
equiv-permutation-iterated-product-Fin-recursive :
{l : Level} (n : ℕ) (A : (Fin n → UU l)) (t : Permutation n) →
permutation-iterated-product-Fin-recursive n A t ≃
iterated-product-Fin-recursive n A
equiv-permutation-iterated-product-Fin-recursive n A t =
( inv-equiv (equiv-iterated-product-Fin-recursive-Π n A)) ∘e
( equiv-permutation-iterated-product-Fin-Π n A t) ∘e
( equiv-iterated-product-Fin-recursive-Π n (A ∘ map-equiv t))
eq-permutation-iterated-product-Fin-recursive :
{l : Level} (n : ℕ) (A : (Fin n → UU l)) (t : Permutation n) →
permutation-iterated-product-Fin-recursive n A t =
iterated-product-Fin-recursive n A
eq-permutation-iterated-product-Fin-recursive n A t =
eq-equiv (equiv-permutation-iterated-product-Fin-recursive n A t)
permutation-iterated-product-lists :
{l : Level} (L : list (UU l)) (t : Permutation (length-list L)) → UU l
permutation-iterated-product-lists L t =
iterated-product-lists (permute-list L t)
equiv-permutation-iterated-product-lists :
{l : Level} (L : list (UU l)) (t : Permutation (length-list L)) →
permutation-iterated-product-lists L t ≃
iterated-product-lists L
equiv-permutation-iterated-product-lists L t =
( equiv-iterated-product-Fin-recursive-lists L ∘e
( ( equiv-permutation-iterated-product-Fin-recursive
( length-list L)
( functional-vec-array (array-list L))
( t)) ∘e
( equiv-eq
( ap
( λ p →
iterated-product-Fin-recursive
( length-array p)
( functional-vec-array p))
( is-retraction-array-list
( length-list L ,
( functional-vec-array (array-list L) ∘ map-equiv t)))) ∘e
( inv-equiv
( equiv-iterated-product-Fin-recursive-lists (permute-list L t))))))
eq-permutation-iterated-product-lists :
{l : Level} (L : list (UU l)) (t : Permutation (length-list L)) →
permutation-iterated-product-lists L t =
iterated-product-lists L
eq-permutation-iterated-product-lists L t =
eq-equiv (equiv-permutation-iterated-product-lists L t)
```