# Binary functoriality of set quotients
```agda
{-# OPTIONS --lossy-unification #-}
module foundation.binary-functoriality-set-quotients where
```
<details><summary>Imports</summary>
```agda
open import foundation.binary-homotopies
open import foundation.dependent-pair-types
open import foundation.exponents-set-quotients
open import foundation.function-extensionality
open import foundation.functoriality-set-quotients
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopies
open import foundation.identity-types
open import foundation.reflecting-maps-equivalence-relations
open import foundation.set-quotients
open import foundation.sets
open import foundation.subtype-identity-principle
open import foundation.surjective-maps
open import foundation.universal-property-set-quotients
open import foundation.universe-levels
open import foundation-core.contractible-types
open import foundation-core.equivalence-relations
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.functoriality-dependent-function-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.propositions
open import foundation-core.subtypes
open import foundation-core.torsorial-type-families
```
</details>
## Idea
Given three types `A`, `B`, and `C` equipped with equivalence relations `R`,
`S`, and `T`, respectively, any binary operation `f : A → B → C` such that for
any `x x' : A` such that `R x x'` holds, and for any `y y' : B` such that
`S y y'` holds, the relation `T (f x y) (f x' y')` holds extends uniquely to a
binary operation `g : A/R → B/S → C/T` such that `g (q x) (q y) = q (f x y)` for
all `x : A` and `y : B`.
## Definition
### Binary hom of equivalence relation
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} (R : equivalence-relation l2 A)
{B : UU l3} (S : equivalence-relation l4 B)
{C : UU l5} (T : equivalence-relation l6 C)
where
preserves-sim-prop-binary-map-equivalence-relation :
(A → B → C) → Prop (l1 ⊔ l2 ⊔ l3 ⊔ l4 ⊔ l6)
preserves-sim-prop-binary-map-equivalence-relation f =
implicit-Π-Prop A
( λ x →
implicit-Π-Prop A
( λ x' →
implicit-Π-Prop B
( λ y →
implicit-Π-Prop B
( λ y' →
function-Prop
( sim-equivalence-relation R x x')
( function-Prop
( sim-equivalence-relation S y y')
( prop-equivalence-relation T (f x y) (f x' y')))))))
preserves-sim-binary-map-equivalence-relation :
(A → B → C) → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4 ⊔ l6)
preserves-sim-binary-map-equivalence-relation f =
type-Prop (preserves-sim-prop-binary-map-equivalence-relation f)
is-prop-preserves-sim-binary-map-equivalence-relation :
(f : A → B → C) → is-prop (preserves-sim-binary-map-equivalence-relation f)
is-prop-preserves-sim-binary-map-equivalence-relation f =
is-prop-type-Prop (preserves-sim-prop-binary-map-equivalence-relation f)
binary-hom-equivalence-relation : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4 ⊔ l5 ⊔ l6)
binary-hom-equivalence-relation =
type-subtype preserves-sim-prop-binary-map-equivalence-relation
map-binary-hom-equivalence-relation :
(f : binary-hom-equivalence-relation) → A → B → C
map-binary-hom-equivalence-relation = pr1
preserves-sim-binary-hom-equivalence-relation :
(f : binary-hom-equivalence-relation) →
preserves-sim-binary-map-equivalence-relation
( map-binary-hom-equivalence-relation f)
preserves-sim-binary-hom-equivalence-relation = pr2
```
## Properties
### Characterization of equality of `binary-hom-equivalence-relation`
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} (R : equivalence-relation l2 A)
{B : UU l3} (S : equivalence-relation l4 B)
{C : UU l5} (T : equivalence-relation l6 C)
where
binary-htpy-hom-equivalence-relation :
(f g : binary-hom-equivalence-relation R S T) → UU (l1 ⊔ l3 ⊔ l5)
binary-htpy-hom-equivalence-relation f g =
binary-htpy
( map-binary-hom-equivalence-relation R S T f)
( map-binary-hom-equivalence-relation R S T g)
refl-binary-htpy-hom-equivalence-relation :
(f : binary-hom-equivalence-relation R S T) →
binary-htpy-hom-equivalence-relation f f
refl-binary-htpy-hom-equivalence-relation f =
refl-binary-htpy (map-binary-hom-equivalence-relation R S T f)
binary-htpy-eq-hom-equivalence-relation :
(f g : binary-hom-equivalence-relation R S T) →
(f = g) → binary-htpy-hom-equivalence-relation f g
binary-htpy-eq-hom-equivalence-relation f .f refl =
refl-binary-htpy-hom-equivalence-relation f
is-torsorial-binary-htpy-hom-equivalence-relation :
(f : binary-hom-equivalence-relation R S T) →
is-torsorial (binary-htpy-hom-equivalence-relation f)
is-torsorial-binary-htpy-hom-equivalence-relation f =
is-torsorial-Eq-subtype
( is-torsorial-binary-htpy
( map-binary-hom-equivalence-relation R S T f))
( is-prop-preserves-sim-binary-map-equivalence-relation R S T)
( map-binary-hom-equivalence-relation R S T f)
( refl-binary-htpy-hom-equivalence-relation f)
( preserves-sim-binary-hom-equivalence-relation R S T f)
is-equiv-binary-htpy-eq-hom-equivalence-relation :
(f g : binary-hom-equivalence-relation R S T) →
is-equiv (binary-htpy-eq-hom-equivalence-relation f g)
is-equiv-binary-htpy-eq-hom-equivalence-relation f =
fundamental-theorem-id
( is-torsorial-binary-htpy-hom-equivalence-relation f)
( binary-htpy-eq-hom-equivalence-relation f)
extensionality-binary-hom-equivalence-relation :
(f g : binary-hom-equivalence-relation R S T) →
(f = g) ≃ binary-htpy-hom-equivalence-relation f g
pr1 (extensionality-binary-hom-equivalence-relation f g) =
binary-htpy-eq-hom-equivalence-relation f g
pr2 (extensionality-binary-hom-equivalence-relation f g) =
is-equiv-binary-htpy-eq-hom-equivalence-relation f g
eq-binary-htpy-hom-equivalence-relation :
(f g : binary-hom-equivalence-relation R S T) →
binary-htpy-hom-equivalence-relation f g → f = g
eq-binary-htpy-hom-equivalence-relation f g =
map-inv-equiv (extensionality-binary-hom-equivalence-relation f g)
```
### The type `binary-hom-equivalence-relation R S T` is equivalent to the type `hom-equivalence-relation R (equivalence-relation-hom-equivalence-relation S T)`
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} (R : equivalence-relation l2 A)
{B : UU l3} (S : equivalence-relation l4 B)
{C : UU l5} (T : equivalence-relation l6 C)
where
map-hom-binary-hom-equivalence-relation :
binary-hom-equivalence-relation R S T → A → hom-equivalence-relation S T
pr1 (map-hom-binary-hom-equivalence-relation f a) =
map-binary-hom-equivalence-relation R S T f a
pr2 (map-hom-binary-hom-equivalence-relation f a) {x} {y} =
preserves-sim-binary-hom-equivalence-relation R S T f
( refl-equivalence-relation R a)
preserves-sim-hom-binary-hom-equivalence-relation :
(f : binary-hom-equivalence-relation R S T) →
preserves-sim-equivalence-relation R
( equivalence-relation-hom-equivalence-relation S T)
( map-hom-binary-hom-equivalence-relation f)
preserves-sim-hom-binary-hom-equivalence-relation f r b =
preserves-sim-binary-hom-equivalence-relation R S T f r
( refl-equivalence-relation S b)
hom-binary-hom-equivalence-relation :
binary-hom-equivalence-relation R S T →
hom-equivalence-relation R
( equivalence-relation-hom-equivalence-relation S T)
pr1 (hom-binary-hom-equivalence-relation f) =
map-hom-binary-hom-equivalence-relation f
pr2 (hom-binary-hom-equivalence-relation f) =
preserves-sim-hom-binary-hom-equivalence-relation f
map-binary-hom-hom-equivalence-relation :
hom-equivalence-relation R
( equivalence-relation-hom-equivalence-relation S T) →
A → B → C
map-binary-hom-hom-equivalence-relation f x =
map-hom-equivalence-relation S T
( map-hom-equivalence-relation R
( equivalence-relation-hom-equivalence-relation S T)
( f)
( x))
preserves-sim-binary-hom-hom-equivalence-relation :
(f :
hom-equivalence-relation R
( equivalence-relation-hom-equivalence-relation S T)) →
preserves-sim-binary-map-equivalence-relation R S T
( map-binary-hom-hom-equivalence-relation f)
preserves-sim-binary-hom-hom-equivalence-relation f {x} {x'} {y} {y'} r s =
transitive-equivalence-relation T
( pr1
( map-hom-equivalence-relation
R (equivalence-relation-hom-equivalence-relation S T) f x)
( y))
( pr1
( map-hom-equivalence-relation
R (equivalence-relation-hom-equivalence-relation S T) f x') y)
( map-hom-equivalence-relation S T (pr1 f x') y')
( preserves-sim-hom-equivalence-relation S T
( map-hom-equivalence-relation
R (equivalence-relation-hom-equivalence-relation S T) f x')
( s))
( preserves-sim-hom-equivalence-relation
R (equivalence-relation-hom-equivalence-relation S T) f r y)
binary-hom-hom-equivalence-relation :
hom-equivalence-relation R
( equivalence-relation-hom-equivalence-relation S T) →
binary-hom-equivalence-relation R S T
pr1 (binary-hom-hom-equivalence-relation f) =
map-binary-hom-hom-equivalence-relation f
pr2 (binary-hom-hom-equivalence-relation f) =
preserves-sim-binary-hom-hom-equivalence-relation f
is-section-binary-hom-hom-equivalence-relation :
( hom-binary-hom-equivalence-relation ∘
binary-hom-hom-equivalence-relation) ~
id
is-section-binary-hom-hom-equivalence-relation f =
eq-htpy-hom-equivalence-relation R
( equivalence-relation-hom-equivalence-relation S T)
( hom-binary-hom-equivalence-relation
( binary-hom-hom-equivalence-relation f))
( f)
( λ x →
eq-htpy-hom-equivalence-relation S T
( map-hom-equivalence-relation R
( equivalence-relation-hom-equivalence-relation S T)
( hom-binary-hom-equivalence-relation
( binary-hom-hom-equivalence-relation f))
( x))
( map-hom-equivalence-relation
R (equivalence-relation-hom-equivalence-relation S T) f x)
( refl-htpy))
is-retraction-binary-hom-hom-equivalence-relation :
( binary-hom-hom-equivalence-relation ∘
hom-binary-hom-equivalence-relation) ~
id
is-retraction-binary-hom-hom-equivalence-relation f =
eq-binary-htpy-hom-equivalence-relation R S T
( binary-hom-hom-equivalence-relation
( hom-binary-hom-equivalence-relation f))
( f)
( refl-binary-htpy (map-binary-hom-equivalence-relation R S T f))
is-equiv-hom-binary-hom-equivalence-relation :
is-equiv hom-binary-hom-equivalence-relation
is-equiv-hom-binary-hom-equivalence-relation =
is-equiv-is-invertible
binary-hom-hom-equivalence-relation
is-section-binary-hom-hom-equivalence-relation
is-retraction-binary-hom-hom-equivalence-relation
equiv-hom-binary-hom-equivalence-relation :
binary-hom-equivalence-relation R S T ≃
hom-equivalence-relation R
( equivalence-relation-hom-equivalence-relation S T)
pr1 equiv-hom-binary-hom-equivalence-relation =
hom-binary-hom-equivalence-relation
pr2 equiv-hom-binary-hom-equivalence-relation =
is-equiv-hom-binary-hom-equivalence-relation
```
### Binary functoriality of types that satisfy the universal property of set quotients
```agda
module _
{l1 l2 l3 l4 l5 l6 l7 l8 l9 : Level}
{A : UU l1} (R : equivalence-relation l2 A)
(QR : Set l3) (qR : reflecting-map-equivalence-relation R (type-Set QR))
{B : UU l4} (S : equivalence-relation l5 B)
(QS : Set l6) (qS : reflecting-map-equivalence-relation S (type-Set QS))
{C : UU l7} (T : equivalence-relation l8 C)
(QT : Set l9) (qT : reflecting-map-equivalence-relation T (type-Set QT))
(UqR : is-set-quotient R QR qR)
(UqS : is-set-quotient S QS qS)
(UqT : is-set-quotient T QT qT)
(f : binary-hom-equivalence-relation R S T)
where
private
p :
(x : A) (y : B) →
map-reflecting-map-equivalence-relation T qT
( map-binary-hom-equivalence-relation R S T f x y) =
inclusion-is-set-quotient-hom-equivalence-relation S QS qS UqS T QT qT UqT
( quotient-hom-equivalence-relation-Set S T)
( reflecting-map-quotient-map-hom-equivalence-relation S T)
( is-set-quotient-set-quotient-hom-equivalence-relation S T)
( quotient-map-hom-equivalence-relation S T
( map-hom-binary-hom-equivalence-relation R S T f x))
( map-reflecting-map-equivalence-relation S qS y)
p x y =
( inv
( coherence-square-map-is-set-quotient S QS qS T QT qT UqS UqT
( map-hom-binary-hom-equivalence-relation R S T f x)
( y))) ∙
( inv
( htpy-eq
( triangle-inclusion-is-set-quotient-hom-equivalence-relation
S QS qS UqS T QT qT UqT
( quotient-hom-equivalence-relation-Set S T)
( reflecting-map-quotient-map-hom-equivalence-relation S T)
( is-set-quotient-set-quotient-hom-equivalence-relation S T)
( map-hom-binary-hom-equivalence-relation R S T f x))
( map-reflecting-map-equivalence-relation S qS y)))
unique-binary-map-is-set-quotient :
is-contr
( Σ ( type-Set QR → type-Set QS → type-Set QT)
( λ h →
(x : A) (y : B) →
( h ( map-reflecting-map-equivalence-relation R qR x)
( map-reflecting-map-equivalence-relation S qS y)) =
( map-reflecting-map-equivalence-relation T qT
( map-binary-hom-equivalence-relation R S T f x y))))
unique-binary-map-is-set-quotient =
is-contr-equiv
( Σ ( type-Set QR → set-quotient-hom-equivalence-relation S T)
( λ h →
( x : A) →
( h (map-reflecting-map-equivalence-relation R qR x)) =
( quotient-map-hom-equivalence-relation S T
( map-hom-binary-hom-equivalence-relation R S T f x))))
( equiv-tot
( λ h →
( equiv-inv-htpy
( ( quotient-map-hom-equivalence-relation S T) ∘
( map-hom-binary-hom-equivalence-relation R S T f))
( h ∘ map-reflecting-map-equivalence-relation R qR))) ∘e
( ( inv-equiv
( equiv-postcomp-extension-surjection
( map-reflecting-map-equivalence-relation R qR ,
is-surjective-is-set-quotient R QR qR UqR)
( ( quotient-map-hom-equivalence-relation S T) ∘
( map-hom-binary-hom-equivalence-relation R S T f))
( emb-inclusion-is-set-quotient-hom-equivalence-relation
S QS qS UqS T QT qT UqT
( quotient-hom-equivalence-relation-Set S T)
( reflecting-map-quotient-map-hom-equivalence-relation S T)
( is-set-quotient-set-quotient-hom-equivalence-relation
S T)))) ∘e
( equiv-tot
( λ h →
equiv-Π-equiv-family
( λ x →
( inv-equiv equiv-funext) ∘e
( inv-equiv
( equiv-dependent-universal-property-surjection-is-surjective
( map-reflecting-map-equivalence-relation S qS)
( is-surjective-is-set-quotient S QS qS UqS)
( λ u →
Id-Prop QT
( inclusion-is-set-quotient-hom-equivalence-relation
S QS qS UqS T QT qT UqT
( quotient-hom-equivalence-relation-Set S T)
( reflecting-map-quotient-map-hom-equivalence-relation
S T)
( is-set-quotient-set-quotient-hom-equivalence-relation
S T)
( quotient-map-hom-equivalence-relation S T
( map-hom-binary-hom-equivalence-relation
R S T f x))
( u))
( h
( map-reflecting-map-equivalence-relation R qR x)
( u)))) ∘e
( equiv-Π-equiv-family
( λ y →
( equiv-inv _ _) ∘e
( equiv-concat'
( h
( map-reflecting-map-equivalence-relation R qR x)
( map-reflecting-map-equivalence-relation S qS y))
( p x y))))))))))
( unique-map-is-set-quotient R QR qR
( equivalence-relation-hom-equivalence-relation S T)
( quotient-hom-equivalence-relation-Set S T)
( reflecting-map-quotient-map-hom-equivalence-relation S T)
( UqR)
( is-set-quotient-set-quotient-hom-equivalence-relation S T)
( hom-binary-hom-equivalence-relation R S T f))
binary-map-is-set-quotient : hom-Set QR (hom-set-Set QS QT)
binary-map-is-set-quotient =
pr1 (center unique-binary-map-is-set-quotient)
compute-binary-map-is-set-quotient :
(x : A) (y : B) →
binary-map-is-set-quotient
( map-reflecting-map-equivalence-relation R qR x)
( map-reflecting-map-equivalence-relation S qS y) =
map-reflecting-map-equivalence-relation
T qT (map-binary-hom-equivalence-relation R S T f x y)
compute-binary-map-is-set-quotient =
pr2 (center unique-binary-map-is-set-quotient)
```
### Binary functoriality of set quotients
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} (R : equivalence-relation l2 A)
{B : UU l3} (S : equivalence-relation l4 B)
{C : UU l5} (T : equivalence-relation l6 C)
(f : binary-hom-equivalence-relation R S T)
where
unique-binary-map-set-quotient :
is-contr
( Σ ( set-quotient R → set-quotient S → set-quotient T)
( λ h →
(x : A) (y : B) →
( h (quotient-map R x) (quotient-map S y)) =
( quotient-map T
( map-binary-hom-equivalence-relation R S T f x y))))
unique-binary-map-set-quotient =
unique-binary-map-is-set-quotient
( R)
( quotient-Set R)
( reflecting-map-quotient-map R)
( S)
( quotient-Set S)
( reflecting-map-quotient-map S)
( T)
( quotient-Set T)
( reflecting-map-quotient-map T)
( is-set-quotient-set-quotient R)
( is-set-quotient-set-quotient S)
( is-set-quotient-set-quotient T)
( f)
binary-map-set-quotient : set-quotient R → set-quotient S → set-quotient T
binary-map-set-quotient =
pr1 (center unique-binary-map-set-quotient)
compute-binary-map-set-quotient :
(x : A) (y : B) →
( binary-map-set-quotient (quotient-map R x) (quotient-map S y)) =
( quotient-map T (map-binary-hom-equivalence-relation R S T f x y))
compute-binary-map-set-quotient =
pr2 (center unique-binary-map-set-quotient)
```