# Diagonals of maps

Content created by Fredrik Bakke, Egbert Rijke and Jonathan Prieto-Cubides.

Created on 2022-07-20.

module foundation.diagonals-of-maps where

Imports
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.equality-fibers-of-maps
open import foundation.standard-pullbacks
open import foundation.universe-levels

open import foundation-core.contractible-maps
open import foundation-core.embeddings
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.propositional-maps
open import foundation-core.retractions
open import foundation-core.sections
open import foundation-core.truncated-maps
open import foundation-core.truncated-types
open import foundation-core.truncation-levels


## Definition

diagonal-map :
{l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) →
A → standard-pullback f f
diagonal-map f x = (x , x , refl)


## Properties

### The fiber of the diagonal of a map

module _
{l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B)
(t : standard-pullback f f)
where

fiber-ap-fiber-diagonal-map :
fiber (diagonal-map f) t → fiber (ap f) (pr2 (pr2 t))
fiber-ap-fiber-diagonal-map (z , refl) = (refl , refl)

fiber-diagonal-map-fiber-ap :
fiber (ap f) (pr2 (pr2 t)) → fiber (diagonal-map f) t
fiber-diagonal-map-fiber-ap (refl , refl) = (pr1 t , refl)

abstract
is-section-fiber-diagonal-map-fiber-ap :
is-section fiber-ap-fiber-diagonal-map fiber-diagonal-map-fiber-ap
is-section-fiber-diagonal-map-fiber-ap (refl , refl) = refl

abstract
is-retraction-fiber-diagonal-map-fiber-ap :
is-retraction fiber-ap-fiber-diagonal-map fiber-diagonal-map-fiber-ap
is-retraction-fiber-diagonal-map-fiber-ap (x , refl) = refl

abstract
is-equiv-fiber-ap-fiber-diagonal-map :
is-equiv fiber-ap-fiber-diagonal-map
is-equiv-fiber-ap-fiber-diagonal-map =
is-equiv-is-invertible
( fiber-diagonal-map-fiber-ap)
( is-section-fiber-diagonal-map-fiber-ap)
( is-retraction-fiber-diagonal-map-fiber-ap)


### A map is k+1-truncated if and only if its diagonal is k-truncated

abstract
is-trunc-diagonal-map-is-trunc-map :
{l1 l2 : Level} (k : 𝕋) {A : UU l1} {B : UU l2} (f : A → B) →
is-trunc-map (succ-𝕋 k) f → is-trunc-map k (diagonal-map f)
is-trunc-diagonal-map-is-trunc-map k f is-trunc-f (x , y , p) =
is-trunc-is-equiv k (fiber (ap f) p)
( fiber-ap-fiber-diagonal-map f (triple x y p))
( is-equiv-fiber-ap-fiber-diagonal-map f (triple x y p))
( is-trunc-map-ap-is-trunc-map k f is-trunc-f x y p)

abstract
is-trunc-map-is-trunc-diagonal-map :
{l1 l2 : Level} (k : 𝕋) {A : UU l1} {B : UU l2} (f : A → B) →
is-trunc-map k (diagonal-map f) → is-trunc-map (succ-𝕋 k) f
is-trunc-map-is-trunc-diagonal-map k f is-trunc-δ b (x , p) (x' , p') =
is-trunc-is-equiv k
( fiber (ap f) (p ∙ (inv p')))
( fiber-ap-eq-fiber f (x , p) (x' , p'))
( is-equiv-fiber-ap-eq-fiber f (x , p) (x' , p'))
( is-trunc-is-equiv' k
( fiber (diagonal-map f) (triple x x' (p ∙ (inv p'))))
( fiber-ap-fiber-diagonal-map f (triple x x' (p ∙ (inv p'))))
( is-equiv-fiber-ap-fiber-diagonal-map f (triple x x' (p ∙ (inv p'))))
( is-trunc-δ (triple x x' (p ∙ (inv p')))))

abstract
is-equiv-diagonal-map-is-emb :
{l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) →
is-emb f → is-equiv (diagonal-map f)
is-equiv-diagonal-map-is-emb f is-emb-f =
is-equiv-is-contr-map
( is-trunc-diagonal-map-is-trunc-map neg-two-𝕋 f
( is-prop-map-is-emb is-emb-f))

abstract
is-emb-is-equiv-diagonal-map :
{l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) →
is-equiv (diagonal-map f) → is-emb f
is-emb-is-equiv-diagonal-map f is-equiv-δ =
is-emb-is-prop-map
( is-trunc-map-is-trunc-diagonal-map neg-two-𝕋 f
( is-contr-map-is-equiv is-equiv-δ))