# Set presented types
```agda
module foundation.set-presented-types where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.coproduct-types
open import foundation.dependent-pair-types
open import foundation.embeddings
open import foundation.empty-types
open import foundation.equality-coproduct-types
open import foundation.equivalences
open import foundation.existential-quantification
open import foundation.fibers-of-maps
open import foundation.functoriality-coproduct-types
open import foundation.homotopies
open import foundation.identity-types
open import foundation.images
open import foundation.injective-maps
open import foundation.propositional-truncations
open import foundation.set-truncations
open import foundation.subtypes
open import foundation.surjective-maps
open import foundation.universe-levels
open import foundation-core.function-types
open import foundation-core.propositions
open import foundation-core.sets
```
</details>
## Idea
A type `A` is said to be
{{#concept "set presented" Agda=has-set-presentation-Prop}} if there
[exists](foundation.existential-quantification.md) a map `f : X → A` from a
[set](foundation-core.sets.md) `X` such that the composite
`X → A → type-trunc-Set A` is an [equivalence](foundation.equivalences.md).
## Definitions
### Set presentations of types
```agda
module _
{l1 l2 : Level} (A : Set l1) (B : UU l2)
where
has-set-presentation-Prop : Prop (l1 ⊔ l2)
has-set-presentation-Prop =
∃ (type-Set A → B) (λ f → is-equiv-Prop (unit-trunc-Set ∘ f))
has-set-presentation : UU (l1 ⊔ l2)
has-set-presentation = type-Prop has-set-presentation-Prop
is-prop-has-set-presentation : is-prop has-set-presentation
is-prop-has-set-presentation = is-prop-type-Prop has-set-presentation-Prop
```
## Propositions
### Types set presented by coproducts are coproducts
Given a type `B` that is set presented by a coproduct
```text
B
∧ \
f / \ η
/ ~ ∨
(A1 + A2) -----> ║B║₀,
```
then `B` computes as the coproduct of the images of the restrictions of `f`
along the left and right inclusion of the coproduct `A1 + A2`
```text
B ≃ im (f ∘ inl) + im (f ∘ inr).
```
```agda
module _
{l1 l2 l3 : Level} {A1 : UU l1} {A2 : UU l2} {B : UU l3}
(f : A1 + A2 → B) (e : (A1 + A2) ≃ ║ B ║₀)
(H : unit-trunc-Set ∘ f ~ map-equiv e)
where
map-is-coproduct-codomain : (im (f ∘ inl) + im (f ∘ inr)) → B
map-is-coproduct-codomain = rec-coproduct pr1 pr1
triangle-is-coproduct-codomain :
( ( map-is-coproduct-codomain) ∘
( map-coproduct (map-unit-im (f ∘ inl)) (map-unit-im (f ∘ inr)))) ~ f
triangle-is-coproduct-codomain (inl x) = refl
triangle-is-coproduct-codomain (inr x) = refl
abstract
is-emb-map-is-coproduct-codomain : is-emb map-is-coproduct-codomain
is-emb-map-is-coproduct-codomain =
is-emb-coproduct
( is-emb-inclusion-subtype (λ b → trunc-Prop _))
( is-emb-inclusion-subtype (λ b → trunc-Prop _))
( λ (b1 , u) (b2 , v) →
apply-universal-property-trunc-Prop u
( function-Prop _ empty-Prop)
( λ where
( x , refl) →
apply-universal-property-trunc-Prop v
( function-Prop _ empty-Prop)
( λ where
( y , refl) r →
is-empty-eq-coproduct-inl-inr x y
( is-injective-is-equiv
( is-equiv-map-equiv e)
( ( inv (H (inl x))) ∙
( ap unit-trunc-Set r) ∙
( H (inr y)))))))
abstract
is-surjective-map-is-coproduct-codomain :
is-surjective map-is-coproduct-codomain
is-surjective-map-is-coproduct-codomain b =
apply-universal-property-trunc-Prop
( apply-effectiveness-unit-trunc-Set
( inv (is-section-map-inv-equiv e (unit-trunc-Set b)) ∙ inv (H a)))
( trunc-Prop (fiber map-is-coproduct-codomain b))
( λ p →
unit-trunc-Prop
( ( map-coproduct
( map-unit-im (f ∘ inl))
( map-unit-im (f ∘ inr))
( a)) ,
( triangle-is-coproduct-codomain a ∙ inv p)))
where
a : A1 + A2
a = map-inv-equiv e (unit-trunc-Set b)
is-coproduct-codomain : (im (f ∘ inl) + im (f ∘ inr)) ≃ B
pr1 is-coproduct-codomain = map-is-coproduct-codomain
pr2 is-coproduct-codomain =
is-equiv-is-emb-is-surjective
is-surjective-map-is-coproduct-codomain
is-emb-map-is-coproduct-codomain
```