112 lines
4.4 KiB
GDScript3
112 lines
4.4 KiB
GDScript3
## structure.gd RAQ Definitions, generation, and elementary ops and props.
|
|
|
|
## GAP Categories and representations
|
|
|
|
## Info class for RAQ
|
|
DeclareInfoClass("InfoRAQ");
|
|
|
|
## 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");
|
|
|
|
## Opposite structures
|
|
DeclareCategory("IsOppositeObject", IsMultiplicativeElement);
|
|
DeclareCategoryCollections("IsOppositeObject");
|
|
DeclareAttribute("OppositeFamily", IsFamily);
|
|
DeclareAttribute("OppositeType", IsFamily);
|
|
DeclareSynonym("IsDefaultOppositeObject",
|
|
IsOppositeObject and IsPositionalObjectOneSlotRep);
|
|
DeclareAttribute("OppositeObj", IsMultiplicativeElement);
|
|
DeclareAttribute("UnderlyingMultiplicativeElement", IsOppositeObject);
|
|
|
|
# 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);
|
|
InstallMethod(GeneratorsOfMagma,
|
|
"finite left quasigroups",
|
|
IsLeftQuasigroup and IsFinite,
|
|
1,
|
|
q -> GeneratorsOfLeftQuasigroup(q)
|
|
);
|
|
|
|
# Generates the structure by \* and \/, same considerations as above
|
|
DeclareAttribute("GeneratorsOfRightQuasigroup", IsRightQuasigroup);
|
|
InstallMethod(GeneratorsOfMagma,
|
|
"finite right quasigroups",
|
|
IsRightQuasigroup and IsFinite,
|
|
2,
|
|
q -> GeneratorsOfRightQuasigroup(q)
|
|
);
|
|
|
|
## Conversions into quasigroup/rack/quandle
|
|
DeclareAttribute("AsLeftQuasigroup", IsCollection);
|
|
DeclareAttribute("AsLeftRack", IsCollection);
|
|
DeclareAttribute("AsLeftQuandle", IsCollection);
|
|
DeclareAttribute("AsRightQuasigroup", IsCollection);
|
|
DeclareAttribute("AsRightRack", IsCollection);
|
|
DeclareAttribute("AsRightQuandle", IsCollection);
|