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