apply

apply は含意 をゴールに適用するタクティクです.ゴールが ⊢ Q で,ローカルコンテキストに h : P → Q があるときに,apply h を実行するとゴールが ⊢ P に書き換わります.

「十分条件でゴールを置き換える」タクティクであると言えますが,十分条件がローカルコンテキストに存在しない場合は suffices の使用も検討してください.

variable (P Q : Prop)

/-- `P → Q` かつ `P` ならば `Q` -/
example (h : P → Q) (hP : P) : Q := by
  apply h

  -- ゴールが `P` に変わっている
  show P

  exact hP

注意点として,h : P → QP の証明を受け取って Q の証明を返す関数でもあるので,上記の例は apply を使わずに exact h hP で閉じることもできます.

example (h : P → Q) (hP : P) : Q := by
  exact h hP

さらに exact の代わりに apply を使うこともできます.

example (h : P → Q) (hP : P) : Q := by
  apply h hP

また,Lean では否定 ¬ PP → False として実装されているため,ゴールが ⊢ False であるときに hn : ¬P に対して apply hn とするとゴールが ⊢ P に書き換わります.

-- P の否定は,「P を仮定すると矛盾する」ということに等しい
example : (¬ P) = (P → False) := by rfl

example (hn : ¬ P) (hP : P) : False := by
  apply hn
  show P
  exact hP

補足

一般に,apply は関数適用を逆算するタクティクです.手元に関数 f : A → B があって型 B の型を作りたいとき,A の項を構成すれば f に適用することで B の項が得られる…といった推論を行います.

-- 関数をタクティクを使用して構成する例
def apply {α β : Type} (f : α → β) (a : α) : β := by
  apply f
  exact a