another question about maxima and lisp



> In maxima, one can get the following lines
> (%i5) f(x):= x^2;
>                                             2
> (%o5)                             f(x) := x
> (%i6) ?print(%);
> ((MDEFINE SIMP) (($F) $X) ((MEXPT) $X 2))
>
> So, the function (latex notation) $f(x) = x^2$ has the (I suppose)
> maxima lisp representation as
>
> ((MDEFINE SIMP) (($F) $X) ((MEXPT) $X 2))

I'm not sure what the relevance of the Latex form is here, but...

> In gcl, one would define this function as
> (defun f (x) (expt x 2))
> Of course there is a similarity, but these are *not* the same.

They are very different.  In Lisp, "expt" is a function which gets
executed.  In Maxima, mexpt is an expression constructor which is
simplified.  There is not mexpt function in Maxima -- it *represents*
exponentiation.

To evaluate (expt x 2), Lisp calls an internal function on the value
of x (which must be a number) and 2.

To evaluate ((mexpt) x 2), Maxima first substitutes the value of x
into that expression giving, e.g. ((mexpt) 3 2).  The main simplifier
routine looks up the simplification routine for mexpt, which is on its
property list.  simpexpt then transforms that expression to 9.

In the case of a symbolic expression, Lisp of course will simply give an error.

The Maxima expression f(2*y) first evaluates and simplifies the
argument 2*y, giving
        ((mtimes simp) 2 $y)
It then substitutes that value for the formal variable $x, giving
        ((mexpt) ((mtimes simp) 2 $y) 2)
Conceptually, the simpexpt routine transforms this to
        ((mtimes) ((mexpt) 2 2) ((mexpt simp) $y 2))
The inner ((mexpt) 2 2) is simplified to 4, and the overall expression
is simplified by simptimes to
        ((mtimes simp) 4 ((mexpt simp) $y 2))

I hope that makes things clearer.

If you want to see this in action, try

       f(x):=x^2$
      ?trace(?meval,?simplifya,?simptimes,?simplus)$
      f(2*y)$

To turn off Lisp tracing, ?untrace()

              -s