# Fibered equivalences ```agda module foundation.fibered-equivalences where ``` <details><summary>Imports</summary> ```agda open import foundation.dependent-pair-types open import foundation.embeddings open import foundation.equivalences open import foundation.fibered-maps open import foundation.logical-equivalences open import foundation.pullbacks open import foundation.slice open import foundation.universe-levels open import foundation-core.cartesian-product-types open import foundation-core.families-of-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.propositions open import foundation-core.subtypes ``` </details> ## Idea A fibered equivalence is a fibered map ```text h A -------> B | | f| |g | | ∨ ∨ X -------> Y i ``` such that both `i` and `h` are equivalences. ## Definition ```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 equiv-over : (X → Y) → UU (l1 ⊔ l2 ⊔ l4) equiv-over i = Σ (A ≃ B) (is-map-over f g i ∘ map-equiv) fibered-equiv : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) fibered-equiv = Σ (X ≃ Y) (equiv-over ∘ map-equiv) fiberwise-equiv-over : (X → Y) → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) fiberwise-equiv-over i = Σ (fiberwise-map-over f g i) is-fiberwise-equiv fam-equiv-over : (X → Y) → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) fam-equiv-over i = (x : X) → (fiber f x) ≃ (fiber g (i x)) ``` ## Properties ### The induced maps on fibers are equivalences ```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 eq-equiv-over-equiv-slice : equiv-slice (i ∘ f) g = equiv-over f g i eq-equiv-over-equiv-slice = refl eq-equiv-slice-equiv-over : equiv-over f g i = equiv-slice (i ∘ f) g eq-equiv-slice-equiv-over = refl equiv-equiv-over-fiberwise-equiv : fiberwise-equiv (fiber (i ∘ f)) (fiber g) ≃ equiv-over f g i equiv-equiv-over-fiberwise-equiv = equiv-equiv-slice-fiberwise-equiv (i ∘ f) g ``` ### Fibered equivalences embed into the type 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) (i : X → Y) where map-Σ-is-equiv-equiv-over : (equiv-over f g i) → Σ (map-over f g i) (is-equiv ∘ pr1) pr1 (pr1 (map-Σ-is-equiv-equiv-over ((h , is-equiv-h) , H))) = h pr2 (pr1 (map-Σ-is-equiv-equiv-over ((h , is-equiv-h) , H))) = H pr2 (map-Σ-is-equiv-equiv-over ((h , is-equiv-h) , H)) = is-equiv-h map-equiv-over-Σ-is-equiv : Σ (map-over f g i) (is-equiv ∘ pr1) → (equiv-over f g i) pr1 (pr1 (map-equiv-over-Σ-is-equiv ((h , H) , is-equiv-h))) = h pr2 (pr1 (map-equiv-over-Σ-is-equiv ((h , H) , is-equiv-h))) = is-equiv-h pr2 (map-equiv-over-Σ-is-equiv ((h , H) , is-equiv-h)) = H is-equiv-map-Σ-is-equiv-equiv-over : is-equiv map-Σ-is-equiv-equiv-over is-equiv-map-Σ-is-equiv-equiv-over = is-equiv-is-invertible map-equiv-over-Σ-is-equiv refl-htpy refl-htpy equiv-Σ-is-equiv-equiv-over : (equiv-over f g i) ≃ Σ (map-over f g i) (is-equiv ∘ pr1) pr1 equiv-Σ-is-equiv-equiv-over = map-Σ-is-equiv-equiv-over pr2 equiv-Σ-is-equiv-equiv-over = is-equiv-map-Σ-is-equiv-equiv-over is-equiv-map-equiv-over-Σ-is-equiv : is-equiv map-equiv-over-Σ-is-equiv is-equiv-map-equiv-over-Σ-is-equiv = is-equiv-is-invertible map-Σ-is-equiv-equiv-over refl-htpy refl-htpy equiv-equiv-over-Σ-is-equiv : Σ (map-over f g i) (is-equiv ∘ pr1) ≃ (equiv-over f g i) pr1 equiv-equiv-over-Σ-is-equiv = map-equiv-over-Σ-is-equiv pr2 equiv-equiv-over-Σ-is-equiv = is-equiv-map-equiv-over-Σ-is-equiv emb-map-over-equiv-over : equiv-over f g i ↪ map-over f g i emb-map-over-equiv-over = comp-emb ( emb-subtype (is-equiv-Prop ∘ pr1)) ( emb-equiv equiv-Σ-is-equiv-equiv-over) map-over-equiv-over : equiv-over f g i → map-over f g i map-over-equiv-over = map-emb emb-map-over-equiv-over is-emb-map-over-equiv-over : is-emb map-over-equiv-over is-emb-map-over-equiv-over = is-emb-map-emb emb-map-over-equiv-over 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-fibered-equiv-fibered-map : fibered-map f g → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) is-fibered-equiv-fibered-map (i , h , H) = is-equiv i × is-equiv h map-Σ-is-fibered-equiv-fibered-map-fibered-equiv : (fibered-equiv f g) → Σ (fibered-map f g) (is-fibered-equiv-fibered-map) pr1 (pr1 (map-Σ-is-fibered-equiv-fibered-map-fibered-equiv ((i , is-equiv-i) , (h , is-equiv-h) , H))) = i pr1 (pr2 (pr1 (map-Σ-is-fibered-equiv-fibered-map-fibered-equiv ((i , is-equiv-i) , (h , is-equiv-h) , H)))) = h pr2 (pr2 (pr1 (map-Σ-is-fibered-equiv-fibered-map-fibered-equiv ((i , is-equiv-i) , (h , is-equiv-h) , H)))) = H pr1 (pr2 (map-Σ-is-fibered-equiv-fibered-map-fibered-equiv ((i , is-equiv-i) , (h , is-equiv-h) , H))) = is-equiv-i pr2 (pr2 (map-Σ-is-fibered-equiv-fibered-map-fibered-equiv ((i , is-equiv-i) , (h , is-equiv-h) , H))) = is-equiv-h map-fibered-equiv-Σ-is-fibered-equiv-fibered-map : (Σ (fibered-map f g) (is-fibered-equiv-fibered-map)) → (fibered-equiv f g) pr1 (pr1 (map-fibered-equiv-Σ-is-fibered-equiv-fibered-map ((i , h , H) , is-equiv-i , is-equiv-h))) = i pr2 (pr1 (map-fibered-equiv-Σ-is-fibered-equiv-fibered-map ((i , h , H) , is-equiv-i , is-equiv-h))) = is-equiv-i pr1 (pr1 (pr2 (map-fibered-equiv-Σ-is-fibered-equiv-fibered-map ((i , h , H) , is-equiv-i , is-equiv-h)))) = h pr2 (pr1 (pr2 (map-fibered-equiv-Σ-is-fibered-equiv-fibered-map ((i , h , H) , is-equiv-i , is-equiv-h)))) = is-equiv-h pr2 (pr2 (map-fibered-equiv-Σ-is-fibered-equiv-fibered-map ((i , h , H) , is-equiv-i , is-equiv-h))) = H is-equiv-map-Σ-is-fibered-equiv-fibered-map-fibered-equiv : is-equiv (map-Σ-is-fibered-equiv-fibered-map-fibered-equiv) is-equiv-map-Σ-is-fibered-equiv-fibered-map-fibered-equiv = is-equiv-is-invertible ( map-fibered-equiv-Σ-is-fibered-equiv-fibered-map) ( refl-htpy) ( refl-htpy) equiv-Σ-is-fibered-equiv-fibered-map-fibered-equiv : (fibered-equiv f g) ≃ Σ (fibered-map f g) (is-fibered-equiv-fibered-map) pr1 equiv-Σ-is-fibered-equiv-fibered-map-fibered-equiv = map-Σ-is-fibered-equiv-fibered-map-fibered-equiv pr2 equiv-Σ-is-fibered-equiv-fibered-map-fibered-equiv = is-equiv-map-Σ-is-fibered-equiv-fibered-map-fibered-equiv is-equiv-map-fibered-equiv-Σ-is-fibered-equiv-fibered-map : is-equiv (map-fibered-equiv-Σ-is-fibered-equiv-fibered-map) is-equiv-map-fibered-equiv-Σ-is-fibered-equiv-fibered-map = is-equiv-is-invertible ( map-Σ-is-fibered-equiv-fibered-map-fibered-equiv) ( refl-htpy) ( refl-htpy) equiv-fibered-equiv-Σ-is-fibered-equiv-fibered-map : Σ (fibered-map f g) (is-fibered-equiv-fibered-map) ≃ (fibered-equiv f g) pr1 equiv-fibered-equiv-Σ-is-fibered-equiv-fibered-map = map-fibered-equiv-Σ-is-fibered-equiv-fibered-map pr2 equiv-fibered-equiv-Σ-is-fibered-equiv-fibered-map = is-equiv-map-fibered-equiv-Σ-is-fibered-equiv-fibered-map is-prop-is-fibered-equiv-fibered-map : (ihH : fibered-map f g) → is-prop (is-fibered-equiv-fibered-map ihH) is-prop-is-fibered-equiv-fibered-map (i , h , H) = is-prop-product (is-property-is-equiv i) (is-property-is-equiv h) is-fibered-equiv-fibered-map-Prop : fibered-map f g → Prop (l1 ⊔ l2 ⊔ l3 ⊔ l4) pr1 (is-fibered-equiv-fibered-map-Prop ihH) = is-fibered-equiv-fibered-map ihH pr2 (is-fibered-equiv-fibered-map-Prop ihH) = is-prop-is-fibered-equiv-fibered-map ihH emb-fibered-map-fibered-equiv : fibered-equiv f g ↪ fibered-map f g emb-fibered-map-fibered-equiv = comp-emb ( emb-subtype is-fibered-equiv-fibered-map-Prop) ( emb-equiv equiv-Σ-is-fibered-equiv-fibered-map-fibered-equiv) fibered-map-fibered-equiv : fibered-equiv f g → fibered-map f g fibered-map-fibered-equiv = map-emb emb-fibered-map-fibered-equiv is-emb-fibered-map-fibered-equiv : is-emb fibered-map-fibered-equiv is-emb-fibered-map-fibered-equiv = is-emb-map-emb emb-fibered-map-fibered-equiv ``` ### Extensionality for equivalences 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 extensionality-equiv-over : (e e' : equiv-over f g i) → ( e = e') ≃ ( htpy-map-over f g i ( map-over-equiv-over f g i e) ( map-over-equiv-over f g i e')) extensionality-equiv-over e e' = ( extensionality-map-over f g i ( map-over-equiv-over f g i e) ( map-over-equiv-over f g i e')) ∘e ( equiv-ap-emb (emb-map-over-equiv-over f g i)) htpy-eq-equiv-over : (e e' : equiv-over f g i) → ( e = e') → ( htpy-map-over f g i ( map-over-equiv-over f g i e) ( map-over-equiv-over f g i e')) htpy-eq-equiv-over e e' = map-equiv (extensionality-equiv-over e e') eq-htpy-equiv-over : (e e' : equiv-over f g i) → htpy-map-over f g i ( map-over-equiv-over f g i e) ( map-over-equiv-over f g i e') → e = e' eq-htpy-equiv-over e e' = map-inv-equiv (extensionality-equiv-over e e') ``` ### Extensionality for fibered equivalences ```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 extensionality-fibered-equiv : (e e' : fibered-equiv f g) → ( e = e') ≃ ( htpy-fibered-map f g ( fibered-map-fibered-equiv f g e) ( fibered-map-fibered-equiv f g e')) extensionality-fibered-equiv e e' = ( extensionality-fibered-map f g ( fibered-map-fibered-equiv f g e) ( fibered-map-fibered-equiv f g e')) ∘e ( equiv-ap-emb (emb-fibered-map-fibered-equiv f g)) htpy-eq-fibered-equiv : (e e' : fibered-equiv f g) → ( e = e') → ( htpy-fibered-map f g ( fibered-map-fibered-equiv f g e) ( fibered-map-fibered-equiv f g e')) htpy-eq-fibered-equiv e e' = map-equiv (extensionality-fibered-equiv e e') eq-htpy-fibered-equiv : (e e' : fibered-equiv f g) → htpy-fibered-map f g ( fibered-map-fibered-equiv f g e) ( fibered-map-fibered-equiv f g e') → e = e' eq-htpy-fibered-equiv e e' = map-inv-equiv (extensionality-fibered-equiv e e') ``` ### Fibered equivalences are pullback squares ```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) (ihH : fibered-map f g) where is-fibered-equiv-is-pullback : is-equiv (pr1 ihH) → is-pullback (pr1 ihH) g (cone-fibered-map f g ihH) → is-fibered-equiv-fibered-map f g ihH pr1 (is-fibered-equiv-is-pullback is-equiv-i pb) = is-equiv-i pr2 (is-fibered-equiv-is-pullback is-equiv-i pb) = is-equiv-horizontal-map-is-pullback (pr1 ihH) g ( cone-fibered-map f g ihH) ( is-equiv-i) ( pb) is-pullback-is-fibered-equiv : is-fibered-equiv-fibered-map f g ihH → is-pullback (pr1 ihH) g (cone-fibered-map f g ihH) is-pullback-is-fibered-equiv (is-equiv-i , is-equiv-h) = is-pullback-is-equiv-horizontal-maps (pr1 ihH) g (cone-fibered-map f g ihH) is-equiv-i is-equiv-h equiv-is-fibered-equiv-is-pullback : is-equiv (pr1 ihH) → is-pullback (pr1 ihH) g (cone-fibered-map f g ihH) ≃ is-fibered-equiv-fibered-map f g ihH equiv-is-fibered-equiv-is-pullback is-equiv-i = equiv-iff-is-prop ( is-prop-is-pullback (pr1 ihH) g (cone-fibered-map f g ihH)) ( is-prop-is-fibered-equiv-fibered-map f g ihH) ( is-fibered-equiv-is-pullback is-equiv-i) ( is-pullback-is-fibered-equiv) equiv-is-pullback-is-fibered-equiv : is-equiv (pr1 ihH) → is-fibered-equiv-fibered-map f g ihH ≃ is-pullback (pr1 ihH) g (cone-fibered-map f g ihH) equiv-is-pullback-is-fibered-equiv is-equiv-i = inv-equiv (equiv-is-fibered-equiv-is-pullback is-equiv-i) fibered-equiv-is-pullback : is-equiv (pr1 ihH) → is-pullback (pr1 ihH) g (cone-fibered-map f g ihH) → fibered-equiv f g pr1 (pr1 (fibered-equiv-is-pullback is-equiv-i pb)) = pr1 ihH pr2 (pr1 (fibered-equiv-is-pullback is-equiv-i pb)) = is-equiv-i pr1 (pr1 (pr2 (fibered-equiv-is-pullback is-equiv-i pb))) = pr1 (pr2 ihH) pr2 (pr1 (pr2 (fibered-equiv-is-pullback is-equiv-i pb))) = pr2 (is-fibered-equiv-is-pullback is-equiv-i pb) pr2 (pr2 (fibered-equiv-is-pullback is-equiv-i pb)) = pr2 (pr2 ihH) is-pullback-fibered-equiv : {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} (f : A → X) (g : B → Y) (e : fibered-equiv f g) → is-pullback ( pr1 (pr1 e)) ( g) ( cone-fibered-map f g (fibered-map-fibered-equiv f g e)) is-pullback-fibered-equiv f g ((i , is-equiv-i) , (h , is-equiv-h) , H) = is-pullback-is-fibered-equiv f g (i , h , H) (is-equiv-i , is-equiv-h) ``` ## Examples ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where self-fibered-equiv : A ≃ B → fibered-equiv id id pr1 (self-fibered-equiv e) = e pr1 (pr2 (self-fibered-equiv e)) = e pr2 (pr2 (self-fibered-equiv e)) = refl-htpy id-fibered-equiv : (f : A → B) → fibered-equiv f f pr1 (id-fibered-equiv f) = id-equiv pr1 (pr2 (id-fibered-equiv f)) = id-equiv pr2 (pr2 (id-fibered-equiv f)) = refl-htpy id-fibered-equiv-htpy : (f g : A → B) → f ~ g → fibered-equiv f g pr1 (id-fibered-equiv-htpy f g H) = id-equiv pr1 (pr2 (id-fibered-equiv-htpy f g H)) = id-equiv pr2 (pr2 (id-fibered-equiv-htpy f g H)) = H ``` ## See also - [Equivalences of arrows](foundation.equivalences-arrows.md) for the same concept under a different name.