Re: Re: Problem with Mathematica 6
- To: mathgroup at smc.vnet.net
- Subject: [mg77302] Re: [mg77080] Re: [mg77065] Problem with Mathematica 6
- From: DrMajorBob <drmajorbob at bigfoot.com>
- Date: Wed, 6 Jun 2007 07:23:15 -0400 (EDT)
- References: <200706020819.EAA29947@smc.vnet.net> <30015102.1181071420143.JavaMail.root@m35>
- Reply-to: drmajorbob at bigfoot.com
If I copy your code into a notebook and execute it (after painfully removing all that In[]:= and Out[]:= nonsense) I get this error message after each use of SmallCircle: Set::write: Tag Factorial in 0! is Protected. If I go back and excute the SmallCircle uses AGAIN, there's no error message, because GetGradeds has stored a result and doesn't repeat the broken test. Then, if I put my cursor after != and press space, Quit, and run the code again, all is well. Apparently, the line break between ! and = caused this strange behavior. The copied code includes what looks like != in the notebook, but it's actually something else. Bobby On Sun, 03 Jun 2007 05:05:27 -0500, Andrzej Kozlowski <akoz at mimuw.edu.pl> wrote: > > 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 > > -- = DrMajorBob at bigfoot.com
- References:
- Problem with Mathematica 6
- From: "Michael Weyrauch" <michael.weyrauch@gmx.de>
- Problem with Mathematica 6