Re: simultaneous ... and ___
- To: mathgroup at smc.vnet.net
- Subject: [mg60920] Re: simultaneous ... and ___
- From: Maxim <ab_def at prontomail.com>
- Date: Mon, 3 Oct 2005 04:06:26 -0400 (EDT)
- References: <dhj4ll$smo$1@smc.vnet.net><dhlc4l$cuj$1@smc.vnet.net> <dhnso6$1eu$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
On Sun, 2 Oct 2005 05:55:18 +0000 (UTC), borges2003xx at yahoo.it
<borges2003xx at yahoo.it> wrote:
> sorry but for a refuse (copy and paste ) i write
> m1[{___, x1__ .., x2___ ..., x3___ ..., ___, x3___ ..., x2___ ...,
> x1__ .., ___}] := {}
> /; (Length[{x1}] + Length[{x1}] + Length[{x1}]) >= 15
> m1[l1_] := l1
>
> the real version is
> m1[{___, x1__ .., x2___ ..., x3___ ..., ___, x3___ ..., x2___ ...,
> x1__ .., ___}] := {}
> /; (Length[{x1}] + Length[{x2}] + Length[{x3}]) >= 15 (or 5 or...)
> m1[l1_] := l1
>
> i apologies
> i use triple ___ for x2 and x3 cause i don't want to be filled always
> with something
>
The key point seems to be that Repeated cannot repeat sequences
(BlankSequence or another Repeated):
In[1]:= MatchQ[{a, b, a, b}, {(x__)..}]
Out[1]= False
In principle there could be a match if x were set to Sequence[a, b]. But
Mathematica pattern matching doesn't do that (string patterns are
different in that aspect). The pattern (x__).. can be matched only if x
can be set to a sequence of length 1:
In[2]:= MatchQ[{a, a}, {(x__)..} /; Length@ {x} == 1]
Out[2]= True
In[3]:= MatchQ[{a, a}, {(x__)..} /; Length@ {x} == 2]
Out[3]= False
As we can see, x can be set to a, which provides a match, but not to
Sequence[a, a]. In my opinion, this gives the user the wrong impression
that sequences can be repeated, when in fact this isn't quite so.
This leads to certain inconsistencies:
In[4]:= MatchQ[{a, a}, {x__, (x__)..}]
Out[4]= False
In[5]:= MatchQ[{a, a}, {x__, (y__)..} /; {x} === {y}]
Out[5]= True
It is hard to explain why the patterns x and y cannot have the same name,
if they can match identical subexpressions (this also shows that it is not
clear how this construct works even with one-element sequences).
One might try to use (x_).. inside a Flat function (say, Plus) to make
Mathematica automatically group a sequence inside Plus so that it can be
matched by x_ instead of x__. But that doesn't work either:
In[6]:= MatchQ[Hold[a + b + a + b], Hold[Plus[x_, x_]]]
Out[6]= True
In[7]:= MatchQ[Hold[a + b + a + b], Hold[Plus[(x_)..]]]
Out[7]= False
Mathematica rewrites the expression as Plus[Plus[a, b], Plus[a, b]] only
in the first example.
One way around this is to use the sequence x___, y___ and add a test to
verify that y comprises repetitions of x. Also nested repeats of that kind
can be done via string patterns:
In[8]:=
StringCases[
StringJoin[ToString /@ {0,1,1,2,2,2,3,4,3,3,3,3,2,1,1,1,1,8}],
x1__..~~x2__..~~x3__..~~___~~x3__..~~x2__..~~x1__.. /;
StringLength[x1~~x2~~x3] >= 4 :>
{x1, x2, x3}]
Out[8]=
{{"11", "2", "3"}}
This correctly determines that x1 can be set to "11" (repeated once before
x2 and twice after x2), and so on. I used __.. to avoid trivial matches,
e.g., all elements of the pattern except one set to empty strings.
Maxim Rytin
m.r at inbox.ru