定義と、その展開


Definitionコマンドを使って型や、関数を定義することができるが、証明の中で、定義に戻って展開したくなる時がある。

例えば次のような2足す関数を定義して、それを二回適用すると4になるような定理を証明したい場合を考える。

Welcome to Coq 8.1 (Feb. 2007)

Coq < Definition ss n := n + 2.
ss is defined

Coq < Theorem ssssO_is_four : ss (ss 0) = 4.
1 subgoal

  ============================
   ss (ss 0) = 4

ssssO_is_four < Proof.

ssssO_is_four <

これを証明するために ss を定義にしたがって展開したいなと思ったら、unfoldというタクティックが非常に便利である。

文法 : unfold [定義されたものの名前].

ためしにやってみよう。

ssssO_is_four < unfold ss.
1 subgoal

  ============================
   0 + 2 + 2 = 4

ssssO_is_four <

ssが展開されてプラスの形になったのがわかるだろう。
じゃあここでさらにプラスも展開してみよう '+' 記号によってあらわされるこれは、実は内部では plus 関数として扱うことができる。
この plus に関してunfoldをかけてみよう。

ssssO_is_four < unfold plus.
1 subgoal

  ============================
   4 = 4

ssssO_is_four <

じゃーん!
これで、示すべきゴールの形は大分シンプルな形になった。
ここで、 reflexivity タクティックを使うと、ゴールを示すことができる。
「ゴールがイコールの形ならば、reflexivityタクティックを使えばいい」、と覚えておこう。

ssssO_is_four < reflexivity.
Proof completed.

完成!!