From: Richard F. <fa...@gm...> - 2025-07-20 13:09:42
|
without looking at this in detail, it seems likely that you are using the name x for two conflicting purposes. It is not a good idea to use x as a pattern variable and as a symbol in your expression, since defmatch not only returns an equation x=something, it also binds x globally to something. If seems you are trying to define a function something like this: vv(h):=if atom(h) then false else if op(h)="^" and part(h,2)=2 then part(h,1) Good luck RJF On Sun, Jul 20, 2025 at 8:36 AM Eduardo Ochs <edu...@gm...> wrote: > Hi list, > > I was trying to write some programs using `defmatch' but I was getting > some strange behaviors that SEEMED to be related to subexpressions > being modified in ways that I didn't expect... I still don't understand > what is going on but I finally got something that is easy to reproduce. > The program is below, and I tested it both with a recent Maxima with > "maxima --no-init" and with a Maxima 5.44 with "/usr/bin/maxima > --userdir=/tmp" with a /tmp/ that is empty enough, and I got the same > error. > > Note that in the last line the > > (x-2)^2+(y+3)^2 = 4 > > is not only reordered to > > (y+3)^2+(x-2)^2 = 4 > > but it is also changed to: > > (y+3)^2+(x-4)^2 = 4 > > I am attaching a screenshot. I edited the whitespace and the line > breaks in the bash/Maxima window a bit, but besides that I didn't > change anything else. > > Here is the program: > > > display2d : false; > > matchdeclare(x, all)$ > defmatch(isx2_, x^2)$ > isx2 (o) := not atom(isx2_(o))$ > isx2_body(o) := isx2(o) and rhs(isx2_(o)[1])$ > sqrtp_ (o) := if isx2(o) then isx2_body(o) else sqrt(o)$ > sqrtn_ (o) := if isx2(o) then -isx2_body(o) else sqrt(o)$ > sqrtp (o) := map('sqrtp_,o)$ > sqrtn (o) := map('sqrtn_,o)$ > > o0 : (x-2)^2+(y+3)^2=4; > part(o0,1,1); > o : o0 - part(o0,1,1); /* (x-2)^2 = 4-(y+3)^2 */ > o : sqrtp(o); /* x-2 = sqrt(4-(y+3)^2) */ > part(o,1,2); > o : o - part(o,1,2); /* x = sqrt(4-(y+3)^2)+2 */ > define(g1(y), rhs(o)); /* g1(y):=sqrt(4-(y+3)^2)+2 */ > > o0 : (x-2)^2+(y+3)^2=4; /* (y+3)^2+(x-4)^2 = 4 */ > > > Cheers, > Eduardo Ochs > http://anggtwu.net/eev-maxima.html > _______________________________________________ > Maxima-discuss mailing list > Max...@li... > https://lists.sourceforge.net/lists/listinfo/maxima-discuss > |