Re : Unpredictability (was (Re: Unevaluated, Plus and Times (was Re: Mathematica language issues))
- To: mathgroup at smc.vnet.net
- Subject: [mg53177] Re : Unpredictability (was (Re: Unevaluated, Plus and Times (was Re: Mathematica language issues))
- From: Jean-Michel Collard <jmcollard at free.fr>
- Date: Tue, 28 Dec 2004 06:30:17 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
About Mathematica language issues and predictability :
i=5
Print[++i * ++i] will always return 42 as Print[++i * i++] will always return 36.
And it's predictable and will always return these values.
In ISO C9x a construction like :
int i=5;
printf("%d",++i * ++i); is unpredictable.
It may return 0 , -45621245 or even 42 !
Such a construction is not forbidden but inpredictable (cf C99 Rationale V5.10).
I think in Mathematica it shoudln't be allowed at all.
Of course who wants to Print[++i * i--] ?
Jean-Michel
Fred Simons wrote:
> The discussion on the behaviour of Unevaluated in cases where it should not
> be used lasts already for a long time. Though irrelevant there are some
> interesting aspects in it. The general behaviour of Unevaluated has been
> explained by Andrzej Kozlowsky. Let me reformulate it very short and
> therefore inaccurate: when during the evaluation process the expression
> changes, the arguments that originally were wrapped in Unevaluated are not
> rewrapped. It is very important to note that changes only due to attributes
> do not count as an change.
>
> Examples have been given to demonstrate that Times and Plus behave
> differently. For example the expression Unevaluated[z]+2. Mathematica looks
> at z+2. The terms are reordered due to the attribute Orderless so
> Mathematica arrives at 2+z. That is the end of the evaluation. The change is
> only due to the attributes so we expect rewrapping of Unevaluated, that is
> the result 2+Unevaluated[z]. But the outcome is 2+z.
>
> In my previous mail I tried to explain this behaviour from the fact that the
> evaluation of expressions with head Plus or Times is slightly different.
> According to Bobby, that explanation was not very clear, so in this mail I
> try to do it better.
>
> There is evidence that as soon as the head Times or Plus of an expression is
> recognized, Mathematica does some sort of pre-evaluation of the arguments.
> All numerical arguments are multplied or added and the result is placed
> befor the other arguments. Only after this pre-evaluation the attributes of
> Times and Plus are applied and the evaluation continues.
>
> I will only consider the function Plus. The pre-evaluation of the arguments
> can be seen from the following function preplus, in which the rules used by
> Mathematica are 'caught':
>
> Attributes[preplus]={HoldAllComplete};
> preplus[x___] := Block[{Plus}, plus@@Plus[x]]
>
> Now we can imitate the evaluation of an expression with head Plus by first
> doing the pre-evaluation with the function preplus and then apply Plus to
> the result.
>
> Here are some examples.
>
> Evaluation of the expression 2+Unevaluated[z] is done in the following way:
>
> In[12]:=
> preplus[2,Unevaluated[z]]
> Plus @@ %
>
> Out[12]=
> plus[2,Unevaluated[z]]
> Out[13]=
> 2+Unevaluated[z]
>
> The pre-evaluation does not change the arguments, so in the input of Plus
> the argument z is still wrapped in Unevaluated. Plus do not change the
> expression so at the end the argument z is wrapped in Unevaluated.
>
> The expression 1+1+Unevaluated[z] gives a different result:
>
> In[14]:=
> preplus[1,1,Unevaluated[z]]
> Plus @@ %
>
> Out[14]=
> plus[2,z]
> Out[15]=
> 2+z
>
> The pre-evaluation changed the arguments so Unevaluated has completely
> disappeared in the input of Plus.
>
> The expression 2+Unevaluated[z+2]:
>
> In[16]:=
> preplus[2, Unevaluated[z+2]]
> Plus @@ %
>
> Out[16]=
> plus[2,Unevaluated[z+2]]
> Out[17]=
> 4+z
>
> Here the pre-evaluation has no effect, so after applying the attributes Flat
> and Orderless, Plus is called with arguments 2, 2 and z. Plus has no rules
> for these combination of argument, so it has to return Plus[2,2,
> Unevaluated[z]]. But then the evaluation of course continues:
>
> In[18]:=
> preplus[2, 2, Unevaluated[z]]
> Plus @@ %
>
> Out[18]=
> plus[4,z]
> Out[19]=
> 4+z
>
> Pre-evaluation of the arguments gives a new set of arguments, so z is no
> longer wrapped in Unevaluated, and the outcome is 4+z.
>
> My conclusion is that the result of all curious examples with head Plus or
> Times where some of the arguments supplied with Unevaluated can be predicted
> in the way Andrzej has described when one takes into account the
> pre-evaluation, as I did in the above examples.
>
> Fred Simons
> Eindhoven Ubiversity of Technology
>
--
"They that can give up essential liberty to obtain a little temporary
safety deserve neither liberty nor safety." -- B. Franklin, 1759