Идемпотентный моноид

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

а) Моноид

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

б) Идемпотентность

Элемент \(a\) называется идемпотентным, если \(a \cdot a = a\). Если все элементы моноида идемпотентны, то такой моноид называется идемпотентным моноидом.

Таким образом, идемпотентный моноид — это моноид, в котором для любого элемента \(a\) выполняется \(a \cdot a = a\).

Примеры идемпотентных моноидов

Зачем нужны идемпотентные моноиды?

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

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

IdempotentMonoid — это моноид, который также является идемпотентным, т.е. добавление значения к самому себе приводит к тому же значению.

IdempotentMonoid должен удовлетворять законам своих "родителей":

Код

trait IdempotentMonoid[A] extends Monoid[A], Band[A]

Множества

Некоторые операции над множествами являются идемпотентными: объединение, пересечение и т.п. Например, объединение множеств образуют IdempotentMonoid:

given [A]: IdempotentMonoid[Set[A]] with
  def empty: Set[A] = Set.empty[A]
  def combine(x: Set[A], y: Set[A]): Set[A] = x ++ y

Законы

Законы наследуются от моноида и идемпотентной полугруппы.

Схема

classDiagram
    class Semigroup~A~{
        +combine(x: A, y: A) A
    }
    class IdempotentSemigroup~A~
    Semigroup <|-- IdempotentSemigroup    
    class Monoid~A~{
        +empty() A
    }
    Semigroup <|-- Monoid
    class IdempotentMonoid~A~
    IdempotentSemigroup <|-- IdempotentMonoid
    Monoid <|-- IdempotentMonoid

Ссылки: