コンテンツにスキップ

tactic と証明項の対応

tactic は証明を魔法のように作っているわけではありません. 各 tactic は,現在のゴールに対して,最終的には Lean のカーネルが検査できる証明項を構成します. Infoview ではゴールが変形されて見えますが,背後では「どのコンストラクタ,どの関数,どの定理を使って項を作るか」を指定していると考えるとよいです.

Chapter 02 で見た型の構成と対応させると,基本 tactic は次のように整理できます.

ゴールまたは仮定の形 主な tactic 対応する項・定義
P → Q∀ x, P x を示す intro 関数 fun h => ...,依存関数
P → Q∀ x, P x を使う apply,関数適用 証明を関数として適用する
P ∧ Q を示す constructorexact ⟨_, _⟩ And.intro
P ∧ Q を使う casesrcasesobtain And.leftAnd.right,パターン分解
P ↔ Q を示す constructor Iff.intro
P ↔ Q を使う rw.mp.mpr 両方向の含意を field として使う
P ∨ Q を示す leftright Or.inlOr.inr
P ∨ Q を使う matchcasesrcases Or のコンストラクタによる場合分け
∃ x, P x を示す useexact ⟨x, hx⟩ Exists.intro
False から任意の命題を示す exfalsocontradiction False.elim
a = b を示す rfl,既存補題 Eq.reflEq 型の証明
a = b を使う rwsubst 等式による置換
inductive 型を使う matchcasesinduction コンストラクタによる場合分け・帰納法
structure の等式を示す ext field ごとの等式

この対応を意識すると,tactic が失敗したときにも「いま必要なのは関数を作ることか,コンストラクタを使うことか,既存の等式で書き換えることか」を切り分けやすくなります. 以降の節では,この表の各行を具体例として見ていきます.