让我们说我知道某些自然数字 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不好。
答案 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.