Ramblings on notation

8 minute read

Alternative title: “Notation is fake”

Twitter math

Consider the now-famous expression:

\[6 \div 2(1+2)\]

What number does this evaluate to? This flares up on twitter every now and then (it cropped up in my discord server about two weeks ago, giving the inspiration for this post), with two main parties, claiming that the answer is 9 or 1 respectively.

Let’s lay out the strongest arguments for both sides. PEMDAS (or BODMAS, or what have you) suggests two ways to parse this (with the \(\times\) inserted for clarity):

  • \[(6 \div 2) \times (1+2)\]
  • \[6 \div (2 \times (1+2))\]

People subscribing to the first parse will usually state the “rule” that “multiplication and division are the same precedence”, and that operators with the same precedence evaluate in left-to-right order. To use more formal syntactic terms, they bind equally tightly (have the same priority) and left-associate.

As far as I know, “operators with the same precedence evaluate left-to-right” only really exists for multiplication/division and addition/subtraction, and is only controversial when the first pair is involved. Most western languages (of which English is the primary language used to communicate mathematics) are written left-to-right, and so it makes sense that the operator we see first should evaluate first. On the other hand, it can feel strange that we decided to syntactically associate operations that are associative (namely, \(+\) and \(\times\)) with their decidedly non-associative inverses (\(-\) and \(\div\)), Note that, even amongst “elementary” operations, we don’t always even follow the left-to-right rule! \(a^{b^c}\) is \(a^{(b^c)}\), not \((a^b)^c = a^{bc}\)! You can make all sorts of allowances (for example, the fact that the \(b^c\) is written “inside” the operator suggests that it should come first), but that is equally arbitrary – why didn’t we pick something similarly “unambiguous” for multiplication?

Proponents of the second interpretation instead tend to note that written mathematics is a natural, human language, and that it should be interpreted in the way that is most intuitive. For the record, I agree with this, in principle (even though I wouldn’t really agree that the expression evaluates to 1 – more on this later).

I’ve heard a few different reasons as for why it’s more intuitive to do the multiplication first, such as “parentheses are already used to say do this first”, so multiplication via parentheses should be done earlier”. The argument I find most compelling is that, by writing the multiplicands without an operator to separate them explicitly (e.g., \(\times\)), it suggests to the reader that they are morally one “term”.

Note that the two views don’t have to be incompatible! The statement “multiplication and division happen at the same time in the order of operations” is a claim about syntax, not semantics – there’s nothing fundamental about “multiplication” that makes it “stronger” than “addition”, only the way we, as humans, read a formula that has been written down. To put it another way, the “rules” are intended to let us drop some parentheses (which are really just a way of disambiguating our syntax tree) by saying that, in certain cases, they’re implicit.

But if that’s the case, then there’s nothing stopping us for having two notations for the same operation with different syntactic properties – it’s totally fine for \(\times\) and \(\div\) to bind equally tightly and left-associate and also for multiplication via the \(\cdot (\cdot)\) to apply first.

Something fundamental about multiplication

So why did we decide that \(\times\) binds more tightly than \(+\)? I did some (admittedly brief) googling, but was unable to nail down a concrete explanation.

One suggestion, which I like, is that it’s due to distributivity. Namely, \(a \times (b + c) = (a \times b) + (a \times c)\), and \((a \times b)^c = (a^c) \times (b^c)\) – the stronger operator distributes over the immediately weaker one. This would mean that, given an expression consisting of only the PEMDAS operators, fully distributing exponents over multiplication, then fully distributing the resulting multiplications would result in an expression with no parenthesized expressions.

One problem with this reasoning is that it only works “one level” at a time. For example, exponents definitely do not distribute over addition, so we’d need to do some polynomial expansion to fully “flatten” an expression.

On the other hand, there are other operators with a precedence convention, if we expand beyond just numbers. In boolean logic, the \(\land\) (conjunction, “and”) operator distributes over both \(\oplus\) (“xor”) and \(\lor\) (disjunction, “or”), and indeed we find that most programming languages give && a higher precedence than ^ and ||. On the third hand, ^ traditionally binds more tightly than ||, but does not distribute over it.

Restricting only to \(\land\) and \(\lor\) does make for another rather interesting conversation. Many logicians actually write \(A \cdot B\) or just \(AB\) to mean \(A \land B\) and \(A + B\) for \(A \lor B\), precisely because \(\times\) distributes over \(+\). In fact, while we’ve so far been using “multiplication” and “addition” to refer to the arithmetic operations on numbers, \(\times_R\) distributing over \(+_R\) is actually baked into the definition of an arbitrary ring \((\times_R, +_R, R)\), separating us from the fact that, numerically, \(\times\) is defined in terms of \(+\).

This would be score one for the 9 camp – Under this view, “division” (as in, the abstract field operation) is shorthand for “multiply by the inverse”, so multiplication and division are actually the same operation, which associates to the left.

For humans to read

If we’re going to bring in things like “abstract ring operations”, we should probably also talk about more “casual” constructs that more people are probably familiar with.

Here is an equation from an actual paper I was reading the other day:

\[P_p = F_p(V-W)/\eta_p\]

(this was indeed written with a slash and not a fully-qualified fraction)

For the sake of a more illustrative example, let’s rewrite the right hand side:

\[\frac{1}{\eta_p} F_p(V-W)\]

How are we to interpret this, exactly as I’ve written it? Under what order should we perform the operations?

On an entirely unrelated (yeah, right) note, consider also the cumulative distribution function \(F_X(x)\) of a random variable \(X\).

In your head, put in all the parentheses to make this fully unambiguous before you keep reading.

How did you parenthesize? As before, there are two main ways:

  • \[\left(\frac{1}{\eta_p}F_p\right)(V-W)\]
  • \[\frac{1}{\eta_p}(F_p(V-W))\]

When I first saw the first interpretation, something didn’t sit right with me. For one, it isn’t even well-formed… if \(F_p\) is a function. Secondly, it also flips the association from the original expression, which is to be expected, we did move a term to the other side, but still makes me uncomfortable.

In fact, the \(F_p\) in the paper is actually a scalar, the \(F\) being the standard physics letter used for force, and is entirely unrelated to \(F_p(x)\), the cumulative distribution function over a random variable \(p\), defined as \(F_p(x) = P(p \le x)\). For bonus points, notice that the capital letter \(P\) is also overloaded here, to mean “probability” in the, well, probabilistic tradition, and “power” in the physics sense.

To put it another way, parsing math isn’t even context-free! Traditionally, function application is the tightest possible binding (because it’s shorthand for an entirely new, parenthesized expression), and functions are named \(f\), \(g\) or \(F\). This means that whether or not \(F_p\) is a function actually changes the way an expression associates!

With these in mind, we can put forward two principles which feel unobjectionable:

  • Replacing all variables with their concrete values should yield “the same” expression
  • It is preferable to need less context (as opposed to more context) to correctly parse a term

When taken in combination, we actually find a point for the 1 camp:

Consider the expression \(x \div f(y+z)\). Properly, to parse this, we would need to know whether \(f\) is a function or a scalar. However, \(f\) is most commonly used to denote a function, and so by principle 2 we should assume that \(f(y+z)\) is the tightest binding present, giving a parse or \(x \div (f(y+z))\). But then, if we then reveal that, in fact, \(f = 2\), by principle 1 we would get that the correct parse is \(x \div (2(y+z))\)!

Nearly everyone I’ve given this explanation to has found something wrong with it, but they aren’t finding the same wrong thing. People seem split on whether the two principles are reasonable (I could certainly come up with a counterargument for either), which one isn’t reasonable, or whether they’re reasonable individually but not in combination. Similarly, the step of assuming that \(f\) might be a function seems to rub people the wrong way.

All that said, I actually still think this is a reasonable argument. As I said before, mathematical expressions are written entirely for humans to read, and most people who have reached the level of being comfortable with functions would agree that the expression \(f(y+z)\) suggests a function application, which is always “one term” that sticks together. It’s only natural, then, to want the similar-looking expression \(2(1+2)\) to also be “one term”.

Who even writes math like this?

The last time this came up, someone mentioned (paraphrasing) “you could get around this by writing the fraction properly”, and “nobody writes \(2(2)\) outside of school anyway”.

Setting aside my immediate objections (like the fact that \(x(e)\) notation is quite common if \(e\) is a more complex expression), this is more-or-less my viewpoint as well. The point of notation is to be readable, and writing something in an ambiguous form goes against that, even if “the rules” make it technically well-formed. The expression \(6 \div 2(1+2)\) doesn’t have a single value, because the real answer is “it depends” (on whether multiplication via adjacent values binds more or equally tightly as division via \(\div\)), because we haven’t settled on a convention in this case, whatever the twitter mob thinks is “correct”.

People who work on theoretical programming languages or logical foundations run into this a lot. What’s the notation for substituting all occurrences of the free variable \(x\) with \(y\) in expression \(e\)? I’ve seen:

  • \[[x/y]e\]
  • \[[y/x]e\]
  • \[e[x/y]\]

and all other variants besides. The context generally makes things clear by “typechecking” the syntax tree in your head (although, in my experience, not always, which is always fun when one of the first two cases is used). This isn’t even getting into all the different ways to notate simultaneous substitution.

Suffice to say, notation sucks and is made up anyway.

Updated:

Leave a Comment