## 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 under * and LeftQuotient; # the family of elements of M may be specified, and must be if # 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) );