linter.style.multiGoal

linter.style.multiGoal は、よくない証明の書き方を指摘するリンターの一つです。

Lean では、複数のサブゴールがあるときにタクティクを実行すると最初のゴールに対して実行されるのですが、証明を構造化するという観点からは、ゴールの一つにフォーカスする(infoview に一つしかゴールが表示されないようにする)べきです。 このリンタはそのような問題を指摘します。

import Mathlib.Tactic.Linter.Multigoal

set_option linter.style.multiGoal true

/--
warning: The following tactic starts with 2 goals and ends with 1 goal, 1 of which is not operated on.
  exact hP
Please focus on the current goal, for instance using `·` (typed as "\.").
note: this linter can be disabled with `set_option linter.style.multiGoal false`
-/
#guard_msgs in
  example {P Q : Prop} (hP : P) (hQ : Q) : P ∧ Q := by
    -- ゴールが2つ生成される
    constructor

    -- この時点でサブゴールが2つあるのに、
    -- フォーカスせずにタクティクを実行しているので警告が出る
    exact hP
    exact hQ

-- 良い証明の例
example {P Q : Prop} (hP : P) (hQ : Q) : P ∧ Q := by
  constructor
  · exact hP
  · exact hQ