这个问题需要归纳法。而归纳法需要一些谓词
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
。
存在n,n ^ 3 == x
。 - ejgallego3^k
是3的幂。n^3
是n的立方。 - Anton Trunov