from __future__ import annotations
from fractions import Fraction
from typing import Callable, Iterable, TypeAlias, TypeVar
from pylogic.expressions.expr import BinaryExpression, Expr
from pylogic.infix.infix import SpecialInfix
from pylogic.proposition.quantified.forall import ForallInSet
from pylogic.proposition.relation.equals import Equals
from pylogic.structures.grouplike.group import AbelianGroup
from pylogic.structures.ringlike.ring import RIng
from pylogic.structures.set_ import Set
from pylogic.typing import Term, Unevaluated
T = TypeVar("T", bound=Term)
E = TypeVar("E", bound=Expr)
Z = TypeVar("Z", str, int, float, complex, Fraction)
BinOpFunc: TypeAlias = Callable[[T, T], BinaryExpression[T]]
[docs]
class CommutativeRIng(RIng[Z]):
times_is_commutative: ForallInSet[ForallInSet[Equals]]
[docs]
@classmethod
def property_times_is_commutative(
cls,
set_: Set,
times_operation: SpecialInfix[Term, Term, Expr, Expr],
) -> ForallInSet[ForallInSet[Equals]]:
return AbelianGroup.property_op_is_commutative(set_, times_operation)
def __init__(
self,
name: str,
elements: Iterable[T] | None = None,
containment_function: Callable[[T], bool] | None = None,
plus_operation: Callable[[T, T], E] | None = None,
plus_operation_symbol: str | None = None,
zero: Z | Unevaluated | None = None,
times_operation: Callable[[T, T], E] | None = None,
times_operation_symbol: str | None = None,
one: Z | Unevaluated | None = None,
**kwargs,
):
RIng.__init__(
self,
name=name,
elements=elements,
containment_function=containment_function,
plus_operation=plus_operation,
plus_operation_symbol=plus_operation_symbol,
zero=zero,
times_operation=times_operation,
times_operation_symbol=times_operation_symbol,
one=one,
**kwargs,
)
self._init_args = (name,)
self._init_kwargs = {
"elements": elements,
"containment_function": containment_function,
"plus_operation": plus_operation,
"plus_operation_symbol": plus_operation_symbol,
"zero": zero,
"times_operation": times_operation,
"times_operation_symbol": times_operation_symbol,
"one": one,
}
self._init_kwargs.update(kwargs)
self.times_is_commutative = CommutativeRIng.property_times_is_commutative(
self, self.times_operation
)
self.times_is_commutative._set_is_axiom(True)