Falseの証明(その2)
Coqで、次の述語を考えてみます。
Inductive is0P : nat -> Prop := is0P_0 : is0P 0.
is0P
は、「自然数が0である」という意味の述語になります。
is0P 1 -> False
の証明
is0P 1
は成り立たないのですが、not (is0P 1)
すなわちis0P 1 -> False
を証明してみましょう。
通常の方法で証明すると次のようになります。
Example not01 : is0P 1 -> False.
Proof.
intros. inversion H.
Qed.
証明項を直接作ろうとすると次のようになります。
fun H : is0P 1 =>
match H in (is0P n)
return
match n with
| 0 => True
| S _ => False
end
with
| is0P_0 => I
end
: is0P 1 -> False
なぜこれで証明ができるのかを、私の理解している範囲で説明します。match
は次の順番で処理されているようです。
-
match H ...
となっているのでH
の型から対応するInductive
を割り出し、コンストラクタを思い出す - 1.で思い出したコンストラクタのすべてが
with
の後に来ていることを確認。H
の型はis0P 1
なのでコンストラクタはis0P_0
のみ。 - コンストラクタ毎に指定された式を分岐と呼ぶ。この場合は
I
のみ。 - それぞれの分岐が
in ... return ...
で指定された型になっているかを確認する。in
とreturn
を使って分岐の型を確認する方法は後述する。ここではI
がin ... return ...
で指定された型になっている。 -
H
の型とin ...
を見比べてreturn ...
に出てくるn
を求める。この場合、H
の型はis0P 1
で、in
で指定されているのはis0P n
なのでこれらを見比べるとn
は1
となる。 - 5.で求めた
n
をreturn ...
に当てはめて、このmatch
式の型とする。今回は、return
で指定された部分のn
を1
とすることで、型はmatch 1 with | 0 => True | S _ => False end
となる。これはCheck
コマンド等ではFalse
と表示される式である。
上記の手順で使っている「分岐の型の確認方法」は次の通り。
- 分岐に対応するパターンの型と
in ...
を見比べる。今回は、パターンはis0P_0
でその型はis0P 0
である。また、in
にはis0P n
が指定されているのでn
は0
となる。 - 1.で求めた
n
をreturn ...
に当てはめて、分岐の型とする。この場合は、match 0 with | 0 => True | S _ => False end
となる。 - 2.で求めた型を分岐が持っているかを確かめる。この場合は
I
がmatch 0 with | 0 => True | S _ => False end
という型かを調べ、OKということになる。
return ...
で指定する式は変数n
を含んでいて、分岐の型を確認する際には分岐毎にn
の値を変えながら確認するというのがポイントのようです。
Author And Source
この問題について(Falseの証明(その2)), 我々は、より多くの情報をここで見つけました https://qiita.com/lion/items/e821edd2abc73d10bf23著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .