MathGroup Archive 2001

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Finding variables in a very long expression

  • To: mathgroup at smc.vnet.net
  • Subject: [mg31410] Re: Finding variables in a very long expression
  • From: "Allan Hayes" <hay at haystack.demon.co.uk>
  • Date: Sat, 3 Nov 2001 05:29:16 -0500 (EST)
  • References: <9rq7ia$ill$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Ted:
You say
>If I had my way removing a symbol would make the kernel work as if the
symbol
> never had any values, but that's not the way it works.

Some thoughts on this:

We see Remove apparently wrapped round occurences of removed symbols in
stored values


    a = A[b];

    Remove[b];

    a

        A[Removed[b]]

Something like this is needed to preserve the stucture of the value, and to
indicate the removal.

But this is more than just wrapping

    FullForm[%]

        A[Removed["b"]]

    AtomQ[%]

        False

and replacement does not work:

    a/."b"->3

        A[Removed[b]]

Moreover, if I simply type and evaluate the result is not the same:

    AtomQ[Removed["b"]]

        False

So something more is going on that I haven't sorted out yet.

b does not now exist

    ?b

        Information::notfound: Symbol b not found.

And we can re-create and set a value to b:

    b= 5

        5

without affecting the value of a:

        a

            A[Removed[b]]

If we had just "make the kernel work as if the symbol never had any values"
(which would seem to be what ClearAll[b] would have done) then this would
not have been been possible.



--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565

"Ersek, Ted R" <ErsekTR at navair.navy.mil> wrote in message
news:9rq7ia$ill$1 at smc.vnet.net...
> Jose Flanigan wanted to know how to find all variables in an expression.
> Consider expr below.
>
> In[1]:=
>    expr=Sqrt[x*y]+x*z+w Sqrt[x]z^(1/n)+Pi/3;
>    w=v;
>
> The simple line below almost works, but the list includes Pi which isn't a
> variable.  The third argument of Cases here is a level specification.  You
> can read about Cases and level specification at my web site (URL below).
>
> In[3]:=
>    Union[Cases[expr, _Symbol, {0, -1}]]
>
> Out[3]=
>    {n, Pi, v, x, y, z}
>
>
> The next line eliminates symbols such as Pi.
>
> In[4]:=
>    Union[Cases[expr, _Symbol?( !NumericQ[#]& ), {0, -1} ]]
>
> Out[4]=
>    {n, v, x, y, z}
>
>
> --- The Plot Thickens ---
> At the 1999 Developer Conference Robby Villegas explained that this sort
of
> thing gets tricky when you are working with symbols that were previously
> removed.  Consider the lines below where the symbol (v) is removed.  If I
> had my way removing a symbol would make the kernel work as if the symbol
> never had any values, but that's not the way it works.
>
> In[5]:=
>    Remove[v]
>
> In[6]:=
>    Union[Cases[expr, _Symbol?( !NumericQ[#]& ), {0, -1} ]]
>
> Out[6]=
>    {n, Removed[v], x, y, z}
>
>
> If you want to make sure your list of variables is free of Removed Symbols
> use the next line (based on Robby Villegas talk).
>
> In[7]:=
>    Union[Cases[expr, _Symbol?( !NumericQ[#] && NameQ[ToString[#]]& ), {0,
> -1} ]]
>
> Out[7]=
>    {b, x, y, z}
>
>
> ---
> Regards,
>    Ted Ersek
>   Check Mathematica Tips, Tricks at
>   http://www.verbeia.com/mathematica/tips/Tricks.html
>
>




  • Prev by Date: Re: how to be as efficient as Sort[list] when list is {{x1,y1},{x2,y2},...}
  • Next by Date: RE: Finding variables in a very long expression (corrected)
  • Previous by thread: Re: Rijndael
  • Next by thread: RE: Re: Finding variables in a very long expression