CoQ中的良好感应

时间:2016-05-29 20:36:10

标签: coq induction

让我们说我知道某些自然数字 good 。我知道1是好的,如果n是好的那么3n是,如果n是好的那么n + 5是,那些只是构建好数的方法。在我看来,在Coq中对此进行充分的形式化是

Inductive good : nat -> Prop :=
  | g1 : good 1
  | g3 : forall n, good n -> good (n * 3)
  | g5 : forall n, good n -> good (n + 5).

然而,尽管显而易见,0不好的事实似乎不能证明使用这个定义(因为当我反转时,在g3的情况下我只在假设中得到相同的东西)。

现在,完全是好数字并不是那么明显。而且看起来我并不需要完全表征它们以便知道0不好。例如,我可以通过做几次反转来知道2不好。

2 个答案:

答案 0 :(得分:4)

这个问题需要归纳。归纳需要一些谓词P : nat -> Prop才能使用。像(fun n => ~good 0)这样的原始(常量)谓词不会给你太多:你将无法证明1(对应于构造函数g1)的基本情况,因为谓词“忘记”它的论点。

所以你需要证明一些逻辑等价(或更强)的陈述,这些陈述很容易给你必要的谓词。 此类等效语句的示例是forall n, good n -> n > 0,您稍后可以使用它来反驳good 0。相应的谓词P(fun n => n > 0)

Require Import Coq.Arith.Arith.
Require Import Coq.omega.Omega.

Inductive good : nat -> Prop :=
  | g1 : good 1
  | g3 : forall n, good n -> good (n * 3)
  | g5 : forall n, good n -> good (n + 5).

Lemma good_gt_O: forall n, good n -> n > 0.
Proof.
  intros n H. induction H; omega.
Qed.

Goal ~ good 0.
  intro H. now apply good_ge_O in H.
Qed.

以下是上述等同性的证明:

Lemma not_good0_gt_zero_equiv_not_good0 :
  (forall n, good n -> n > 0) <-> ~ good 0.
Proof.
  split; intros; firstorder.
  destruct n; [tauto | omega].
Qed.

并且很容易证明@ {eponier的答案中隐含出现的forall n, n = 0 -> ~ good n也等同于~ good 0

Lemma not_good0_eq_zero_equiv_not_good0 :
  (forall n, n = 0 -> ~ good n) <-> ~ good 0.
Proof.
  split; intros; subst; auto.
Qed.

现在,用于证明forall n, n = 0 -> ~ good n的相应谓词是fun n => n = 0 -> False。这可以通过使用由Coq自动生成的goal_ind归纳原理的手动应用来显示:

Example not_good_0_manual : forall n, n = 0 -> ~ good n.
Proof.
  intros n Eq contra.
  generalize Eq.
  refine (good_ind (fun n => n = 0 -> False) _ _ _ _ _);
    try eassumption; intros; omega.
Qed.

generalize Eq.引入n = 0作为当前目标的前提。如果没有它,证明的目标将是False,相应的谓词将再次成为枯燥的fun n => False

答案 1 :(得分:4)

在尝试反驳(^\/\/.*)|(\s+\/\/.*)|((\/\*)(.|\n)+?(\*\/)) 时,g3确实可以无限次地应用good 0。这就是为什么我们可以认为这个证明需要induction(我们可以看到@AntonTrunov解决方案中所需的辅助引理使用归纳法)。同样的想法用于http://www.cis.upenn.edu/~bcpierce/sf/current/Imp.html#lab428的定理loop_never_stop

Require Import Omega.

Example not_good_0 : ~ good 0.
Proof.
  intros contra. remember 0 as n. induction contra.
  discriminate. apply IHcontra. omega. omega.
Qed.