# Diagonal maps into cartesian products of types

Content created by Fredrik Bakke.

Created on 2024-04-11.

module foundation-core.diagonal-maps-cartesian-products-of-types where

Imports
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.equality-cartesian-product-types
open import foundation.universe-levels

open import foundation-core.cartesian-product-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.propositions
open import foundation-core.retractions
open import foundation-core.sections


## Idea

The diagonal map that includes a type A into its cartesian product A × A is the map that maps x to the pair (x , x).

## Definition

module _
{l : Level} (A : UU l)
where

diagonal-product : A → A × A
diagonal-product x = (x , x)


## Properties

### The action on paths of a diagonal

compute-ap-diagonal-product :
{l : Level} {A : UU l} {x y : A} (p : x ＝ y) →
ap (diagonal-product A) p ＝ eq-pair p p
compute-ap-diagonal-product refl = refl


### If the diagonal of A is an equivalence, then A is a proposition

module _
{l : Level} (A : UU l)
where

abstract
is-prop-is-equiv-diagonal-product :
is-equiv (diagonal-product A) → is-prop A
is-prop-is-equiv-diagonal-product is-equiv-d =
is-prop-all-elements-equal
( λ x y →
( inv (ap pr1 (is-section-map-inv-is-equiv is-equiv-d (x , y)))) ∙
( ap pr2 (is-section-map-inv-is-equiv is-equiv-d (x , y))))

equiv-diagonal-product-is-prop :
is-prop A → A ≃ A × A
pr1 (equiv-diagonal-product-is-prop is-prop-A) =
diagonal-product A
pr2 (equiv-diagonal-product-is-prop is-prop-A) =
is-equiv-is-invertible
( pr1)
( λ _ → eq-pair (eq-is-prop is-prop-A) (eq-is-prop is-prop-A))
( λ a → eq-is-prop is-prop-A)


### The fibers of the diagonal map

module _
{l : Level} (A : UU l)
where

eq-fiber-diagonal-product :
(t : A × A) → fiber (diagonal-product A) t → pr1 t ＝ pr2 t
eq-fiber-diagonal-product (x , y) (z , α) = inv (ap pr1 α) ∙ ap pr2 α

fiber-diagonal-product-eq :
(t : A × A) → pr1 t ＝ pr2 t → fiber (diagonal-product A) t
fiber-diagonal-product-eq (x , y) β = (x , eq-pair refl β)

is-section-fiber-diagonal-product-eq :
(t : A × A) →
is-section (eq-fiber-diagonal-product t) (fiber-diagonal-product-eq t)
is-section-fiber-diagonal-product-eq (x , .x) refl = refl

is-retraction-fiber-diagonal-product-eq :
(t : A × A) →
is-retraction (eq-fiber-diagonal-product t) (fiber-diagonal-product-eq t)
is-retraction-fiber-diagonal-product-eq .(z , z) (z , refl) = refl

abstract
is-equiv-eq-fiber-diagonal-product :
(t : A × A) → is-equiv (eq-fiber-diagonal-product t)
is-equiv-eq-fiber-diagonal-product t =
is-equiv-is-invertible
( fiber-diagonal-product-eq t)
( is-section-fiber-diagonal-product-eq t)
( is-retraction-fiber-diagonal-product-eq t)