Re: Re: Problem with Mathematica 6
- To: mathgroup at smc.vnet.net
- Subject: [mg77116] Re: [mg77097] Re: [mg77065] Problem with Mathematica 6
- From: Oyvind Tafjord <tafjord at wolfram.com>
- Date: Mon, 4 Jun 2007 03:48:08 -0400 (EDT)
- References: <200706020819.EAA29947@smc.vnet.net> <DFEBF444-FF43-4A1E-8B31-893ABB27F09D@mimuw.edu.pl> <200706031014.GAA02961@smc.vnet.net>
Andrzej Kozlowski wrote: > In my reply I omitted the question of possible reason for the new > behaviour. I did that because when I was replying I had not yet > investigated this problem and, given that this phenomenon involves > unprotecting a built-in function, I did not think the precise reason > was relevant. I have not changed my mind about that, but now I think > that what you have observed is a consequence of changes that have > been made in the pattern matcher, which do not seem to me to involve > any obvious bug and perhaps represent an improvement. Hi Andrzej, You are correct, this is a result of a bug fix in which the attributes of the head in a pattern is recognized even if it's wrapped in a pattern construct (such as Condition). The old behavior led to inconsistent behavior in that only the first of these three matches would be found: a+b+c/.a+b->foo a+b+c/.x:a+b->foo a+b+c/.a+b/;True->foo In some cases, this bug was (usually unwittingly) exploited to hack around recognizing these attributes. Oyvind Tafjord Wolfram Research To see what I > mean compare these two outputs: > > First Mathematica 5.2: > > > a**b /. (NonCommutativeMultiply[x___] /; (Print[{x}]; > Length[{x}] <= 1)) :> f[x] > > > {a,b} > > a**b > > > Now Mathematica 6: > > In[7]:= a ** b /. NonCommutativeMultiply[x___] /; (Print[{x}]; > Length[{x}] <= 1) :> f[x] > > {a, b} > {a} > > Out[7]= f[a] ** b > > Note that Mathematica 6.0 actually went inside the expression a**b > and used the attribute Flat to find a match for > NonCommutativeMultiply[x___]/Length[{x}] <= 1), while Mathematica 5.2 > looked only at the top level and did not find any match. This > suggests to me that the new behaviour is more likely an improvement > over the old rather than a bug. Anyway, whatever the reason, the > advice not to unprotect built-in functions still stands. > > Andrzej Kozlowski > > > > On 2 Jun 2007, at 21:49, Andrzej Kozlowski wrote: > >> *This message was transferred with a trial version of CommuniGate >> (tm) Pro* >> >> On 2 Jun 2007, at 17:19, Michael Weyrauch wrote: >> >>> Hello, >>> >>> the following code fragment runs under Mathematica 5.2 but >>> produces an infinite recursion error in Mathematica 6.0 in certain >>> cases: >>> >>> First I define a number of commands and slightly change the >>> built-in command "NonCommutativeMultiply": >>> Grading[_] = 0; >>> Fermion[a__] := ((Grading[#1] = 1) & ) /@ {a}; >>> Fermion[a, b]; >>> GetGradeds[a___] := GetGradeds[a] = Select[{a}, Grading[#1] != 0 & ]; >>> >>> Unprotect[NonCommutativeMultiply]; >>> NonCommutativeMultiply[a___] /; (Length[GetGradeds[a]] <= 1) := >>> Times[a]; >>> Protect[NonCommutativeMultiply]; >>> >>> If you now e.g. evaluate >>> >>> In[22]:= k ** l >>> Out[22]= k*l >>> >>> or >>> >>> In[23]:= a ** l >>> Out[23]= a*l >>> >>> BUT in Mathematica 6.0: >>> >>> In[24]:= a ** b >>> >>> $IterationLimit::"itlim" : "Iteration limit of 4096 exceeded. \ >>> \!\(\*ButtonBox["\[RightSkeleton]", >>> BaseStyle->"Link", >>> ButtonData:>"paclet:ref/message/$IterationLimit/itlim", >>> ButtonFrame->None, >>> ButtonNote->"$IterationLimit::itlim"]\)" >>> Out[24]= Hold[(Times[a]) ** b] >>> >>> However in Mathematica 5.2 one gets >>> >>> In[10]:= a ** b >>> Out[10]=a**b >>> >>> which is what I expect and I want to have. >>> >>> I.e., whenever I NonCommutativeMultiply two variables which are >>> explicitly declared as fermions by the command Fermion[], I get an >>> infinite recursion error in Mathematica 6. >>> >>> This behaviour of Mathematica 6.0 is rather confusing to me, since >>> I believe that I just use very basic and elementary assignments >>> in my code. Why shouldn't it work under Mathematica 6.0 if it >>> works under 5.2? It appears that the 6.0 kernel behaves >>> differently than the >>> 5.2 kernel in such basic situations. Very unpleasant! >>> >>> (For anyone who wonders about the purpose of this (strange) code: >>> It is a small fragment of a package that implements the handling >>> of Grassmann variables. I just extracted that bit in order to show >>> the Mathematica 6.0 problem.) >>> >>> Furthermore, beyond an explanation of this unexpected behaviour of >>> Mathematica 6, I would like to find a workaround in Mathematica 6 >>> such that I get >>> the same result as in Mathematica 5.2. >>> >>> Thanks for any suggestions. >>> >>> Michael Weyrauch >>> >> On of the most basic principles in Mathematica programming, stated, >> over the years, a number of times on this list by WRI employees, >> (particularly by David Withoff) is if you choose to Unprotect and >> modify any built-in functions you can only blame yourself for any >> unpleasantness that might occur. The workaround is: don't do it. >> >> One think you can do instead is to do essentially the same thing >> without modifying NonCompputativeMultiply. If you want to use a >> symbol that looks like multiplication you could choose SmallCircle. >> You could then do something like this: >> >> In[1]:= Grading[_] = 0; >> In[2]:= Fermion[a__] := ((Grading[#1] = 1) &) /@ {a}; >> In[3]:= Fermion[a, b] >> Out[3]= {1, 1} >> In[4]:= GetGradeds[a___] := GetGradeds[a] = Select[{a}, Grading >> [#1] != 0 &]; >> In[9]:= SmallCircle[z___] /; (Length[GetGradeds[z]] <= 1) := Times[z]; >> In[10]:= SmallCircle[z___] := NonCommutativeMultiply[z] >> >> In[13]:= SmallCircle[a, l] >> Out[13]= a l >> >> SmallCircle[a,b] >> >> In[14]:= SmallCircle[a, b] >> Out[14]= a ** b >> >> In[17]:= SmallCircle[a, l, m] >> Out[17]= a l m >> >> Of course instead of writing SmallCircle[a,l,m] you can use as >> input a escape sc escape l escape sc escape m . >> >> Andrzej Kozlowski >
- References:
- Problem with Mathematica 6
- From: "Michael Weyrauch" <michael.weyrauch@gmx.de>
- Re: Problem with Mathematica 6
- From: Andrzej Kozlowski <akoz@mimuw.edu.pl>
- Problem with Mathematica 6