# Decidable equivalence relations ```agda module foundation.decidable-equivalence-relations where ``` <details><summary>Imports</summary> ```agda open import foundation.binary-relations open import foundation.decidable-equality open import foundation.decidable-propositions open import foundation.decidable-relations open import foundation.decidable-subtypes open import foundation.decidable-types open import foundation.dependent-pair-types open import foundation.effective-maps-equivalence-relations open import foundation.equivalence-classes open import foundation.equivalence-relations open import foundation.existential-quantification open import foundation.function-extensionality open import foundation.functoriality-cartesian-product-types open import foundation.fundamental-theorem-of-identity-types open import foundation.images open import foundation.logical-equivalences open import foundation.propositional-truncations open import foundation.reflecting-maps-equivalence-relations open import foundation.sets open import foundation.slice open import foundation.surjective-maps open import foundation.type-arithmetic-cartesian-product-types open import foundation.type-arithmetic-dependent-pair-types open import foundation.universal-property-image open import foundation.universe-levels open import foundation-core.cartesian-product-types open import foundation-core.embeddings open import foundation-core.equality-dependent-pair-types open import foundation-core.equivalences open import foundation-core.fibers-of-maps open import foundation-core.function-types open import foundation-core.functoriality-dependent-pair-types open import foundation-core.homotopies open import foundation-core.identity-types open import foundation-core.propositions open import foundation-core.subtypes open import foundation-core.torsorial-type-families open import foundation-core.transport-along-identifications ``` </details> ## Idea A decidable equivalence relation on a type `X` is an equivalence relation `R` on `X` such that `R x y` is a decidable proposition for each `x y : X`. ## Definitions ### Decidable equivalence relations ```agda is-decidable-equivalence-relation : {l1 l2 : Level} → {A : UU l1} → equivalence-relation l2 A → UU (l1 ⊔ l2) is-decidable-equivalence-relation {A = A} R = (x y : A) → is-decidable ( sim-equivalence-relation R x y) Decidable-equivalence-relation : {l1 : Level} (l2 : Level) → UU l1 → UU (l1 ⊔ lsuc l2) Decidable-equivalence-relation l2 X = Σ ( Decidable-Relation l2 X) ( λ R → is-equivalence-relation (relation-Decidable-Relation R)) module _ {l1 l2 : Level} {X : UU l1} (R : Decidable-equivalence-relation l2 X) where decidable-relation-Decidable-equivalence-relation : Decidable-Relation l2 X decidable-relation-Decidable-equivalence-relation = pr1 R relation-Decidable-equivalence-relation : X → X → Prop l2 relation-Decidable-equivalence-relation = relation-Decidable-Relation decidable-relation-Decidable-equivalence-relation sim-Decidable-equivalence-relation : X → X → UU l2 sim-Decidable-equivalence-relation = rel-Decidable-Relation decidable-relation-Decidable-equivalence-relation is-prop-sim-Decidable-equivalence-relation : (x y : X) → is-prop (sim-Decidable-equivalence-relation x y) is-prop-sim-Decidable-equivalence-relation = is-prop-rel-Decidable-Relation decidable-relation-Decidable-equivalence-relation is-decidable-sim-Decidable-equivalence-relation : (x y : X) → is-decidable (sim-Decidable-equivalence-relation x y) is-decidable-sim-Decidable-equivalence-relation = is-decidable-Decidable-Relation decidable-relation-Decidable-equivalence-relation is-equivalence-relation-Decidable-equivalence-relation : is-equivalence-relation relation-Decidable-equivalence-relation is-equivalence-relation-Decidable-equivalence-relation = pr2 R equivalence-relation-Decidable-equivalence-relation : equivalence-relation l2 X pr1 equivalence-relation-Decidable-equivalence-relation = relation-Decidable-equivalence-relation pr2 equivalence-relation-Decidable-equivalence-relation = is-equivalence-relation-Decidable-equivalence-relation refl-Decidable-equivalence-relation : is-reflexive sim-Decidable-equivalence-relation refl-Decidable-equivalence-relation = refl-equivalence-relation equivalence-relation-Decidable-equivalence-relation symmetric-Decidable-equivalence-relation : is-symmetric sim-Decidable-equivalence-relation symmetric-Decidable-equivalence-relation = symmetric-equivalence-relation equivalence-relation-Decidable-equivalence-relation equiv-symmetric-Decidable-equivalence-relation : {x y : X} → sim-Decidable-equivalence-relation x y ≃ sim-Decidable-equivalence-relation y x equiv-symmetric-Decidable-equivalence-relation {x} {y} = equiv-iff-is-prop ( is-prop-sim-Decidable-equivalence-relation x y) ( is-prop-sim-Decidable-equivalence-relation y x) ( symmetric-Decidable-equivalence-relation x y) ( symmetric-Decidable-equivalence-relation y x) transitive-Decidable-equivalence-relation : is-transitive sim-Decidable-equivalence-relation transitive-Decidable-equivalence-relation = transitive-equivalence-relation equivalence-relation-Decidable-equivalence-relation equiv-equivalence-relation-is-decidable-Dec-equivalence-relation : {l1 l2 : Level} {X : UU l1} → Decidable-equivalence-relation l2 X ≃ Σ ( equivalence-relation l2 X) ( λ R → is-decidable-equivalence-relation R) pr1 equiv-equivalence-relation-is-decidable-Dec-equivalence-relation R = ( equivalence-relation-Decidable-equivalence-relation R , is-decidable-sim-Decidable-equivalence-relation R) pr2 equiv-equivalence-relation-is-decidable-Dec-equivalence-relation = is-equiv-is-invertible ( λ (R , d) → ( map-inv-equiv ( equiv-relation-is-decidable-Decidable-Relation) ( prop-equivalence-relation R , d) , is-equivalence-relation-prop-equivalence-relation R)) ( refl-htpy) ( refl-htpy) ``` ### Equivalence classes of decidable equivalence relations ```agda module _ {l1 l2 : Level} {X : UU l1} (R : Decidable-equivalence-relation l2 X) where is-equivalence-class-Decidable-equivalence-relation : decidable-subtype l2 X → UU (l1 ⊔ lsuc l2) is-equivalence-class-Decidable-equivalence-relation P = exists-structure ( X) ( λ x → P = decidable-relation-Decidable-equivalence-relation R x) equivalence-class-Decidable-equivalence-relation : UU (l1 ⊔ lsuc l2) equivalence-class-Decidable-equivalence-relation = im (decidable-relation-Decidable-equivalence-relation R) class-Decidable-equivalence-relation : X → equivalence-class-Decidable-equivalence-relation pr1 (class-Decidable-equivalence-relation x) = decidable-relation-Decidable-equivalence-relation R x pr2 (class-Decidable-equivalence-relation x) = intro-exists x refl emb-equivalence-class-Decidable-equivalence-relation : equivalence-class-Decidable-equivalence-relation ↪ decidable-subtype l2 X emb-equivalence-class-Decidable-equivalence-relation = emb-im (decidable-relation-Decidable-equivalence-relation R) decidable-subtype-equivalence-class-Decidable-equivalence-relation : equivalence-class-Decidable-equivalence-relation → decidable-subtype l2 X decidable-subtype-equivalence-class-Decidable-equivalence-relation = map-emb emb-equivalence-class-Decidable-equivalence-relation subtype-equivalence-class-Decidable-equivalence-relation : equivalence-class-Decidable-equivalence-relation → subtype l2 X subtype-equivalence-class-Decidable-equivalence-relation = subtype-decidable-subtype ∘ decidable-subtype-equivalence-class-Decidable-equivalence-relation is-in-subtype-equivalence-class-Decidable-equivalence-relation : equivalence-class-Decidable-equivalence-relation → X → UU l2 is-in-subtype-equivalence-class-Decidable-equivalence-relation = is-in-subtype ∘ subtype-equivalence-class-Decidable-equivalence-relation is-prop-is-in-subtype-equivalence-class-Decidable-equivalence-relation : (P : equivalence-class-Decidable-equivalence-relation) (x : X) → is-prop (is-in-subtype-equivalence-class-Decidable-equivalence-relation P x) is-prop-is-in-subtype-equivalence-class-Decidable-equivalence-relation P = is-prop-is-in-subtype ( subtype-equivalence-class-Decidable-equivalence-relation P) is-set-equivalence-class-Decidable-equivalence-relation : is-set equivalence-class-Decidable-equivalence-relation is-set-equivalence-class-Decidable-equivalence-relation = is-set-im ( decidable-relation-Decidable-equivalence-relation R) ( is-set-decidable-subtype) equivalence-class-Decidable-equivalence-relation-Set : Set (l1 ⊔ lsuc l2) pr1 equivalence-class-Decidable-equivalence-relation-Set = equivalence-class-Decidable-equivalence-relation pr2 equivalence-class-Decidable-equivalence-relation-Set = is-set-equivalence-class-Decidable-equivalence-relation unit-im-equivalence-class-Decidable-equivalence-relation : hom-slice ( decidable-relation-Decidable-equivalence-relation R) ( decidable-subtype-equivalence-class-Decidable-equivalence-relation) unit-im-equivalence-class-Decidable-equivalence-relation = unit-im (decidable-relation-Decidable-equivalence-relation R) is-image-equivalence-class-Decidable-equivalence-relation : is-image ( decidable-relation-Decidable-equivalence-relation R) ( emb-equivalence-class-Decidable-equivalence-relation) ( unit-im-equivalence-class-Decidable-equivalence-relation) is-image-equivalence-class-Decidable-equivalence-relation = is-image-im (decidable-relation-Decidable-equivalence-relation R) is-surjective-class-Decidable-equivalence-relation : is-surjective class-Decidable-equivalence-relation is-surjective-class-Decidable-equivalence-relation = is-surjective-map-unit-im ( decidable-relation-Decidable-equivalence-relation R) ``` ## Properties ### We characterize the identity type of the equivalence classes ```agda module _ {l1 l2 : Level} {A : UU l1} (R : Decidable-equivalence-relation l2 A) (a : A) where abstract center-total-subtype-equivalence-class-Decidable-equivalence-relation : Σ ( equivalence-class-Decidable-equivalence-relation R) ( λ P → is-in-subtype-equivalence-class-Decidable-equivalence-relation R P a) pr1 center-total-subtype-equivalence-class-Decidable-equivalence-relation = class-Decidable-equivalence-relation R a pr2 center-total-subtype-equivalence-class-Decidable-equivalence-relation = refl-Decidable-equivalence-relation R a contraction-total-subtype-equivalence-class-Decidable-equivalence-relation : ( t : Σ ( equivalence-class-Decidable-equivalence-relation R) ( λ P → is-in-subtype-equivalence-class-Decidable-equivalence-relation R P a)) → center-total-subtype-equivalence-class-Decidable-equivalence-relation = t contraction-total-subtype-equivalence-class-Decidable-equivalence-relation ( pair (pair P p) H) = eq-type-subtype ( λ Q → subtype-equivalence-class-Decidable-equivalence-relation R Q a) ( apply-universal-property-trunc-Prop ( p) ( Id-Prop ( equivalence-class-Decidable-equivalence-relation-Set R) ( class-Decidable-equivalence-relation R a) ( pair P p)) ( α)) where α : fiber (pr1 R) P → class-Decidable-equivalence-relation R a = pair P p α (pair x refl) = eq-type-subtype ( λ z → trunc-Prop ( fiber (decidable-relation-Decidable-equivalence-relation R) z)) ( eq-htpy ( λ y → eq-iff-Decidable-Prop ( pr1 R a y) ( pr1 R x y) ( λ K → transitive-Decidable-equivalence-relation R x a y K H) ( λ K → transitive-Decidable-equivalence-relation R a x y K ( symmetric-Decidable-equivalence-relation R x a H)))) is-torsorial-subtype-equivalence-class-Decidable-equivalence-relation : is-torsorial ( λ P → is-in-subtype-equivalence-class-Decidable-equivalence-relation R P a) pr1 is-torsorial-subtype-equivalence-class-Decidable-equivalence-relation = center-total-subtype-equivalence-class-Decidable-equivalence-relation pr2 is-torsorial-subtype-equivalence-class-Decidable-equivalence-relation = contraction-total-subtype-equivalence-class-Decidable-equivalence-relation related-eq-quotient-Decidable-equivalence-relation : (q : equivalence-class-Decidable-equivalence-relation R) → class-Decidable-equivalence-relation R a = q → is-in-subtype-equivalence-class-Decidable-equivalence-relation R q a related-eq-quotient-Decidable-equivalence-relation .(class-Decidable-equivalence-relation R a) refl = refl-Decidable-equivalence-relation R a abstract is-equiv-related-eq-quotient-Decidable-equivalence-relation : (q : equivalence-class-Decidable-equivalence-relation R) → is-equiv (related-eq-quotient-Decidable-equivalence-relation q) is-equiv-related-eq-quotient-Decidable-equivalence-relation = fundamental-theorem-id ( is-torsorial-subtype-equivalence-class-Decidable-equivalence-relation) ( related-eq-quotient-Decidable-equivalence-relation) abstract effective-quotient-Decidable-equivalence-relation' : (q : equivalence-class-Decidable-equivalence-relation R) → ( class-Decidable-equivalence-relation R a = q) ≃ ( is-in-subtype-equivalence-class-Decidable-equivalence-relation R q a) pr1 (effective-quotient-Decidable-equivalence-relation' q) = related-eq-quotient-Decidable-equivalence-relation q pr2 (effective-quotient-Decidable-equivalence-relation' q) = is-equiv-related-eq-quotient-Decidable-equivalence-relation q abstract eq-effective-quotient-Decidable-equivalence-relation' : (q : equivalence-class-Decidable-equivalence-relation R) → is-in-subtype-equivalence-class-Decidable-equivalence-relation R q a → class-Decidable-equivalence-relation R a = q eq-effective-quotient-Decidable-equivalence-relation' q = map-inv-is-equiv ( is-equiv-related-eq-quotient-Decidable-equivalence-relation q) ``` ### The quotient map into the large set quotient is effective ```agda module _ {l1 l2 : Level} {A : UU l1} (R : Decidable-equivalence-relation l2 A) where abstract is-effective-class-Decidable-equivalence-relation : is-effective ( equivalence-relation-Decidable-equivalence-relation R) ( class-Decidable-equivalence-relation R) is-effective-class-Decidable-equivalence-relation x y = ( equiv-symmetric-Decidable-equivalence-relation R) ∘e ( effective-quotient-Decidable-equivalence-relation' R x ( class-Decidable-equivalence-relation R y)) abstract apply-effectiveness-class-Decidable-equivalence-relation : {x y : A} → ( class-Decidable-equivalence-relation R x = class-Decidable-equivalence-relation R y) → sim-Decidable-equivalence-relation R x y apply-effectiveness-class-Decidable-equivalence-relation {x} {y} = map-equiv (is-effective-class-Decidable-equivalence-relation x y) abstract apply-effectiveness-class-Decidable-equivalence-relation' : {x y : A} → sim-Decidable-equivalence-relation R x y → class-Decidable-equivalence-relation R x = class-Decidable-equivalence-relation R y apply-effectiveness-class-Decidable-equivalence-relation' {x} {y} = map-inv-equiv (is-effective-class-Decidable-equivalence-relation x y) ``` ### The quotient map into the large set quotient is surjective and effective ```agda module _ {l1 l2 : Level} {A : UU l1} (R : Decidable-equivalence-relation l2 A) where is-surjective-and-effective-class-Decidable-equivalence-relation : is-surjective-and-effective ( equivalence-relation-Decidable-equivalence-relation R) ( class-Decidable-equivalence-relation R) pr1 is-surjective-and-effective-class-Decidable-equivalence-relation = is-surjective-class-Decidable-equivalence-relation R pr2 is-surjective-and-effective-class-Decidable-equivalence-relation = is-effective-class-Decidable-equivalence-relation R ``` ### The quotient map into the large set quotient is a reflecting map ```agda module _ {l1 l2 : Level} {A : UU l1} (R : Decidable-equivalence-relation l2 A) where quotient-reflecting-map-equivalence-class-Decidable-equivalence-relation : reflecting-map-equivalence-relation ( equivalence-relation-Decidable-equivalence-relation R) ( equivalence-class-Decidable-equivalence-relation R) pr1 quotient-reflecting-map-equivalence-class-Decidable-equivalence-relation = class-Decidable-equivalence-relation R pr2 quotient-reflecting-map-equivalence-class-Decidable-equivalence-relation = apply-effectiveness-class-Decidable-equivalence-relation' R ``` ```agda module _ {l1 l2 : Level} {A : UU l1} (R : Decidable-equivalence-relation l2 A) where transitive-is-in-subtype-equivalence-class-Decidable-equivalence-relation : (P : equivalence-class-Decidable-equivalence-relation R) (a b : A) → is-in-subtype-equivalence-class-Decidable-equivalence-relation R P a → sim-Decidable-equivalence-relation R a b → is-in-subtype-equivalence-class-Decidable-equivalence-relation R P b transitive-is-in-subtype-equivalence-class-Decidable-equivalence-relation P a b p q = apply-universal-property-trunc-Prop ( pr2 P) ( subtype-equivalence-class-Decidable-equivalence-relation R P b) ( λ (pair x T) → tr ( λ Z → is-in-subtype-equivalence-class-Decidable-equivalence-relation R Z b) { x = class-Decidable-equivalence-relation R x} {y = P} ( eq-pair-Σ ( T) ( all-elements-equal-type-trunc-Prop _ _)) ( transitive-Decidable-equivalence-relation R _ a b q ( tr ( λ Z → is-in-subtype-equivalence-class-Decidable-equivalence-relation R Z a) { x = P} { y = class-Decidable-equivalence-relation R x} ( eq-pair-Σ (inv T) (all-elements-equal-type-trunc-Prop _ _)) ( p)))) ``` ```agda module _ {l1 l2 : Level} {A : UU l1} (R : equivalence-relation l2 A) where is-decidable-is-in-equivalence-class-is-decidable : ((a b : A) → is-decidable (sim-equivalence-relation R a b)) → (T : equivalence-class R) → (a : A) → is-decidable (is-in-equivalence-class R T a) is-decidable-is-in-equivalence-class-is-decidable F T a = apply-universal-property-trunc-Prop ( pr2 T) ( is-decidable-Prop ( subtype-equivalence-class R T a)) ( λ (pair t P) → is-decidable-iff ( backward-implication (P a)) ( forward-implication (P a)) ( F t a)) ``` #### The type of decidable equivalence relations on `A` is equivalent to the type of surjections from `A` into a type with decidable equality ```agda has-decidable-equality-type-Surjection-Into-Set : {l1 : Level} {A : UU l1} (surj : Surjection-Into-Set l1 A) → ( is-decidable-equivalence-relation ( equivalence-relation-Surjection-Into-Set surj)) → has-decidable-equality (type-Surjection-Into-Set surj) has-decidable-equality-type-Surjection-Into-Set surj is-dec-rel x y = apply-twice-dependent-universal-property-surjection-is-surjective ( map-Surjection-Into-Set surj) ( is-surjective-Surjection-Into-Set surj) ( λ (s t : (type-Surjection-Into-Set surj)) → ( is-decidable (s = t) , is-prop-is-decidable ( is-set-type-Surjection-Into-Set surj s t))) ( λ a1 a2 → is-dec-rel a1 a2) ( x) ( y) is-decidable-equivalence-relation-Surjection-Into-Set : {l1 : Level} {A : UU l1} (surj : Surjection-Into-Set l1 A) → has-decidable-equality (type-Surjection-Into-Set surj) → is-decidable-equivalence-relation ( equivalence-relation-Surjection-Into-Set surj) is-decidable-equivalence-relation-Surjection-Into-Set surj dec-eq x y = dec-eq (map-Surjection-Into-Set surj x) (map-Surjection-Into-Set surj y) equiv-Surjection-Into-Set-Decidable-equivalence-relation : {l1 : Level} (A : UU l1) → Decidable-equivalence-relation l1 A ≃ Σ (UU l1) (λ X → (A ↠ X) × has-decidable-equality X) equiv-Surjection-Into-Set-Decidable-equivalence-relation {l1} A = ( ( equiv-Σ ( λ z → (A ↠ z) × has-decidable-equality z) ( id-equiv) ( λ X → ( equiv-product ( id-equiv) ( inv-equiv ( equiv-add-redundant-prop ( is-prop-is-set ( X)) ( is-set-has-decidable-equality)) ∘e commutative-product) ∘e ( equiv-left-swap-Σ)))) ∘e ( ( associative-Σ ( UU l1) ( λ X → is-set X) ( λ X → (A ↠ pr1 X) × has-decidable-equality (pr1 X))) ∘e ( ( associative-Σ ( Set l1) ( λ X → (A ↠ type-Set X)) ( λ X → has-decidable-equality (pr1 (pr1 X)))) ∘e ( ( equiv-type-subtype ( λ surj → is-prop-Π ( λ x → is-prop-Π ( λ y → is-prop-is-decidable ( is-prop-sim-equivalence-relation ( equivalence-relation-Surjection-Into-Set surj) ( x) ( y))))) ( λ _ → is-prop-has-decidable-equality) ( λ s → has-decidable-equality-type-Surjection-Into-Set s) ( λ s → is-decidable-equivalence-relation-Surjection-Into-Set s)) ∘e ( ( inv-equiv ( equiv-Σ-equiv-base ( λ R → is-decidable-equivalence-relation R) ( inv-equiv ( equiv-surjection-into-set-equivalence-relation A)))) ∘e ( equiv-equivalence-relation-is-decidable-Dec-equivalence-relation)))))) ```