AUTHORS:
- Nicolas M. Thiery (2010): initial revision
Given a concrete category self == As() (i.e. a subcategory of Sets()), As().Subquotients() returns the category of objects of As() endowed with a distinguished description as subquotient of some other object of As().
EXAMPLES:
sage: Monoids().Subquotients()
Category of subquotients of monoids
A parent \(A\) in As() is further in As().Subquotients() if there is a distinguished parent \(B\) in As(), called the ambient space, a subspace \(B'\) of \(B\) and a pair of structure preserving maps:
called respectively the lifting map and retract map such that \(r \circ l\) is the identity of \(A\). What exactly structure preserving means is explicited in each category; this typically states that, for each operation \(op\) of the category, there is a commutative diagram such that:
for all \(e\in A\), one has \(op_A(e) = r(op_B(l(e)))\)
This allows for deriving the operations on \(A\) from those on \(B\).
Note: this is a slightly weaker definition than that found on http://en.wikipedia.org/wiki/Subquotient: B’ is not necessarily required to be a subobject of B.
Assumptions:
For any category As(), As().Subquotients() is a subcategory of As().
Example: a subquotient of a group is a group (e.g. a left or right quotients of a group by a non normal subgroup is not in this category).
This construction is covariant: if As() is a subcategory of Bs(), then As().Subquotients() is a subcategory of Bs().Subquotients()
Example: if \(A\) is a distinguished subquotient of \(B\) in the category of groups, then is is also a subquotient of \(B\) in the category of monoids.
If the user (or a program) calls As().Subquotients(), then it is assumed that subquotients are well defined in this category. This is not checked, and probably never will. Note that, if a category \(As()\) does not specify anything about its subquotients, then it’s subquotient category looks like this:
sage: EuclideanDomains().Subquotients()
Join of Category of euclidean domains and Category of subquotients of monoids
Interface: the ambient space of \(B\) is given by B.ambient(). The lifting and retract map are implemented respectively as methods B.lift(b) and B.retract(a). As a shorthand, one can use alternatively b.lift():
sage: S = Semigroups().Subquotients().example(); S
An example of a (sub)quotient semigroup: a quotient of the left zero semigroup
sage: S.ambient()
An example of a semigroup: the left zero semigroup
sage: S(3).lift().parent()
An example of a semigroup: the left zero semigroup
sage: S(3) * S(1) == S.retract( S(3).lift() * S(1).lift() )
True
See S? for more.
TODO: use a more interesting example, like \(\ZZ/n\ZZ\).
The two most common use cases are:
- quotients, when \(A'=A\) and \(r\) is a morphism; then \(r\) is a canonical quotient map from \(A\) to \(B\))
- subobjects (when \(l\) is an embedding from \(B\) into \(A\)).
See respectively Quotients and Subobjects.
TESTS:
sage: TestSuite(Sets().Subquotients()).run()
Bases: sage.categories.covariant_functorial_construction.RegressiveCovariantConstructionCategory
TESTS:
sage: from sage.categories.covariant_functorial_construction import CovariantConstructionCategory
sage: class FooBars(CovariantConstructionCategory):
... _functor_category = "FooBars"
sage: Category.FooBars = lambda self: FooBars.category_of(self)
sage: C = FooBars(ModulesWithBasis(ZZ))
sage: C
Category of foo bars of modules with basis over Integer Ring
sage: C.base_category()
Category of modules with basis over Integer Ring
sage: latex(C)
\mathbf{FooBars}(\mathbf{ModulesWithBasis}_{\Bold{Z}})
sage: import __main__; __main__.FooBars = FooBars # Fake FooBars being defined in a python module
sage: TestSuite(C).run()