Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
1998
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 1998

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

Search the Archive

Lattice Algebra: Problems with Flat and Orderless

  • To: mathgroup at smc.vnet.net
  • Subject: [mg14896] Lattice Algebra: Problems with Flat and Orderless
  • From: immtwg at brahe.gbar.dtu.dk (Torben Winther Graversen)
  • Date: Wed, 25 Nov 1998 17:48:18 -0500
  • Organization: UNI-C
  • Sender: owner-wri-mathgroup at wolfram.com

Hi,

I'm trying to implement an operator, called say "p", from a lattice 
algebra. It is thus commutative, associative, distributive and 
idempotent. I use the Flat and Orderless attributes to implement 
associativity and commutativity, but I also need to have a "top" 
element, called say "a", with this property:

p[a, __] = a;

so that e.g. "p[a,b,c]" gives just "a". This is obviously similar to 
multiplication with zero.

If I implement this before I set the Flat and Orderless attributes it 
works:

In[1]:= p[a, __] = a;

In[2]:= p[a,b,c]
Out[2]= a

If I implement it after I set the attributes the pattern matcher will 
never let me reduce the expression to just "a" but rather "p[a]":

In[3]:= ClearAll[p];

In[4]:= Attributes[p] = {Orderless, Flat};

In[5]:= p[a, __] = a;

In[6]:= p[a,b,c]
Out[6]= p[a]

Question 1:
How do I get around that? Adding a definition like p[x_]=x has the same 
problem, and an infinite recursion. The only way I have found to do it 
was to implement the rule before the attributes, and then set the 
attributes:

In[7]:= ClearAll[p];

In[8]:= p[a, __] = a;

In[9]:= Attributes[p] = {Orderless, Flat};

In[10]:= p[a,b,c]
Out[10]= a

But if I now repeat the definition of the rule, I get two seamingly 
identical rules for p:

In[11]:= p[a, __] = a;

In[12]:- ?p

Global`p

Attributes[p] = {Flat, Orderless}
 
p[a, __] = a
 
p[a, __] = a

But it's still the original rule that is used:

In[13]:= p[a,b,c]
Out[13]= a

Question 2:
What exactly is going on here?

--
Best regards,

  Torben Winther Graversen
  http://www.student.dtu.dk/~immtwg


  • Prev by Date: Re: tag on input form
  • Next by Date: Plot Image Size
  • Previous by thread: Re: writing mathematica list to a file
  • Next by thread: Plot Image Size