我想在Coq中证明:
convert l' + 1 + (convert l' + 1) = convert l' + convert l' + 1 + 1
只有一些括号是多余的,不允许我使用reflexivity
命令;那我该怎么办?
所有元素都是nat
(自然)类型,因此convert l'
是一个返回nat编号的函数,我不想使用像Omega等强大的策略。< / p>
答案 0 :(得分:7)
Omega
非常有用,因为它可以让您继续使用证明中更有趣的部分,但是当一个人学习时,我个人觉得看到一个更简单的&#34;证明(欧米茄生成的证明条款往往很长且不可读)。
首先请注意,您需要使用plus
的关联性和交换性。使用Coq的搜索工具来查找有用的引理。使用_
作为外卡字符。您可以找到包含看起来像关联性的结构的lemmas:
SearchAbout (_ + (_ + _)= (_ + _) + _).
找到五个含有以下内容的词条:
plus_assoc: forall n m p : nat, n + (m + p) = n + m + p
以同样的方式,你可以找到
的交换性引理SearchAbout (_ + _ = _ + _).
这就是:
plus_comm: forall n m : nat, n + m = m + n
您无法直接应用它们,但您可以使用rewrite
策略来处理术语的子部分。我建议你玩它来了解它是如何工作的。
这是所需引理的证明。
Require Import Arith.
Lemma nat_lemma: forall n, n + 1 + (n + 1) = n + n + 1 + 1.
intro n.
repeat rewrite <- plus_assoc. (* n + (1 + (n + 1)) = n + (n + (1 + 1)) *)
rewrite (plus_comm 1 (n+1)). (* uses (1 + (n + 1) = (n + 1) + 1 *)
repeat rewrite plus_assoc.
reflexivity.
Qed.
现在用这个引理证明你的定理。
答案 1 :(得分:0)
您可以使用omega
策略。只需在文件开头Require Import Omega.
,你就应该好好去。