Re: Re: extracting variables from an expression
- To: mathgroup at smc.vnet.net
- Subject: [mg44204] Re: [mg44135] Re: [mg44111] extracting variables from an expression
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Sun, 26 Oct 2003 00:41:58 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
I forgot one more thing. You can further modify the definition below to
give:
Vars[expr_] := Union[Cases[expr,
_Symbol?( !MemberQ[Attributes[#1], Protected] & ),
Infinity,Heads->True]]
This will allow variables to be also Heads of expressions e.g:
Vars[f[2] < 3 && f[2] > 1]
{f}
I think you probably do not need this, but I can imagine situations
when this can be useful.It may be perhaps more likely that you would
want f[2] rather than the head f to be the name of a variable, in which
case you could use the definition:
Vars[expr_] := Union[Cases[expr, _Symbol?(! MemberQ[Attributes[#1],
Protected] &)[_] | _Symbol?(! MemberQ[Attributes[#1], Protected] &),
Infinity]]
This now works with variables named f[1], f[2] etc as well as symbols,
eg.
Vars[Vars[f[2] < Log[3] && f[2] > Log[a]]]
{a, f[2]}
Note that we have avoided getting Log[3] returned as a variable and at
the same time managed to get a rather than Log[a] as another variable.
Andrzej Kozlowski
Yokohama, Japan
http://www.mimuw.edu.pl/~akoz/
On Friday, October 24, 2003, at 05:24 PM, Andrzej Kozlowski wrote:
> You are quite right. I forgot about that. The function you need is
> Union. The correct code is:
>
>
> Vars[expr_] := Union[Cases[expr,
> _Symbol?( !MemberQ[Attributes[#1], Protected] & ),
> Infinity]]
>
>
> expr1 = a || b || c || (a && d);
> Vars[expr1]
>
>
> {a, b, c, d}
>
>
> On Friday, October 24, 2003, at 02:05 AM, Peter Schinko wrote:
>
>> Thank you very much for your help! The function works properly, but
>> there is
>> still one minor problem: the function isolates every single occurance
>> of a
>> variable, so for example:
>>
>> expr1 = a || b || c || (a && d)
>> Vars[expr1]
>> will return
>> {a, b, c, a, d}
>>
>> I need to remove all variables from the list that appear two times or
>> more,
>> so that I can construct a table with true and false to evaluate the
>> expression. I have tried to find such function, but I could not find
>> anything in "List Manipulation". Is there an easy way to do this
>> myself, or
>> is there such a function built in?
>>
>> Thank you very much for your help!
>> Kind regards
>> Peter Schinko
>>
>> University of Linz, Austria
>>
>> www.pkos17.at
>>
>>
>>
> Andrzej Kozlowski
> Yokohama, Japan
> http://www.mimuw.edu.pl/~akoz/
>
>
>