如果你看到一个不可能的目标,有两种可能性:要么你的证明策略有误(也许你的引理是错误的),要么假设是矛盾的。
如果您认为假设是矛盾的,您可以将目标设置为False
,以消除一些复杂性。elimtype False
实现了这一点。通常,您False
通过证明一个命题P
及其否定来证明~P
;该策略从和absurd P
推断出任何目标。如果有一个特定的假设是矛盾的,则将目标设置为 如果一个特定的假设显然是矛盾的,或者只是将证明任何目标。P
~P
contradict H
~H
~A
A
~ ~A
contradiction H
contradiction
有许多策略涉及归纳类型的假设。弄清楚使用哪一个主要是经验问题。以下是主要的(但您很快就会遇到此处未涉及的情况):
destruct
简单地将假设分解为几个部分。它丢失了有关依赖关系和递归的信息。一个典型的例子是destruct H
where H
is 一个连词H : A /\ B
,它分裂成两个独立的类型和H
假设;或者对偶where是析取,它将证明分成两个不同的子证明,一个带有假设,一个带有假设。A
B
destruct H
H
H : A \/ B
A
B
case_eq
类似于destruct
,但保留了假设与其他假设的联系。例如,destruct n
wheren : nat
将证明分为两个子证明,一个 forn = 0
和一个 for n = S m
。如果n
用于其他假设(即您有 a H : P n
),您可能需要记住,n
您已破坏的 与n
这些假设中使用的相同:case_eq n
这样做。
inversion
对假设的类型进行案例分析。当假设类型中存在destruct
会忘记的依赖关系时,它特别有用。您通常会case_eq
在假设中使用Set
(平等相关)和inversion
假设中Prop
(具有非常依赖的类型)。该inversion
策略留下了很多平等,并且通常遵循subst
简化假设。该inversion_clear
策略是一种简单的替代方法,inversion; subst
但会丢失一些信息。
induction
意味着您将通过对给定假设的归纳(=递归)来证明目标。例如,induction n
wheren : nat
表示您将执行整数归纳并证明基本情况(n
替换为0
)和归纳情况(n
替换为m+1
)。
你的例子很简单,你可以证明它“通过案例分析很明显a
”。
Lemma has2b2: forall a:three, a<>zero/\a<>one ->a=two.
Proof. destruct a; tauto. Qed.
但是让我们看一下该destruct
策略产生的案例,即intros; destruct a.
. (is 的情况a
是one
对称的;最后一种情况a
istwo
是自反性显而易见的。)
H : zero <> zero /\ zero <> one
============================
zero = two
这个目标看起来是不可能的。我们可以将这一点告诉 Coq,在这里它可以自动发现矛盾(zero=zero
很明显,其余的是该策略处理的一阶重言式tauto
)。
elimtype False. tauto.
事实上tauto
,即使你不告诉 Coq 不要担心目标并且在tauto
没有第一个目标的情况下编写elimtype False
(IIRC 在旧版本的 Coq 中没有),实际上也是有效的。您可以tauto
通过编写info tauto
. Coq 会告诉你该tauto
策略生成了什么证明脚本。这不是很容易理解,所以让我们看一下这个案例的手动证明。首先,让我们将假设(即合取)一分为二。
destruct H as [H0 H1].
我们现在有两个假设,其中之一是zero <> zero
。这显然是错误的,因为它的否定zero = zero
显然是正确的。
contradiction H0. reflexivity.
我们可以更详细地了解该contradiction
策略的作用。(info contradiction
会揭示场景下发生的事情,但同样对新手不友好)。我们声称目标是正确的,因为假设是矛盾的,所以我们可以证明任何事情。因此,让我们将中间目标设置为False
。
assert (F : False).
跑去red in H0.
看看那zero <> zero
是真正的符号~(zero=zero)
,它又被定义为含义zero=zero -> False
。False
的结论也是如此H0
:
apply H0.
zero=zero
现在我们需要证明
reflexivity.
现在我们已经证明了我们的断言False
。剩下的就是证明这False
意味着我们的目标。好吧,False
意味着任何目标,这就是它的定义(False
定义为 0 case 的归纳类型)。
destruct F.