# `0`-Connected types

```agda
module foundation.0-connected-types where
```

<details><summary>Imports</summary>

```agda
open import foundation.action-on-identifications-functions
open import foundation.constant-maps
open import foundation.contractible-types
open import foundation.dependent-pair-types
open import foundation.fiber-inclusions
open import foundation.functoriality-set-truncation
open import foundation.images
open import foundation.inhabited-types
open import foundation.mere-equality
open import foundation.propositional-truncations
open import foundation.set-truncations
open import foundation.sets
open import foundation.surjective-maps
open import foundation.unit-type
open import foundation.universal-property-contractible-types
open import foundation.universal-property-unit-type
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.identity-types
open import foundation-core.precomposition-functions
open import foundation-core.propositions
open import foundation-core.truncated-maps
open import foundation-core.truncated-types
open import foundation-core.truncation-levels
```

</details>

## Idea

A type is said to be connected if its type of connected components, i.e., its
set truncation, is contractible.

```agda
is-0-connected-Prop : {l : Level}  UU l  Prop l
is-0-connected-Prop A = is-contr-Prop (type-trunc-Set A)

is-0-connected : {l : Level}  UU l  UU l
is-0-connected A = type-Prop (is-0-connected-Prop A)

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

abstract
  is-inhabited-is-0-connected :
    {l : Level} {A : UU l}  is-0-connected A  is-inhabited A
  is-inhabited-is-0-connected {l} {A} C =
    apply-universal-property-trunc-Set'
      ( center C)
      ( set-Prop (trunc-Prop A))
      ( unit-trunc-Prop)

abstract
  mere-eq-is-0-connected :
    {l : Level} {A : UU l}  is-0-connected A  (x y : A)  mere-eq x y
  mere-eq-is-0-connected {A = A} H x y =
    apply-effectiveness-unit-trunc-Set (eq-is-contr H)

abstract
  is-0-connected-mere-eq :
    {l : Level} {A : UU l} (a : A) 
    ((x : A)  mere-eq a x)  is-0-connected A
  is-0-connected-mere-eq {l} {A} a e =
    pair
      ( unit-trunc-Set a)
      ( apply-dependent-universal-property-trunc-Set'
        ( λ x  set-Prop (Id-Prop (trunc-Set A) (unit-trunc-Set a) x))
        ( λ x  apply-effectiveness-unit-trunc-Set' (e x)))

abstract
  is-0-connected-mere-eq-is-inhabited :
    {l : Level} {A : UU l} 
    is-inhabited A  ((x y : A)  mere-eq x y)  is-0-connected A
  is-0-connected-mere-eq-is-inhabited H K =
    apply-universal-property-trunc-Prop H
      ( is-0-connected-Prop _)
      ( λ a  is-0-connected-mere-eq a (K a))

is-0-connected-is-surjective-point :
  {l1 : Level} {A : UU l1} (a : A) 
  is-surjective (point a)  is-0-connected A
is-0-connected-is-surjective-point a H =
  is-0-connected-mere-eq a
    ( λ x 
      apply-universal-property-trunc-Prop
        ( H x)
        ( mere-eq-Prop a x)
        ( λ u  unit-trunc-Prop (pr2 u)))

abstract
  is-surjective-point-is-0-connected :
    {l1 : Level} {A : UU l1} (a : A) 
    is-0-connected A  is-surjective (point a)
  is-surjective-point-is-0-connected a H x =
    apply-universal-property-trunc-Prop
      ( mere-eq-is-0-connected H a x)
      ( trunc-Prop (fiber (point a) x))
      ( λ where refl  unit-trunc-Prop (star , refl))

is-trunc-map-ev-point-is-connected :
  {l1 l2 : Level} (k : 𝕋) {A : UU l1} {B : UU l2} (a : A) 
  is-0-connected A  is-trunc (succ-𝕋 k) B 
  is-trunc-map k (ev-point' a {B})
is-trunc-map-ev-point-is-connected k {A} {B} a H K =
  is-trunc-map-comp k
    ( ev-point' star {B})
    ( precomp (point a) B)
    ( is-trunc-map-is-equiv k
      ( universal-property-contr-is-contr star is-contr-unit B))
    ( is-trunc-map-precomp-Π-is-surjective k
      ( is-surjective-point-is-0-connected a H)
      ( λ _  (B , K)))

equiv-dependent-universal-property-is-0-connected :
  {l1 : Level} {A : UU l1} (a : A)  is-0-connected A 
  ( {l : Level} (P : A  Prop l) 
    ((x : A)  type-Prop (P x))  type-Prop (P a))
equiv-dependent-universal-property-is-0-connected a H P =
  ( equiv-universal-property-unit (type-Prop (P a))) ∘e
  ( equiv-dependent-universal-property-surjection-is-surjective
    ( point a)
    ( is-surjective-point-is-0-connected a H)
    ( P))

apply-dependent-universal-property-is-0-connected :
  {l1 : Level} {A : UU l1} (a : A)  is-0-connected A 
  {l : Level} (P : A  Prop l)  type-Prop (P a)  (x : A)  type-Prop (P x)
apply-dependent-universal-property-is-0-connected a H P =
  map-inv-equiv (equiv-dependent-universal-property-is-0-connected a H P)

abstract
  is-surjective-fiber-inclusion :
    {l1 l2 : Level} {A : UU l1} {B : A  UU l2} 
    is-0-connected A  (a : A)  is-surjective (fiber-inclusion B a)
  is-surjective-fiber-inclusion {B = B} C a (x , b) =
    apply-universal-property-trunc-Prop
      ( mere-eq-is-0-connected C a x)
      ( trunc-Prop (fiber (fiber-inclusion B a) (x , b)))
      ( λ where refl  unit-trunc-Prop (b , refl))

abstract
  mere-eq-is-surjective-fiber-inclusion :
    {l1 : Level} {A : UU l1} (a : A) 
    ({l : Level} (B : A  UU l)  is-surjective (fiber-inclusion B a)) 
    (x : A)  mere-eq a x
  mere-eq-is-surjective-fiber-inclusion a H x =
    apply-universal-property-trunc-Prop
      ( H  x  unit) (x , star))
      ( mere-eq-Prop a x)
      ( λ u  unit-trunc-Prop (ap pr1 (pr2 u)))

abstract
  is-0-connected-is-surjective-fiber-inclusion :
    {l1 : Level} {A : UU l1} (a : A) 
    ({l : Level} (B : A  UU l)  is-surjective (fiber-inclusion B a)) 
    is-0-connected A
  is-0-connected-is-surjective-fiber-inclusion a H =
    is-0-connected-mere-eq a (mere-eq-is-surjective-fiber-inclusion a H)

is-0-connected-equiv :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} 
  (A  B)  is-0-connected B  is-0-connected A
is-0-connected-equiv e = is-contr-equiv _ (equiv-trunc-Set e)

is-0-connected-equiv' :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} 
  (A  B)  is-0-connected A  is-0-connected B
is-0-connected-equiv' e = is-0-connected-equiv (inv-equiv e)
```

### `0`-connected types are closed under cartesian products

```agda
module _
  {l1 l2 : Level} (X : UU l1) (Y : UU l2)
  (p1 : is-0-connected X) (p2 : is-0-connected Y)
  where

  is-0-connected-product : is-0-connected (X × Y)
  is-0-connected-product =
    is-contr-equiv
      ( type-trunc-Set X × type-trunc-Set Y)
      ( equiv-distributive-trunc-product-Set X Y)
      ( is-contr-product p1 p2)
```

### The unit type is `0`-connected

```agda
abstract
  is-0-connected-unit : is-0-connected unit
  is-0-connected-unit =
    is-contr-equiv' unit equiv-unit-trunc-unit-Set is-contr-unit
```

### A contractible type is `0`-connected

```agda
is-0-connected-is-contr :
  {l : Level} (X : UU l) 
  is-contr X  is-0-connected X
is-0-connected-is-contr X p =
  is-contr-equiv X (inv-equiv (equiv-unit-trunc-Set (X , is-set-is-contr p))) p
```

### The image of a function with a `0`-connected domain is `0`-connected

```agda
abstract
  is-0-connected-im-is-0-connected-domain :
    {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A  B) 
    is-0-connected A  is-0-connected (im f)
  is-0-connected-im-is-0-connected-domain {A = A} {B} f C =
    apply-universal-property-trunc-Prop
      ( is-inhabited-is-0-connected C)
      ( is-contr-Prop _)
      ( λ a 
        is-contr-equiv'
          ( im (map-trunc-Set f))
          ( equiv-trunc-im-Set f)
          ( is-contr-im
            ( trunc-Set B)
            ( unit-trunc-Set a)
            ( apply-dependent-universal-property-trunc-Set'
              ( λ x 
                set-Prop
                  ( Id-Prop
                    ( trunc-Set B)
                    ( map-trunc-Set f x)
                    ( map-trunc-Set f (unit-trunc-Set a))))
              ( λ a' 
                apply-universal-property-trunc-Prop
                  ( mere-eq-is-0-connected C a' a)
                  ( Id-Prop
                    ( trunc-Set B)
                    ( map-trunc-Set f (unit-trunc-Set a'))
                    ( map-trunc-Set f (unit-trunc-Set a)))
                  ( λ where refl  refl)))))

abstract
  is-0-connected-im-point' :
    {l1 : Level} {A : UU l1} (f : unit  A)  is-0-connected (im f)
  is-0-connected-im-point' f =
    is-0-connected-im-is-0-connected-domain f is-0-connected-unit
```