我有以下引理并且证据不完整:
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
时,它只会降低到相同的最终目标。
我如何完成此证明?
答案 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
不是以n
或O
(它不是“构造函数为首”)开头,因此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