从表面上看,我无法解决以下问题。这种归纳类型适用于偶数自然数和经过证明的引理,表示将两个偶数相加会产生偶数。
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”相同。帮助将不胜感激。
答案 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 n
和even 2
。使用前提和even
的定义,两者都应该很容易达到。