👻

CoqのFixpointと帰納法を用いた証明

2020/09/20に公開

これまでの記事

前回:https://zenn.dev/emma_e_evans/articles/de3c743845c2cf2dd42d

Fixpoint

Fixpointでは再帰的な関数を定義することができます。
前回のnatとPreに対して,n回のPreを適用するnPreという関数を定義してみましょう。

Fixpoint nPre (n:nat) (m:nat): nat :=
 match n, m with
 | O, _ => n
 | l, O => l
 | S l, S k => nPre l k
 end.

帰納法を用いた証明

この関数を使用した次の命題「任意の自然数nに対して,ある自然数mが存在して,nにm回Preを適用すればOになる。」を証明します。この命題を仮にprop2とします。
前回は命題の証明を始める際にDefinitionコマンドを使いましたが,今回はExampleを使います。使い方は全く同じです。

Example prop2: forall n:nat, exists m:nat, nPre n m = O.
Proof.
intros. (* nを仮定に追加 *)
exists (S n). (* mの具体的な値としてS nをとる *)
induction n. (* nに関する帰納法で証明する *)
(* n=Oのとき,nPre O (S O) = Oを証明する *)
reflexivity. 
(* nPre n (S n) = Oが成り立つと仮定して,nPre (S n) (S (S n))が成り立つことを証明する *)
simpl.
apply IHn. (* 仮定を適用 *)
Qed.

上のように帰納法を使いたいときはinductionタクティクスを使えばOKです。

次回はandとorを含む命題の証明をします。

Discussion