这与(+)
定义的方式有关。您可以(+)
通过关闭符号来访问 的基础定义(在 CoqIDE 中View > Display notations
),看到符号(+)
对应于函数Nat.add
,然后调用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
您可以看到它(+)
是通过匹配它的第一个参数来定义的,其中 inn + 1
是变量n
。因为n
不以O
or开头S
(它不是“以构造函数为首的”),所以match
不能减少。这意味着您将无法仅通过说这两个事物计算为相同的范式(这就是所reflexivity
声称的)来证明相等性。
相反,您需要向 coq 解释为什么对于任何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
Nat.add_1_r: forall n : nat, n + 1 = S n