hint

hint は複数のタクティクを試し、上手くいったものを報告してくれるタクティクです。

import Mathlib.Tactic -- `hint` は検索を伴うので、おおざっぱに import している

/--
info: Try these:
• exact h p
-/
#guard_msgs in
  example (P Q : Prop) (p : P) (h : P → Q) : Q := by
    hint

/--
info: Try these:
• simp_all only [and_self]
-/
#guard_msgs in
  example (P Q R : Prop) (x : P ∧ Q ∧ R ∧ R) : Q ∧ P ∧ R := by
    hint

登録されているタクティク

デフォルトでは以下の8つのタクティクを試します。

hint に登録されているタクティクのリストは、Mathlib.Tactic.Hint.getHints 関数を介して確認することができます。

open Lean in

/-- `hint` タクティクに登録されているタクティクの完全なリストを出力する -/
def getRegisteredTactics : CoreM Unit := do
  let hintTactics := (← Mathlib.Tactic.Hint.getHints).map (·.raw)
  for tactic in hintTactics do
    let .node _ _ arr := tactic
      | panic! "error: unexpected syntax term"
    IO.println arr[0]!

/--
info: "linarith"
"omega"
"decide"
"exact?"
"simp_all?"
"aesop"
"intro"
"split"
-/
#guard_msgs in #eval getRegisteredTactics

タクティクの新規登録

登録されているタクティクに tac を追加するには、register_hint tac を実行します。

register_hint nlinarith

/--
info: Try these:
• nlinarith
-/
#guard_msgs in
  example (a b : Nat) (h : a ≤ b) : (a + b) ^ 2 ≤ 4 * b ^ 2 := by
    hint