itauto

itauto は、直観主義論理(intuitionistic logic)の範囲内でトートロジー(tautology)を証明します。

命題論理を扱うタクティクには他にも tauto がありますが、あちらは選択原理 Classical.choice を勝手に使用することがあります。なお選択原理は Lean が標準で用意している公理のひとつで、排中律 P ∨ ¬ P や二重否定の除去 ¬ ¬ P → P を示すのに必要です。

import Mathlib.Tactic.ITauto
import Mathlib.Tactic.Tauto

-- 命題とその否定は同値ではない
-- itauto で示したバージョン
theorem not_iff_not₀ (p : Prop) : ¬ (p ↔ ¬ p) := by itauto

-- tauto で示したバージョン
theorem not_iff_not₁ (p : Prop) : ¬ (p ↔ ¬ p) := by tauto

-- 選択原理に依存していない
/-- info: 'not_iff_not₀' does not depend on any axioms -/
#guard_msgs in #print axioms not_iff_not₀

-- 勝手に選択原理を使用している!
/-- info: 'not_iff_not₁' depends on axioms: [propext, Classical.choice, Quot.sound] -/
#guard_msgs in #print axioms not_iff_not₁

tauto と同様に、扱えるのは命題論理のトートロジーだけです。述語論理は扱えないことがあります。

/-- 排中律の二重否定 -/
example (P : Prop) : ¬¬ (P ∨ ¬ P) := by
  -- `itauto` で示せる
  itauto

example : ∀ (P : Prop), ¬¬ (P ∨ ¬ P) := by
  -- 量化されただけで `itauto` で示せなくなる
  fail_if_success itauto

  intro P hP

  -- 量化がなくなると扱えるようになる
  itauto