Re: search for an operator in an expression
- To: mathgroup at smc.vnet.net
- Subject: [mg78453] Re: search for an operator in an expression
- From: rob <josh2499 at hotmail.com>
- Date: Mon, 2 Jul 2007 06:48:50 -0400 (EDT)
- References: <f5iuqu$a99$1@smc.vnet.net> <f5o8jr$5jo$1@smc.vnet.net> <f5qhdc$2jt$1@smc.vnet.net> <f5tcb1$2ir$1@smc.vnet.net> <f62k8u$bp5$1@smc.vnet.net> <f659vd$912$1@smc.vnet.net>
Albert, thanks for trying to help but it's over my head. I
have no idea what the XXX is there for. I think I'll drop
this one -- not all of my attempts to understand Mathematica get me
anywhere. Regards, Rob
Albert wrote:
> Hi,
>
>
>>>you must distinguish between OutputFormat, what you see, and FullForm,
>>>
>>>what Mathematica sees. Try: FullForm[yourExpression] then you will see
>>>
>>>that you have 1 operator Plus with multiple arguments. If you want to
>>>
>>>see the number of arguments, you could e.g. use:
>>>
>>>Cases[expression, Plus[x__] :> Length[x]]
>
>
> while in principle this shows the principle of the in my opinion
> clearest way how to treat this, it does not work here and the nearely
> correct result is just an accident, as you can see when you check what
> the matches really are:
>
> In[17]:= Cases[expr, Plus[x__] :> XXX[x]]
>
> Out[17]= {XXX[2], XXX[d], XXX[a \[ExponentialE]^(-b x)],
> XXX[Sin[b + c]]}
>
> you must be careful for these reasons:
>
> - Plus has Attributes that influence pattern matching in a way that is
> not what we need here, among them Flat and Orderless.
> - Cases looks for matches by Default only in level 1, to find all
> instances you need to explicitly tell it to.
> - Plus[a,b] is a+b, so the number of plus signs in StandardForm is one
> less than the length of the arguments of the corresponding Plus
> - x matches a Sequence in the above code, which Length does not really
> like
>
> Taking account of all these, the following should work for arbitrary
> expressions, although I did not really test it...
>
> In[14]:= Total[
> Cases[expr /. Plus -> plus,plus[x__] :> (Length[{x}]-1),{0,Infinity}]
> ]
>
> Out[14]= 4
>
> By the way it is always a good idea to check whether pattern matching
> constructs really do what you want, in this case the following makes me
> believe I could be right :-)
>
> In[19]:= Cases[expr /. Plus -> plus,plus[x__] :> XXX[x], {0,Infinity}]
>
> Out[19]= {XXX[b, c], XXX[2, d, a Exp[-b x], Sin[plus[b, c]]]}
>
>
> hope that works and helps,
>
> albert
>