MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

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


  • Prev by Date: Re: Iterate through a list help
  • Next by Date: Re: Re: Problem with Mathematica 6
  • Previous by thread: Re: Problem with Mathematica 6
  • Next by thread: Re: Re: Problem with Mathematica 6