Re: Sequence and Or
- To: mathgroup at smc.vnet.net
- Subject: [mg34214] Re: [mg34179] Sequence and Or
- From: Andrzej Kozlowski <andrzej at platon.c.u-tokyo.ac.jp>
- Date: Thu, 9 May 2002 05:17:08 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Yes, in this case all the arguments will be evaluated. You can see the difference in performance quite clearly: In[1]:= p1 := 1 == 1 In[2]:= p2 := FullSimplify[Gamma[z]*z == z!] In[3]:= Timing[Or[p1,p2]] Out[3]= {0. Second,True} In[4]:= Timing[Or@@{p1,p2}] Out[4]= {0.84 Second,True} Andrzej Kozlowski Toyama International University JAPAN http://platon.c.u-tokyo.ac.jp/andrzej/ On Thursday, May 9, 2002, at 02:02 PM, DrBob wrote: > Good explanation! We don't always EXPECT reasons that make sense. > > Then, does > > Or@@{expr1,expr2,...,exprn} > > sacrifice that efficiency? > > Bobby > > -----Original Message----- > From: Andrzej Kozlowski [mailto:andrzej at platon.c.u-tokyo.ac.jp] To: mathgroup at smc.vnet.net > Sent: Wednesday, May 08, 2002 11:56 PM > To: drbob at bigfoot.com > Cc: mathgroup at smc.vnet.net > Subject: [mg34214] Re: [mg34179] Sequence and Or > > It seems to me this is just a matter of efficiency. Suppose you want to > evaluate Or[p1,p2,p3,...,pn] for some statements p1, p2 ...pn. It is > enough that just one pi is True for the answer to be true. So > Mathematica evaluates each statement in turn and stops whenever it finds > > one that turns out to be true. This can produce a big gain in > efficiency, particularly if you sensibly arranged the statements so that > > those more likely to be true come earlier. Of course for this sort of > thing to be of any use you need to have the HoldAll attribute otherwise > Mathematica would first evaluate all the statements even if only p1 was > true and easy to check and the rest hard. > > > > > On Wednesday, May 8, 2002, at 11:54 PM, DrBob wrote: > >> Thanks for the workaround! It makes me wonder, though, why Or should >> have the HoldAll attribute at all. >> >> Bobby >> >> -----Original Message----- >> From: Andrzej Kozlowski [mailto:andrzej at platon.c.u-tokyo.ac.jp] To: mathgroup at smc.vnet.net >> Sent: Wednesday, May 08, 2002 5:27 AM >> To: drbob at bigfoot.com >> Cc: mathgroup at smc.vnet.net >> Subject: [mg34214] Re: [mg34179] Sequence and Or >> >> Compare: >> >> In[19]:= >> Or[Sequence@@{True,False,True}] >> >> Out[19]= >> Sequence[True,False,True] >> >> In[20]:= >> Or[Evaluate[Sequence@@{True,False,True}]] >> >> Out[20]= >> True >> >> In[21]:= >> Or[Sequence[True,False,True]] >> >> Out[21]= >> True >> >> The point is the HoldAll attribute of Or. Because of it, when you > enter >> >> Or[Sequence@@{True,False,True}] only a single argument is passed to > Or >> but Or with a single argument returns: >> >> In[22]:= >> Or[x] >> >> Out[22]= >> x >> >> >> >> >> On Wednesday, May 8, 2002, at 02:57 PM, DrBob wrote: >> >>> When I evaluate the following... >>> >>> {True,False,True} >>> Or@@% >>> Sequence@@% >>> Or[%] >>> >>> the outputs are: >>> >>> {True,False,True} >>> True >>> Sequence[True,False,True] >>> Sequence[True,False,True] >>> >>> while I had expected: >>> >>> {True,False,True} >>> True >>> Sequence[True,False,True] >>> True >>> >>> What am I missing? >>> >>> Bobby Treat >>> >>> >>> >>> >>> >> >> >> > > >