# Maps fibered over a map
```agda
module foundation.fibered-maps where
```
<details><summary>Imports</summary>
```agda
open import foundation.cones-over-cospan-diagrams
open import foundation.dependent-pair-types
open import foundation.function-extensionality
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopy-induction
open import foundation.slice
open import foundation.structure-identity-principle
open import foundation.type-arithmetic-dependent-pair-types
open import foundation.unit-type
open import foundation.universal-property-empty-type
open import foundation.universe-levels
open import foundation.whiskering-homotopies-composition
open import foundation-core.commuting-squares-of-maps
open import foundation-core.contractible-types
open import foundation-core.empty-types
open import foundation-core.equality-dependent-pair-types
open import foundation-core.equivalences
open import foundation-core.fibers-of-maps
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import foundation-core.small-types
open import foundation-core.torsorial-type-families
open import foundation-core.truncated-types
open import foundation-core.truncation-levels
```
</details>
## Idea
Consider a diagram of the form
```text
A B
| |
f | | g
∨ ∨
X ------> Y
i
```
A **fibered map** from `f` to `g` over `i` is a map `h : A → B` such that the
square `i ∘ f ~ g ∘ h` [commutes](foundation-core.commuting-squares-of-maps.md).
## Definitions
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → X) (g : B → Y)
where
is-map-over : (X → Y) → (A → B) → UU (l1 ⊔ l4)
is-map-over i h = coherence-square-maps h f g i
map-over : (X → Y) → UU (l1 ⊔ l2 ⊔ l4)
map-over i = Σ (A → B) (is-map-over i)
fibered-map : UU (l1 ⊔ l3 ⊔ l2 ⊔ l4)
fibered-map = Σ (X → Y) (map-over)
fiberwise-map-over : (X → Y) → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
fiberwise-map-over i = (x : X) → fiber f x → fiber g (i x)
cone-fibered-map : (ihH : fibered-map) → cone (pr1 ihH) g A
pr1 (cone-fibered-map ihH) = f
pr1 (pr2 (cone-fibered-map (i , h , H))) = h
pr2 (pr2 (cone-fibered-map (i , h , H))) = H
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → X) (g : B → Y)
where
map-total-map-over : (i : X → Y) → map-over f g i → A → B
map-total-map-over i = pr1
is-map-over-map-total-map-over :
(i : X → Y) (m : map-over f g i) →
is-map-over f g i (map-total-map-over i m)
is-map-over-map-total-map-over i = pr2
map-over-fibered-map : (m : fibered-map f g) → map-over f g (pr1 m)
map-over-fibered-map = pr2
map-base-fibered-map : (m : fibered-map f g) → X → Y
map-base-fibered-map = pr1
map-total-fibered-map : (m : fibered-map f g) → A → B
map-total-fibered-map = pr1 ∘ pr2
is-map-over-map-total-fibered-map :
(m : fibered-map f g) →
is-map-over f g (map-base-fibered-map m) (map-total-fibered-map m)
is-map-over-map-total-fibered-map = pr2 ∘ pr2
```
## Properties
### Identifications of maps over
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → X) (g : B → Y) (i : X → Y)
where
coherence-htpy-map-over :
(m m' : map-over f g i) →
map-total-map-over f g i m ~ map-total-map-over f g i m' → UU (l1 ⊔ l4)
coherence-htpy-map-over m m' K =
( is-map-over-map-total-map-over f g i m ∙h (g ·l K)) ~
( is-map-over-map-total-map-over f g i m')
htpy-map-over : (m m' : map-over f g i) → UU (l1 ⊔ l2 ⊔ l4)
htpy-map-over m m' =
Σ ( map-total-map-over f g i m ~ map-total-map-over f g i m')
( coherence-htpy-map-over m m')
refl-htpy-map-over : (m : map-over f g i) → htpy-map-over m m
pr1 (refl-htpy-map-over m) = refl-htpy
pr2 (refl-htpy-map-over m) = right-unit-htpy
htpy-eq-map-over : (m m' : map-over f g i) → m = m' → htpy-map-over m m'
htpy-eq-map-over m .m refl = refl-htpy-map-over m
is-torsorial-htpy-map-over :
(m : map-over f g i) → is-torsorial (htpy-map-over m)
is-torsorial-htpy-map-over m =
is-torsorial-Eq-structure
( is-torsorial-htpy (map-total-map-over f g i m))
( map-total-map-over f g i m , refl-htpy)
( is-torsorial-htpy (is-map-over-map-total-map-over f g i m ∙h refl-htpy))
is-equiv-htpy-eq-map-over :
(m m' : map-over f g i) → is-equiv (htpy-eq-map-over m m')
is-equiv-htpy-eq-map-over m =
fundamental-theorem-id (is-torsorial-htpy-map-over m) (htpy-eq-map-over m)
extensionality-map-over :
(m m' : map-over f g i) → (m = m') ≃ (htpy-map-over m m')
pr1 (extensionality-map-over m m') = htpy-eq-map-over m m'
pr2 (extensionality-map-over m m') = is-equiv-htpy-eq-map-over m m'
eq-htpy-map-over : (m m' : map-over f g i) → htpy-map-over m m' → m = m'
eq-htpy-map-over m m' = map-inv-equiv (extensionality-map-over m m')
```
### Identifications of fibered maps
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → X) (g : B → Y)
where
coherence-htpy-fibered-map :
(m m' : fibered-map f g) →
map-base-fibered-map f g m ~ map-base-fibered-map f g m' →
map-total-fibered-map f g m ~ map-total-fibered-map f g m' → UU (l1 ⊔ l4)
coherence-htpy-fibered-map m m' I H =
( is-map-over-map-total-fibered-map f g m ∙h (g ·l H)) ~
( (I ·r f) ∙h is-map-over-map-total-fibered-map f g m')
htpy-fibered-map : (m m' : fibered-map f g) → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
htpy-fibered-map m m' =
Σ ( map-base-fibered-map f g m ~ map-base-fibered-map f g m')
( λ I →
Σ ( map-total-fibered-map f g m ~ map-total-fibered-map f g m')
( coherence-htpy-fibered-map m m' I))
refl-htpy-fibered-map : (m : fibered-map f g) → htpy-fibered-map m m
pr1 (refl-htpy-fibered-map m) = refl-htpy
pr1 (pr2 (refl-htpy-fibered-map m)) = refl-htpy
pr2 (pr2 (refl-htpy-fibered-map m)) =
inv-htpy-left-unit-htpy ∙h right-unit-htpy
htpy-eq-fibered-map :
(m m' : fibered-map f g) → m = m' → htpy-fibered-map m m'
htpy-eq-fibered-map m .m refl = refl-htpy-fibered-map m
is-torsorial-htpy-fibered-map :
(m : fibered-map f g) → is-torsorial (htpy-fibered-map m)
is-torsorial-htpy-fibered-map m =
is-torsorial-Eq-structure
( is-torsorial-htpy (map-base-fibered-map f g m))
( map-base-fibered-map f g m , refl-htpy)
( is-torsorial-Eq-structure
( is-torsorial-htpy (map-total-fibered-map f g m))
( map-total-fibered-map f g m , refl-htpy)
( is-torsorial-htpy
( is-map-over-map-total-fibered-map f g m ∙h refl-htpy)))
is-equiv-htpy-eq-fibered-map :
(m m' : fibered-map f g) → is-equiv (htpy-eq-fibered-map m m')
is-equiv-htpy-eq-fibered-map m =
fundamental-theorem-id
( is-torsorial-htpy-fibered-map m)
( htpy-eq-fibered-map m)
extensionality-fibered-map :
(m m' : fibered-map f g) → (m = m') ≃ (htpy-fibered-map m m')
pr1 (extensionality-fibered-map m m') = htpy-eq-fibered-map m m'
pr2 (extensionality-fibered-map m m') = is-equiv-htpy-eq-fibered-map m m'
eq-htpy-fibered-map :
(m m' : fibered-map f g) → htpy-fibered-map m m' → m = m'
eq-htpy-fibered-map m m' = map-inv-equiv (extensionality-fibered-map m m')
```
### Fibered maps and fiberwise maps over are equivalent notions
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → X) (g : B → Y) (i : X → Y)
where
fiberwise-map-over-map-over :
map-over f g i → fiberwise-map-over f g i
pr1 (fiberwise-map-over-map-over (h , H) .(f a) (a , refl)) = h a
pr2 (fiberwise-map-over-map-over (h , H) .(f a) (a , refl)) = inv (H a)
map-over-fiberwise-map-over :
fiberwise-map-over f g i → map-over f g i
pr1 (map-over-fiberwise-map-over α) a = pr1 (α (f a) (pair a refl))
pr2 (map-over-fiberwise-map-over α) a = inv (pr2 (α (f a) (pair a refl)))
is-section-map-over-fiberwise-map-over-eq-htpy :
(α : fiberwise-map-over f g i) (x : X) →
fiberwise-map-over-map-over (map-over-fiberwise-map-over α) x ~ α x
is-section-map-over-fiberwise-map-over-eq-htpy α .(f a) (pair a refl) =
eq-pair-eq-fiber (inv-inv (pr2 (α (f a) (pair a refl))))
is-section-map-over-fiberwise-map-over :
fiberwise-map-over-map-over ∘ map-over-fiberwise-map-over ~ id
is-section-map-over-fiberwise-map-over α =
eq-htpy (eq-htpy ∘ is-section-map-over-fiberwise-map-over-eq-htpy α)
is-retraction-map-over-fiberwise-map-over :
map-over-fiberwise-map-over ∘ fiberwise-map-over-map-over ~ id
is-retraction-map-over-fiberwise-map-over (pair h H) =
eq-pair-eq-fiber (eq-htpy (inv-inv ∘ H))
abstract
is-equiv-fiberwise-map-over-map-over :
is-equiv (fiberwise-map-over-map-over)
is-equiv-fiberwise-map-over-map-over =
is-equiv-is-invertible
( map-over-fiberwise-map-over)
( is-section-map-over-fiberwise-map-over)
( is-retraction-map-over-fiberwise-map-over)
abstract
is-equiv-map-over-fiberwise-map-over :
is-equiv (map-over-fiberwise-map-over)
is-equiv-map-over-fiberwise-map-over =
is-equiv-is-invertible
( fiberwise-map-over-map-over)
( is-retraction-map-over-fiberwise-map-over)
( is-section-map-over-fiberwise-map-over)
equiv-fiberwise-map-over-map-over :
map-over f g i ≃ fiberwise-map-over f g i
pr1 equiv-fiberwise-map-over-map-over =
fiberwise-map-over-map-over
pr2 equiv-fiberwise-map-over-map-over =
is-equiv-fiberwise-map-over-map-over
equiv-map-over-fiberwise-map-over :
fiberwise-map-over f g i ≃ map-over f g i
pr1 equiv-map-over-fiberwise-map-over =
map-over-fiberwise-map-over
pr2 equiv-map-over-fiberwise-map-over =
is-equiv-map-over-fiberwise-map-over
equiv-map-over-fiberwise-hom :
fiberwise-hom (i ∘ f) g ≃ map-over f g i
equiv-map-over-fiberwise-hom =
equiv-hom-slice-fiberwise-hom (i ∘ f) g
equiv-fiberwise-map-over-fiberwise-hom :
fiberwise-hom (i ∘ f) g ≃ fiberwise-map-over f g i
equiv-fiberwise-map-over-fiberwise-hom =
equiv-fiberwise-map-over-map-over ∘e equiv-map-over-fiberwise-hom
is-small-fiberwise-map-over :
is-small (l1 ⊔ l2 ⊔ l4) (fiberwise-map-over f g i)
pr1 is-small-fiberwise-map-over = map-over f g i
pr2 is-small-fiberwise-map-over = equiv-map-over-fiberwise-map-over
```
### Slice maps are equal to fibered maps over
```agda
eq-map-over-id-hom-slice :
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
(f : A → X) (g : B → X) → hom-slice f g = map-over f g id
eq-map-over-id-hom-slice f g = refl
eq-map-over-hom-slice :
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → X) (g : B → Y) (i : X → Y) → hom-slice (i ∘ f) g = map-over f g i
eq-map-over-hom-slice f g i = refl
```
### Horizontal composition for fibered maps
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {C : UU l3}
{X : UU l4} {Y : UU l5} {Z : UU l6}
{f : A → X} {g : B → Y} {h : C → Z}
where
is-map-over-pasting-horizontal :
{k : X → Y} {l : Y → Z} {i : A → B} {j : B → C} →
is-map-over f g k i → is-map-over g h l j →
is-map-over f h (l ∘ k) (j ∘ i)
is-map-over-pasting-horizontal {k} {l} {i} {j} =
pasting-horizontal-coherence-square-maps i j f g h k l
map-over-pasting-horizontal :
{k : X → Y} {l : Y → Z} →
map-over f g k → map-over g h l → map-over f h (l ∘ k)
pr1 (map-over-pasting-horizontal {k} {l} (i , I) (j , J)) = j ∘ i
pr2 (map-over-pasting-horizontal {k} {l} (i , I) (j , J)) =
is-map-over-pasting-horizontal {k} {l} I J
fibered-map-pasting-horizontal :
fibered-map f g → fibered-map g h → fibered-map f h
pr1 (fibered-map-pasting-horizontal (k , iI) (l , jJ)) = l ∘ k
pr2 (fibered-map-pasting-horizontal (k , iI) (l , jJ)) =
map-over-pasting-horizontal {k} {l} iI jJ
```
### Vertical composition for fibered maps
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2}
{C : UU l3} {D : UU l4}
{X : UU l5} {Y : UU l6}
{i : A → B} {j : C → D} {k : X → Y}
where
is-map-over-pasting-vertical :
{f : A → C} {g : B → D}
{f' : C → X} {g' : D → Y} →
is-map-over f g j i → is-map-over f' g' k j →
is-map-over (f' ∘ f) (g' ∘ g) k i
is-map-over-pasting-vertical {f} {g} {f'} {g'} =
pasting-vertical-coherence-square-maps i f g j f' g' k
```
### The truncation level of the types of fibered maps is bounded by the truncation level of the codomains
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
where
is-trunc-is-map-over :
(k : 𝕋) → is-trunc (succ-𝕋 k) Y →
(f : A → X) (g : B → Y) (i : X → Y) (h : A → B) →
is-trunc k (is-map-over f g i h)
is-trunc-is-map-over k is-trunc-Y f g i h =
is-trunc-Π k (λ x → is-trunc-Y (i (f x)) (g (h x)))
is-trunc-map-over :
(k : 𝕋) → is-trunc (succ-𝕋 k) Y → is-trunc k B →
(f : A → X) (g : B → Y) (i : X → Y) → is-trunc k (map-over f g i)
is-trunc-map-over k is-trunc-Y is-trunc-B f g i =
is-trunc-Σ
( is-trunc-function-type k is-trunc-B)
( is-trunc-is-map-over k is-trunc-Y f g i)
is-trunc-fibered-map :
(k : 𝕋) → is-trunc k Y → is-trunc k B →
(f : A → X) (g : B → Y) → is-trunc k (fibered-map f g)
is-trunc-fibered-map k is-trunc-Y is-trunc-B f g =
is-trunc-Σ
( is-trunc-function-type k is-trunc-Y)
( is-trunc-map-over
( k)
( is-trunc-succ-is-trunc k is-trunc-Y)
( is-trunc-B)
( f)
( g))
```
### The transpose of a fibered map
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
where
transpose-is-map-over :
(f : A → X) (g : B → Y) (i : X → Y) (h : A → B) →
is-map-over f g i h → is-map-over h i g f
transpose-is-map-over f g i h = inv-htpy
transpose-map-over :
(f : A → X) (g : B → Y) (i : X → Y)
(hH : map-over f g i) → map-over (pr1 hH) i g
pr1 (transpose-map-over f g i hH) = f
pr2 (transpose-map-over f g i (h , H)) =
transpose-is-map-over f g i h H
transpose-fibered-map :
(f : A → X) (g : B → Y)
(ihH : fibered-map f g) → fibered-map (pr1 (pr2 ihH)) (pr1 ihH)
pr1 (transpose-fibered-map f g ihH) = g
pr2 (transpose-fibered-map f g (i , hH)) =
transpose-map-over f g i hH
```
### If the top left corner is empty, the type of fibered maps is equivalent to maps `X → Y`
```text
!
empty ---> B
| |
! | | g
∨ ∨
X -----> Y
i
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → X) (g : B → Y) (is-empty-A : is-empty A)
where
inv-compute-fibered-map-is-empty : (fibered-map f g) ≃ (X → Y)
inv-compute-fibered-map-is-empty =
right-unit-law-Σ-is-contr
( λ i →
is-contr-Σ
( universal-property-empty-is-empty A is-empty-A B)
( ex-falso ∘ is-empty-A)
( dependent-universal-property-empty-is-empty A is-empty-A
( eq-value (i ∘ f) (g ∘ ex-falso ∘ is-empty-A))))
compute-fibered-map-is-empty : (X → Y) ≃ (fibered-map f g)
compute-fibered-map-is-empty = inv-equiv inv-compute-fibered-map-is-empty
module _
{ l2 l3 l4 : Level} {B : UU l2} {X : UU l3} {Y : UU l4}
{f : empty → X} (g : B → Y)
where
inv-compute-fibered-map-empty : (fibered-map f g) ≃ (X → Y)
inv-compute-fibered-map-empty = inv-compute-fibered-map-is-empty f g id
compute-fibered-map-empty : (X → Y) ≃ (fibered-map f g)
compute-fibered-map-empty = compute-fibered-map-is-empty f g id
```
### If the bottom right corner is contractible, the type of fibered maps is equivalent to maps `A → B`
```text
A -----> B
| |
f | | !
∨ ∨
X ---> unit
!
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → X) (g : B → Y) (is-contr-Y : is-contr Y)
where
inv-compute-fibered-map-is-contr : (fibered-map f g) ≃ (A → B)
inv-compute-fibered-map-is-contr =
( right-unit-law-Σ-is-contr
( λ j →
is-contr-Π
( λ x →
is-prop-is-contr is-contr-Y (center is-contr-Y) (g (j x))))) ∘e
( left-unit-law-Σ-is-contr
( is-contr-function-type is-contr-Y)
( λ _ → center is-contr-Y))
compute-fibered-map-is-contr : (A → B) ≃ (fibered-map f g)
compute-fibered-map-is-contr = inv-equiv inv-compute-fibered-map-is-contr
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
(f : A → X) {g : B → unit}
where
inv-compute-fibered-map-unit : (fibered-map f g) ≃ (A → B)
inv-compute-fibered-map-unit =
inv-compute-fibered-map-is-contr f g is-contr-unit
compute-fibered-map-unit : (A → B) ≃ (fibered-map f g)
compute-fibered-map-unit = compute-fibered-map-is-contr f g is-contr-unit
```
## Examples
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2}
(h : A → B)
where
is-fibered-over-self : is-map-over id id h h
is-fibered-over-self = refl-htpy
self-map-over : map-over id id h
pr1 self-map-over = h
pr2 self-map-over = is-fibered-over-self
self-fibered-map : fibered-map id id
pr1 self-fibered-map = h
pr2 self-fibered-map = self-map-over
is-map-over-id : is-map-over h h id id
is-map-over-id = refl-htpy
id-map-over : map-over h h id
pr1 id-map-over = id
pr2 id-map-over = is-map-over-id
id-fibered-map : fibered-map h h
pr1 id-fibered-map = id
pr2 id-fibered-map = id-map-over
```
## See also
- [Morphisms of arrows](foundation.morphisms-arrows.md) for the same concept
under a different name.
- For the pullback property of the type of fibered maps, see
[the pullback-hom](orthogonal-factorization-systems.pullback-hom.md)