probleme with rule



On 10/8/06, Robert Dodier <robert.dodier at gmail.com> wrote:
>
> On 10/8/06, Stavros Macrakis <macrakis at gmail.com> wrote:
>
> > I'm not sure that pattern matching is the right way to approach
> this.  Why
> > not adjoin the equation x=x^2 (which of course implies x=x^a for all
> > positive integers a) to your system for each binary variable?
>
> "More than one way to do it" is OK by me so long as every method
> works as advertised.


It's fine by me, too. But I want to be sure we're recommending robust,
reliable methods.

The original problem statement was: "solve a system of equations including
binary variables and non binary variables".  Using tellsimp(after) to
simplify x^a simplify to x for all integer a does not guarantee that Maxima
will only use values of x in {0,1}.  Try

            solve([x*a+y*b=1],[x,y,a,b])

where a and b are declared Binary (with the relevant tellsimpafters).  You
get the useless answer

           [[a = -(%r2*%r4-1)/%r3, b = %r2, x = %r3, y = %r4]],

which has not taken into account that a and b are Binary.  On the other
hand,

           solve([a*x+b*y=1,a^2=a,b^2=b],[a,b,x,y])

nicely gets you

             [[a = 1,  b = 0,  x = 1,  y = %r5],
               [a = 0,  b = 1,  x = %r6,  y = 1],
               [a = 1,  b = 1,  x = %r7,  y = 1-%r7]]

What is problematic in Maxima is that often
> enough the obvious method fails and instead one must try some kind
> of obscure workaround; that is the unhelpful kind of MTOWTDI.


Agreed entirely, if indeed the obvious method is a correct method.  Just
because it works on some cases doesn't mean it will (or should) work in all
cases.

tellsimpafter seems to have resolved the problem to Laurent's satisfaction,
> so I guess we should be happy for that.


I am always uncomfortable when I don't understand why a method has worked.
In this case, I do not understand why Maxima has any hope of using tellsimp
information to solve an equation correctly.  For example, suppose I
tellsimp(f(g(x))=x).  Then solve(f(g(x))=3,x) will give the correct answer,
but solve(g(x),x) has no hope.


> Do you know if tellrat would be useful in this context?


 I tried it in the above simple case, and it doesn't work.  Remember, both
tellsimp and tellrat only operate in one direction: they tell Maxima that if
there is an expression of a certain form, it can be simplified to a certain
other form.  They do *not* impart any other mathematical information to
Maxima; certainly Maxima never uses them in the reverse directly.
tellrat(a^2-a) is *not* the same thing as adjoining a^2-a to every algebraic
system.

              -s