# Propositional maps

```agda
module foundation-core.propositional-maps where
```

<details><summary>Imports</summary>

```agda
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.universe-levels

open import foundation-core.contractible-types
open import foundation-core.embeddings
open import foundation-core.fibers-of-maps
open import foundation-core.identity-types
open import foundation-core.propositions
```

</details>

## Idea

A map is said to be **propositional** if its
[fibers](foundation-core.fibers-of-maps.md) are
[propositions](foundation-core.propositions.md). This condition is the same as
the condition of being a
[`-1`-truncated map](foundation-core.truncated-maps.md), and it is
[equivalent](foundation-core.equivalences.md) to being an
[embedding](foundation-core.embeddings.md).

**Note:** Of the three equivalent conditions mentioned above, propositional
maps, `-1`-truncated maps, and embeddings, the central notion of in the
agda-unimath library is that of embedding. This means that most infrastructure
is available for embeddings, and that it is easy to convert from any of the
other two notions to the notion of embedding.

## Definitions

### The predicate of being a propositional map

```agda
module _
  {l1 l2 : Level}
  where

  is-prop-map :
    {A : UU l1} {B : UU l2} 
    (A  B)  UU (l1  l2)
  is-prop-map {B = B} f = (b : B)  is-prop (fiber f b)
```

### The type of propositional maps

```agda
module _
  {l1 l2 : Level}
  where

  prop-map : (A : UU l1) (B : UU l2)  UU (l1  l2)
  prop-map A B = Σ (A  B) is-prop-map

  module _
    {A : UU l1} {B : UU l2} (f : prop-map A B)
    where

    map-prop-map : A  B
    map-prop-map = pr1 f

    is-prop-map-prop-map : is-prop-map map-prop-map
    is-prop-map-prop-map = pr2 f
```

## Properties

### The fibers of a map are propositions if and only if it is an embedding

```agda
module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A  B}
  where

  abstract
    is-emb-is-prop-map : is-prop-map f  is-emb f
    is-emb-is-prop-map is-prop-map-f x =
      fundamental-theorem-id
        ( is-contr-equiv'
          ( fiber f (f x))
          ( equiv-fiber f (f x))
          ( is-proof-irrelevant-is-prop (is-prop-map-f (f x)) (x , refl)))
        ( λ _  ap f)

  abstract
    is-prop-map-is-emb : is-emb f  is-prop-map f
    is-prop-map-is-emb is-emb-f y =
      is-prop-is-proof-irrelevant α
      where
      α : (t : fiber f y)  is-contr (fiber f y)
      α (x , refl) =
        is-contr-equiv
          ( fiber' f (f x))
          ( equiv-fiber f (f x))
          ( fundamental-theorem-id'  _  ap f) (is-emb-f x))

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

  emb-prop-map : prop-map A B  A  B
  pr1 (emb-prop-map (f , p)) = f
  pr2 (emb-prop-map (f , p)) = is-emb-is-prop-map p

  prop-map-emb : A  B  prop-map A B
  pr1 (prop-map-emb (f , p)) = f
  pr2 (prop-map-emb (f , p)) = is-prop-map-is-emb p

  is-prop-map-emb : (f : A  B)  is-prop-map (map-emb f)
  is-prop-map-emb f = is-prop-map-is-emb (is-emb-map-emb f)

  is-prop-map-emb' : (f : A  B)  (b : B)  is-prop (fiber' (map-emb f) b)
  is-prop-map-emb' f y =
    is-prop-equiv' (equiv-fiber (map-emb f) y) (is-prop-map-emb f y)

  fiber-emb-Prop : A  B  B  Prop (l1  l2)
  pr1 (fiber-emb-Prop f y) = fiber (map-emb f) y
  pr2 (fiber-emb-Prop f y) = is-prop-map-emb f y

  fiber-emb-Prop' : A  B  B  Prop (l1  l2)
  pr1 (fiber-emb-Prop' f y) = fiber' (map-emb f) y
  pr2 (fiber-emb-Prop' f y) = is-prop-map-emb' f y
```