Re: Re: Re: Taking either a sequence or a list
- To: mathgroup at smc.vnet.net
- Subject: [mg63617] Re: Re: Re: Taking either a sequence or a list
- From: Maxim <m.r at inbox.ru>
- Date: Sat, 7 Jan 2006 03:13:50 -0500 (EST)
- References: <dnm29m$89q$1@smc.vnet.net> <dnopf9$2gp$1@smc.vnet.net> <dnrd16$kqf$1@smc.vnet.net> <200512231008.FAA25950@smc.vnet.net> <dp05eq$g3b$1@smc.vnet.net> <200512311140.GAA28014@smc.vnet.net> <dpg0vi$plt$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
On Wed, 4 Jan 2006 08:28:34 +0000 (UTC), Oyvind Tafjord <tafjord at wolfram.com> wrote: > ----- Original Message ----- > From: "Maxim" <m.r at inbox.ru> To: mathgroup at smc.vnet.net >> In[1]:= pset = Module[{f}, >> Attributes[f] = {Flat, Orderless}; >> ReplaceList[f @@ #, f[s___, s2___] -> {s}] >> ]&; >> >> In[2]:= pset[{1, 2, 3}] >> >> Out[2]= {{}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}} >> >> But should it work this way? Why doesn't it generate the list {2, 1} as >> well? > > This is yet another issue. The behavior is an important optimization to > save testing a lot of redundant possible matches. It does mean that only > the > sorted version of each sequence will be tried, but this is consistent > with > the general Orderless nature of the function involved. > > > You probably noticed that if you remove the Flat attribute, you'll get > many > more results. This optimization was for unknown reasons not there for > this > case (leading to slowness bugs being reported). For the next version, > only > sorted sequences will be tried in this case as well. > > > For a Flat+OneIdentity head f, a _ pattern will try things like 1, > f[1,2], > f[1,2,3], etc. On the other hand a __ pattern will try things like 1, > Sequence[1,2], Sequence[1,2,3]. I agree that writing up a more complete > documentation of these subtleties would be a good idea. > That's certainly interesting, thank you for the clarifications. It seems to imply that with the optimization which you mentioned the following function won't generate all permutations of a given list: In[1]:= perm = Module[{f}, Attributes[f] = Orderless; ReplaceList[f @@ #, f[s__] -> {s}] ]&; In[2]:= perm[{1, 2, 3}] Out[2]= {{1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1}} Mathematica 6 will simply return {{1, 2, 3}}, is that correct? Also I think there are some other vague points related to ReplaceAll: In[3]:= Block[{f}, Attributes[f] = Flat; f[1, 2, 3] /. f[x__, y_] -> {x, y}] Out[3]= {1, f[2, 3]} In[4]:= Block[{f}, Attributes[f] = {Flat, Orderless}; f[1, 2, 3] /. f[x__, y_] -> {x, y}] Out[4]= f[{1, f[2, 3]}] If Mathematica tries to regroup or reorder the arguments only at the places corresponding to Blank in the pattern, not BlankSequence, that explains why x is matched to 1, not f[1]. But where does the outer f in the second example come from? Besides, since a replacement such as f[g[a], g[b], 1] /. f[(_g)..] -> 0 finds a match (when f is Flat), we cannot just say that Flat doesn't try substitutions for BlankSequence or Repeated -- ReplaceAll still tries to regroup the arguments even if there isn't a Blank pattern present, so I'm not sure how to formulate the general rule that would cover both cases. Maxim Rytin m.r at inbox.ru
- Follow-Ups:
- Re: Re: Re: Re: Taking either a sequence or a list
- From: "Oyvind Tafjord" <tafjord@wolfram.com>
- Re: Re: Re: Re: Taking either a sequence or a list