如何在Coq中使用证明的引理

时间:2020-05-31 09:18:52

标签: coq

从表面上看,我无法解决以下问题。这种归纳类型适用于偶数自然数和经过证明的引理,表示将两个偶数相加会产生偶数。

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是偶数的特殊情况:

Lemma lm_even2: forall n: nat, even n -> even (n + 2).

更通用的lm_even1在这里会派上用场,但是我一直在努力使用apply,rewrite等来表达lm_even2与“ p = 2”相同。帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

如果您(明确地)向我们展示您的尝试,则可能会得到更好的答案。仅有apply和其他一种或两种基本策略的简短证明,但也许您在某个地方有误会。从长远来看,纠正这种误解将对您更有帮助。


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

Lemma lm_even2: forall n: nat, even n -> even (n + 2).
Proof.
  intros.

现在证明状态为

1 subgoal
n : nat
H : even n
______________________________________(1/1)
even (n + 2)

现在我们可以apply lm_even1.了。 apply term.试图用目标统一term的类型,可能从左到右填充term的参数(如果是某种功能)。

例如,apply lm_even1.首先会尝试使用完整类型进行统一

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

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

forall p : nat, even ?n -> even p -> even (?n + p)

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

最后一个目标是可以实现目标的唯一目标:even (?n + ?p)?n = n?p = 2。如果我们没有引入变量,那么这根本就行不通,因为其他类型都不符合最初的目标。

Lemma lm_even2: forall n: nat, even n -> even (n + 2).
Proof.
  intros.
  apply lm_even1.

现在证明状态为

2 subgoals
n : nat
H : even n
______________________________________(1/2)
even n
______________________________________(2/2)
even 2

因此,我们有两个目标:even neven 2。使用前提和even的定义,两者都应该很容易达到。