`DeclareOperation` and `DeclareProperty` do not commute, should they?
Observe:
gap> DeclareProperty("IsFoo", IsMatrixGroup); IsFoo;
<Property "IsFoo">
gap> DeclareOperation("IsFoo", [IsMatrixGroup, IsField]); IsFoo;
<Property "IsFoo">
works fine, but this gives an error:
gap> DeclareOperation("IsFoo", [IsMatrixGroup, IsField]); IsFoo;
<Operation "IsFoo">
gap> DeclareProperty("IsFoo", IsMatrixGroup);
Error, operation `IsFoo' was not created as a property, use `DeclareOperation'
As a consequence, the numericalsgps package does
DeclareOperation("IsIrreducible",[IsIrreducibleNumericalSemigroup]);
because the irredsol package (which usually is loaded first) does
DeclareOperation("IsIrreducible", [IsMatrixGroup, IsField]);
Now one could modify irredsol to workaround this by inserting a DeclareProperty("IsIrreducible", SOME_FILTER_DUNNO);, but this is somewhat unsatisfactory.
Also note that DeclareOperation does "commute" with DeclareAttribute: this
gap> DeclareOperation("IsFoo", [IsMatrixGroup, IsField]); IsFoo;
<Operation "IsFoo">
gap> DeclareAttribute("IsFoo", IsMatrixGroup); IsFoo;
<Attribute "IsFoo">
gives the "same" result as this:
gap> DeclareAttribute("IsFoo", IsMatrixGroup); IsFoo;
<Attribute "IsFoo">
gap> DeclareOperation("IsFoo", [IsMatrixGroup, IsField]); IsFoo;
<Attribute "IsFoo">
For attributes, there is ConvertToAttribute which takes care of the "upgrade" of an operation to an attribute. It is backed by the kernel functions OPER_TO_ATTRIBUTE resp. OPER_TO_MUTABLE_ATTRIBUTE, which call into the C functions ConvertOperationIntoAttribute. Perhaps a similar function could be added for properties.
Note that in the above examples, it is important that the operation has a number of arguments different from 1. Otherwise, there are more errors, e.g.:
#
gap> DeclareProperty("IsF1", IsMatrixGroup);
gap> DeclareOperation("IsF1", [IsMatrixGroup, IsField]);
#
gap> DeclareOperation("IsF2", [IsMatrixGroup, IsField]);
gap> DeclareProperty("IsF2", IsMatrixGroup);
Error, operation `IsF2' was not created as a property, use `DeclareOperation'
#
gap> DeclareAttribute("IsF3", IsMatrixGroup);
gap> DeclareOperation("IsF3", [IsMatrixGroup, IsField]);
#
gap> DeclareOperation("IsF4", [IsMatrixGroup, IsField]);
gap> DeclareAttribute("IsF4", IsMatrixGroup);
#
gap> DeclareProperty("IsF5", IsMatrixGroup);
gap> DeclareOperation("IsF5", [IsRationalFunction]);
Error, operation `IsF5' was created as a property, use `DeclareProperty'
#
gap> DeclareOperation("IsF6", [IsRationalFunction]);
gap> DeclareProperty("IsF6", IsMatrixGroup);
Error, operation `IsF6' was not created as a property, use `DeclareOperation'
#
gap> DeclareAttribute("IsF7", IsMatrixGroup);
gap> DeclareOperation("IsF7", [IsRationalFunction]);
Error, operation `IsF7' was created as an attribute, use `DeclareAttribute'
#
gap> DeclareOperation("IsF8", [IsRationalFunction]);
gap> DeclareAttribute("IsF8", IsMatrixGroup);
Error, operation `IsF8' has been declared as a one argument Operation and cannot also be an Attribute