# Multivariable operations
```agda
module foundation.multivariable-operations where
```
<details><summary>Imports</summary>
```agda
open import elementary-number-theory.natural-numbers
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.equality-cartesian-product-types
open import foundation.raising-universe-levels
open import foundation.unit-type
open import foundation.universe-levels
open import foundation-core.cartesian-product-types
open import foundation-core.coproduct-types
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import linear-algebra.vectors
```
</details>
## Idea
Given `n` types, an n-ary multivariable operation on them is a function that
takes as inputs one element of each type, and returns an element in some type
`X`.
## Definitions
```agda
multivariable-input :
{l : Level}
(n : ℕ)
(A : functional-vec (UU l) n) →
UU l
multivariable-input zero-ℕ A = raise-unit _
multivariable-input (succ-ℕ n) A =
A (inr star) × multivariable-input n (tail-functional-vec n A)
empty-multivariable-input :
{l : Level}
(A : functional-vec (UU l) 0) →
multivariable-input 0 A
empty-multivariable-input A = raise-star
head-multivariable-input :
{l : Level}
(n : ℕ)
(A : functional-vec (UU l) (succ-ℕ n)) →
multivariable-input (succ-ℕ n) A →
head-functional-vec n A
head-multivariable-input n A (a0 , a) = a0
tail-multivariable-input :
{l : Level}
(n : ℕ)
(A : functional-vec (UU l) (succ-ℕ n)) →
multivariable-input (succ-ℕ n) A →
multivariable-input n (tail-functional-vec n A)
tail-multivariable-input n A (a0 , a) = a
cons-multivariable-input :
{l : Level}
(n : ℕ)
(A : functional-vec (UU l) n) →
{A0 : UU l} →
A0 →
multivariable-input n A →
multivariable-input (succ-ℕ n) (cons-functional-vec n A0 A)
pr1 (cons-multivariable-input n A a0 a) = a0
pr2 (cons-multivariable-input n A a0 a) = a
multivariable-operation :
{ l : Level}
( n : ℕ)
( A : functional-vec (UU l) n)
( X : UU l) →
UU l
multivariable-operation n A X =
multivariable-input n A → X
```
## Properties
### For the case of constant families, multivariable inputs and vectors coincide
```agda
vector-multivariable-input :
{l : Level}
(n : ℕ)
(A : UU l) →
multivariable-input n (λ _ → A) →
vec A n
vector-multivariable-input zero-ℕ A _ = empty-vec
vector-multivariable-input (succ-ℕ n) A (a0 , a) =
a0 ∷ (vector-multivariable-input n A a)
multivariable-input-vector :
{l : Level}
(n : ℕ)
(A : UU l) →
vec A n →
multivariable-input n (λ _ → A)
multivariable-input-vector zero-ℕ A _ = raise-star
multivariable-input-vector (succ-ℕ n) A (a0 ∷ a) =
cons-multivariable-input n (λ _ → A) a0
( multivariable-input-vector n A a)
is-section-multivariable-input-vector :
{l : Level}
(n : ℕ)
(A : UU l) →
( vector-multivariable-input n A ∘
multivariable-input-vector n A) ~ id
is-section-multivariable-input-vector zero-ℕ A empty-vec = refl
is-section-multivariable-input-vector (succ-ℕ n) A (a0 ∷ a) =
ap (_∷_ a0) ( is-section-multivariable-input-vector n A a)
is-retraction-multivariable-input-vector :
{l : Level}
(n : ℕ)
(A : UU l) →
( multivariable-input-vector n A ∘
vector-multivariable-input n A) ~ id
is-retraction-multivariable-input-vector zero-ℕ A (map-raise star) = refl
is-retraction-multivariable-input-vector (succ-ℕ n) A (a0 , a) =
eq-pair refl ( is-retraction-multivariable-input-vector n A a)
is-equiv-vector-multivariable-input :
{l : Level}
(n : ℕ)
(A : UU l) →
is-equiv (vector-multivariable-input n A)
is-equiv-vector-multivariable-input n A =
is-equiv-is-invertible
( multivariable-input-vector n A)
( is-section-multivariable-input-vector n A)
( is-retraction-multivariable-input-vector n A)
compute-vector-multivariable-input :
{l : Level}
(n : ℕ)
(A : UU l) →
multivariable-input n (λ _ → A) ≃ vec A n
pr1 (compute-vector-multivariable-input n A) =
vector-multivariable-input n A
pr2 (compute-vector-multivariable-input n A) =
is-equiv-vector-multivariable-input n A
```