次の定理を証明せよ。(ringタクティックやomegaタクティックを用いても構わない。)
Require Import Arith.
Fixpoint sum_odd(n:nat) : nat :=
match n with
| O => O
| S m => 1 + m + m + sum_odd m
end.
Goal forall n, sum_odd n = n * n.
Proof.
(* ここに証明を書く *)
Qed.
ヒント
次の定理を証明せよ。 (出典 : anarchy proof)
Require Import Lists.List.
Fixpoint sum (xs: list nat) : nat :=
match xs with
| nil => 0
| x :: xs => x + sum xs
end.
Theorem Pigeon_Hole_Principle :
forall (xs : list nat), length xs < sum xs -> (exists x, 1<x /\ In x xs).
Proof.
(* ここに証明を書く *)
Qed.
ヒント
以下のテンプレートを参考にしてもよい。
(* コンストラクタの名前は例えば、SOとSにするとよい。 *)
Inductive pos : Set :=
(* posの定義を書く *) .
Fixpoint plus(n m:pos) : pos := (* plusの定義を書く *) .
Infix "+" := plus.
Theorem plus_assoc : forall n m p, n + (m + p) = (n + m) + p.
Proof.
(* 証明を書く *)
Qed.
ヒント
足し算が左側の数に関する帰納法で定義されているとき、足し算の結合性は一番左の数に関する帰納法のみで証明できます。(中央と右の数に関する帰納法は必要ありません。)
次の定理を証明せよ。
Theorem FF: ~exists f, forall n, f (f n) = S n.
Proof.
(* ここに証明を書く *)
Qed.
次の定理を証明せよ。
Inductive Tree:Set :=
| Node: list Tree -> Tree.
Theorem Tree_dec: forall a b:Tree, {a=b} + {a<>b}.
Proof.
(* ここに証明を書く *)
Qed.
帰納法はCoqの核となる部分ですが、ここでは基本的な練習ができる3問と発展的な2問を用意してみました。
問12以外にも、anarchy proofには帰納法に関連する練習問題がいくつかあります。帰納法がメインの問題と思われるものをいくつか抜き出してみます。