MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: DownValues and Cases


Andrzej Kozlowski wrote:

>On 26 Oct 2006, at 15:39, Bruce Colletti wrote:
>
>  
>
>>Re Mathematica 5.2 under WinXP.
>>
>>The results of the first two Cases statements leads me to  
>>anticipate {{1,3.5}, {2,5}, {_,0}} as the output of the third.
>>
>>The output of the fourth Cases statement confirms this expectation.
>>
>>Unfortunately, the output of the third statement is the empty list.
>>
>>Why so?  I've reviewed a related mid-July MathGroup thread, but  
>>don't see the answer (if it's there at all).
>>
>>Thankx.
>>
>>Bruce
>>
>>--------------------------
>>
>>f at 1=3.5;
>>f@2=5;
>>f[_]:=0;
>>h=DownValues@f
>>
>>Out[4]={HoldPattern[f[1]] :> 3.5, HoldPattern[f[2]] :> 5,  
>>HoldPattern[f[_]] :> 0}
>>
>>Cases[h,HoldPattern[f[x_]] -> x,Infinity]
>>Out[5]={1,2,_}
>>
>>Cases[h,(_ :> y_) -> y,Infinity]
>>Out[6]={3.5,5,0}
>>
>>Cases[h,(HoldPattern[f[x_]] :> y_) -> {x,y},Infinity]
>>Out[7]={}
>>
>>Cases[{a :> 4,b :> 5, c :> 6},(x_ :> y_) -> {x,y}]
>>Out[8]={{a,4},{b,5},{c,6}}
>>
>>    
>>
>
>This is rather tricky. The problem is how to force the PatternMatcher  
>to interpret HoldPattenr literally rather than as the pattern to be  
>held. Note that:
>
>Cases[h, (Verbatim[HoldPattern[f[2]]] :> y_) -> {x, y},
>   Infinity]
>
>{{x, 5}}
>
>works, but:
>
>
>Cases[h, (Verbatim[HoldPattern[f[x_]]] :> y_) -> {x, y},
>   Infinity]
>
>{}
>
>doesn't, because now x_ is also interpreted literally rather than as  
>a pattern. 
>
In this case you can apply Verbatim to just the head HoldPattern, but 
then you still need a HoldPattern to prevent f[x_] from evaluating. So:

In[18]:=
Cases[h, (Verbatim[HoldPattern][HoldPattern[f[x_]]] :> y_) -> {x, y}, 
Infinity]
Out[18]=
{{1, 3.5}, {2, 5}, {_, 0}}

Carl Woll
Wolfram Research

>So you have got to somehow to avoid using HoldPattern  
>directly in your pattern (this is now rally getting confusing), for  
>example like this:
>
>
>Cases[h, (p_ :> y_) /; Head[p] === HoldPattern :>
>    {p[[1,1]], y}, Infinity]
>
>{{1, 3.5}, {2, 5}, {_, 0}}
>
>There are probably more elegant ways but none comes to my mind just now.
>
>Andrzej Kozlowski
>  
>
 


  • Prev by Date: Re: Why all the if's the answer
  • Next by Date: Re: Why all the if's the answer
  • Previous by thread: Re: DownValues and Cases
  • Next by thread: Re: Re: DownValues and Cases