# 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) ```