# Unordered pairs of elements in a type ```agda module foundation.unordered-pairs where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.commuting-triangles-of-maps open import foundation.contractible-types open import foundation.decidable-equality open import foundation.dependent-pair-types open import foundation.dependent-universal-property-equivalences open import foundation.existential-quantification open import foundation.function-extensionality open import foundation.fundamental-theorem-of-identity-types open import foundation.homotopy-induction open import foundation.mere-equivalences open import foundation.postcomposition-functions open import foundation.propositional-truncations open import foundation.structure-identity-principle open import foundation.type-arithmetic-dependent-function-types open import foundation.universal-property-contractible-types open import foundation.universal-property-dependent-pair-types open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import foundation-core.contractible-maps open import foundation-core.coproduct-types open import foundation-core.embeddings 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.homotopies open import foundation-core.identity-types open import foundation-core.precomposition-dependent-functions open import foundation-core.propositions open import foundation-core.sets open import foundation-core.torsorial-type-families open import univalent-combinatorics.2-element-types open import univalent-combinatorics.equality-standard-finite-types open import univalent-combinatorics.finite-types open import univalent-combinatorics.standard-finite-types open import univalent-combinatorics.universal-property-standard-finite-types ``` </details> ## Idea An unordered pair of elements in a type `A` consists of a 2-element type `X` and a map `X → A`. ## Definition ### The definition of unordered pairs ```agda unordered-pair : {l : Level} (A : UU l) → UU (lsuc lzero ⊔ l) unordered-pair A = Σ (2-Element-Type lzero) (λ X → type-2-Element-Type X → A) ``` ### Immediate structure on the type of unordered pairs ```agda module _ {l : Level} {A : UU l} (p : unordered-pair A) where 2-element-type-unordered-pair : 2-Element-Type lzero 2-element-type-unordered-pair = pr1 p type-unordered-pair : UU lzero type-unordered-pair = type-2-Element-Type 2-element-type-unordered-pair has-two-elements-type-unordered-pair : has-two-elements type-unordered-pair has-two-elements-type-unordered-pair = has-two-elements-type-2-Element-Type 2-element-type-unordered-pair is-set-type-unordered-pair : is-set type-unordered-pair is-set-type-unordered-pair = is-set-mere-equiv' has-two-elements-type-unordered-pair (is-set-Fin 2) has-decidable-equality-type-unordered-pair : has-decidable-equality type-unordered-pair has-decidable-equality-type-unordered-pair = has-decidable-equality-mere-equiv' has-two-elements-type-unordered-pair ( has-decidable-equality-Fin 2) element-unordered-pair : type-unordered-pair → A element-unordered-pair = pr2 p other-element-unordered-pair : type-unordered-pair → A other-element-unordered-pair x = element-unordered-pair ( map-swap-2-Element-Type 2-element-type-unordered-pair x) ``` ### The predicate of being in an unodered pair ```agda is-in-unordered-pair-Prop : {l : Level} {A : UU l} (p : unordered-pair A) (a : A) → Prop l is-in-unordered-pair-Prop p a = exists-structure-Prop ( type-unordered-pair p) ( λ x → element-unordered-pair p x = a) is-in-unordered-pair : {l : Level} {A : UU l} (p : unordered-pair A) (a : A) → UU l is-in-unordered-pair p a = type-Prop (is-in-unordered-pair-Prop p a) is-prop-is-in-unordered-pair : {l : Level} {A : UU l} (p : unordered-pair A) (a : A) → is-prop (is-in-unordered-pair p a) is-prop-is-in-unordered-pair p a = is-prop-type-Prop (is-in-unordered-pair-Prop p a) ``` ### The condition of being a self-pairing ```agda is-selfpairing-unordered-pair : {l : Level} {A : UU l} (p : unordered-pair A) → UU l is-selfpairing-unordered-pair p = (x y : type-unordered-pair p) → type-trunc-Prop (element-unordered-pair p x = element-unordered-pair p y) ``` ### Standard unordered pairs Any two elements `x` and `y` in a type `A` define a standard unordered pair ```agda module _ {l1 : Level} {A : UU l1} (x y : A) where element-standard-unordered-pair : Fin 2 → A element-standard-unordered-pair = map-inv-ev-zero-one-Fin-two-ℕ (λ _ → A) (x , y) standard-unordered-pair : unordered-pair A pr1 standard-unordered-pair = Fin-UU-Fin' 2 pr2 standard-unordered-pair = element-standard-unordered-pair other-element-standard-unordered-pair : Fin 2 → A other-element-standard-unordered-pair (inl (inr _)) = y other-element-standard-unordered-pair (inr _) = x compute-other-element-standard-unordered-pair : (u : Fin 2) → other-element-unordered-pair standard-unordered-pair u = other-element-standard-unordered-pair u compute-other-element-standard-unordered-pair (inl (inr x)) = ap element-standard-unordered-pair (compute-swap-Fin-two-ℕ (inl (inr x))) compute-other-element-standard-unordered-pair (inr x) = ap element-standard-unordered-pair (compute-swap-Fin-two-ℕ (inr x)) ``` ## Properties ### Extensionality of unordered pairs ```agda module _ {l1 : Level} {A : UU l1} where Eq-unordered-pair : (p q : unordered-pair A) → UU l1 Eq-unordered-pair p q = Σ ( type-unordered-pair p ≃ type-unordered-pair q) ( λ e → coherence-triangle-maps ( element-unordered-pair p) ( element-unordered-pair q) ( map-equiv e)) refl-Eq-unordered-pair : (p : unordered-pair A) → Eq-unordered-pair p p pr1 (refl-Eq-unordered-pair (pair X p)) = id-equiv-UU-Fin {k = 2} X pr2 (refl-Eq-unordered-pair (pair X p)) = refl-htpy Eq-eq-unordered-pair : (p q : unordered-pair A) → p = q → Eq-unordered-pair p q Eq-eq-unordered-pair p .p refl = refl-Eq-unordered-pair p is-torsorial-Eq-unordered-pair : (p : unordered-pair A) → is-torsorial (Eq-unordered-pair p) is-torsorial-Eq-unordered-pair (pair X p) = is-torsorial-Eq-structure ( is-torsorial-equiv-UU-Fin {k = 2} X) ( pair X (id-equiv-UU-Fin {k = 2} X)) ( is-torsorial-htpy p) is-equiv-Eq-eq-unordered-pair : (p q : unordered-pair A) → is-equiv (Eq-eq-unordered-pair p q) is-equiv-Eq-eq-unordered-pair p = fundamental-theorem-id ( is-torsorial-Eq-unordered-pair p) ( Eq-eq-unordered-pair p) extensionality-unordered-pair : (p q : unordered-pair A) → (p = q) ≃ Eq-unordered-pair p q pr1 (extensionality-unordered-pair p q) = Eq-eq-unordered-pair p q pr2 (extensionality-unordered-pair p q) = is-equiv-Eq-eq-unordered-pair p q eq-Eq-unordered-pair' : (p q : unordered-pair A) → Eq-unordered-pair p q → p = q eq-Eq-unordered-pair' p q = map-inv-is-equiv (is-equiv-Eq-eq-unordered-pair p q) eq-Eq-unordered-pair : (p q : unordered-pair A) (e : type-unordered-pair p ≃ type-unordered-pair q) → (element-unordered-pair p ~ (element-unordered-pair q ∘ map-equiv e)) → (p = q) eq-Eq-unordered-pair p q e H = eq-Eq-unordered-pair' p q (pair e H) is-retraction-eq-Eq-unordered-pair : (p q : unordered-pair A) → (eq-Eq-unordered-pair' p q ∘ Eq-eq-unordered-pair p q) ~ id is-retraction-eq-Eq-unordered-pair p q = is-retraction-map-inv-is-equiv (is-equiv-Eq-eq-unordered-pair p q) is-section-eq-Eq-unordered-pair : (p q : unordered-pair A) → ( Eq-eq-unordered-pair p q ∘ eq-Eq-unordered-pair' p q) ~ id is-section-eq-Eq-unordered-pair p q = is-section-map-inv-is-equiv (is-equiv-Eq-eq-unordered-pair p q) eq-Eq-refl-unordered-pair : (p : unordered-pair A) → eq-Eq-unordered-pair p p id-equiv refl-htpy = refl eq-Eq-refl-unordered-pair p = is-retraction-eq-Eq-unordered-pair p p refl ``` ### Induction on equality of unordered pairs ```agda module _ {l1 l2 : Level} {A : UU l1} (p : unordered-pair A) (B : (q : unordered-pair A) → Eq-unordered-pair p q → UU l2) where ev-refl-Eq-unordered-pair : ((q : unordered-pair A) (e : Eq-unordered-pair p q) → B q e) → B p (refl-Eq-unordered-pair p) ev-refl-Eq-unordered-pair f = f p (refl-Eq-unordered-pair p) triangle-ev-refl-Eq-unordered-pair : coherence-triangle-maps ( ev-point (p , refl-Eq-unordered-pair p)) ( ev-refl-Eq-unordered-pair) ( ev-pair) triangle-ev-refl-Eq-unordered-pair = refl-htpy abstract is-equiv-ev-refl-Eq-unordered-pair : is-equiv ev-refl-Eq-unordered-pair is-equiv-ev-refl-Eq-unordered-pair = is-equiv-right-map-triangle ( ev-point (p , refl-Eq-unordered-pair p)) ( ev-refl-Eq-unordered-pair) ( ev-pair) ( triangle-ev-refl-Eq-unordered-pair) ( dependent-universal-property-contr-is-contr ( p , refl-Eq-unordered-pair p) ( is-torsorial-Eq-unordered-pair p) ( λ u → B (pr1 u) (pr2 u))) ( is-equiv-ev-pair) abstract is-contr-map-ev-refl-Eq-unordered-pair : is-contr-map ev-refl-Eq-unordered-pair is-contr-map-ev-refl-Eq-unordered-pair = is-contr-map-is-equiv is-equiv-ev-refl-Eq-unordered-pair abstract ind-Eq-unordered-pair : B p (refl-Eq-unordered-pair p) → ((q : unordered-pair A) (e : Eq-unordered-pair p q) → B q e) ind-Eq-unordered-pair u = pr1 (center (is-contr-map-ev-refl-Eq-unordered-pair u)) compute-refl-ind-Eq-unordered-pair : (u : B p (refl-Eq-unordered-pair p)) → ind-Eq-unordered-pair u p (refl-Eq-unordered-pair p) = u compute-refl-ind-Eq-unordered-pair u = pr2 (center (is-contr-map-ev-refl-Eq-unordered-pair u)) ``` ### Inverting extensional equality of unordered pairs ```agda module _ {l : Level} {A : UU l} (p q : unordered-pair A) where inv-Eq-unordered-pair : Eq-unordered-pair p q → Eq-unordered-pair q p pr1 (inv-Eq-unordered-pair (e , H)) = inv-equiv e pr2 (inv-Eq-unordered-pair (e , H)) = coherence-triangle-maps-inv-top ( element-unordered-pair p) ( element-unordered-pair q) ( e) ( H) ``` ### Mere equality of unordered pairs ```agda module _ {l1 : Level} {A : UU l1} where mere-Eq-unordered-pair-Prop : (p q : unordered-pair A) → Prop l1 mere-Eq-unordered-pair-Prop p q = trunc-Prop (Eq-unordered-pair p q) mere-Eq-unordered-pair : (p q : unordered-pair A) → UU l1 mere-Eq-unordered-pair p q = type-Prop (mere-Eq-unordered-pair-Prop p q) is-prop-mere-Eq-unordered-pair : (p q : unordered-pair A) → is-prop (mere-Eq-unordered-pair p q) is-prop-mere-Eq-unordered-pair p q = is-prop-type-Prop (mere-Eq-unordered-pair-Prop p q) refl-mere-Eq-unordered-pair : (p : unordered-pair A) → mere-Eq-unordered-pair p p refl-mere-Eq-unordered-pair p = unit-trunc-Prop (refl-Eq-unordered-pair p) ``` ### A standard unordered pair `{x,y}` is equal to the standard unordered pair `{y,x}` ```agda module _ {l1 : Level} {A : UU l1} (x y : A) where swap-standard-unordered-pair : Eq-unordered-pair ( standard-unordered-pair x y) ( standard-unordered-pair y x) pr1 swap-standard-unordered-pair = equiv-succ-Fin 2 pr2 swap-standard-unordered-pair (inl (inr _)) = refl pr2 swap-standard-unordered-pair (inr _) = refl is-commutative-standard-unordered-pair : standard-unordered-pair x y = standard-unordered-pair y x is-commutative-standard-unordered-pair = eq-Eq-unordered-pair' ( standard-unordered-pair x y) ( standard-unordered-pair y x) ( swap-standard-unordered-pair) ``` ### Dependent universal property of pointed unordered pairs We will construct an equivalence ```text ((p : unordered-pair A) (i : type p) → B p i) ≃ ((x y : A) → B {x,y} 0) ``` ```agda module _ {l1 l2 : Level} {A : UU l1} (B : (p : unordered-pair A) → type-unordered-pair p → UU l2) where ev-pointed-unordered-pair : ((p : unordered-pair A) (i : type-unordered-pair p) → B p i) → ((x y : A) → B (standard-unordered-pair x y) (zero-Fin 1)) ev-pointed-unordered-pair f x y = f (standard-unordered-pair x y) (zero-Fin 1) abstract dependent-universal-property-pointed-unordered-pairs : is-equiv ev-pointed-unordered-pair dependent-universal-property-pointed-unordered-pairs = is-equiv-comp ( λ f x y → f (Fin-UU-Fin' 2) (element-standard-unordered-pair x y) (zero-Fin 1)) ( ev-pair) ( is-equiv-ev-pair) ( is-equiv-comp ( λ f x y → f ( Fin-UU-Fin' 2) ( zero-Fin 1) ( element-standard-unordered-pair x y)) ( map-Π (λ I → swap-Π)) ( is-equiv-map-Π-is-fiberwise-equiv ( λ I → is-equiv-swap-Π)) ( is-equiv-comp ( λ f x y → f (element-standard-unordered-pair x y)) ( λ f → f (Fin-UU-Fin' 2) (zero-Fin 1)) ( dependent-universal-property-identity-system-type-2-Element-Type ( Fin-UU-Fin' 2) ( zero-Fin 1) ( λ I i → (a : type-2-Element-Type I → A) → B (I , a) i)) ( is-equiv-comp ( ev-pair) ( precomp-Π ( λ xy → element-standard-unordered-pair (pr1 xy) (pr2 xy)) ( λ g → B (Fin-UU-Fin' 2 , g) (zero-Fin 1))) ( is-equiv-precomp-Π-is-equiv ( is-equiv-map-inv-dependent-universal-proeprty-Fin-two-ℕ ( λ _ → A)) ( λ g → B (Fin-UU-Fin' 2 , g) (zero-Fin 1))) ( is-equiv-ev-pair)))) equiv-dependent-universal-property-pointed-unordered-pairs : ((p : unordered-pair A) (i : type-unordered-pair p) → B p i) ≃ ((x y : A) → B (standard-unordered-pair x y) (zero-Fin 1)) pr1 equiv-dependent-universal-property-pointed-unordered-pairs = ev-pointed-unordered-pair pr2 equiv-dependent-universal-property-pointed-unordered-pairs = dependent-universal-property-pointed-unordered-pairs ``` ### Functoriality of unordered pairs ```agda map-unordered-pair : {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) → unordered-pair A → unordered-pair B pr1 (map-unordered-pair f p) = 2-element-type-unordered-pair p pr2 (map-unordered-pair f p) = f ∘ element-unordered-pair p preserves-comp-map-unordered-pair : {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} (g : B → C) (f : A → B) → map-unordered-pair (g ∘ f) ~ (map-unordered-pair g ∘ map-unordered-pair f) preserves-comp-map-unordered-pair g f p = refl preserves-id-map-unordered-pair : {l1 : Level} {A : UU l1} → map-unordered-pair (id {A = A}) ~ id preserves-id-map-unordered-pair = refl-htpy htpy-unordered-pair : {l1 l2 : Level} {A : UU l1} {B : UU l2} {f g : A → B} → (f ~ g) → (map-unordered-pair f ~ map-unordered-pair g) htpy-unordered-pair {f = f} {g = g} H (pair X p) = eq-Eq-unordered-pair ( map-unordered-pair f (pair X p)) ( map-unordered-pair g (pair X p)) ( id-equiv) ( H ·r p) preserves-refl-htpy-unordered-pair : {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) → htpy-unordered-pair (refl-htpy {f = f}) ~ refl-htpy preserves-refl-htpy-unordered-pair f p = is-retraction-eq-Eq-unordered-pair ( map-unordered-pair f p) ( map-unordered-pair f p) ( refl) equiv-unordered-pair : {l1 l2 : Level} {A : UU l1} {B : UU l2} → (A ≃ B) → (unordered-pair A ≃ unordered-pair B) equiv-unordered-pair e = equiv-tot (λ X → equiv-postcomp (type-UU-Fin 2 X) e) map-equiv-unordered-pair : {l1 l2 : Level} {A : UU l1} {B : UU l2} → (A ≃ B) → (unordered-pair A → unordered-pair B) map-equiv-unordered-pair e = map-equiv (equiv-unordered-pair e) is-equiv-map-equiv-unordered-pair : {l1 l2 : Level} {A : UU l1} {B : UU l2} → (e : A ≃ B) → is-equiv (map-equiv-unordered-pair e) is-equiv-map-equiv-unordered-pair e = is-equiv-map-equiv (equiv-unordered-pair e) element-equiv-standard-unordered-pair : {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃ B) (x y : A) → ( map-equiv e ∘ element-standard-unordered-pair x y) ~ ( element-standard-unordered-pair (map-equiv e x) (map-equiv e y)) element-equiv-standard-unordered-pair e x y (inl (inr _)) = refl element-equiv-standard-unordered-pair e x y (inr _) = refl equiv-standard-unordered-pair : {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃ B) (x y : A) → map-equiv-unordered-pair e (standard-unordered-pair x y) = standard-unordered-pair (map-equiv e x) (map-equiv e y) equiv-standard-unordered-pair e x y = eq-Eq-unordered-pair ( map-equiv-unordered-pair e (standard-unordered-pair x y)) ( standard-unordered-pair (map-equiv e x) (map-equiv e y)) ( id-equiv) ( element-equiv-standard-unordered-pair e x y) id-equiv-unordered-pair : {l : Level} {A : UU l} → map-equiv-unordered-pair (id-equiv {A = A}) ~ id id-equiv-unordered-pair = refl-htpy element-id-equiv-standard-unordered-pair : {l : Level} {A : UU l} (x y : A) → element-equiv-standard-unordered-pair (id-equiv {A = A}) x y ~ refl-htpy element-id-equiv-standard-unordered-pair x y (inl (inr _)) = refl element-id-equiv-standard-unordered-pair x y (inr _) = refl id-equiv-standard-unordered-pair : {l : Level} {A : UU l} (x y : A) → equiv-standard-unordered-pair id-equiv x y = refl id-equiv-standard-unordered-pair x y = ( ap ( eq-Eq-unordered-pair ( standard-unordered-pair x y) ( standard-unordered-pair x y) ( id-equiv)) ( eq-htpy (element-id-equiv-standard-unordered-pair x y))) ∙ ( eq-Eq-refl-unordered-pair (standard-unordered-pair x y)) unordered-distinct-pair : {l : Level} (A : UU l) → UU (lsuc lzero ⊔ l) unordered-distinct-pair A = Σ (UU-Fin lzero 2) (λ X → pr1 X ↪ A) ``` ### Every unordered pair is merely equal to a standard unordered pair ```agda abstract is-surjective-standard-unordered-pair : {l : Level} {A : UU l} (p : unordered-pair A) → type-trunc-Prop ( Σ A (λ x → Σ A (λ y → standard-unordered-pair x y = p))) is-surjective-standard-unordered-pair (I , a) = apply-universal-property-trunc-Prop ( has-two-elements-type-2-Element-Type I) ( trunc-Prop ( Σ _ (λ x → Σ _ (λ y → standard-unordered-pair x y = (I , a))))) ( λ e → unit-trunc-Prop ( a (map-equiv e (zero-Fin 1)) , a (map-equiv e (one-Fin 1)) , eq-Eq-unordered-pair ( standard-unordered-pair _ _) ( I , a) ( e) ( λ where ( inl (inr _)) → refl ( inr _) → refl))) ``` ### For every unordered pair `p` and every element `i` in its underlying type, `p` is equal to a standard unordered pair ```agda module _ {l : Level} {A : UU l} (p : unordered-pair A) (i : type-unordered-pair p) where compute-standard-unordered-pair-element-unordered-pair : Eq-unordered-pair ( standard-unordered-pair ( element-unordered-pair p i) ( other-element-unordered-pair p i)) ( p) pr1 compute-standard-unordered-pair-element-unordered-pair = equiv-point-2-Element-Type ( 2-element-type-unordered-pair p) ( i) pr2 compute-standard-unordered-pair-element-unordered-pair (inl (inr _)) = ap ( element-unordered-pair p) ( inv ( compute-map-equiv-point-2-Element-Type ( 2-element-type-unordered-pair p) ( i))) pr2 compute-standard-unordered-pair-element-unordered-pair (inr _) = ap ( element-unordered-pair p) ( inv ( compute-map-equiv-point-2-Element-Type' ( 2-element-type-unordered-pair p) ( i))) eq-compute-standard-unordered-pair-element-unordered-pair : standard-unordered-pair ( element-unordered-pair p i) ( other-element-unordered-pair p i) = p eq-compute-standard-unordered-pair-element-unordered-pair = eq-Eq-unordered-pair' ( standard-unordered-pair ( element-unordered-pair p i) ( other-element-unordered-pair p i)) ( p) ( compute-standard-unordered-pair-element-unordered-pair) ```