Coq:prove Prop隐含自然数的算术关系

时间:2018-09-29 20:17:30

标签: math coq proof prop

我正在尝试证明以下引理-

Lemma less_than_two_equivalent: forall x, less_than_two x = true -> x < 2. 

基于以下定义。

Fixpoint less_than (a b:nat): bool:=
match a, b with
|0, 0 => false
|0, _ => true
|S a', 0 => false
|S a', S b' => less_than a' b'
end.

Fixpoint less_than_two (x:nat) : bool  := if less_than x 2 then true else false.

从数学上讲,只有2种情况,0或1。destruction应该是锤子,但关于S x的信息不足,无法进行进一步的推理。

是否应将less_than修改为归纳数据类型?如果没有,该如何解决?

1 个答案:

答案 0 :(得分:1)

让我首先重新定义ModuleNotFoundError: No module named 'prompt_toolkit.formatted_text' [W 22:16:31.449 NotebookApp] KernelRestarter: restart failed [W 22:16:31.450 NotebookApp] Kernel e25f532c-ce0f-4ac3-bc3c-4b54864d0994 died, removing from map. [W 22:17:16.442 NotebookApp] Timeout waiting for kernel_info reply from e25f532c-ce0f-4ac3-bc3c-4b54864d0994 [E 22:17:16.447 NotebookApp] Error opening stream: HTTP 404: Not Found (Kernel does not exist: e25f532c-ce0f-4ac3-bc3c-4b54864d0994) ^C[I 22:17:50.731 NotebookApp] interrupted 。首先,它不是递归的,因此将其定义为less_than_two毫无意义。接下来,Fixpointif less_than x 2 then true else false基本相同。在这一点上,我不会介意引入新的定义,因此您的引理变成了

less_than x 2

我不知道您的证明究竟出了什么问题,但是您可能忘记了再破坏一次Lemma less_than_two_equivalent x: less_than x 2 = true -> x < 2. Proof. do 2 (destruct x; auto); simpl. destruct x; discriminate. Qed. 。看到x时,您仍然无法使用less_than x 0 = true -> S (S x) < 2完成目标,因为对变量的求值被阻止了-discriminate参数的less_than首个模式匹配然后才检查ab的破坏使计算不受阻碍,并让Coq看到您以x为前提,因此该目标成为可证明的。

请注意,这取决于比较功能的特定实现。你选择了这个吗?

false = true

您将得到一个更简单的证明(少一个(* (!) the [struct] annotation is important here, as well as as the order of the parameters [b, a] in the match expression *) Fixpoint less_than' (a b : nat) {struct b} : bool := match b, a with | 0, _ => false | _, 0 => true | S b', S a' => less_than' a' b' end. ):

destruct