我正在尝试证明以下引理-
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修改为归纳数据类型?如果没有,该如何解决?
答案 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
毫无意义。接下来,Fixpoint
与if 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
首个模式匹配然后才检查a
。 b
的破坏使计算不受阻碍,并让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