TL;DR
- Lean では の否定を
¬ Pと書き、P → Falseという含意として定義している。 - 矛盾からは何でも示せるので、
contradictionやexfalsoタクティクで矛盾を使った証明を書ける。
内容
否定の定義
Lean では命題 の否定を ¬ P と書く。数学では「 を仮定すると矛盾するから、 は偽である」という推論をよく行う。Lean の ¬ P はこの考え方で定義されており、P → False という含意そのものである。
example (P : Prop) : (¬ P) = (P → False) := by
rfl¬ P は含意なので、¬ P を使うときは apply、¬ P を示すときは intro を使える。
/-- P と ¬ P を同時に仮定すると矛盾する -/
example (P : Prop) (hnp : ¬ P) (hp : P) : False := by
-- ¬ P は P → False に等しいので、P を示せばよい
apply hnp
exact hp/-- 対偶が元の命題と同値であることの、片方のケース -/
example (P Q : Prop) (h : P → ¬ Q) : Q → ¬ P := by
-- Q → ¬ P を示したいので Q を仮定する
intro hq
-- ¬ P は P → False に等しいので、P を仮定する
intro hp
-- h : P → Q → False に適用して False を得る
exact h hp hqcontradiction タクティク
と が両方あるときは矛盾が導かれる。矛盾からは何でも示せるので、 と があれば何でも示せる。Lean では contradiction でこれを表せる。
example (P : Prop) (hnp : ¬ P) (hp : P) : False := by
contradictionexfalso タクティク
矛盾からは何でも示せるので、証明のどの時点でもゴールを ⊢ False に置き換えてよい。こうすると証明が読みやすくなることがある。Lean では exfalso で置き換える。
example (P Q : Prop) (hnp : ¬ P) (hp : P) : Q := by
exfalso
contradiction