# Diagonal maps into cartesian products of types
```agda
module foundation.diagonal-maps-cartesian-products-of-types where
open import foundation-core.diagonal-maps-cartesian-products-of-types public
```
<details><summary>Imports</summary>
```agda
open import foundation.0-maps
open import foundation.dependent-pair-types
open import foundation.faithful-maps
open import foundation.universe-levels
open import foundation-core.1-types
open import foundation-core.cartesian-product-types
open import foundation-core.contractible-maps
open import foundation-core.embeddings
open import foundation-core.fibers-of-maps
open import foundation-core.identity-types
open import foundation-core.propositional-maps
open import foundation-core.propositions
open import foundation-core.sets
open import foundation-core.truncated-maps
open import foundation-core.truncated-types
open import foundation-core.truncation-levels
```
</details>
## Properties
### A type is `k+1`-truncated if and only if the diagonal is `k`-truncated
```agda
module _
{l : Level} {A : UU l}
where
abstract
is-trunc-is-trunc-map-diagonal-product :
(k : 𝕋) → is-trunc-map k (diagonal-product A) → is-trunc (succ-𝕋 k) A
is-trunc-is-trunc-map-diagonal-product k is-trunc-d x y =
is-trunc-is-equiv' k
( fiber (diagonal-product A) (pair x y))
( eq-fiber-diagonal-product A (pair x y))
( is-equiv-eq-fiber-diagonal-product A (pair x y))
( is-trunc-d (pair x y))
abstract
is-prop-is-contr-map-diagonal-product :
is-contr-map (diagonal-product A) → is-prop A
is-prop-is-contr-map-diagonal-product =
is-trunc-is-trunc-map-diagonal-product neg-two-𝕋
abstract
is-set-is-prop-map-diagonal-product :
is-prop-map (diagonal-product A) → is-set A
is-set-is-prop-map-diagonal-product =
is-trunc-is-trunc-map-diagonal-product neg-one-𝕋
abstract
is-set-is-emb-diagonal-product : is-emb (diagonal-product A) → is-set A
is-set-is-emb-diagonal-product H =
is-set-is-prop-map-diagonal-product (is-prop-map-is-emb H)
abstract
is-1-type-is-0-map-diagonal-product :
is-0-map (diagonal-product A) → is-1-type A
is-1-type-is-0-map-diagonal-product =
is-trunc-is-trunc-map-diagonal-product zero-𝕋
abstract
is-1-type-is-faithful-diagonal-product :
is-faithful (diagonal-product A) → is-1-type A
is-1-type-is-faithful-diagonal-product H =
is-1-type-is-0-map-diagonal-product (is-0-map-is-faithful H)
abstract
is-trunc-map-diagonal-product-is-trunc :
(k : 𝕋) → is-trunc (succ-𝕋 k) A → is-trunc-map k (diagonal-product A)
is-trunc-map-diagonal-product-is-trunc k is-trunc-A t =
is-trunc-is-equiv k
( pr1 t = pr2 t)
( eq-fiber-diagonal-product A t)
( is-equiv-eq-fiber-diagonal-product A t)
( is-trunc-A (pr1 t) (pr2 t))
abstract
is-contr-map-diagonal-product-is-prop :
is-prop A → is-contr-map (diagonal-product A)
is-contr-map-diagonal-product-is-prop =
is-trunc-map-diagonal-product-is-trunc neg-two-𝕋
abstract
is-prop-map-diagonal-product-is-set :
is-set A → is-prop-map (diagonal-product A)
is-prop-map-diagonal-product-is-set =
is-trunc-map-diagonal-product-is-trunc neg-one-𝕋
abstract
is-emb-diagonal-product-is-set : is-set A → is-emb (diagonal-product A)
is-emb-diagonal-product-is-set H =
is-emb-is-prop-map (is-prop-map-diagonal-product-is-set H)
abstract
is-0-map-diagonal-product-is-1-type :
is-1-type A → is-0-map (diagonal-product A)
is-0-map-diagonal-product-is-1-type =
is-trunc-map-diagonal-product-is-trunc zero-𝕋
abstract
is-faithful-diagonal-product-is-1-type :
is-1-type A → is-faithful (diagonal-product A)
is-faithful-diagonal-product-is-1-type H =
is-faithful-is-0-map (is-0-map-diagonal-product-is-1-type H)
diagonal-product-emb :
{l : Level} (A : Set l) → type-Set A ↪ type-Set A × type-Set A
pr1 (diagonal-product-emb A) =
diagonal-product (type-Set A)
pr2 (diagonal-product-emb A) =
is-emb-diagonal-product-is-set (is-set-type-Set A)
diagonal-product-faithful-map :
{l : Level} (A : 1-Type l) →
faithful-map (type-1-Type A) (type-1-Type A × type-1-Type A)
pr1 (diagonal-product-faithful-map A) =
diagonal-product (type-1-Type A)
pr2 (diagonal-product-faithful-map A) =
is-faithful-diagonal-product-is-1-type (is-1-type-type-1-Type A)
```