# Families of maps
```agda
module foundation.families-of-maps where
```
<details><summary>Imports</summary>
```agda
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.type-arithmetic-dependent-pair-types
open import foundation.universal-property-dependent-pair-types
open import foundation.universe-levels
open import foundation-core.contractible-types
open import foundation-core.families-of-equivalences
open import foundation-core.function-types
open import foundation-core.functoriality-dependent-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.propositions
open import foundation-core.subtypes
open import foundation-core.torsorial-type-families
open import foundation-core.type-theoretic-principle-of-choice
```
</details>
## Idea
Given a type `A` and type families `B C : A → Type`, a **family of maps** from
`B` to `C` is an element of the type `(x : A) → B x → C x`.
```agda
module _
{l1 l2 l3 : Level} {A : UU l1}
(B : A → UU l2) (C : A → UU l3)
where
fam-map : UU (l1 ⊔ l2 ⊔ l3)
fam-map = (x : A) → B x → C x
```
## Properties
### Families of maps are equivalent to maps of total spaces respecting the first coordinate
```agda
module _
{l1 l2 l3 : Level} {A : UU l1}
(B : A → UU l2) (C : A → UU l3)
where
equiv-fam-map-map-tot-space :
fam-map B C ≃ Σ (Σ A B → Σ A C) (λ f → pr1 ~ pr1 ∘ f)
equiv-fam-map-map-tot-space =
equivalence-reasoning
fam-map B C
≃ (((x , _) : Σ A B) → C x)
by
equiv-ind-Σ
≃ (((x , _) : Σ A B) → Σ (Σ A (x =_)) (λ (x' , _) → C x'))
by
equiv-Π-equiv-family
( λ (x , _) →
inv-left-unit-law-Σ-is-contr
( is-torsorial-Id x)
( x , refl))
≃ (((x , _) : Σ A B) →
Σ (Σ A C) (λ (x' , _) → x = x'))
by
equiv-Π-equiv-family (λ _ → equiv-right-swap-Σ)
≃ Σ (Σ A B → Σ A C) (λ f → pr1 ~ pr1 ∘ f)
by
distributive-Π-Σ
```
### Families of equivalences are equivalent to equivalences of total spaces respecting the first coordinate
```agda
module _
{l1 l2 l3 : Level} {A : UU l1}
(B : A → UU l2) (C : A → UU l3)
where
equiv-fam-equiv-equiv-tot-space :
fam-equiv B C ≃ Σ (Σ A B ≃ Σ A C) (λ e → pr1 ~ pr1 ∘ map-equiv e)
equiv-fam-equiv-equiv-tot-space =
equivalence-reasoning
fam-equiv B C
≃ fiberwise-equiv B C
by
equiv-fiberwise-equiv-fam-equiv B C
≃ Σ ( Σ ( Σ A B → Σ A C) (λ e → pr1 ~ pr1 ∘ e))
( λ (e , _) → is-equiv e)
by
equiv-subtype-equiv
( equiv-fam-map-map-tot-space B C)
( λ f → Π-Prop A (is-equiv-Prop ∘ f))
( λ (e , _) → is-equiv-Prop e)
( λ f →
is-equiv-tot-is-fiberwise-equiv , is-fiberwise-equiv-is-equiv-tot)
≃ Σ (Σ A B ≃ Σ A C) (λ e → pr1 ~ pr1 ∘ map-equiv e)
by
equiv-right-swap-Σ
```