axiom-math
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Axiom-math] Can I decompose a domain ?


From: Martin Rubey
Subject: Re: [Axiom-math] Can I decompose a domain ?
Date: 21 Mar 2006 14:52:44 +0100
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.4

Dear Francois,

Francois Maltey <address@hidden> writes:

> Hello William, and thanks a lot
> 
> > > resFloat   : Expression Float := cos (4.0 * x)
> > > resInteger : Expression Float := cos (4 * x)
> > > resComplex : Expression Complex Integer := exp (3+4*%i)
> > > 
> > > How can I get Float from resFloat ? Integer from resInteger, etc.
> > > in a *.input file ?
>  
> > Is the following what you want?
> 
> No I don't try to get the sub-argument, but the type of the subargument.
> But I'm not sure I can get it.

In general, I don't think that it's possible. However, I think in your
situation, it is unnecessary.

> > (isTimes ((argument ((kernels resFloat).1)).1)).1::Float
> > (isTimes ((argument ((kernels resInteger).1)).1)).1::Integer
> > argument ((kernels resComplex).1).1::Complex Integer
> 
> Imagine I know that a is an Expression...
> My function don't know if a is an Expression Float, or an Expression
> Integer...

As far as I know, you are modifying TranscendentalManipulations(R, F) from
manip.spad. The header reads

)abbrev package TRMANIP TranscendentalManipulations
TranscendentalManipulations(R, F): Exports == Implementation where
  R : Join(OrderedSet, GcdDomain)
  F : Join(FunctionSpace R, TranscendentalFunctionCategory)

So, usually, TRMANIP will be called (secretly, by the interpreter) with the
arguments

INT, EXPR INT

or

Float, EXPR Float

or

FRAC INT, EXPR FRAC INT

or something similar. So you can simply say

  Myfunction(a : F) : String ==
    if R is Integer then 
      ...
    else if R is Fraction Integer then
      ...

and so on.

However, I believe that it is better to test for properties:

   if R has CharacteristicZero then 
     if F has ComplexCategory R then
       ...
     else

and so on. In some cases you will also want to test whether a particular member
of R is an integer. You then have to say

   if (r := retractIfCan(a)@Union("failed", Integer)) case Integer then ...

Warning: look up the correct syntax, and as far as I remember, it makes a
difference whether you ask for Union("failed", Integer) or Union(Integer,
"failed"), unfortunately.
   

In an .input file you can simulate this behaviour as follows: say, right at the
beginning

R => INT
F => EXPR R

to test your code for EXPR INT. If you have done this, modify it to say

R => Float
F => EXPR R

to test your code for EXPR Float, and so on.

Martin





reply via email to

[Prev in Thread] Current Thread [Next in Thread]