我正在解决一个引理,遇到一种情况,我必须证明次引理(true = false)。矛盾不起作用。我怎样才能实现这个目标? 另一个引理,与上面大致相同,我必须证明sub_lemma 0 = S n。帮助我关闭这些虚假陈述。
答案 0 :(得分:0)
幸运的是,除非您有证明错误的假设或假设,否则您实际上无法证明这些子引理。例如说我们有这个证明:
Import Nat.
Theorem impossible :
0 = 1.
Proof. Admitted.
如您所见,我们首先尝试证明一些不可能的事情。 0不等于1,因此如果我们要继续解释器或编译器,则必须接受证明。 相反,我们有证据表明出现是您的解决方案问题:
Theorem possible1 :
False ->
0 = 1.
Proof.
intro H.
exfalso.
apply H.
Qed.
我们有相同的证明,但是我们首先假设False
。 False
是Prop
(命题)类型的成员,这是Coq判断某项是否为True的核心。如果您可以将一组Prop
评估为True
状态,那么您就已经解决了证明(这大大简化了,我只是想把想法弄清楚)。
但是,如果我们假设False
为假设,则我们假设True
的倒数为True
。如果真是这样,那么现在应该证明可改善的一切都是可证明的。如果我们假设False
,我们可以证明任何事情。
不过,在第一个示例中,我们将0 = 1
和False
强制转换为exfalso
。然后,由于H正是我们的目标,因此我们可以应用H(或使用assumption
策略)。
Theorem possible2 :
False ->
0 = 1.
Proof.
intro H.
inversion H.
Qed.
反转是可以在此处使用的另一种有用策略。它还有许多其他有用的应用程序,但在假设False
的前提下,它可以用作简化目标的捷径。如果您对错误的假设应用反演,则它可以有效地完成与possible1
相同的任务,并为您完成目标。它认识到假设False
意味着您可以证明一切。
最后,我们可以延迟部分证明:
Theorem delay:
forall (n : nat),
n = S n.
Proof.
intros.
induction n.
- admit.
- rewrite <- IHn.
apply IHn.
(* Can't prove base case *)
Admitted.
从impossible
回想起我们必须使用Admitted
关键字来结束证明。我们必须使用Admitted
,因为不可能达到所有目标都满足的状态,因此我们不能使用Qed
退出证明状态。
但是,admit
策略将使您将证明推迟到以后。如果您将目标看作是彼此堆叠在一起的两个单独任务,则可以使用admit
将最下面的薄页移动到下面并转移到以后。但是,在退出证明或再次使用Admitted
之前,您必须回到那个转移的子引理。
编译器CoqC
在用IDE证明定理方面不如IDE有用,因此,我强烈建议您使用它。 (我当前的项目涉及Extraction,我认为它需要编译器,而IDE不支持。如果有人发表其他意见,我将删除此脚注)
答案 1 :(得分:0)
存在三种可能性:(1)您的初始陈述已经不可证明,或者(2)您在证明中间进行了转弯,导致您转到了无法证明的新子目标;或者(3)您的目标中有多种假设是相互矛盾的,但是您和基本的contradiction
策略都不认为这是矛盾的。要获得更多帮助,我们将需要进行完整的尝试。