use*_*035 3 coq logical-foundations
我试图证明以下引理:
\n\nInductive even : nat \xe2\x86\x92 Prop :=\n| ev_0 : even 0\n| ev_SS (n : nat) (H : even n) : even (S (S n)).\n\nLemma even_Sn_not_even_n : forall n,\n even (S n) <-> not (even n).\nProof.\n intros n. split.\n + intros H. unfold not. intros H1. induction H1 as [|n\' E\' IHn].\n - inversion H.\n - inversion_clear H. apply IHn in H0. apply H0.\n + unfold not. intros H. induction n as [|n\' E\' IHn].\n -\nQed.\n
Run Code Online (Sandbox Code Playgroud)\n\n这是我最后得到的:
\n\n1 subgoal (ID 173)\n\nH : even 0 -> False\n============================\neven 1\n
Run Code Online (Sandbox Code Playgroud)\n\n我希望 coq 将“偶数 0”评估为 true,将“偶数 1”评估为 false。我尝试过simpl
,apply ev_0 in H.
但他们给出了错误。该怎么办?
小智 6
simpl in H.\n
Run Code Online (Sandbox Code Playgroud)\n\n上面的代码将不起作用。
\n\neven
《逻辑基础》一书中对 的定义是:
Inductive even : nat \xe2\x86\x92 Prop :=\n| ev_0 : even 0\n| ev_SS (n : nat) (H : even n) : even (S (S n)).\n
Run Code Online (Sandbox Code Playgroud)\n\neven 0
是一个 Prop,而不是 bool。看起来您正在混淆类型True
和False
以及布尔值true
和false
。它们是完全不同的东西,并且在 Coq 的逻辑下不能互换。简而言之,even 0
不简化为true
或True
或任何东西。这只是even 0
。如果你想even 0
在逻辑上显示 is true,你应该构造一个该类型的值。
我不记得 LF 中当时可以使用哪些策略,但这里有一些可能性:
\n\n(* Since you know `ev_0` is a value of type `even 0`,\n construct `False` from H and destruct it.\n This is an example of forward proof. *)\nset (contra := H ev_0). destruct contra.\n\n(* ... or, in one step: *)\ndestruct (H ev_0).\n\n(* We all know `even 1` is logically false,\n so change the goal to `False` and work from there.\n This is an example of backward proof. *)\nexfalso. apply H. apply ev_0.\n
Run Code Online (Sandbox Code Playgroud)\n