我怎样才能重写" + 1" (加一)到" S" (succ)在Coq?

时间:2016-10-28 21:55:12

标签: coq coq-tactic successor-arithmetics

我有以下引理并且证据不完整:

Lemma (s_is_plus_one : forall n:nat, S n = n + 1).
Proof.
  intros.
  reflexivity.
Qed.

此证明失败

Unable to unify "n + 1" with "S n".

似乎eq_S可以证明这一点,但我无法应用它(它不会将n + 1识别为S n:{{ 1}})。我也试过了Error: Unable to find an instance for the variable y.,但它无法找到关系。当我使用ring时,它只会降低到相同的最终目标。

我如何完成此证明?

1 个答案:

答案 0 :(得分:10)

这与(+)的定义方式有关。你可以通过关闭符号来访问(+)的基础定义(在View > Display notations中的CoqIDE中),看到符号(+)对应于函数Nat.add然后调用{ {1}}给你:

Print Nat.add

您可以看到Nat.add = fix add (n m : nat) {struct n} : nat := match n with | O => m | S p => S (add p m) end 是通过匹配(+)中变量n + 1的第一个参数来定义的。由于n不是以nO(它不是“构造函数为首”)开头,因此S无法减少。这意味着你不能仅仅通过说两个事物计算到相同的正常形式(这是match声称的那个)来证明平等。

相反,您需要向coq解释为什么对于任何reflexivity而言,相等性将成立。像n这样的递归函数的典型举措是继续Nat.add的证明。它确实在这里完成了工作:

induction

另一方面,您可以注意到另一方面Lemma s_is_plus_one : forall n:nat, S n = n + 1. Proof. intros. induction n. - reflexivity. - simpl. rewrite <- IHn. reflexivity. Qed. 是构造函数的,这意味着如果只有1而不是1 + n,匹配就会触发。好吧,我们很幸运,因为在标准库中,有人已经证明n + 1是可交换的,所以我们可以使用它:

Nat.add

最后一种选择:使用Lemma s_is_plus_one : forall n:nat, S n = n + 1. Proof. intros. rewrite (Nat.add_comm n 1). reflexivity. Qed. ,我们可以找到所有关于某个变量SearchAbout (?n + 1)的模式?n + 1的定理(问号在这里很重要)。第一个结果是真正相关的引理:

?n