n m : nat
Coq で が隣接する偶数であると言う方法の 1 つは、その関係を 0 と 2 から帰納的に定義することです。
Inductive adj_ev : nat -> nat -> Prop :=
| ae_0 : adj_ev 0 2
| ae_1 : forall ( n m : nat ), adj_ev n m -> adj_ev m ( S ( S m ) )
| ae_2 : forall ( n m : nat ), adj_ev n m -> adj_ev m n.
ae_0
0 と 2 が隣接する偶数であることを示します。ae_1
は、いくつかn m : nat
が隣接する偶数である場合、 と もそうであるm
と述べていm + 2
ます。これら 2 つのコンストラクターを使用すると、隣接する偶数のすべてのペアを無限大までカバーできます。ちょっと待って!これはn
、 のm
場合にのみ機能しn < m
ます。ae_2
したがって、リレーション内の特定の数値ペアを反転 する最後のコンストラクターが必要です。
リレーションを定義したので、それが機能することを確認するためにサニティ チェックを行います。adj_ev 1 3
たとえば、1 と 3 は隣り合った偶数ではないことを知っていますadj_ev
。だから私は確かにそれを証明~ ( adj_ev 1 3 )
できますよね?
Theorem test' : ~ ( adj_ev 1 3 ).
unfold not. intros H.
inversion H. inversion H0.
数回反転した後、すぐに無限ループに陥ります。Coq に「どうすれば隣接して偶数になるn
ことができるのか?」と尋ねているようなものです。m
Coq は、「まあ、おそらくandm
はn
隣接しており...」と答えます。Coq は、「まあ、おそらく隣接しており、さらには...」と無限に言います。m
n
n
m
一般的な問題は、いくつかの帰納的に定義された対称関係があるR
場合、 が実際に成り立つ場所で成り立つことを示すのは簡単ですR
が、成り立たない場所で成り立たないことを示すのは難しいことです。このような場合、矛盾を抽出するよりも優れた戦術があるinversion
かもしれませんが、それが何であるかはわかりません。
何かご意見は?