Коммутативная полугруппа

Коммутативная полугруппа — это алгебраическая структура, которая сочетает в себе свойства полугруппы и коммутативности. Разберем эти понятия по отдельности, а затем объединим их.

а) Полугруппа

Полугруппа — это множество \(S\), на котором определена бинарная операция \(\cdot\) (обычно называемая умножением или композицией), удовлетворяющая свойству ассоциативности:

б) Коммутативность

Операция \(\cdot\) называется коммутативной, если для любых \(a, b \in S\) выполняется:

\(a \cdot b = b \cdot a.\)

Таким образом, коммутативная полугруппа — это полугруппа, в которой операция \(\cdot\) коммутативна. То есть:

Примеры коммутативных полугрупп

Зачем нужны коммутативные полугруппы?

Коммутативные полугруппы находят применение в различных областях:

Формальное определение

CSemigroup[A] - полугруппа, которая является коммутативной.

Помимо законов полугруппы:

должен соблюдаться закон:

Код

trait CSemigroup[A] extends Semigroup[A]

Натуральные числа N образуют коммутативную полугруппу относительно сложения

given CSemigroup[Int] = (x: Int, y: Int) => x + y

Законы

Коммутативность означает, что порядок элементов при объединении не важен. Другими словами, результат операции combine будет одинаковым, независимо от того, в каком порядке вы передаёте элементы x и y. Это можно записать так: cs.combine(x, y) == cs.combine(y, x)

... // Законы полугруппы
  
def checkCommutativity[A](x: A, y: A)(using
    cs: CSemigroup[A]
): ValidatedNel[String, Unit] =
  Either.cond[String, Unit](
    cs.combine(x, y) == cs.combine(y, x),
    (),
    "Не соблюдается коммутативность: x + y должно быть равно y + x"
  ).toValidatedNel  

Схема

classDiagram
    class Semigroup~A~{
        +combine(x: A, y: A) A
    }
    class CommutativeSemigroup~A~
    Semigroup <|-- CommutativeSemigroup  

Реализация в библиотеках

Реализация в Spire

import spire.algebra.CSemigroup

CSemigroup.combine(1, 2) == CSemigroup.combine(2, 1)

Ссылки: