|
[Date Index]
[Thread Index]
[Author Index]
Re: Impossible?
Arturas Acus wrote:
>
> Hello,
>
> I would like to construct a function which gives me an absolute Level of
> subexpression in expression. For example I want:
>
> a*(b+c*(d+AbsoluteLevelQ[e]))
>
> evaluate to
>
> Level[a*(b+c*(d+e)),e].
> ( AbsoiuteLevelQ climbs up until reaches In[], after that calls Level
> )
>
> More generally, I would like to control absolute level (level in respect
> to In[%]) at which patter matching take place. For example if pattern
> matches at Level n>3, then rule is applied, but if it matches at
> Level n<3 then not.
>
> I suspect, that evaluation machinery here is hardly involved. Do
> Mathematica language provides tools for such a control? Please comment
> if solution don't exist.
>
> Arturas Acus
> ....
Something along the following lines might get you started.
ruls = {f_[e1___, al[e_Symbol], e2___] :> al[f[e1,e,e2], e],
f_[e1___, al[e2_,e_Symbol], e3___] :> al[f[e1,e2,e3], e]}
In[81]:= (a*(b+c*(d+al[e])) //. ruls) /. al->Level Level::level: Level
specification e is not of the form n, {n}, or {m, n}.
Out[81]= Level[a (b + c (d + e)), e]
But, while this gives the output you specified, I doubt it is what you
want. Maybe you have in mind a nesting-depth-counter? Could do
In[1]:= ruls2 = {al[e_] :> al[e,1],
f_[e1___, al[e2_,n_Integer], e3___] :> al[f[e1,e2,e3], n+1]}
In[2]:= (a*(b+c*(d+al[e])) //. ruls2) Out[2]= al[a (b + c (d + e)), 5]
or perhaps
FindLevel[e_] := Module[{pos, len},
len = Length[pos = Position[e, al[_]]];
Length[pos[[1]]] +1 /; len==1
]
In[16]:= FindLevel[a*(b+c*(d+al[e]))] Out[16]= 5
Daniel Lichtblau
Wolfram Research
Prev by Date:
Re: Derivative via mathematica
Next by Date:
method to eliminate NIntegrate warning.
Prev by thread:
Impossible?
Next by thread:
Re: Impossible?
|