如何在Coq中证明这个简单的方程

时间:2014-11-27 00:21:09

标签: coq

我想在Coq中证明:

convert l' + 1 + (convert l' + 1) = convert l' + convert l' + 1 + 1

只有一些括号是多余的,不允许我使用reflexivity命令;那我该怎么办?

所有元素都是nat(自然)类型,因此convert l'是一个返回nat编号的函数,我不想使用像Omega等强大的策略。< / p>

2 个答案:

答案 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.,你就应该好好去。