# Projective types
```agda
module foundation.projective-types where
```
<details><summary>Imports</summary>
```agda
open import elementary-number-theory.natural-numbers
open import foundation.connected-maps
open import foundation.postcomposition-functions
open import foundation.surjective-maps
open import foundation.truncation-levels
open import foundation.universe-levels
open import foundation-core.function-types
open import foundation-core.sets
open import foundation-core.truncated-types
```
</details>
## Idea
A type `X` is said to be **set-projective** if for every surjective map
`f : A → B` into a set `B` the postcomposition function
```text
(X → A) → (X → B)
```
is surjective. This is equivalent to the condition that for every equivalence
relation `R` on a type `A` the natural map
```text
(X → A)/~ → (X → A/R)
```
is an equivalence. The latter map is always an embedding, and it is an
equivalence for every `X`, `A`, and `R` if and only if the axiom of choice
holds.
The notion of set-projectiveness generalizes to `n`-projectiveness, for `n : ℕ`.
A type `X` is said to be `k`-projective if the postcomposition function
`(X → A) → (X → B)` is surjective for every `k-1`-connected map `f : A → B` into
a `k`-truncated type `B`.
## Definitions
### Set-projective types
```agda
is-set-projective :
{l1 : Level} (l2 l3 : Level) → UU l1 → UU (l1 ⊔ lsuc l2 ⊔ lsuc l3)
is-set-projective l2 l3 X =
(A : UU l2) (B : Set l3) (f : A ↠ type-Set B) →
is-surjective (postcomp X (map-surjection f))
```
### `k`-projective types
```agda
is-projective :
{l1 : Level} (l2 l3 : Level) (k : ℕ) → UU l1 → UU (l1 ⊔ lsuc l2 ⊔ lsuc l3)
is-projective l2 l3 k X =
( A : UU l2) (B : Truncated-Type l3 (truncation-level-ℕ k))
( f :
connected-map
( truncation-level-minus-one-ℕ k)
( A)
( type-Truncated-Type B)) →
is-surjective (postcomp X (map-connected-map f))
```
## See also
- The natural map `(X → A)/~ → (X → A/R)` was studied in
[foundation.exponents-set-quotients](foundation.exponents-set-quotients.md)