Re: Checking for a given phrase in an expression
- To: mathgroup at smc.vnet.net
- Subject: [mg60782] Re: [mg60744] Checking for a given phrase in an expression
- From: Andrzej Kozlowski <andrzej at yhc.att.ne.jp>
- Date: Wed, 28 Sep 2005 01:41:36 -0400 (EDT)
- References: <200509270745.DAA18926@smc.vnet.net> <B8D01E27-0C24-437F-B196-C353CF3C1C9E@mimuw.edu.pl>
- Reply-to: Andrzej Kozlowski <andrzej at akikoz.net>
- Sender: owner-wri-mathgroup at wolfram.com
On 27 Sep 2005, at 23:06, Andrzej Kozlowski wrote:
>
> On 27 Sep 2005, at 16:45, lost.and.lonely.physicist at gmail.com wrote:
>
>
>
>> Hello everyone
>>
>> Is it possible to ask Mathematica to check if a given phrase
>> occurs in
>> an expression? Say I have
>>
>> aa = 1 + x + x y + Log[Sin[z]]
>>
>> and
>>
>> bb = x + Log[Sin[z]]
>>
>> Can Mathematica tell me such a phrase bb exists in aa? Can it tell me
>> its 'position' within the expression aa?
>>
>> Thanks for the help!
>>
>>
>>
>>
>
>
> Your question is actually too vague to have an unambiguous answer.
> One can define a function like this:
>
> SubExpressionQ[a_, b_] := Block[{f}, (a /. b -> f) =!= a]
>
> This will test if something is a "subexpression' of something else
> in the sense of Matheamtica's pattern matching. Thus in your case:
>
>
> aa = 1 + x + x*y + Log[Sin[z]]; bb = x + Log[Sin[z]];
>
>
> SubExpressionQ[aa, bb]
>
>
> True
>
>
> However, this concept of subexpression will not necessarily always
> correspond to what you might expect. For example just take
>
> s = (x/y)^2
>
> You might expect that x/y is a subexpression ("phrase") of s, but
> in fact:
>
>
> SubExpressionQ[s,x/y]
>
> False
>
> To understand why you need to look at the FullForm of the two
> expressions:
>
>
> FullForm[s]
>
> Times[Power[x,2],Power[y,-2]]
>
>
> FullForm[x/y]
>
> Times[x,Power[y,-1]]
>
> and now you can see why one is not a "phrase" in the other. As I
> wrote at the beginning, the meaning of "phrase in something"is
> ambiguous. There are various ways to interpret it. One way is the
> above, which is based on the way Mathematica evaluates and
> represents expressions. Another possible approach would be to
> convert both expressions to strings and use Mathematica's string
> matching abilities to test if the two expressions convert to
> substrings of one another. This approach will of course not always
> agree with the other.
> Given all that there is also no clear sense in which you can speak
> of a "position" of one expression in anohter, particularly that the
> commutative and associative laws for addition and multiplication
> are used in pattern matching .
>
> Andrzej Kozlowski
>
>
There is another, minor but annoying problem with the function
SubExpressionQ I defined above:
SubExpressionQ[a_, b_] := Block[{f}, (a /. b -> f) =!= a]
which will occur if the expression b is just the symbol f
SubExpressionQ[1+f+f^2,f]
False
This can however be easily avoided, for example as follows:
Clear[SubExpressionQ]
SubExpressionQ[a_, b_] := (a /. b -> Unique[]) =!= a
Now
SubExpressionQ[1+f+f^2,f]
True
etc.
Andrzej Kozlowski
- References:
- Checking for a given phrase in an expression
- From: lost.and.lonely.physicist@gmail.com
- Checking for a given phrase in an expression