# Exponents of set quotients
```agda
{-# OPTIONS --lossy-unification #-}
module foundation.exponents-set-quotients where
```
<details><summary>Imports</summary>
```agda
open import foundation.binary-relations
open import foundation.dependent-pair-types
open import foundation.function-extensionality
open import foundation.functoriality-set-quotients
open import foundation.postcomposition-functions
open import foundation.reflecting-maps-equivalence-relations
open import foundation.set-quotients
open import foundation.sets
open import foundation.universal-property-set-quotients
open import foundation.universe-levels
open import foundation.whiskering-homotopies-composition
open import foundation-core.contractible-types
open import foundation-core.embeddings
open import foundation-core.equivalence-relations
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import foundation-core.propositions
```
</details>
## Idea
Given a type `A` equipped with an equivalence relation `R` and a type `X`, the
set quotient
```text
(X → A) / ~
```
where `f ~ g := (x : A) → R (f x) (g x)`, embeds into the type `X → A/R`. This
embedding for every `X`, `A`, and `R` if and only if the axiom of choice holds.
Consequently, we get embeddings
```text
((hom-equivalence-relation R S) / ~) ↪ ((A/R) → (B/S))
```
for any two equivalence relations `R` on `A` and `S` on `B`.
## Definitions
### The canonical equivalence relation on `X → A`
```agda
module _
{l1 l2 l3 : Level} (X : UU l1) {A : UU l2} (R : equivalence-relation l3 A)
where
rel-function-type : Relation-Prop (l1 ⊔ l3) (X → A)
rel-function-type f g =
Π-Prop X (λ x → prop-equivalence-relation R (f x) (g x))
sim-function-type : (f g : X → A) → UU (l1 ⊔ l3)
sim-function-type = type-Relation-Prop rel-function-type
refl-sim-function-type : is-reflexive sim-function-type
refl-sim-function-type f x = refl-equivalence-relation R (f x)
symmetric-sim-function-type : is-symmetric sim-function-type
symmetric-sim-function-type f g r x =
symmetric-equivalence-relation R (f x) (g x) (r x)
transitive-sim-function-type : is-transitive sim-function-type
transitive-sim-function-type f g h r s x =
transitive-equivalence-relation R (f x) (g x) (h x) (r x) (s x)
equivalence-relation-function-type : equivalence-relation (l1 ⊔ l3) (X → A)
pr1 equivalence-relation-function-type = rel-function-type
pr1 (pr2 equivalence-relation-function-type) = refl-sim-function-type
pr1 (pr2 (pr2 equivalence-relation-function-type)) =
symmetric-sim-function-type
pr2 (pr2 (pr2 equivalence-relation-function-type)) =
transitive-sim-function-type
map-exponent-reflecting-map-equivalence-relation :
{l4 : Level} {B : UU l4} →
reflecting-map-equivalence-relation R B → (X → A) → (X → B)
map-exponent-reflecting-map-equivalence-relation q =
postcomp X (map-reflecting-map-equivalence-relation R q)
reflects-exponent-reflecting-map-equivalence-relation :
{l4 : Level} {B : UU l4} (q : reflecting-map-equivalence-relation R B) →
reflects-equivalence-relation equivalence-relation-function-type
( map-exponent-reflecting-map-equivalence-relation q)
reflects-exponent-reflecting-map-equivalence-relation q {f} {g} H =
eq-htpy (λ x → reflects-map-reflecting-map-equivalence-relation R q (H x))
exponent-reflecting-map-equivalence-relation :
{l4 : Level} {B : UU l4} →
reflecting-map-equivalence-relation R B →
reflecting-map-equivalence-relation
( equivalence-relation-function-type)
( X → B)
pr1 (exponent-reflecting-map-equivalence-relation q) =
map-exponent-reflecting-map-equivalence-relation q
pr2 (exponent-reflecting-map-equivalence-relation q) =
reflects-exponent-reflecting-map-equivalence-relation q
module _
{l4 l5 : Level}
(Q : Set l4)
(q :
reflecting-map-equivalence-relation
( equivalence-relation-function-type)
( type-Set Q))
(Uq : is-set-quotient equivalence-relation-function-type Q q)
(QR : Set l5) (qR : reflecting-map-equivalence-relation R (type-Set QR))
(UqR : is-set-quotient R QR qR)
where
unique-inclusion-is-set-quotient-equivalence-relation-function-type :
is-contr
( Σ ( type-Set Q → (X → type-Set QR))
( λ h →
( h) ∘
( map-reflecting-map-equivalence-relation
( equivalence-relation-function-type)
( q))
~
( map-exponent-reflecting-map-equivalence-relation qR)))
unique-inclusion-is-set-quotient-equivalence-relation-function-type =
universal-property-set-quotient-is-set-quotient
( equivalence-relation-function-type)
( Q)
( q)
( Uq)
( function-Set X QR)
( exponent-reflecting-map-equivalence-relation qR)
map-inclusion-is-set-quotient-equivalence-relation-function-type :
type-Set Q → (X → type-Set QR)
map-inclusion-is-set-quotient-equivalence-relation-function-type =
map-universal-property-set-quotient-is-set-quotient
( equivalence-relation-function-type)
( Q)
( q)
( Uq)
( function-Set X QR)
( exponent-reflecting-map-equivalence-relation qR)
triangle-inclusion-is-set-quotient-equivalence-relation-function-type :
( ( map-inclusion-is-set-quotient-equivalence-relation-function-type) ∘
( map-reflecting-map-equivalence-relation
( equivalence-relation-function-type)
( q))) ~
( map-exponent-reflecting-map-equivalence-relation qR)
triangle-inclusion-is-set-quotient-equivalence-relation-function-type =
triangle-universal-property-set-quotient-is-set-quotient
( equivalence-relation-function-type)
( Q)
( q)
( Uq)
( function-Set X QR)
( exponent-reflecting-map-equivalence-relation qR)
```
### An equivalence relation on relation preserving maps
```agda
module _
{l1 l2 l3 l4 : Level}
{A : UU l1} (R : equivalence-relation l2 A)
{B : UU l3} (S : equivalence-relation l4 B)
where
rel-hom-equivalence-relation :
Relation-Prop (l1 ⊔ l4) (hom-equivalence-relation R S)
rel-hom-equivalence-relation f g =
rel-function-type A S
( map-hom-equivalence-relation R S f)
( map-hom-equivalence-relation R S g)
sim-hom-equivalence-relation :
(f g : hom-equivalence-relation R S) → UU (l1 ⊔ l4)
sim-hom-equivalence-relation f g =
sim-function-type A S
( map-hom-equivalence-relation R S f)
( map-hom-equivalence-relation R S g)
refl-sim-hom-equivalence-relation : is-reflexive sim-hom-equivalence-relation
refl-sim-hom-equivalence-relation f =
refl-sim-function-type A S (map-hom-equivalence-relation R S f)
symmetric-sim-hom-equivalence-relation :
is-symmetric sim-hom-equivalence-relation
symmetric-sim-hom-equivalence-relation f g =
symmetric-sim-function-type A S
( map-hom-equivalence-relation R S f)
( map-hom-equivalence-relation R S g)
transitive-sim-hom-equivalence-relation :
is-transitive sim-hom-equivalence-relation
transitive-sim-hom-equivalence-relation f g h =
transitive-sim-function-type A S
( map-hom-equivalence-relation R S f)
( map-hom-equivalence-relation R S g)
( map-hom-equivalence-relation R S h)
equivalence-relation-hom-equivalence-relation :
equivalence-relation (l1 ⊔ l4) (hom-equivalence-relation R S)
pr1 equivalence-relation-hom-equivalence-relation =
rel-hom-equivalence-relation
pr1 (pr2 equivalence-relation-hom-equivalence-relation) =
refl-sim-hom-equivalence-relation
pr1 (pr2 (pr2 equivalence-relation-hom-equivalence-relation)) =
symmetric-sim-hom-equivalence-relation
pr2 (pr2 (pr2 equivalence-relation-hom-equivalence-relation)) =
transitive-sim-hom-equivalence-relation
```
### The universal reflecting map from `hom-equivalence-relation R S` to `A/R → B/S`
#### First variant using only the universal property of set quotients
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} (R : equivalence-relation l2 A)
(QR : Set l3) (qR : reflecting-map-equivalence-relation R (type-Set QR))
(UqR : is-set-quotient R QR qR)
{B : UU l4} (S : equivalence-relation l5 B)
(QS : Set l6) (qS : reflecting-map-equivalence-relation S (type-Set QS))
(UqS : is-set-quotient S QS qS)
where
universal-map-is-set-quotient-hom-equivalence-relation :
hom-equivalence-relation R S → hom-Set QR QS
universal-map-is-set-quotient-hom-equivalence-relation =
map-is-set-quotient R QR qR S QS qS UqR UqS
reflects-universal-map-is-set-quotient-hom-equivalence-relation :
reflects-equivalence-relation
( equivalence-relation-hom-equivalence-relation R S)
( universal-map-is-set-quotient-hom-equivalence-relation)
reflects-universal-map-is-set-quotient-hom-equivalence-relation {f} {g} s =
eq-htpy
( ind-is-set-quotient R QR qR UqR
( λ x →
Id-Prop QS
( map-is-set-quotient R QR qR S QS qS UqR UqS f x)
( map-is-set-quotient R QR qR S QS qS UqR UqS g x))
( λ a →
( coherence-square-map-is-set-quotient R QR qR S QS qS UqR UqS f a) ∙
( apply-effectiveness-is-set-quotient' S QS qS UqS (s a)) ∙
( inv
( coherence-square-map-is-set-quotient
R QR qR S QS qS UqR UqS g a))))
universal-reflecting-map-is-set-quotient-hom-equivalence-relation :
reflecting-map-equivalence-relation
( equivalence-relation-hom-equivalence-relation R S)
( hom-Set QR QS)
pr1 universal-reflecting-map-is-set-quotient-hom-equivalence-relation =
universal-map-is-set-quotient-hom-equivalence-relation
pr2 universal-reflecting-map-is-set-quotient-hom-equivalence-relation =
reflects-universal-map-is-set-quotient-hom-equivalence-relation
```
#### Second variant using the designated set quotients
```agda
module _
{l1 l2 l3 l4 : Level}
{A : UU l1} (R : equivalence-relation l2 A)
{B : UU l3} (S : equivalence-relation l4 B)
where
universal-reflecting-map-set-quotient-hom-equivalence-relation :
reflecting-map-equivalence-relation
( equivalence-relation-hom-equivalence-relation R S)
( set-quotient R → set-quotient S)
universal-reflecting-map-set-quotient-hom-equivalence-relation =
universal-reflecting-map-is-set-quotient-hom-equivalence-relation
( R)
( quotient-Set R)
( reflecting-map-quotient-map R)
( λ {l} → is-set-quotient-set-quotient R {l})
( S)
( quotient-Set S)
( reflecting-map-quotient-map S)
( λ {l} → is-set-quotient-set-quotient S {l})
universal-map-set-quotient-hom-equivalence-relation :
hom-equivalence-relation R S → set-quotient R → set-quotient S
universal-map-set-quotient-hom-equivalence-relation =
map-reflecting-map-equivalence-relation
( equivalence-relation-hom-equivalence-relation R S)
( universal-reflecting-map-set-quotient-hom-equivalence-relation)
reflects-universal-map-set-quotient-hom-equivalence-relation :
reflects-equivalence-relation
( equivalence-relation-hom-equivalence-relation R S)
( universal-map-set-quotient-hom-equivalence-relation)
reflects-universal-map-set-quotient-hom-equivalence-relation =
reflects-map-reflecting-map-equivalence-relation
( equivalence-relation-hom-equivalence-relation R S)
( universal-reflecting-map-set-quotient-hom-equivalence-relation)
```
## Properties
### The inclusion of the quotient `(X → A)/~` into `X → A/R` is an embedding
```agda
module _
{l1 l2 l3 l4 l5 : Level} (X : UU l1)
{A : UU l2} (R : equivalence-relation l3 A)
(Q : Set l4)
(q :
reflecting-map-equivalence-relation
( equivalence-relation-function-type X R)
( type-Set Q))
(Uq : is-set-quotient (equivalence-relation-function-type X R) Q q)
(QR : Set l5) (qR : reflecting-map-equivalence-relation R (type-Set QR))
(UqR : is-set-quotient R QR qR)
where
is-emb-inclusion-is-set-quotient-equivalence-relation-function-type :
is-emb
( map-inclusion-is-set-quotient-equivalence-relation-function-type
X R Q q Uq QR qR UqR)
is-emb-inclusion-is-set-quotient-equivalence-relation-function-type =
is-emb-map-universal-property-set-quotient-is-set-quotient
( equivalence-relation-function-type X R)
( Q)
( q)
( Uq)
( function-Set X QR)
( exponent-reflecting-map-equivalence-relation X R qR)
( λ g h p x →
apply-effectiveness-is-set-quotient R QR qR UqR (htpy-eq p x))
```
### The extension of the universal map from `hom-equivalence-relation R S` to `A/R → B/S` to the quotient is an embedding
#### First variant using only the universal property of the set quotient
```agda
module _
{l1 l2 l3 l4 l5 l6 l7 : Level}
{A : UU l1} (R : equivalence-relation l2 A)
(QR : Set l3) (qR : reflecting-map-equivalence-relation R (type-Set QR))
(UR : is-set-quotient R QR qR)
{B : UU l4} (S : equivalence-relation l5 B)
(QS : Set l6) (qS : reflecting-map-equivalence-relation S (type-Set QS))
(US : is-set-quotient S QS qS)
(QH : Set l7)
(qH :
reflecting-map-equivalence-relation
( equivalence-relation-hom-equivalence-relation R S)
( type-Set QH))
(UH :
is-set-quotient (equivalence-relation-hom-equivalence-relation R S) QH qH)
where
unique-inclusion-is-set-quotient-hom-equivalence-relation :
is-contr
( Σ ( hom-Set QH (hom-set-Set QR QS))
( λ μ →
( μ ∘
map-reflecting-map-equivalence-relation
( equivalence-relation-hom-equivalence-relation R S)
( qH)) ~
( universal-map-is-set-quotient-hom-equivalence-relation
R QR qR UR S QS qS US)))
unique-inclusion-is-set-quotient-hom-equivalence-relation =
universal-property-set-quotient-is-set-quotient
( equivalence-relation-hom-equivalence-relation R S)
( QH)
( qH)
( UH)
( hom-set-Set QR QS)
( universal-reflecting-map-is-set-quotient-hom-equivalence-relation
R QR qR UR S QS qS US)
inclusion-is-set-quotient-hom-equivalence-relation :
hom-Set QH (hom-set-Set QR QS)
inclusion-is-set-quotient-hom-equivalence-relation =
pr1 (center (unique-inclusion-is-set-quotient-hom-equivalence-relation))
triangle-inclusion-is-set-quotient-hom-equivalence-relation :
( inclusion-is-set-quotient-hom-equivalence-relation ∘
map-reflecting-map-equivalence-relation
( equivalence-relation-hom-equivalence-relation R S)
( qH)) ~
( universal-map-is-set-quotient-hom-equivalence-relation
R QR qR UR S QS qS US)
triangle-inclusion-is-set-quotient-hom-equivalence-relation =
pr2 (center (unique-inclusion-is-set-quotient-hom-equivalence-relation))
is-emb-inclusion-is-set-quotient-hom-equivalence-relation :
is-emb inclusion-is-set-quotient-hom-equivalence-relation
is-emb-inclusion-is-set-quotient-hom-equivalence-relation =
is-emb-map-universal-property-set-quotient-is-set-quotient
( equivalence-relation-hom-equivalence-relation R S)
( QH)
( qH)
( UH)
( hom-set-Set QR QS)
( universal-reflecting-map-is-set-quotient-hom-equivalence-relation
R QR qR UR S QS qS US)
( λ g h p a →
apply-effectiveness-is-set-quotient S QS qS US
( ( inv-htpy
( coherence-square-map-is-set-quotient R QR qR S QS qS UR US g) ∙h
( ( htpy-eq p ·r map-reflecting-map-equivalence-relation R qR) ∙h
( coherence-square-map-is-set-quotient
R QR qR S QS qS UR US h)))
( a)))
emb-inclusion-is-set-quotient-hom-equivalence-relation :
type-Set QH ↪ hom-Set QR QS
pr1 emb-inclusion-is-set-quotient-hom-equivalence-relation =
inclusion-is-set-quotient-hom-equivalence-relation
pr2 emb-inclusion-is-set-quotient-hom-equivalence-relation =
is-emb-inclusion-is-set-quotient-hom-equivalence-relation
```
#### Second variant using the official set quotients
```agda
module _
{l1 l2 l3 l4 : Level}
{A : UU l1} (R : equivalence-relation l2 A)
{B : UU l3} (S : equivalence-relation l4 B)
where
quotient-hom-equivalence-relation-Set : Set (l1 ⊔ l2 ⊔ l3 ⊔ l4)
quotient-hom-equivalence-relation-Set =
quotient-Set (equivalence-relation-hom-equivalence-relation R S)
set-quotient-hom-equivalence-relation : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
set-quotient-hom-equivalence-relation =
type-Set quotient-hom-equivalence-relation-Set
is-set-set-quotient-hom-equivalence-relation :
is-set set-quotient-hom-equivalence-relation
is-set-set-quotient-hom-equivalence-relation =
is-set-type-Set quotient-hom-equivalence-relation-Set
reflecting-map-quotient-map-hom-equivalence-relation :
reflecting-map-equivalence-relation
( equivalence-relation-hom-equivalence-relation R S)
( set-quotient-hom-equivalence-relation)
reflecting-map-quotient-map-hom-equivalence-relation =
reflecting-map-quotient-map
( equivalence-relation-hom-equivalence-relation R S)
quotient-map-hom-equivalence-relation :
hom-equivalence-relation R S → set-quotient-hom-equivalence-relation
quotient-map-hom-equivalence-relation =
quotient-map (equivalence-relation-hom-equivalence-relation R S)
is-set-quotient-set-quotient-hom-equivalence-relation :
is-set-quotient
( equivalence-relation-hom-equivalence-relation R S)
( quotient-hom-equivalence-relation-Set)
( reflecting-map-quotient-map-hom-equivalence-relation)
is-set-quotient-set-quotient-hom-equivalence-relation =
is-set-quotient-set-quotient
( equivalence-relation-hom-equivalence-relation R S)
unique-inclusion-set-quotient-hom-equivalence-relation :
is-contr
( Σ ( set-quotient-hom-equivalence-relation →
set-quotient R → set-quotient S)
( λ μ →
μ ∘
quotient-map (equivalence-relation-hom-equivalence-relation R S) ~
universal-map-set-quotient-hom-equivalence-relation R S))
unique-inclusion-set-quotient-hom-equivalence-relation =
universal-property-set-quotient-is-set-quotient
( equivalence-relation-hom-equivalence-relation R S)
( quotient-hom-equivalence-relation-Set)
( reflecting-map-quotient-map-hom-equivalence-relation)
( is-set-quotient-set-quotient-hom-equivalence-relation)
( hom-set-Set (quotient-Set R) (quotient-Set S))
( universal-reflecting-map-set-quotient-hom-equivalence-relation R S)
inclusion-set-quotient-hom-equivalence-relation :
set-quotient (equivalence-relation-hom-equivalence-relation R S) →
set-quotient R → set-quotient S
inclusion-set-quotient-hom-equivalence-relation =
pr1 (center (unique-inclusion-set-quotient-hom-equivalence-relation))
triangle-inclusion-set-quotient-hom-equivalence-relation :
( inclusion-set-quotient-hom-equivalence-relation ∘
quotient-map (equivalence-relation-hom-equivalence-relation R S)) ~
( universal-map-set-quotient-hom-equivalence-relation R S)
triangle-inclusion-set-quotient-hom-equivalence-relation =
pr2 (center (unique-inclusion-set-quotient-hom-equivalence-relation))
is-emb-inclusion-set-quotient-hom-equivalence-relation :
is-emb inclusion-set-quotient-hom-equivalence-relation
is-emb-inclusion-set-quotient-hom-equivalence-relation =
is-emb-map-universal-property-set-quotient-is-set-quotient
( equivalence-relation-hom-equivalence-relation R S)
( quotient-hom-equivalence-relation-Set)
( reflecting-map-quotient-map-hom-equivalence-relation)
( is-set-quotient-set-quotient-hom-equivalence-relation)
( hom-set-Set (quotient-Set R) (quotient-Set S))
( universal-reflecting-map-set-quotient-hom-equivalence-relation R S)
( λ g h p a →
apply-effectiveness-quotient-map S
( ( inv-htpy
( coherence-square-map-set-quotient R S g) ∙h
( ( htpy-eq p ·r quotient-map R) ∙h
( coherence-square-map-set-quotient
R S h)))
( a)))
emb-inclusion-set-quotient-hom-equivalence-relation :
set-quotient (equivalence-relation-hom-equivalence-relation R S) ↪
( set-quotient R → set-quotient S)
pr1 emb-inclusion-set-quotient-hom-equivalence-relation =
inclusion-set-quotient-hom-equivalence-relation
pr2 emb-inclusion-set-quotient-hom-equivalence-relation =
is-emb-inclusion-set-quotient-hom-equivalence-relation
```