首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Coq中如何使用证明引理

Coq中如何使用证明引理
EN

Stack Overflow用户
提问于 2020-05-31 09:18:52
回答 1查看 373关注 0票数 0

虽然我看上去很初级,但我解决不了以下问题。对于偶数自然数有这种归纳类型,并且有一个证明引理,表示增加两个偶数会产生一个偶数。

代码语言:javascript
复制
Inductive even : nat -> Prop :=
| O_even : even 0
| plus_2_even : forall n:nat, even n -> even (S (S n)).

Lemma lm_even1: forall n p:nat, even n -> even p -> even (n + p).

我想证明n+2是偶数的特例:

代码语言:javascript
复制
Lemma lm_even2: forall n: nat, even n -> even (n + 2).

更一般的lm_even1在这里会派上用场,但我一直在使用apply、Re书面等方法来表示lm_even2是与"p = 2“相同的语句,但一直失败。我会感谢你的帮助。

EN

Stack Overflow用户

回答已采纳

发布于 2020-05-31 09:52:58

如果你(明确地)告诉我们你尝试过什么,你可能会得到一个更好的答案。有一个简短的证据,只有apply和其他一两个基本战术,但也许你有一个误解的地方。从长远来看,纠正这种误解对你会更有帮助。

我们应该首先介绍所有的前提。有一个很好的理由,我将在下面讨论。

代码语言:javascript
复制
Lemma lm_even2: forall n: nat, even n -> even (n + 2).
Proof.
  intros.

现在证明的是

代码语言:javascript
复制
1 subgoal
n : nat
H : even n
______________________________________(1/1)
even (n + 2)

现在我们处于apply lm_even1.的位置。apply term.试图将term类型与目标统一起来,可能从左到右向term填充参数(如果是某种函数的话)。

因此,例如,apply lm_even1.将首先尝试与完整类型统一

代码语言:javascript
复制
forall n p : nat, even n -> even p -> even (n + p)

然后尝试使用一些变量作为第一个参数(类型为nat):

代码语言:javascript
复制
forall p : nat, even ?n -> even p -> even (?n + p)

peven ?n -> even ?p -> even (?n + ?p)也是如此。接下来,由于这仍然是一个函数类型,所以它可以通过使用一些未知变量even ?n类型的参数来继续:even ?p -> even (?n + ?p),最后是even (?n + ?p)

唯一能够与目标相匹配的是最后一个目标:even (?n + ?p)?n = n?p = 2。如果我们没有引入变量,这将根本无法工作,因为其他类型都不符合最初的目标。

代码语言:javascript
复制
Lemma lm_even2: forall n: nat, even n -> even (n + 2).
Proof.
  intros.
  apply lm_even1.

现在证明的是

代码语言:javascript
复制
2 subgoals
n : nat
H : even n
______________________________________(1/2)
even n
______________________________________(2/2)
even 2

所以我们有两个目标:even neven 2。两者都应该是相当容易达到的前提和定义的even

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62114039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档