假设如下:
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-2
或F n-1
{1}}是空的,我们可以显示子串更短,因此足以用于归纳假设 - 如何在Coq中表达这一点?
答案 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
假设。