norm_num

norm_num は、数値リテラルを含む式を正規化するタクティクです。変数を含まない等式・不等式・整除関係等を示したいときに使います。

import Mathlib.Tactic.NormNum

example : 37 * 23 + 19 = 870 := by
  norm_num

example : ¬ (15 : Int) ^ 2 < 100 := by
  norm_num

example : (2 : ℚ) / 3 + 1 / 6 = 5 / 6 := by
  norm_num

norm_num は仮定に対しても使うことができます。 たとえば norm_num at h とすると、仮定 h の中の数値式を正規化します。

example {n : Nat} (h : 3 ∣ n + 4) : 3 ∣ n + 1 := by
  -- 最初は、h とゴールは違う式なので証明できない
  fail_if_success assumption

  -- `n + 4` は `n + 1 + 3` と同じなので、3 で割った余りは変わらない
  norm_num at h

  assumption

norm_numnorm_num [f] のように補題や定義を渡して使うこともできます。 渡した補題で式を展開してから、数値計算を正規化します。

def taxIncluded (price : Nat) (taxRate : Nat) : Nat :=
  price + price * taxRate / 100

example : taxIncluded 1200 10 = 1320 := by
  -- 最初は norm_num だけでは証明が終わらない
  fail_if_success solve |
    norm_num

  norm_num [taxIncluded]