contradiction

矛盾からはどんな命題でも証明することができます。これを爆発律(principle of explosion)と呼びますが、contradiction は、この爆発律を使ってゴールを閉じるタクティクです。

ローカルコンテキストに P¬ P が同時にあるなど、矛盾した状況にあるときにゴールを閉じます。

import Mathlib.Algebra.Algebra.Basic -- `not_lt` などが使えるようにする

variable (P Q : Prop)

-- `False`
example (h : False) : P := by contradiction

-- 明らかに偽な等式
example (h : 2 + 2 = 3) : P := by contradiction

-- 明らかに偽な等式
example (x : Nat) (h : x ≠ x) : P := by contradiction

-- 矛盾する仮定
example (hP : P) (hnP : ¬ P) : Q := by contradiction

爆発律を利用するタクティクには他に exfalso もありますが、あちらはゴールを False に書き換えるだけで、ゴールを閉じるところまでは行いません。

補足

以下の例では、contradiction がいかにも通りそうに見えるのですが、通りません。contradiction にはあまり強力な前処理は備わっていないので、注意が必要です。

variable (n m : ℕ)

example (hl : n ≤ m) (hg : m < n) : False := by
  -- 明らかに矛盾に見えるが、 通らない
  fail_if_success contradiction

  -- 通らない理由は、 `n ≤ m` が `¬ m < n` を意味することを
  -- `contradiction` は知らないから。

  -- 次のようにして教えてあげると…
  have := hl.not_lt

  -- `contradiction` が通るようになる
  contradiction