Hacker News new | past | comments | ask | show | jobs | submit login
Lint for Math (rjlipton.wordpress.com)
107 points by GFK_of_xmaspast on March 9, 2015 | hide | past | favorite | 30 comments



We really need a better way to represent math in documents. TeX/LaTex is all about putting ink on paper in a pretty way; it doesn't know anything about the math.

As with programming languages, the first question is what each variable is, and what its type and definition are. You should be able to mouse over variables in textbooks and see that information. You should be able to see formulas fully parenthesized if you want. (The machine learning people are terrible about inventing new operators and not telling the reader what their precedence is.)

Mathematica notebooks come close to this. But books and papers on math are not usually published that way. MathML was a step in the right direction but didn't catch on.


I'm a mathematics graduate student with (basically) a degree in CS, and I see programmers claim this all the time. They seem to think that if they can make a tool that allows them to read calculus textbooks or machine learning textbooks more easily, this tool will obviously be useful for all mathematicians everywhere. I disagree.

If you want to seriously address this issue, you need to make sure it works for the mathematicians who work at the most abstract levels of the hierarchy. Mathematics as a language is primarily about communicating an idea from one human to another. The problem here is that pure mathematicians want and need to bend type rules for the sake of communication. There are implicit equivalences of types all over the place. For example, a homotopy is a smooth map (between more than one kind of space depending on your preference), but it is also a statement of equality between two things, and it is a commutative diagram involving infinite sequences of objects and operators which is defined in contexts where smooth maps do not exist. Whether or not these different things can be used in the same place depends not on the type of the definition but the greater context of the paper.

Moreover, not all variables have definitions you can annotate. Sometimes the definitions are assumed to exist for the sake of contradiction, sometimes they are the unique limit of some crazy sequence that takes a page to write down. Sometimes they are defined by properties they have, so they don't represent a single object but a family of objects (or maybe it is a single object, who knows?)

I'm not saying better math documents are impossible. I'm saying that most programmers who claim that we need a better way to do it don't appreciate the depth and complexity of the problem.

I think probably a better solution is to augment a public repository of papers (such as arXiv) by allowing readers to add inline annotations explaining concepts, fixing bugs, etc. The real tragedy is that once a person figures out what the hell is going on in a poorly written paper, they have no way to bring their insight to anyone reading the same document in the same place.


> They seem to think that if they can make a tool that allows them to read calculus textbooks or machine learning textbooks more easily, this tool will obviously be useful for all mathematicians everywhere. I disagree.

I agree with you times infinity.

I get frustrated when programmers are used to looking at source code that has very precise meaning and are expecting to be able to read mathematics as if it were source code too. Or worse, when people think that the hardest part of understanding mathematics is the notation. Or that a capital sigma means a sum in all contexts, or that a lowercase sigma could not possibly mean anything other than a standard deviation or a lowercase pi could not mean anything other than the first positive root of the sine function.

Mathematics is written by humans for humans. Trying to automate mathematical writing or reading is about as feasible as trying to automate literary analysis of 19th century romanticism[1]. Or in Weierstrass's words to Kovalevskaya,

    [...] it is true that a mathematician who is not somewhat of a
    poet, will never be a perfect mathematician.
https://en.wikiquote.org/wiki/Karl_Weierstrass

[1] When reading Riemann, I particularly feel like I might as well be reading E. T. A. Hoffman sometimes. Some of the moves he makes I cannot describe as anything but poetical. For example, how he describes the contours of integration in a couple of reformulations of the zeta function.


> Mathematics is written by humans for humans.

Sure. But since I can't directly probe your mind, I can either read through thousands of pages of manuscript to refine my internal mental model of the particular theory/problem set/subfield, or hope for an interactive system that allows me to do just that, where I can tinker with concepts and connections between them.

Bret Victor showed it best, and even though he was talking about the applied side, it goes perfectly for the more abstract areas too.


> even though he was talking about the applied side, it goes perfectly for the more abstract areas too.

This is where Bret Victor and I disagree: interactive documents for visualizing circuit diagrams do not generalize perfectly to all of mathematics. If you want to develop a generic tool that allows any mathematician to build interactive documents for tinkering with concepts, you need to see how deep the mathematical rabbit hole goes. Victor's tools are a proof of concept for very limited systems.


When I was studying mathematics the tool I wanted most was a simple proof assistant that could help me dive deeper into steps.

Because to effectively understand a concept (usually through applications of it either in full blown proofs, or in smaller calculations - that are just ad-hoc proofs) you need the right level of verbosity. Oversaturation with low-level set theory steps from Burbaki won't make anyone understand systems of differential equations, but when you are unsure of a step, you need a bit more detail.

And in my experience the optimal trajectory through a proof is almost always different for everyone. So it'd be good if proofs were "discoverable", expand and collapse steps.

And we don't even have to go crazy with "reverse mathematics"-like axiom chasing. But the current practice of throwing random symbols on pages in LaTeX is rather suboptimal in my opinion.


This is not an interactive document in the sense Bret Victor proposes.


Coincidentally, I was reading this Wolfram post on much the same topic & point just this morning: http://blog.stephenwolfram.com/2014/08/computational-knowled...


The problem is that there are actually several components needed: the semantic markup language, an input method no less efficient than LaTeX, and the math-lint itself. LaTeX is not semantic. MathML is just too verbose to type in the raw. The syntax used by theorem-proving software tends to be both esoteric and a bit too verbose (in addition to requiring the statements themselves to be extremely verbose).

I'm not sure that any plaintext markup can be sufficiently compact, semantic, and still resemble the handwritten syntax. That means we'll probably have to come up with a more interactive input method that is a bit more WYSIWYG in nature and has some auto-complete and automatic parenthesizing.


One of the reasons is surely that different fields of maths/engineering reuse the same symbols to have different meanings.


We know how to do type-directed operator overloading in unambiguous cases, eg. static methods in OO, modules and typeclasses in FP. This is often (ab)used to distinguish between alternative definitions. For example, Haskell's Monoid module defines several type synonyms for booleans and numbers, each of which has a different Monoid definition: https://hackage.haskell.org/package/base-4.7.0.2/docs/Data-M...

If we trigger an error for ambiguous cases, the path of least resistance is to make things unambiguous.


> MathML is just too verbose to type in the raw.

Tools like mathematica and MS equation editor have solved this at the same time as the input method question: have an input method which converts to a markup in the background. This markup has enough information to produce typeset output.


They have attempted to solve this. The problem comes as soon as it picks the incorrect markeup for a given input. Which undoubtedly will happen.


Mathcad has a reasonably good system for that.


Parentheses are also just a typesetting convention. You should be able to mouse over and have them replaced by concentric boxes or something. Even whitespace. Look at how easy this: 4 + [–1(–2 – 1)]2

is to parse this way:

  4                     +                      –1  *  –2–1    ^2
(especially imagine appropriate light-grey concentric boxes)

This is a LISP expression:

  (LIST 'PLUS (DIFF (CADR EXPR) X) (CADDR EXPR) X))
Here it is with whitespace instead of parantheses:

  LIST 'PLUS               DIFF   CADR EXPR    X              CADDR EXPR             X)
and as you can see there's an extra parantheses closing something I hadn't quoted. (I have nothing to match it with.)

Likewise font size, exact character placement vertically, visual cues, color (more deeply nested = redshift) can all make it super-easy to instantly parse things.

Instead the computer gets it instantly (super-easy to parse nested parantheses for the computer) but doesn't convey that to us at a glance at all.


Whether math papers do this or not, educational material such as textbooks definitely should. They should go beyond that and connect formulas with visual representations too. (I lightly experimented with this for my site https://www.learneroo.com/ )


Simple errors like these cover maybe 0.01% of the issues in a common math paper draft. Scrutinizing human review is required to catch "intellectual errors" such as introducing a concept before the reader is mentally prepared for it, or by offering an explanation in too much or little depth. During review, typographical errors (e.g. $10^12$) and "type-checking" errors (e.g. "r ∈ R vs. r ⊆ R") should be obvious to reviewers, so I feel it would be an extremely low priority to develop and apply a tool to fix these trivial issues.

And as much as I value good, clean code and style guides in programming, the TeX source of formulas are never read and usually edited by a single person, even in large collaborative projects.


> Simple errors like these cover maybe 0.01% of the issues in a common math paper draft.

And yet I wasted lots of time trying to make sense of papers containing such errors. So I would appreciate such a tool.


Terry Tao has a blog post about these "compilation errors":

    However, when, as a graduate student, one encounters the task of
    reading a technical mathematical paper for the first time, it is
    often the case that one loses much of one's higher reading skills,
    reverting instead to a more formal and tedious line-by-line
    interpretation of the text. As a consequence, a single typo or
    undefined term in the paper can cause one's comprehension of the
    paper to grind to a complete halt, in much the same way that it
    would to a computer.
https://plus.google.com/+TerenceTao27/posts/TGjjJPUdJjk

There's more context here:

https://terrytao.wordpress.com/career-advice/there%E2%80%99s...


I don't think this is going to be possible until computers are smart enough to understand high level maths (theorem provers have still a long way to go). A hundred different fields of research have a hundred different notations which are usually assumed to be convention and the reader is expected to know about these. The i in the summation could also refer to the imaginary unit but only if you are talking to physicists/mathematicians. Engineers use a j instead. Or what about conventions such as Einstein summation or infix operators defined by a set of axioms? How do you even recognize what a variable is or that \oplus is likely an operator or that z^*z is not a typo but a superscript indicating complex conjugation followed by an implicit multiplication symbol?

In addition, much of the math out there is described in words, rather than pure formulae. Humans are capable to reason about these things because we are trained to have an abstract understanding of what these things mean in a given context (and we can actually understand text).

A naive implementation of checking correctness of equations would likely return an incomprehensibly long list of cases where your equation might not make sense. A program that could check each and every step of your computation needs to understand your notation and definitions. While this is possible in principle – I assume you could do that for one particular problem with Mathematica – it would take you at least a few orders of magnitude more time to implement your sanity-check program for a particular problem than to check your equations by hand.


In the grand scheme of things all the errors he mentioned do not make a difference to the overall direction of the proof. Syntactic errors in programs on the other hand do. Unused variables, equality instead of assignment, declared but uninitialized variables, etc. are almost always bugs. That's not the case with math.

That's not to say this line of reasoning is not worthwhile. PLT Redex already does something similar for programming language semantics: http://redex.racket-lang.org/. Catching bugs in programming language semantics works for the same reason catching bugs in C works. There is a formal grammar with well-defined meaning that doesn't exist in general mathematical discourse. There is work being done in that direction as well: http://homotopytypetheory.org/book/. I wouldn't call that linting though.


> In the grand scheme of things all the errors he mentioned do not make a difference to the overall direction of the proof.

They make a huge difference if the reader wants to reuse a certain formula without deriving everything in sight. The time necessary to use a formula is no longer O(1), but O(n) with n being the length of the preceding discussion.

It also means you can't look at two expression and immediately check if they are equivalent as the variables might have different semantics.

Plus, you don't get to correct the mistake in the original, so every time you (or someone else) have to read it, you might need to redo the calculations just to be sure.


Then you and I are talking about different things. I don't read a mathematical proof to see what formulas I can copy. I read a mathematical proof to re-use the techniques in some other domain and to understand it I have to follow along and re-create bits and pieces of the proof. Obvious mistakes like the one mentioned in the post do not hinder that process. Less obvious errors would not be caught by a linter.

As for correcting mistakes I usually go to the author's homepage to find the most up to date versions along with errata. These days most papers are put up on the arxiv anyway which is often more up to date than whatever is printed in a journal so fixes for minor errors is again a non-issue.


I'm not talking about "reading a proof to see what I can copy", it's about being able to rely on what is written there. Also, there are many papers that serve as references that I want to be able to look up quickly. Rederiving every result any time I want to use it is not the way to go.


So... Kind of like the risk you take when you copy and paste code without first attempting to understanding it? I can't say that I've ever read through a proof just to nab a formula without even thinking through the material.


Coq[0] provides functionality that is an extension of this concept. It checks your proofs for you!

[0]- https://coq.inria.fr/


Cool idea. Parsing LaTeX into an AST with awareness of math structure (e.g. taking into account symbolic transformations like x^{1/2}=\sqrt{2}) would be a good start.

Before catching errors, I think an easier target for a tool like this would be to enforce notation, e.g. permutations are always called π not σ, and vectors are always \vec{v} not \mathbf{v}. This would be useful for multi-author texts like wikipedia.


Parsing LaTeX would be a heavy task due to LaTeX's innumerable packages.

I would recommend a compiler which translates a subset of a clean math notation (which could be identical to the math subset of LaTeX) to native LaTeX, which includes a lint algorithm, and which also supports special graphics packages (PGF/TikZ for instance).

This approach would keep the compiler small and maintainable while retaining 100% compatibility with LaTeX.


Is there a word to describe the structure of the notation of mathematics versus programming syntax versus the English language?


Most of programming is done in something reminiscent of type theory. Actual languages are more complicated because they either are impure (C, C++ etc) or involve non-total functions (Haskell). Idris, Coq and Agda can be reduced to some sort of type theory.

On the other hand, most of mathematics can be done in first order logic (FOL).

As for English, I'm not much of a linguist but I believe the closest equivalent to the above for English (and other natural languages) would be Categorical Grammar or maybe Montague grammar.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: