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