6
$\begingroup$

I don't know if the question trivial or not (if so I will delete it), but here is what I have:

I know that

x x
(*  x^2  *)

Looking at the full form gives

FullForm[Times[x, x]]
(* Power[x, 2] *)

It is clear that the Times head has been changed to Power head. I just wonder how does this happen. Can I control this behavior to stop this conversion between heads?

$\endgroup$
7
$\begingroup$

We can use this function to see that the conversion is not made during parsing:

parseString[s_String, prep : (True | False) : True] := 
  FrontEndExecute[FrontEnd`UndocumentedTestFEParserPacket[s, prep]]

parseString["x x"]
{BoxData[RowBox[{"x", "x"}]], StandardForm}

We can use this to see that the conversion does not take place while converting boxes to StandardForm:

ToExpression[RowBox[{"x", "x"}], StandardForm, HoldComplete] // FullForm
HoldComplete[Times[x,x]]

We can see that the rule is applied as part of the normal evaluation sequence:

Times[x, x] // TracePrint

x x

Times

x

x

(x^2)

Power

x

2

You cannot generally "stop this conversion" but you can temporarily disable the rules for Times using Block:

Block[{Times},
 ToString[x x]
]
"Times[x, x]"

You can also Hold or HoldComplete expressions and apply your own rules.

Neither of these methods lets Times otherwise behave as desired. I have lamented this problem myself with regard to Subtract and Divide as the "equivalent" forms they are converted into are neither equivalent nor as fast.

$\endgroup$
  • $\begingroup$ Mr.Wizard, do you have new insight in the problem with the short forms you linked to? You said in one of the comments you might post a partial solution at some point. I'm sure many people would be interested (including me)! $\endgroup$ – sebhofer Aug 3 '14 at 9:42
  • $\begingroup$ @sebhofer I wish I did. I tried a few things and I didn't come up with anything I wanted to use. However it's been a long time and I didn't try too hard as I was hoping someone else had a better idea. $\endgroup$ – Mr.Wizard Aug 3 '14 at 14:44
4
$\begingroup$

Mathematica embraces the notion of canonical form. Internally it wants all expressions to be reduced to their canonical forms.

Times[x, x] is not a canonical form, so it gets reduced to Power[x, 2], which is.

I share Mr.Wizard's occasional frustration over the choices of canon made by Wolfram Research, but I think it is far too late to expect any change. So grin and bear it, as we say here in the US.

$\endgroup$
  • $\begingroup$ thank you for the explanation and for the advice I am smiling right now while bearing the fact :) $\endgroup$ – Algohi Aug 3 '14 at 17:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.