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