Re: DownValues and Cases
- To: mathgroup at smc.vnet.net
- Subject: [mg70777] Re: [mg70759] DownValues and Cases
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Fri, 27 Oct 2006 00:28:22 -0400 (EDT)
- References: <200610260639.CAA19605@smc.vnet.net> <EA3D6F5B-C921-45E7-9AB3-DACF16C63276@mimuw.edu.pl>
On 26 Oct 2006, at 22:54, 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. 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 A more compact way to do the above is: Cases[h, (p_HoldPattern :> y_) :> {p[[1, 1]], y}, Infinity] But, it seems to me that the most accurate way to match expressions with Head HoldPattern, as you wanted to do, is to first replace HoldPattern by something like Hold or Unevaluated: Cases[h /. HoldPattern -> Hold, (Hold[f[x_]] :> y_) -> {x, y}, Infinity] {{1, 3.5}, {2, 5}, {_, 0}} Andrzej Kozlowski
- References:
- DownValues and Cases
- From: Bruce Colletti <vze269bv@verizon.net>
- DownValues and Cases