Идемпотентное полукольцо

Идемпотентное полукольцо — это полукольцо, в котором операция сложения идемпотентна. Это означает, что для любого элемента \(a\) из полукольца выполняется свойство \(a + a = a\).

Определение идемпотентного полукольца

Идемпотентное полукольцо — это множество \(S\), на котором определены две бинарные операции:

Эти операции должны удовлетворять следующим аксиомам:

Если в полукольце также существует единичный элемент \(1 \in S\) такой, что \(a \cdot 1 = 1 \cdot a = a\) для любого \(a \in S\), то такое полукольцо называется идемпотентным полукольцом с единицей.

Примеры идемпотентных полуколец

Зачем нужны идемпотентные полукольца?

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

Отличие идемпотентного полукольца от обычного полукольца

Основное отличие заключается в свойстве идемпотентности сложения. В идемпотентном полукольце для любого элемента \(a\) выполняется \(a + a = a\), тогда как в обычном полукольце это свойство может не выполняться.

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

Идемпотентное полукольцо - это полукольцо, которое также является идемпотентным, т.е. добавление значения к самому себе приводит к тому же значению.

Для полукольца с единицей должны соблюдаться все законы полукольца:

, а также закон идемпотентности сложения:

Код

trait ISemiring[A] extends Semiring[A], IdempotentMonoid[A]

Множества

given [A]: ISemiring[Set[A]] with
  val empty: Set[A]                         = Set.empty[A]
  def combine(x: Set[A], y: Set[A]): Set[A] = x ++ y
  def times(x: Set[A], y: Set[A]): Set[A]   = x.intersect(y)

Законы

... // Законы полукольца

def checkIdempotency[A](x: A)(using s: Band[A]): ValidatedNel[String, Unit] =
  Either.cond[String, Unit](
    s.combine(x, x) == x,
    (),
    "Не соблюдается идемпотентность: x + x должно быть равно x"
  ).toValidatedNel

Схема

classDiagram
    class Semigroup~A~{
        +combine(x: A, y: A) A
    }
    class IdempotentSemigroup~A~
    Semigroup <|-- IdempotentSemigroup    
    class Monoid~A~{
        +empty() A
    }
    Semigroup <|-- Monoid
    class CommutativeSemigroup~A~
    Semigroup <|-- CommutativeSemigroup  
    class IdempotentMonoid~A~
    IdempotentSemigroup <|-- IdempotentMonoid
    Monoid <|-- IdempotentMonoid
    class CommutativeMonoid~A~
    Monoid <|-- CommutativeMonoid
    CommutativeSemigroup <|-- CommutativeMonoid
    class Semiring~A~
    CommutativeMonoid <|-- Semiring
    class MultiplicativeSemigroup~A~{
        +times(x: A, y: A) A
    }
    MultiplicativeSemigroup <|-- Semiring
    Semigroup .. MultiplicativeSemigroup
    class IdempotentSemiring~A~
    IdempotentMonoid <|-- IdempotentSemiring
    Semiring <|-- IdempotentSemiring

Ссылки: