如何解决陈述中的矛盾

时间:2020-06-23 06:04:25

标签: coq

我正在解决一个引理,遇到一种情况,我必须证明次引理(true = false)。矛盾不起作用。我怎样才能实现这个目标? 另一个引理,与上面大致相同,我必须证明sub_lemma 0 = S n。帮助我关闭这些虚假陈述。

2 个答案:

答案 0 :(得分:0)

幸运的是,除非您有证明错误的假设或假设,否则您实际上无法证明这些子引理。例如说我们有这个证明:

Import Nat.

Theorem impossible :
  0 = 1.
Proof. Admitted.

如您所见,我们首先尝试证明一些不可能的事情。 0不等于1,因此如果我们要继续解释器或编译器,则必须接受证明。 相反,我们有证据表明出现是您的解决方案问题:

Theorem possible1 :
  False ->
  0 = 1.
Proof.
  intro H.
  exfalso.
  apply H.
Qed.

我们有相同的证明,但是我们首先假设FalseFalseProp(命题)类型的成员,这是Coq判断某项是否为True的核心。如果您可以将一组Prop评估为True状态,那么您就已经解决了证明(这大大简化了,我只是想把想法弄清楚)。 但是,如果我们假设False为假设,则我们假设True的倒数为True。如果真是这样,那么现在应该证明可改善的一切都是可证明的。如果我们假设False,我们可以证明任何事情。 不过,在第一个示例中,我们将0 = 1False强制转换为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策略都不认为这是矛盾的。要获得更多帮助,我们将需要进行完整的尝试。