MathGroup Archive 2007

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

Search the Archive

Re: Re: Problem with Mathematica 6


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
> 



  • Prev by Date: Two Version 6.0 Package Problems
  • Next by Date: Re: simple question
  • Previous by thread: Re: Problem with Mathematica 6
  • Next by thread: Re: Problem with Mathematica 6