Thank you for the extensive explanation. It clarifies things I obviously didn't understand... sage.categories.pushout is the most relevant part for what I was trying to ask. Paul
On Wednesday, November 28, 2012 2:31:06 PM UTC+1, Simon King wrote: > > Hi Paul, > > On 2012-11-28, Paul-Olivier Dehaye <paulo...@gmail.com <javascript:>> > wrote: > >> > change "To coerce from the category down to the parent" --> "To > coerce > >> from > >> > the abstraction layer to the parent". In this abstraction layer > (which > >> is > >> > close to the categories now available, but not quite the same), > > I still don't get what you are talking about. > > What do you mean by "abstraction layer"? For example, if you have a > vector space with a fixed basis, would the next abstraction layer be the > vector space without the choice of a basis? I think this is what Nicolas > calls "abstract parent" or so. But this is by no means close to the > categories now available! The abstract parent would still be *object* of > a category. > > >> > we would > >> > have a list of methods for the parent class and the element class of > a > >> > Category C. Now say you have parentA and parentB both implementing > the > >> same > >> > category C. > > Nonono. parentA and parentB implement *objects* of said category. > > >> > As part of its definition, parentA c/should tell how to > >> > initialize it using exclusively methods from this abstraction layer. > But > >> > parentB implements some of these methods. With any luck there might > be > >> > enough overlap that we automatically get a coercion from parentB -> > >> parentA. > > Hm. Are you perhaps suggesting that the category of a parent should > prescribe what basic data are needed to determine one of its objects? I > think that can not work. > > > You are asking about a different kind of coercion from the one I was > > talking about (that's part of my point: some are are purely at the > > concrete/Parents level -when the category does not change, I think these > > are called conversions as well-, > > I think we should settle some notions. > > Axioms for "coercion": > > * A "coercion" is a morphism in a category. Hence, if A and B are parents, > then a coercion from A to B is in Hom_C(A,B), where C is a category > which has both A and B as objects. > * There is at most one coercion between A and B. > * The composition of a coercion is a coercion. > * id_A is the coercion from A to A. > > Axioms for "conversion": > > * A "conversion" from a parent A to a parent B is a partial map from A > to B. > * I think we want uniqueness, but we do not assume that the composition > of conversions is a conversion. > * *If* there is a coercion from A to B, then the conversion map must > coincide with the coercion homomorphism. > > Are you talking about the same notion? > > > Let's use decorators to describe the two "pure" kinds of coercions, with > > prototype of the code that would run: > > 1) Purely concrete level - the kind I was talking about - the category > > stays the same, but the implementation (i.e. parents) changes. > > If we talk about coercion, then we talk about a fixed category, namely > the one which the coercion is morphism of. > > > Even in this > > case this is dealt with by specifying in terms of the category what > > arguments the constructor takes in each of the parents. > > "Constructor" of what? Constructor of an object? Or constructor of an > element of an object? I really don't see how the category of Rings() > could possible prescribe the argument spectrum for the constructor of a > ring element. > > > class Parent1(Parent, category = CategoryC): # > > unrelated point: for me it makes more sense to specify the category > here. > > No, not at all! Instances of the same parent class may very well belong > to different categories. So, I think it makes no sense to prescribe a > category in a class definition. > > > class Element1(Parent1.Element) > > That would be an error even when using metaclasses: Simply > Parent1.Element is not defined at that point. > > And besides, there *are* parent classes such that the element classes > have different backends. For example, all matrix spaces are implemented > using the same parent class - but the chosen element class depends on > whether we have a finite field of characteristic 2, a finite prime field > of odd characteristic, a finite non-prime field of odd characteristic, > ZZ, QQ or general commutative rings. > > Hence, it is not the case that the element class is determined by the > parent class. And it can also be (but I don't know if this is used) that > the same element class can be used to implement the elements of parents > that belong to different parent classes. > > > So CategoryC has many invariants, M to Z. > > This may be possible for the category of vector spaces: You need a field > K, an integer n presribing the dimension, and a list B of n elements > prescribing a basis, and these data define a vector space with basis. > And you need n elements of K to determine an element of that vector > space with basis. > > But what do you do for general categories such as the category of > rings? > > > Coercions would allow here to construct a composite parent from many > > different parents sharing the same category. > > Again, it seems we use totally different notions. A coercion in the > usual meaning in Sage does not "construct a composite parent". Perhaps > you are talking about construction functors (functors may of course > transform a given parent into a new parent)? > > Construction functors are an important brick in Sage's coercion model. > See sage.categories.pushout. > > > 2) Now, this is the kind you were asking about: coercions between > Parents > > with different underlying categories. > > Again, different notion. A coercion is a morphism in a category to which > *both* parents belong as objects. > > > For this coercion, nothing would be required of the Parents: it has > nothing > > to do with them! > > Someone would have to say in the category framework that there is always > a > > morphism from a ring R to a graded algebra over that ring R, and > register > > this as a coercion > > For that purpose, you can define a parent method __init_extra__ in the > category. > In fact, sage.categories.algebras.Algebras.ParentMethods.__init_extra__ > has the purpose of registering a coercion from the base ring. > > > Is this unrealistic? Does some of this already happen? > > See above, it is already done. > > Best regards, > Simon > > > -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To post to this group, send email to sage-devel@googlegroups.com. To unsubscribe from this group, send email to sage-devel+unsubscr...@googlegroups.com. Visit this group at http://groups.google.com/group/sage-devel?hl=en.