# Symmetric operations
```agda
module foundation.symmetric-operations where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-binary-functions
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.equivalence-extensionality
open import foundation.function-extensionality
open import foundation.functoriality-coproduct-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.propositional-truncations
open import foundation.universal-property-propositional-truncation-into-sets
open import foundation.universe-levels
open import foundation.unordered-pairs
open import foundation-core.coproduct-types
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import foundation-core.propositions
open import foundation-core.sets
open import foundation-core.subtypes
open import foundation-core.torsorial-type-families
open import univalent-combinatorics.2-element-types
open import univalent-combinatorics.finite-types
open import univalent-combinatorics.standard-finite-types
```
</details>
## Idea
Recall that there is a standard unordered pairing operation
`{-,-} : A → (A → unordered-pair A)`. This induces for any type `B` a map
```text
λ f x y → f {x,y} : (unordered-pair A → B) → (A → A → B)
```
A binary operation `μ : A → A → B` is symmetric if it extends to an operation
`μ̃ : unordered-pair A → B` along `{-,-}`. That is, a binary operation `μ` is
symmetric if there is an operation `μ̃` on the undordered pairs in `A`, such that
`μ̃({x,y}) = μ(x,y)` for all `x, y : A`. Symmetric operations can be understood
to be fully coherent commutative operations. One can check that if `B` is a set,
then `μ` has such an extension if and only if it is commutative in the usual
algebraic sense.
## Definition
### The (incoherent) algebraic condition of commutativity
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2}
where
is-commutative : (A → A → B) → UU (l1 ⊔ l2)
is-commutative f = (x y : A) → f x y = f y x
is-commutative-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) →
(A → A → type-Set B) → Prop (l1 ⊔ l2)
is-commutative-Prop B f =
Π-Prop _ (λ x → Π-Prop _ (λ y → Id-Prop B (f x y) (f y x)))
```
### Commutative operations
```agda
module _
{l1 l2 : Level} (A : UU l1) (B : UU l2)
where
symmetric-operation : UU (lsuc lzero ⊔ l1 ⊔ l2)
symmetric-operation = unordered-pair A → B
map-symmetric-operation : symmetric-operation → A → A → B
map-symmetric-operation f x y =
f (standard-unordered-pair x y)
```
## Properties
### The restriction of a commutative operation to the standard unordered pairs is commutative
```agda
is-commutative-symmetric-operation :
{l1 l2 : Level} {A : UU l1} {B : UU l2} (f : symmetric-operation A B) →
is-commutative (λ x y → f (standard-unordered-pair x y))
is-commutative-symmetric-operation f x y =
ap f (is-commutative-standard-unordered-pair x y)
```
### A binary operation from `A` to `B` is commutative if and only if it extends to the unordered pairs in `A`
```agda
module _
{l1 l2 : Level} {A : UU l1} (B : Set l2)
where
is-weakly-constant-on-equivalences-is-commutative :
(f : A → A → type-Set B) (H : is-commutative f) →
(X : UU lzero) (p : X → A) (e e' : Fin 2 ≃ X) →
(htpy-equiv e e') + (htpy-equiv e (e' ∘e equiv-succ-Fin 2)) →
( f (p (map-equiv e (zero-Fin 1))) (p (map-equiv e (one-Fin 1)))) =
( f (p (map-equiv e' (zero-Fin 1))) (p (map-equiv e' (one-Fin 1))))
is-weakly-constant-on-equivalences-is-commutative f H X p e e' (inl K) =
ap-binary f (ap p (K (zero-Fin 1))) (ap p (K (one-Fin 1)))
is-weakly-constant-on-equivalences-is-commutative f H X p e e' (inr K) =
( ap-binary f (ap p (K (zero-Fin 1))) (ap p (K (one-Fin 1)))) ∙
( H (p (map-equiv e' (one-Fin 1))) (p (map-equiv e' (zero-Fin 1))))
symmetric-operation-is-commutative :
(f : A → A → type-Set B) → is-commutative f →
symmetric-operation A (type-Set B)
symmetric-operation-is-commutative f H (pair (pair X K) p) =
map-universal-property-set-quotient-trunc-Prop B
( λ e → f (p (map-equiv e (zero-Fin 1))) (p (map-equiv e (one-Fin 1))))
( λ e e' →
is-weakly-constant-on-equivalences-is-commutative f H X p e e'
( map-equiv-coproduct
( inv-equiv (equiv-ev-zero-htpy-equiv-Fin-two-ℕ (pair X K) e e'))
( inv-equiv (equiv-ev-zero-htpy-equiv-Fin-two-ℕ
( pair X K)
( e)
( e' ∘e equiv-succ-Fin 2)))
( decide-value-equiv-Fin-two-ℕ
( pair X K)
( e')
( map-equiv e (zero-Fin 1)))))
( K)
compute-symmetric-operation-is-commutative :
(f : A → A → type-Set B) (H : is-commutative f) (x y : A) →
symmetric-operation-is-commutative f H (standard-unordered-pair x y) =
f x y
compute-symmetric-operation-is-commutative f H x y =
htpy-universal-property-set-quotient-trunc-Prop B
( λ e → f (p (map-equiv e (zero-Fin 1))) (p (map-equiv e (one-Fin 1))))
( λ e e' →
is-weakly-constant-on-equivalences-is-commutative f H (Fin 2) p e e'
( map-equiv-coproduct
( inv-equiv
( equiv-ev-zero-htpy-equiv-Fin-two-ℕ (Fin-UU-Fin' 2) e e'))
( inv-equiv (equiv-ev-zero-htpy-equiv-Fin-two-ℕ
( Fin-UU-Fin' 2)
( e)
( e' ∘e equiv-succ-Fin 2)))
( decide-value-equiv-Fin-two-ℕ
( Fin-UU-Fin' 2)
( e')
( map-equiv e (zero-Fin 1)))))
( id-equiv)
where
p : Fin 2 → A
p = pr2 (standard-unordered-pair x y)
```
### Characterization of equality of symmetric operations into sets
```agda
module _
{l1 l2 : Level} (A : UU l1) (B : Set l2)
(f : symmetric-operation A (type-Set B))
where
htpy-symmetric-operation-Set-Prop :
(g : symmetric-operation A (type-Set B)) → Prop (l1 ⊔ l2)
htpy-symmetric-operation-Set-Prop g =
Π-Prop A
( λ x →
Π-Prop A
( λ y →
Id-Prop B
( map-symmetric-operation A (type-Set B) f x y)
( map-symmetric-operation A (type-Set B) g x y)))
htpy-symmetric-operation-Set :
(g : symmetric-operation A (type-Set B)) → UU (l1 ⊔ l2)
htpy-symmetric-operation-Set g =
type-Prop (htpy-symmetric-operation-Set-Prop g)
center-total-htpy-symmetric-operation-Set :
Σ ( symmetric-operation A (type-Set B))
( htpy-symmetric-operation-Set)
pr1 center-total-htpy-symmetric-operation-Set = f
pr2 center-total-htpy-symmetric-operation-Set x y = refl
abstract
contraction-total-htpy-symmetric-operation-Set :
( t :
Σ ( symmetric-operation A (type-Set B))
( htpy-symmetric-operation-Set)) →
center-total-htpy-symmetric-operation-Set = t
contraction-total-htpy-symmetric-operation-Set (g , H) =
eq-type-subtype
htpy-symmetric-operation-Set-Prop
( eq-htpy
( λ p →
apply-universal-property-trunc-Prop
( is-surjective-standard-unordered-pair p)
( Id-Prop B (f p) (g p))
( λ where (x , y , refl) → H x y)))
is-torsorial-htpy-symmetric-operation-Set :
is-torsorial (htpy-symmetric-operation-Set)
pr1 is-torsorial-htpy-symmetric-operation-Set =
center-total-htpy-symmetric-operation-Set
pr2 is-torsorial-htpy-symmetric-operation-Set =
contraction-total-htpy-symmetric-operation-Set
htpy-eq-symmetric-operation-Set :
(g : symmetric-operation A (type-Set B)) →
(f = g) → htpy-symmetric-operation-Set g
htpy-eq-symmetric-operation-Set g refl x y = refl
is-equiv-htpy-eq-symmetric-operation-Set :
(g : symmetric-operation A (type-Set B)) →
is-equiv (htpy-eq-symmetric-operation-Set g)
is-equiv-htpy-eq-symmetric-operation-Set =
fundamental-theorem-id
is-torsorial-htpy-symmetric-operation-Set
htpy-eq-symmetric-operation-Set
extensionality-symmetric-operation-Set :
(g : symmetric-operation A (type-Set B)) →
(f = g) ≃ htpy-symmetric-operation-Set g
pr1 (extensionality-symmetric-operation-Set g) =
htpy-eq-symmetric-operation-Set g
pr2 (extensionality-symmetric-operation-Set g) =
is-equiv-htpy-eq-symmetric-operation-Set g
eq-htpy-symmetric-operation-Set :
(g : symmetric-operation A (type-Set B)) →
htpy-symmetric-operation-Set g → (f = g)
eq-htpy-symmetric-operation-Set g =
map-inv-equiv (extensionality-symmetric-operation-Set g)
```
### The type of commutative operations into a set is equivalent to the type of symmetric operations
```agda
module _
{l1 l2 : Level} (A : UU l1) (B : Set l2)
where
map-compute-symmetric-operation-Set :
symmetric-operation A (type-Set B) → Σ (A → A → type-Set B) is-commutative
pr1 (map-compute-symmetric-operation-Set f) =
map-symmetric-operation A (type-Set B) f
pr2 (map-compute-symmetric-operation-Set f) =
is-commutative-symmetric-operation f
map-inv-compute-symmetric-operation-Set :
Σ (A → A → type-Set B) is-commutative → symmetric-operation A (type-Set B)
map-inv-compute-symmetric-operation-Set (f , H) =
symmetric-operation-is-commutative B f H
is-section-map-inv-compute-symmetric-operation-Set :
( map-compute-symmetric-operation-Set ∘
map-inv-compute-symmetric-operation-Set) ~ id
is-section-map-inv-compute-symmetric-operation-Set (f , H) =
eq-type-subtype
( is-commutative-Prop B)
( eq-htpy
( λ x →
eq-htpy
( λ y →
compute-symmetric-operation-is-commutative B f H x y)))
is-retraction-map-inv-compute-symmetric-operation-Set :
( map-inv-compute-symmetric-operation-Set ∘
map-compute-symmetric-operation-Set) ~ id
is-retraction-map-inv-compute-symmetric-operation-Set g =
eq-htpy-symmetric-operation-Set A B
( map-inv-compute-symmetric-operation-Set
( map-compute-symmetric-operation-Set g))
( g)
( compute-symmetric-operation-is-commutative B
( map-symmetric-operation A (type-Set B) g)
( is-commutative-symmetric-operation g))
is-equiv-map-compute-symmetric-operation-Set :
is-equiv map-compute-symmetric-operation-Set
is-equiv-map-compute-symmetric-operation-Set =
is-equiv-is-invertible
map-inv-compute-symmetric-operation-Set
is-section-map-inv-compute-symmetric-operation-Set
is-retraction-map-inv-compute-symmetric-operation-Set
compute-symmetric-operation-Set :
symmetric-operation A (type-Set B) ≃ Σ (A → A → type-Set B) is-commutative
pr1 compute-symmetric-operation-Set =
map-compute-symmetric-operation-Set
pr2 compute-symmetric-operation-Set =
is-equiv-map-compute-symmetric-operation-Set
```