# The image of a map
```agda
module foundation.images where
```
<details><summary>Imports</summary>
```agda
open import foundation.dependent-pair-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.propositional-truncations
open import foundation.slice
open import foundation.subtype-identity-principle
open import foundation.surjective-maps
open import foundation.universe-levels
open import foundation-core.1-types
open import foundation-core.commuting-triangles-of-maps
open import foundation-core.contractible-types
open import foundation-core.embeddings
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.injective-maps
open import foundation-core.propositions
open import foundation-core.sets
open import foundation-core.subtypes
open import foundation-core.torsorial-type-families
open import foundation-core.truncated-types
open import foundation-core.truncation-levels
```
</details>
## Idea
The **image** of a map is a type that satisfies the
[universal property of the image](foundation.universal-property-image.md) of a
map.
## Definitions
```agda
module _
{l1 l2 : Level} {X : UU l1} {A : UU l2} (f : A → X)
where
subtype-im : subtype (l1 ⊔ l2) X
subtype-im x = trunc-Prop (fiber f x)
is-in-subtype-im : X → UU (l1 ⊔ l2)
is-in-subtype-im = is-in-subtype subtype-im
im : UU (l1 ⊔ l2)
im = type-subtype subtype-im
inclusion-im : im → X
inclusion-im = inclusion-subtype subtype-im
map-unit-im : A → im
pr1 (map-unit-im a) = f a
pr2 (map-unit-im a) = unit-trunc-Prop (a , refl)
triangle-unit-im : coherence-triangle-maps f inclusion-im map-unit-im
triangle-unit-im a = refl
unit-im : hom-slice f inclusion-im
pr1 unit-im = map-unit-im
pr2 unit-im = triangle-unit-im
```
## Properties
### We characterize the identity type of im f
```agda
module _
{l1 l2 : Level} {X : UU l1} {A : UU l2} (f : A → X)
where
Eq-im : im f → im f → UU l1
Eq-im x y = (pr1 x = pr1 y)
refl-Eq-im : (x : im f) → Eq-im x x
refl-Eq-im x = refl
Eq-eq-im : (x y : im f) → x = y → Eq-im x y
Eq-eq-im x .x refl = refl-Eq-im x
abstract
is-torsorial-Eq-im :
(x : im f) → is-torsorial (Eq-im x)
is-torsorial-Eq-im x =
is-torsorial-Eq-subtype
( is-torsorial-Id (pr1 x))
( λ x → is-prop-type-trunc-Prop)
( pr1 x)
( refl)
( pr2 x)
abstract
is-equiv-Eq-eq-im : (x y : im f) → is-equiv (Eq-eq-im x y)
is-equiv-Eq-eq-im x =
fundamental-theorem-id
( is-torsorial-Eq-im x)
( Eq-eq-im x)
equiv-Eq-eq-im : (x y : im f) → (x = y) ≃ Eq-im x y
pr1 (equiv-Eq-eq-im x y) = Eq-eq-im x y
pr2 (equiv-Eq-eq-im x y) = is-equiv-Eq-eq-im x y
eq-Eq-im : (x y : im f) → Eq-im x y → x = y
eq-Eq-im x y = map-inv-is-equiv (is-equiv-Eq-eq-im x y)
```
### The image inclusion is an embedding
```agda
abstract
is-emb-inclusion-im :
{l1 l2 : Level} {X : UU l1} {A : UU l2} (f : A → X) →
is-emb (inclusion-im f)
is-emb-inclusion-im f = is-emb-inclusion-subtype (trunc-Prop ∘ fiber f)
emb-im :
{l1 l2 : Level} {X : UU l1} {A : UU l2} (f : A → X) → im f ↪ X
pr1 (emb-im f) = inclusion-im f
pr2 (emb-im f) = is-emb-inclusion-im f
```
### The image inclusion is injective
```agda
abstract
is-injective-inclusion-im :
{l1 l2 : Level} {X : UU l1} {A : UU l2} (f : A → X) →
is-injective (inclusion-im f)
is-injective-inclusion-im f = is-injective-is-emb (is-emb-inclusion-im f)
```
### The unit map of the image is surjective
```agda
abstract
is-surjective-map-unit-im :
{l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) →
is-surjective (map-unit-im f)
is-surjective-map-unit-im f (y , z) =
apply-universal-property-trunc-Prop z
( trunc-Prop (fiber (map-unit-im f) (y , z)))
( α)
where
α : fiber f y → type-Prop (trunc-Prop (fiber (map-unit-im f) (y , z)))
α (x , p) = unit-trunc-Prop (x , eq-type-subtype (trunc-Prop ∘ fiber f) p)
```
### The image of a map into a truncated type is truncated
```agda
abstract
is-trunc-im :
{l1 l2 : Level} (k : 𝕋) {X : UU l1} {A : UU l2} (f : A → X) →
is-trunc (succ-𝕋 k) X → is-trunc (succ-𝕋 k) (im f)
is-trunc-im k f = is-trunc-emb k (emb-im f)
im-Truncated-Type :
{l1 l2 : Level} (k : 𝕋) (X : Truncated-Type l1 (succ-𝕋 k)) {A : UU l2}
(f : A → type-Truncated-Type X) → Truncated-Type (l1 ⊔ l2) (succ-𝕋 k)
pr1 (im-Truncated-Type k X f) = im f
pr2 (im-Truncated-Type k X f) = is-trunc-im k f (is-trunc-type-Truncated-Type X)
```
### The image of a map into a proposition is a proposition
```agda
abstract
is-prop-im :
{l1 l2 : Level} {X : UU l1} {A : UU l2} (f : A → X) →
is-prop X → is-prop (im f)
is-prop-im = is-trunc-im neg-two-𝕋
im-Prop :
{l1 l2 : Level} (X : Prop l1) {A : UU l2}
(f : A → type-Prop X) → Prop (l1 ⊔ l2)
im-Prop X f = im-Truncated-Type neg-two-𝕋 X f
```
### The image of a map into a set is a set
```agda
abstract
is-set-im :
{l1 l2 : Level} {X : UU l1} {A : UU l2} (f : A → X) →
is-set X → is-set (im f)
is-set-im = is-trunc-im neg-one-𝕋
im-Set :
{l1 l2 : Level} (X : Set l1) {A : UU l2}
(f : A → type-Set X) → Set (l1 ⊔ l2)
im-Set X f = im-Truncated-Type (neg-one-𝕋) X f
```
### The image of a map into a 1-type is a 1-type
```agda
abstract
is-1-type-im :
{l1 l2 : Level} {X : UU l1} {A : UU l2} (f : A → X) →
is-1-type X → is-1-type (im f)
is-1-type-im = is-trunc-im zero-𝕋
im-1-Type :
{l1 l2 : Level} (X : 1-Type l1) {A : UU l2}
(f : A → type-1-Type X) → 1-Type (l1 ⊔ l2)
im-1-Type X f = im-Truncated-Type zero-𝕋 X f
```