在Coq中获得更强的归纳原理

时间:2017-02-20 12:10:46

标签: coq theorem-proving

假设如下:

Inductive bin : Set := Z | O.

Fixpoint fib (n : nat) : list bin :=
  match n with
    | 0   => [Z]
    | S k => match k with
               | 0    => [O]
               | S k' => fib k' ++ fib k
             end
  end.

我想表明:

Theorem fib_first : forall n,
    Nat.Even n -> n > 3 -> exists w, fib n = Z :: w.

但是,通过在induction上执行n,我会得到一个非常无用的归纳法 假设修复n,说明IH : Nat.Even n -> n > 3 -> exists w : list bin, fib n = Z :: w

我理想的是以下内容:IH : forall n : nat, Nat.Even n -> n > 3 -> exists w : list bin, fib n = Z :: w。当然,我不能假设原始命题,但感觉我需要证明一些更强大的东西?

我可以通过展开F n = F n-2 . F n-1来实现归纳推理的想法,我们知道F n-2即使F n是偶数,也不会F n-2F n-1 {1}}是空的,我们可以显示子串更短,因此足以用于归纳假设 - 如何在Coq中表达这一点?

1 个答案:

答案 0 :(得分:2)

诀窍是展开Nat.Even的定义并在n / 2而不是n上进行归纳:

Theorem fib_first : forall n,
  Nat.Even n -> exists w, fib n = Z :: w.
Proof.
intros n [m ->].
induction m as [|m IH].
- now exists nil.
- rewrite <- mult_n_Sm, plus_comm.
  generalize (2 * m) IH. clear m IH. simpl.
  intros n [w ->].
  simpl. eauto.
Qed.

请注意,实际上并不需要n > 3假设。