# 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 ```