5

Is there a way to change operator precedence for built-in symbols?

I'd like \[TensorProduct] (which I redefine to KroneckerProduct) to take precedence after dot, so that the following is true

A.B\[TensorProduct]C.D == (A.B)\[TensorProduct](C.D)
Yaroslav Bulatov
  • 7,793
  • 1
  • 19
  • 44
  • 1
    Related: 140609. People tend to suggest workarounds rather than actual ways to change operator precedence. Edit You might give TensorProduct a HoldAll attribute and define downvalues (to TensorProduct) when a Dot object appears in TensorProduct. – jjc385 Apr 19 '17 at 16:24
  • 1
    Also, how exactly do you redefine \[TensorProduct] to KroneckerProduct? – jjc385 Apr 19 '17 at 16:35
  • I do TensorProduct=KroneckerProduct – Yaroslav Bulatov Apr 19 '17 at 20:14
  • How about using CircleTimes = KroneckerProduct and then A.B\[CircleTimes]C.D – chuy Apr 20 '17 at 16:46

1 Answers1

7

If you enter \[TensorProduct] using the input alias t*, then you can override the input alias to produce a TemplateBox with a SyntaxForm setting to lower the precedence:

CurrentValue[EvaluationNotebook[], {InputAliases,"t*"}]=TemplateBox[
    {},
    "TensorProduct",
    DisplayFunction->("\[TensorProduct]"&),
    InterpretationFunction:>(Sequence["~","TensorProduct","~"]&),
    SyntaxForm->"*"
];

Your example (as an image to show the alias in action):

enter image description here

Carl Woll
  • 130,679
  • 6
  • 243
  • 355