Re: Canonical order...

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

I just noticed that in the second case (Sort) the trick with sortF, which is used for trapping built-in functions, is not needed at all, since Sort is being called with a custom sort function and there is no danger of an infinite loop, so the following simpler code will work: In[1]:= Unprotect[Sort]; In[2]:= Sort[{a_F,b_F}]:=Sort[{a,b},Not[OrderedQ[{#1,#2}]]&] In[3]:= Protect[Sort]; In[4]:= Sort[{F[a],F[b]}] Out[4]= {F(b),F(a)} Andrzej On 9 Mar 2005, at 19:09, Andrzej Kozlowski wrote: > 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>