Implementing a new parent: a (draft of) tutorialΒΆ

The easiest approach for implementing a new parent is to start from a close example in sage.categories.examples. Here, we will get through the process of implementing a new finite semigroup, taking as starting point the provided example:

sage: S = FiniteSemigroups().example()
sage: S
An example of a finite semigroup: the left regular band generated by ('a', 'b', 'c', 'd')

You may lookup the implementation of this example with:

sage: S??                               # not tested

Or by browsing the source code of sage.categories.examples.finite_semigroups.LeftRegularBand.

Copy-paste this code into, say, a cell of the notebook, and replace every occurence of FiniteSemigroups().example(...) in the documentation by LeftRegularBand. This will be equivalent to:

sage: from sage.categories.examples.finite_semigroups import LeftRegularBand

Now, try:

sage: S = LeftRegularBand(); S
An example of a finite semigroup: the left regular band generated by ('a', 'b', 'c', 'd')

and play around with the examples in the documentation of S and of FiniteSemigroups.

Rename the class to ShiftSemigroup, and modify the product to implement the semigroup generated by the given alphabet such that \(au = u\) for any \(u\) of length \(3\).

Use TestSuite to test the newly implemented semigroup; draw its Cayley graph.

Add another option to the constructor to generalize the construction to any u of length \(k\).

Lookup the Sloane for the sequence of the sizes of those semigroups.

Now implement the commutative monoid of subsets of \(\{1,\dots,n\}\) endowed with union as product. What is its category? What are the extra functionalities available there? Implement iteration and cardinality.

TODO: the tutorial should explain there how to reuse the enumerated set of subsets, and endow it with more structure.