使用Omega来证明Coq中的引理

时间:2012-12-03 19:20:29

标签: coq proof induction

我正在尝试使用Omega在Coq中进行证明。我花了很多时间,但没有任何事情发生在我身上。我不得不说我是Coq的新手,所以我对这种语言并不放心,而且我没有多少经验。但我正在研究它。

以下是我必须证明的代码:

Require Import Arith Omega.

Fixpoint div2 (n : nat) :=
 match n with
   S (S p) => S (div2 p)
 | _ => 0
 end.

Fixpoint mod2 (n : nat) :=
 match n with
   S (S p) => mod2 p
 | x => x
 end.

为了证明这一点,我认为首先通过归纳法证明这一问题是有帮助的:

Lemma div2_eq : forall n, 2 * div2 n + mod2 n = n.

然后这个,使用omega和div2_eq:

Lemma div2_le : forall n, div2 n <= n.

但我没有办法进一步。

有谁知道该怎么做?

1 个答案:

答案 0 :(得分:3)

您可以轻松地从函数div2mod2中获取归纳原则,如下所示:

Functional Scheme div2_ind := Induction for div2 Sort Prop.
Functional Scheme mod2_ind := Induction for mod2 Sort Prop.

div2_indmod2_ind或多或少有类型:

forall P1,
  P1 0 0 ->
  P1 1 0 ->
  (forall n1, P1 n1 (div2 n1) -> P1 (S (S n1)) (S (div2 n1))) ->
  forall n1, P1 n1 (div2 n1)

forall P1,
  P1 0 0 ->
  P1 1 1 ->
  (forall n1, P1 n1 (mod2 n1) -> P1 (S (S n1)) (mod2 n1)) ->
  forall n1, P1 n1 (mod2 n1)

要应用这些定理,您可以方便地写functional induction (div2 n)functional induction (mod2 n),通常可以写induction n

但更强的归纳原则与这些功能有关:

Lemma nat_ind_alt : forall P1 : nat -> Prop,
  P1 0 ->
  P1 1 ->
  (forall n1, P1 n1 -> P1 (S (S n1))) ->
  forall n1, P1 n1.
Proof.
intros P1 H1 H2 H3. induction n1 as [[| [| n1]] H4] using lt_wf_ind.
  info_auto.
  info_auto.
  info_auto.
Qed.

事实上,任何函数的领域都是有用的归纳原理的线索。例如,与函数域plus : nat -> nat -> natmult : nat -> nat -> nat相关联的归纳原理只是结构归纳。这让我想知道为什么Functional Scheme不会产生这些更一般的原则。

无论如何,你的定理的证明就变成了:

Lemma div2_eq : forall n, 2 * div2 n + mod2 n = n.
Proof.
induction n as [| | n1 H1] using nat_ind_alt.
  simpl in *. omega.
  simpl in *. omega.
  simpl in *. omega.
Qed.

Lemma div2_le : forall n, div2 n <= n.
Proof.
induction n as [| | n1 H1] using nat_ind_alt.
  simpl. omega.
  simpl. omega.
  simpl. omega.
Qed.

你应该熟悉功能感应,但更重要的是,你应该熟悉有充分理由的感应。