Re: Canonical order...

*To*: mathgroup at smc.vnet.net*Subject*: [mg55036] Re: [mg54989] Canonical order...*From*: Andrzej Kozlowski <akoz at mimuw.edu.pl>*Date*: Thu, 10 Mar 2005 05:24:45 -0500 (EST)*References*: <200503091134.GAA06921@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

On 9 Mar 2005, at 12:34, Josef Karthauser wrote: > > I'm trying to adjust what Mathematica thinks is canonical order for > a particular function F[], so that orderless functions such as > Times[F[c], F[a], F[b]] automatically gets ordered according to my > specified sort ordering function on F. > > I thought that I could do it by tweaking with Order, i.e. > > Order[F[a_], F[b_]] := -Order[a,b] > > for instance. > > I was hoping then that, > > Times[F[a],F[b]] > > would then become the canonical, > > Times[F[b],F[a]], > > but this doesn't happen: > > : Order[F[a], F[b]] > = -1 > > : Times[F[b], F[a]] > = F[a] F[b] > > : % // FullForm > = Times[F[a], F[b]] > > Ok, so it looks like Sort, isn't paying attention to Order[]. Should > it? How do I go about changing the default sort order for a particular > function? > > : Sort[{F[a], F[b]}] > = {F[a], F[b]} > > Joe > > p.s. I've asked for a lot of help recently, but not given much in > return. Many thanks to all of you who are helping me out with this > learning curve! :) You're all stars! > -- > Josef Karthauser (joe at tao.org.uk) http://www.josef-k.net/ > FreeBSD (cvs meister, admin and hacker) http://www.uk.FreeBSD.org/ > Physics Particle Theory (student) http://www.pact.cpes.sussex.ac.uk/ > ================ An eclectic mix of fact and theory. ================= > > > There are really two questions here, one about Times and one about Sort. They are not actually related so I will answer them in turn. The short answer is "don't do it". But if you want to mess around with unprotecting Times and accept the risks involved you can do this: In[3]:= Unprotect[Times]; In[4]:= Format[Times[a_F,b_F]]:=HoldForm[b*a]/;OrderedQ[{a,b}] In[5]:= Protect[Times]; Now In[6]:= F[a]*F[c] Out[6]= F(c) F(a) Or In[7]:= F[1]*F[2] Out[7]= F(2) F(1) But of course you still get: In[8]:= F[1]*F[2]*F[3] Out[8]= F(1) F(2) F(3) Now the question about Sort: here is a somewhat different approach, again it requires you to unprotect Sort: In[9]:= sortF=True; In[10]:= Unprotect[Sort]; In[11]:= Sort[{a_F,b_F}]/;sortF:=Block[{sortF=False},Sort[{a,b},Not[ OrderedQ[{#1,#2}]]&]] In[12]:= Protect[Sort]; In[13]:= Sort[{F[a],F[b]}] Out[13]= {F(b),F(a)} Note that changing the behaviour of Sort in this way will have no effect on the behaviour of Times. Andrzej Kozlowski Chiba, Japan http://www.akikoz.net/andrzej/index.html http://www.mimuw.edu.pl/~akoz/

**References**:**Canonical order...***From:*Josef Karthauser <joe@tao.org.uk>