コンテンツにスキップ

関数・含意・全称命題: introapplyspecialize

含意 P → Q や全称命題 ∀ x, P x を示すときは,intro で仮定や変数を導入します. ゴールが P → Q なら intro hPhP : P をローカルコンテキストに追加し,ゴールを Q に変えます. ゴールが ∀ x : α, P x なら intro x は任意の x : α を導入し,ゴールを P x に変えます.

example (P Q : Prop) (hQ : Q) : P  Q := by
  intro _hP
  exact hQ

example (P : Nat  Prop) (h :  n : Nat, P n) : P 0 := by
  exact h 0

apply は,現在のゴールを証明するために使えそうな定理や仮定を適用します. ゴールが R で,hQR : Q → R があるとき,apply hQR により新しいゴールは Q になります. より一般には,結論が現在のゴールと一致するような定理を後ろ向きに使い,その定理の前提を新しいゴールとして残します.

example (P Q R : Prop) (hPQ : P  Q) (hQR : Q  R) (hP : P) : R := by
  apply hQR
  apply hPQ
  exact hP

全称命題を具体的な値に適用したいときは,関数適用のように書けます. specialize は,全称命題の仮定を特定の値に特殊化して,仮定そのものを書き換える tactic です. 次の例では,h : ∀ n, P n → Q nspecialize h 3 によって h : P 3 → Q 3 に変わります.

example (P Q : Nat  Prop) (h :  n : Nat, P n  Q n) (hP : P 3) : Q 3 := by
  specialize h 3
  exact h hP

演習

introexact だけで証明してください. 余裕があれば,term-style proof でも同じ命題を書いてください.

example (P Q : Prop) (hQ : Q) : P  Q := by
  sorry