Dear all, (I'm sending this also to Bertfried, since he was interested at some point)
C Y writes: > > (Well, that is Aldor syntax, but I hope in can be understood.) > > Well, about as well as I understand Axiom's syntax... :-/. I might as well > ask this up front, and I'm sorry in advance if I missed something obvious > and/or am proving myself as intelligent as your average rock: Never ever say something like this. It is *good* to ask questions, and it is also good to ask stupid questions. Moreover, it is impossible to tell beforehand whether a question is stupid or not. In my opinion, there are no stupid questions. (The reason for my saying that stupid questions are good questions is that very likely 10 other people in the audience will secretely hope that somebody else will be asking their "stupid" questions. But noone dares.) Elsewhere you wrote: > I'm quite aware these [questions] are an indicator I haven't read and > understood something I need to, so if someone can point me to the correct > "Axiom for Dummies" file I'll be only too glad to fade away until I > understand it properly. PLEASE DON'T FADE AWAY. WE NEED YOU! ------------------------------------------------------------------------------- > Is there a tutorial or some such that takes a Category->Domains set of code > and dissects it essentially character by character, answering all the dumb > questions? There is the Aldor user guide: http://www.aldor.org/docs/HTML/index.html which is very thorough but maybe a little steep, so I think the following approach is better for a beginning: > Here are some of the ones floating around in my head which I don't know > quite how to answer at the moment. > Taking this example: > > Units(R: Field): Exports == Implementation where > U == Fraction Polynomial Integer > > 1) The syntax (R: Field) - what does this actually denote? R I guess is all > Rings? No. R is a identifier, a variable in the computer language sense. So the syntax is Name0(Name1: Type1, Name2: Type2, ...): NameA == NameB where and Type1, Type2, ... are Types like * Field, Ring, ... which are categories, in this case Name1 will be taken by axiom to denote a domain of category Type1. Example: ------------------------------------------------ Units(R: Field): Exports == Implementation where ------------------------------------------------ R will be some Field from now on. I.e., you can multiply, add and take inverses of the elements in R. * Integer, Polynomial Integer, PrimeField 5, ... which are domains, in which case Name1 will be taken by axiom to denote an element of Type1. Example: ----------------------------------------------------- SquareMatrix(ndim,R): Exports == Implementation where ndim : NonNegativeInteger R : Ring ----------------------------------------------------- ndim will be a NonNegativeInteger and R a Ring. A valid call would be 0$SquareMatrix(5, Polynomial Integer) which will give a 0 matrix of dimension 5 with entries (all zero) which are Polynomials with Integer coefficients. Note that you are allowed to put the type declaration also after the keyword "where". Another example ------------------------------------------------ PrimeField(p:PositiveInteger): Exp == Impl where ------------------------------------------------ Here p will be a PositiveInteger. A valid call would be characteristic()$PrimeField(5) an invalid call would be characteristic()$PrimeField(x) unless x *is* an integer at the time of evaluation. > 2) Exports == Implementation - what is actually being exported here, and > where is it being exported to? "Exports" and "Implementation" are just two identifiers. If you read the sources, you will sometimes also find Cat == Capsule or Cat == Definition It seems that writing Category == is reserved for categories. So the complete syntax is (incomplete, but useful) Name0(Name1: Type1, Name2: Type2, ...): NameA == NameB where NameA == with op1Declaration op2Declaration op3Declaration NameB == add op1Definition op2Definition op3Definition The keyword * "==" means: here comes a macro definition * ":" means: here comes a type declaration * ":=" means: here comes an assignment. So we could also write Name0(Name1: Type1, Name2: Type2, ...): with op1Declaration op2Declaration op3Declaration == add op1Definition op2Definition op3Definition except the indentation is then less clear. The keyword "with" means: here come declarations the user will see. Note that the with part may be missing. See below. The keyword "add" means: here come definitions, declarations and assignments the user will not see. > 4) What is the significance of "%" within a domain definition? It means: I am an element of this domain. > 5) ... > > If "Domains" are to be part of a "Category", what responsibilities do the > Domains have to a) label themselves as being part of a category This comes just before the "with" part. (If it is present...). An example is PrimeField(p:PositiveInteger): Exp == Impl where Exp ==> Join(FiniteFieldCategory,FiniteAlgebraicExtensionField($),_ ConvertibleTo(Integer)) Impl ==> InnerPrimeField(p) add if not prime?(p)$IntegerPrimesPackage(Integer) then error "Argument to prime field must be a prime" Thus: PrimeField will be an element of the categories FiniteFieldCategory, FiniteAlgebraicExtensionField($), and ConvertibleTo(Integer) (all quite reasonable, isn't it? "$" is the same as "%", as far as I know) It does not have any additional operations exported -- apart from the operations it inherits from FiniteFieldCategory, FiniteAlgebraicExtensionField and ConvertibleTo(Integer). > b) ... Can a Category demand certain abilities or actions be defined for a > Domain in order for it to be a legal part of the Category? Yes. ALL operations defined by the category must be implemented. However, you can define a default implementation in the category itself. For example: SemiGroup(): Category == SetCategory with --operations "*": (%,%) -> % ++ x*y returns the product of x and y. "**": (%,PositiveInteger) -> % ++ x**n returns the repeated product ++ of x n times, i.e. exponentiation. "^": (%,PositiveInteger) -> % ++ x^n returns the repeated product ++ of x n times, i.e. exponentiation. add import RepeatedSquaring(%) x:% ** n:PositiveInteger == expt(x,n) _^(x:%, n:PositiveInteger):% == x ** n Here you find a default declaration of taking the n-th power that is valid for SemiGroups. It will be overridden (i.e., implemented differently) by some domains, of course. > > The full blown thing would then be > > a category Units, that has as domains Mass, Time, Length, ... I > > suppose. > > From what little I do understand, I like this idea the best of any so far. > I would call the category Dimensions, since that's what Mass, Time and > Length denote - they are not units until a specific quantity like 1 kg, 1 > sec and 1 meter is defined. To define a * b where a is of domain Mass and b of domain Time you probably need the Product domain. The signature will be (I forgot to say: "++", "+++" and "--" are three different kinds of comments... )abb category DIM Dimension Dimension(F: Field): Category == with "+": (%, %) -> % ++ elements of units can always be added "*": (F, %) -> % ++ elements of units can always be multiplied with a scalar )abb package PRODDIM ProductDimension ProductDimension(A: Dimension, B: Dimension): Exports == Implementation where "*": (A, B) -> Product(A, B) But I'm not yet sure how you can define a / b where a is of domain Mass and b of domain Time... Martin _______________________________________________ Axiom-developer mailing list Axiom-developer@nongnu.org http://lists.nongnu.org/mailman/listinfo/axiom-developer