# Connected types

Content created by Egbert Rijke, Fredrik Bakke, Jonathan Prieto-Cubides, Tom de Jong, Daniel Gratzer and Elisabeth Stenholm.

Created on 2022-02-18.

module foundation.connected-types where

Imports
open import foundation.contractible-types
open import foundation.dependent-pair-types
open import foundation.diagonal-maps-of-types
open import foundation.function-extensionality
open import foundation.functoriality-truncation
open import foundation.inhabited-types
open import foundation.propositional-truncations
open import foundation.propositions
open import foundation.truncations
open import foundation.type-arithmetic-dependent-pair-types
open import foundation.universe-levels

open import foundation-core.constant-maps
open import foundation-core.contractible-maps
open import foundation-core.equivalences
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.identity-types
open import foundation-core.precomposition-functions
open import foundation-core.retracts-of-types
open import foundation-core.truncated-types
open import foundation-core.truncation-levels


## Idea

A type is said to be k-connected if its k-truncation is contractible.

## Definition

is-connected-Prop : {l : Level} (k : 𝕋) → UU l → Prop l
is-connected-Prop k A = is-contr-Prop (type-trunc k A)

is-connected : {l : Level} (k : 𝕋) → UU l → UU l
is-connected k A = type-Prop (is-connected-Prop k A)

is-prop-is-connected :
{l : Level} (k : 𝕋) (A : UU l) → is-prop (is-connected k A)
is-prop-is-connected k A = is-prop-type-Prop (is-connected-Prop k A)


## Properties

### All types are (-2)-connected

is-neg-two-connected : {l : Level} (A : UU l) → is-connected neg-two-𝕋 A
is-neg-two-connected A = is-trunc-type-trunc


### A type A is k-connected if and only if the map B → (A → B) is an equivalence for every k-truncated type B

is-equiv-diagonal-exponential-is-connected :
{l1 l2 : Level} {k : 𝕋} {A : UU l1} (B : Truncated-Type l2 k) →
is-connected k A →
is-equiv (diagonal-exponential (type-Truncated-Type B) A)
is-equiv-diagonal-exponential-is-connected {k = k} {A} B H =
is-equiv-comp
( precomp unit-trunc (type-Truncated-Type B))
( diagonal-exponential (type-Truncated-Type B) (type-trunc k A))
( is-equiv-diagonal-exponential-is-contr H (type-Truncated-Type B))
( is-truncation-trunc B)

is-connected-is-equiv-diagonal-exponential :
{l1 : Level} {k : 𝕋} {A : UU l1} →
( {l2 : Level} (B : Truncated-Type l2 k) →
is-equiv (diagonal-exponential (type-Truncated-Type B) A)) →
is-connected k A
is-connected-is-equiv-diagonal-exponential {k = k} {A} H =
tot
( λ x →
function-dependent-universal-property-trunc
( Id-Truncated-Type' (trunc k A) x))
( tot
( λ _ → htpy-eq)
( center (is-contr-map-is-equiv (H (trunc k A)) unit-trunc)))


### A contractible type is k-connected for any k

module _
{l1 : Level} (k : 𝕋) {A : UU l1}
where

is-connected-is-contr : is-contr A → is-connected k A
is-connected-is-contr H =
is-connected-is-equiv-diagonal-exponential
( λ B → is-equiv-diagonal-exponential-is-contr H (type-Truncated-Type B))


### A type that is (k+1)-connected is k-connected

is-connected-is-connected-succ-𝕋 :
{l1 : Level} (k : 𝕋) {A : UU l1} →
is-connected (succ-𝕋 k) A → is-connected k A
is-connected-is-connected-succ-𝕋 k H =
is-connected-is-equiv-diagonal-exponential
( λ B →
is-equiv-diagonal-exponential-is-connected
( truncated-type-succ-Truncated-Type k B)
( H))


### The total space of a family of k-connected types over a k-connected type is k-connected

is-connected-Σ :
{l1 l2 : Level} (k : 𝕋) {A : UU l1} {B : A → UU l2} →
is-connected k A → ((x : A) → is-connected k (B x)) →
is-connected k (Σ A B)
is-connected-Σ k H K =
is-contr-equiv _ (equiv-trunc k (equiv-pr1 K) ∘e equiv-trunc-Σ k) H


### An inhabited type A is k + 1-connected if and only if its identity types are k-connected

module _
{l1 : Level} {k : 𝕋} {A : UU l1}
where

abstract
is-inhabited-is-connected :
is-connected (succ-𝕋 k) A → is-inhabited A
is-inhabited-is-connected H =
map-universal-property-trunc
( truncated-type-Prop k (is-inhabited-Prop A))
( unit-trunc-Prop)
( center H)

abstract
is-connected-eq-is-connected :
is-connected (succ-𝕋 k) A → {x y : A} → is-connected k (x ＝ y)
is-connected-eq-is-connected H {x} {y} =
is-contr-equiv
( unit-trunc x ＝ unit-trunc y)
( effectiveness-trunc k x y)
( is-prop-is-contr H (unit-trunc x) (unit-trunc y))

abstract
is-connected-succ-is-connected-eq :
is-inhabited A → ((x y : A) → is-connected k (x ＝ y)) →
is-connected (succ-𝕋 k) A
is-connected-succ-is-connected-eq H K =
apply-universal-property-trunc-Prop H
( is-connected-Prop (succ-𝕋 k) A)
( λ a →
( unit-trunc a) ,
( function-dependent-universal-property-trunc
( Id-Truncated-Type
( truncated-type-succ-Truncated-Type
( succ-𝕋 k)
( trunc (succ-𝕋 k) A))
( unit-trunc a))
( λ x →
map-universal-property-trunc
( Id-Truncated-Type
( trunc (succ-𝕋 k) A)
( unit-trunc a)
( unit-trunc x))
( λ where refl → refl)
( center (K a x)))))


### Being connected is invariant under equivalence

module _
{l1 l2 : Level} {k : 𝕋} {A : UU l1} {B : UU l2}
where

is-connected-is-equiv :
(f : A → B) → is-equiv f → is-connected k B → is-connected k A
is-connected-is-equiv f e =
is-contr-is-equiv
( type-trunc k B)
( map-trunc k f)
( is-equiv-map-equiv-trunc k (f , e))

is-connected-equiv :
A ≃ B → is-connected k B → is-connected k A
is-connected-equiv f =
is-connected-is-equiv (map-equiv f) (is-equiv-map-equiv f)

module _
{l1 l2 : Level} {k : 𝕋} {A : UU l1} {B : UU l2}
where

is-connected-equiv' :
A ≃ B → is-connected k A → is-connected k B
is-connected-equiv' f = is-connected-equiv (inv-equiv f)

is-connected-is-equiv' :
(f : A → B) → is-equiv f → is-connected k A → is-connected k B
is-connected-is-equiv' f e = is-connected-equiv' (f , e)


### Retracts of k-connected types are k-connected

module _
{l1 l2 : Level} {k : 𝕋} {A : UU l1} {B : UU l2}
where

is-connected-retract-of :
A retract-of B →
is-connected k B →
is-connected k A
is-connected-retract-of R c =
is-contr-retract-of (type-trunc k B) (retract-of-trunc-retract-of R) c