Documentation

Lean.Linter.Extra.UnnecessarySeqFocus

Enables the 'unnecessary <;>' linter. This will warn whenever the <;> tactic combinator is used when ; would work.

example : True := by apply id <;> trivial

The <;> is unnecessary here because apply id only makes one subgoal. Prefer apply id; trivial instead.

In some cases, the <;> is syntactically necessary because a single tactic is expected:

example : True := by
  cases () with apply id <;> apply id
  | unit => trivial

In this case, you should use parentheses, as in (apply id; apply id):

example : True := by
  cases () with (apply id; apply id)
  | unit => trivial

The set of tactic syntax kinds that act on multiple goals — meaning tac differs from focus tac. Used to suppress false positives where tac1 <;> tac2 cannot be replaced by (tac1; tac2) because that would expose tac2 to a different set of goals.

Other modules can extend this set in their own builtin_initialize block by calling addBuiltinMultigoalKinds.

Register k as a multigoal tactic syntax kind.

Instances For

    Register ks as multigoal tactic syntax kinds.

    Instances For

      Whether k is a multigoal tactic kind, per multigoalKindsRef.

      Instances For

        The information we record for each <;> node appearing in the syntax.

        • stx : Syntax

          The <;> node itself.

        • used : Bool
          • true: this <;> has been used unnecessarily at least once
          • false: it has never been executed
          • If it has been used properly at least once, the entry is removed from the table.
        Instances For
          @[reducible, inline]

          The monad for collecting used tactic syntaxes.

          Instances For
            @[inline]

            True if this is a <;> node in either tactic or conv classes.

            Instances For
              @[specialize #[]]

              Accumulates the set of tactic syntaxes that should be evaluated at least once.

              Traverse the info tree down a given path. Each (n, i) means that the array must have length n and we will descend into the i'th child.

              Instances For

                Search for tactic executions in the info tree and remove executed tactic syntaxes.

                Search for tactic executions in the info tree and remove executed tactic syntaxes.

                Enables the 'unnecessary <;>' linter. This will warn whenever the <;> tactic combinator is used when ; would work.

                example : True := by apply id <;> trivial
                

                The <;> is unnecessary here because apply id only makes one subgoal. Prefer apply id; trivial instead.

                In some cases, the <;> is syntactically necessary because a single tactic is expected:

                example : True := by
                  cases () with apply id <;> apply id
                  | unit => trivial
                

                In this case, you should use parentheses, as in (apply id; apply id):

                example : True := by
                  cases () with (apply id; apply id)
                  | unit => trivial
                
                Instances For