# Unordered `n`-tuples of elements in a type
```agda
module foundation.unordered-tuples where
```
<details><summary>Imports</summary>
```agda
open import elementary-number-theory.natural-numbers
open import foundation.decidable-equality
open import foundation.dependent-pair-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopy-induction
open import foundation.postcomposition-functions
open import foundation.structure-identity-principle
open import foundation.universe-levels
open import foundation.whiskering-homotopies-composition
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.identity-types
open import foundation-core.sets
open import foundation-core.torsorial-type-families
open import univalent-combinatorics.complements-isolated-elements
open import univalent-combinatorics.equality-finite-types
open import univalent-combinatorics.finite-types
open import univalent-combinatorics.standard-finite-types
```
</details>
## Idea
An **unordered `n`-tuple** of elements of a type `A` consists of an `n`-element
set `X` equipped with a map `X → A`.
## Definition
```agda
unordered-tuple :
{l : Level} (n : ℕ) (A : UU l) → UU (lsuc lzero ⊔ l)
unordered-tuple n A = Σ (UU-Fin lzero n) (λ X → type-UU-Fin n X → A)
module _
{l : Level} (n : ℕ) {A : UU l} (t : unordered-tuple n A)
where
type-unordered-tuple-UU-Fin : UU-Fin lzero n
type-unordered-tuple-UU-Fin = pr1 t
type-unordered-tuple : UU lzero
type-unordered-tuple = type-UU-Fin n type-unordered-tuple-UU-Fin
has-cardinality-type-unordered-tuple : has-cardinality n type-unordered-tuple
has-cardinality-type-unordered-tuple =
has-cardinality-type-UU-Fin n type-unordered-tuple-UU-Fin
is-set-type-unordered-tuple : is-set type-unordered-tuple
is-set-type-unordered-tuple =
is-set-has-cardinality n has-cardinality-type-unordered-tuple
has-decidable-equality-type-unordered-tuple :
has-decidable-equality type-unordered-tuple
has-decidable-equality-type-unordered-tuple =
has-decidable-equality-has-cardinality n
has-cardinality-type-unordered-tuple
element-unordered-tuple : type-unordered-tuple → A
element-unordered-tuple = pr2 t
```
### Unordered tuples away from an index
```agda
module _
{l : Level} (n : ℕ) {A : UU l} (t : unordered-tuple (succ-ℕ n) A)
(i : type-unordered-tuple (succ-ℕ n) t)
where
type-complement-point-unordered-tuple-UU-Fin : UU-Fin lzero n
type-complement-point-unordered-tuple-UU-Fin =
complement-element-UU-Fin n
( pair (type-unordered-tuple-UU-Fin (succ-ℕ n) t) i)
type-complement-point-unordered-tuple : UU lzero
type-complement-point-unordered-tuple =
type-UU-Fin n type-complement-point-unordered-tuple-UU-Fin
inclusion-complement-point-unordered-tuple :
type-complement-point-unordered-tuple → type-unordered-tuple (succ-ℕ n) t
inclusion-complement-point-unordered-tuple =
inclusion-complement-element-UU-Fin n
( pair (type-unordered-tuple-UU-Fin (succ-ℕ n) t) i)
unordered-tuple-complement-point-type-unordered-tuple :
unordered-tuple n A
pr1 unordered-tuple-complement-point-type-unordered-tuple =
complement-element-UU-Fin n
( pair (type-unordered-tuple-UU-Fin (succ-ℕ n) t) i)
pr2 unordered-tuple-complement-point-type-unordered-tuple =
( element-unordered-tuple (succ-ℕ n) t) ∘
( inclusion-complement-point-unordered-tuple)
```
### Standard unordered tuples
```agda
standard-unordered-tuple :
{l : Level} (n : ℕ) {A : UU l} (f : Fin n → A) → unordered-tuple n A
pr1 (standard-unordered-tuple n f) = Fin-UU-Fin' n
pr2 (standard-unordered-tuple n f) = f
```
## Properties
### Equality of unordered tuples
```agda
module _
{l : Level} (n : ℕ) {A : UU l}
where
Eq-unordered-tuple : unordered-tuple n A → unordered-tuple n A → UU l
Eq-unordered-tuple x y =
Σ ( type-unordered-tuple n x ≃ type-unordered-tuple n y)
( λ e →
( element-unordered-tuple n x) ~
( element-unordered-tuple n y ∘ map-equiv e))
refl-Eq-unordered-tuple :
(x : unordered-tuple n A) → Eq-unordered-tuple x x
pr1 (refl-Eq-unordered-tuple x) = id-equiv
pr2 (refl-Eq-unordered-tuple x) = refl-htpy
Eq-eq-unordered-tuple :
(x y : unordered-tuple n A) → x = y → Eq-unordered-tuple x y
Eq-eq-unordered-tuple x .x refl = refl-Eq-unordered-tuple x
is-torsorial-Eq-unordered-tuple :
(x : unordered-tuple n A) → is-torsorial (Eq-unordered-tuple x)
is-torsorial-Eq-unordered-tuple x =
is-torsorial-Eq-structure
( is-torsorial-equiv-UU-Fin {k = n} (type-unordered-tuple-UU-Fin n x))
( pair (type-unordered-tuple-UU-Fin n x) id-equiv)
( is-torsorial-htpy (element-unordered-tuple n x))
is-equiv-Eq-eq-unordered-tuple :
(x y : unordered-tuple n A) → is-equiv (Eq-eq-unordered-tuple x y)
is-equiv-Eq-eq-unordered-tuple x =
fundamental-theorem-id
( is-torsorial-Eq-unordered-tuple x)
( Eq-eq-unordered-tuple x)
extensionality-unordered-tuple :
(x y : unordered-tuple n A) → (x = y) ≃ Eq-unordered-tuple x y
pr1 (extensionality-unordered-tuple x y) = Eq-eq-unordered-tuple x y
pr2 (extensionality-unordered-tuple x y) = is-equiv-Eq-eq-unordered-tuple x y
eq-Eq-unordered-tuple :
(x y : unordered-tuple n A) → Eq-unordered-tuple x y → x = y
eq-Eq-unordered-tuple x y =
map-inv-is-equiv (is-equiv-Eq-eq-unordered-tuple x y)
is-retraction-eq-Eq-unordered-tuple :
(x y : unordered-tuple n A) →
(eq-Eq-unordered-tuple x y ∘ Eq-eq-unordered-tuple x y) ~ id
is-retraction-eq-Eq-unordered-tuple x y =
is-retraction-map-inv-is-equiv (is-equiv-Eq-eq-unordered-tuple x y)
```
### Functoriality of unordered tuples
```agda
map-unordered-tuple :
{l1 l2 : Level} (n : ℕ) {A : UU l1} {B : UU l2} (f : A → B) →
unordered-tuple n A → unordered-tuple n B
pr1 (map-unordered-tuple n f t) = type-unordered-tuple-UU-Fin n t
pr2 (map-unordered-tuple n f t) = f ∘ element-unordered-tuple n t
preserves-comp-map-unordered-tuple :
{l1 l2 l3 : Level} (n : ℕ) {A : UU l1} {B : UU l2} {C : UU l3}
(g : B → C) (f : A → B) →
map-unordered-tuple n (g ∘ f) ~
(map-unordered-tuple n g ∘ map-unordered-tuple n f)
preserves-comp-map-unordered-tuple n g f p = refl
preserves-id-map-unordered-tuple :
{l1 : Level} (n : ℕ) {A : UU l1} →
map-unordered-tuple n (id {A = A}) ~ id
preserves-id-map-unordered-tuple n = refl-htpy
htpy-unordered-tuple :
{l1 l2 : Level} (n : ℕ) {A : UU l1} {B : UU l2} {f g : A → B} →
(f ~ g) → (map-unordered-tuple n f ~ map-unordered-tuple n g)
htpy-unordered-tuple n {f = f} {g = g} H t =
eq-Eq-unordered-tuple n
( map-unordered-tuple n f t)
( map-unordered-tuple n g t)
( pair id-equiv (H ·r element-unordered-tuple n t))
preserves-refl-htpy-unordered-tuple :
{l1 l2 : Level} (n : ℕ) {A : UU l1} {B : UU l2} (f : A → B) →
htpy-unordered-tuple n (refl-htpy {f = f}) ~ refl-htpy
preserves-refl-htpy-unordered-tuple n f p =
is-retraction-eq-Eq-unordered-tuple n
( map-unordered-tuple n f p)
( map-unordered-tuple n f p)
( refl)
equiv-unordered-tuple :
{l1 l2 : Level} (n : ℕ) {A : UU l1} {B : UU l2} →
(A ≃ B) → (unordered-tuple n A ≃ unordered-tuple n B)
equiv-unordered-tuple n e = equiv-tot (λ X → equiv-postcomp (type-UU-Fin n X) e)
map-equiv-unordered-tuple :
{l1 l2 : Level} (n : ℕ) {A : UU l1} {B : UU l2} →
(A ≃ B) → (unordered-tuple n A → unordered-tuple n B)
map-equiv-unordered-tuple n e = map-equiv (equiv-unordered-tuple n e)
is-equiv-map-equiv-unordered-tuple :
{l1 l2 : Level} (n : ℕ) {A : UU l1} {B : UU l2} →
(e : A ≃ B) → is-equiv (map-equiv-unordered-tuple n e)
is-equiv-map-equiv-unordered-tuple n e =
is-equiv-map-equiv (equiv-unordered-tuple n e)
```