RAQ/gap/structure.gd
2017-10-22 00:44:56 +02:00

91 lines
3.6 KiB
GDScript3

## structure.gd RAQ Definitions, generation, and elementary ops and props.
## GAP Categories and representations
## Self-distributivity
# Note these are properties that can and therefore should be defined just at
# the level of MultiplicativeElements and Magmas, hence although the LOOPS
# package defines IsLDistributive and IsRDistributive for quasigroups, they
# would be ambiguous in the case of something like a semiring whose
# multiplicative structure was a quasigroup
# (cf. https://arxiv.org/abs/0910.4760). Hence, we implement them in RAQ with
# new, non-conflicting terms.
# An element that knows that multiplication in its family is left
# self-distributive:
DeclareCategory("IsLSelfDistElement", IsMultiplicativeElement);
DeclareCategoryCollections("IsLSelfDistElement");
# An element that knows that multiplication in its family is right
# self-distributive:
DeclareCategory("IsRSelfDistElement", IsMultiplicativeElement);
DeclareCategoryCollections("IsRSelfDistElement");
# Left self-distributive collections of elements:
DeclareProperty("IsLSelfDistributive", IsMultiplicativeElementCollection);
InstallTrueMethod(IsLSelfDistributive, IsLSelfDistElementCollection);
# Right self-distributive collections of elements:
DeclareProperty("IsRSelfDistributive", IsMultiplicativeElementCollection);
InstallTrueMethod(IsRSelfDistributive, IsRSelfDistElementCollection);
## Idempotence
# There is already a property IsIdempotent on elements, but to definw
# structures which will automatically be quandles we need a corresponding
# collections category:
DeclareCategoryCollections("IsIdempotent");
# Collections in which every element is idempotent
DeclareProperty("IsElementwiseIdempotent", IsMultiplicativeElementCollection);
InstallTrueMethod(IsElementwiseIdempotent, IsIdempotentCollection);
## Left and right racks and quandles
DeclareSynonym("IsLeftRack", IsLeftQuasigroup and IsLSelfDistributive);
DeclareSynonym("IsRightRack", IsRightQuasigroup and IsRSelfDistributive);
DeclareSynonym("IsLeftQuandle", IsLeftRack and IsElementwiseIdempotent);
DeclareSynonym("IsRightQuandle", IsRightRack and IsElementwiseIdempotent);
## One-sided quasigroups and racks and quandles by generators
# Returns the closure of <gens> under * and LeftQuotient;
# the family of elements of M may be specified, and must be if <gens>
# is empty (in which case M will be empty as well).
DeclareGlobalFunction("LeftQuasigroup");
DeclareGlobalFunction("LeftQuasigroupNC");
DeclareGlobalFunction("RightQuasigroup");
DeclareGlobalFunction("RightQuasigroupNC");
DeclareGlobalFunction("LeftRack");
DeclareGlobalFunction("LeftRackNC");
DeclareGlobalFunction("RightRack");
DeclareGlobalFunction("RightRackNC");
DeclareGlobalFunction("LeftQuandle");
DeclareGlobalFunction("LeftQuandleNC");
DeclareGlobalFunction("RightQuandle");
DeclareGlobalFunction("RightQuandleNC");
# Underlying operation
DeclareGlobalFunction("CloneOfTypeByGenerators");
# Attributes for the generators
# Generates the structure by \* and LeftQuotient. Note that for finite
# structures, these are the same as the GeneratorsOfMagma but in general more
# elements might be required to generate the structure just under *
DeclareAttribute("GeneratorsOfLeftQuasigroup", IsLeftQuasigroup);
InstallImmediateMethod(GeneratorsOfMagma,
"finite left quasigroups",
IsLeftQuasigroup and IsFinite,
1,
q -> GeneratorsOfLeftQuasigroup(q)
);
# Generates the structure by \* and \/, same considerations as above
DeclareAttribute("GeneratorsOfRightQuasigroup", IsRightQuasigroup);
InstallImmediateMethod(GeneratorsOfMagma,
"finite right quasigroups",
IsRightQuasigroup and IsFinite,
2,
q -> GeneratorsOfRightQuasigroup(q)
);