Documentation

Mathlib.Tactic.Linter.SyntaxBased

Syntax based linters #

This file defines a linter that combines many different linters that each operate directly on the Syntax. This approach of combining the linters into a single loop is more efficient than having each linter do this by itself.

The cdot linter #

The cdot linter flags uses of a dot (.) that could instead be a "cdot" (·). It also flags "isolated cdots", i.e. when the · is on its own line.

The dollarSyntax linter #

The dollarSyntax linter flags uses of $ that could instead be <|. These are disallowed by the mathlib style guide, as using <| pairs better with |>.

The lambdaSyntax linter #

The lambdaSyntax linter flags uses of the symbol λ to define anonymous functions. This is syntactically equivalent to the fun keyword; mathlib style prefers using the latter.

The auxiliary declaration linter #

The auxLemma linter flags explicit references to auto-generated "auxiliary" declarations such as _proof_1, match_1, or _sizeOf_1.

These names are internal implementation details generated by the Lean elaborator. They are not stable across refactors (e.g. reordering fields in a structure can renumber _proof_ indices), so depending on them makes code fragile.

The oldObtain linter, against stream-of-consciousness obtain #

The oldObtain linter flags any occurrences of "stream-of-consciousness" obtain, i.e. uses of the obtain tactic which do not immediately provide a proof.

Example #

There are six different kinds of obtain uses. In one example, they look like this.

theorem foo : True := by
  -- These cases are fine.
  obtain := trivial
  obtain h := trivial
  obtain : True := trivial
  obtain h : True := trivial
  -- These are linted against.
  obtain : True
  · trivial
  obtain h : True
  · trivial

We allow the first four (since an explicit proof is provided), but lint against the last two.

Why is this bad? #

This is similar to removing all uses of Tactic.Replace and Tactic.Have from mathlib: in summary,

The oldObtain linter flags uses of the "stream-of-consciousness" variants of the obtain tactic, i.e. with the proof postponed.

The extended binder linter #

In mathlib we prefer writing the basic ∀/∃ binders over ∀ᵉ/∃ᵉ. This is because the latter was used quite infrequently, so the cost of needing to learn this notation was greater than the benefit.

The extendedBinder linter flags uses of the ∀ᵉ/∃ᵉ notation for combining universal and existential binders. Mathlib prefers basic ∀/∃ notation.

The combined syntax linter #