无法弄清楚为什么重写不起作用

Can't figure out why re-write does not work

我正在学习 coq,无法弄清楚为什么重写不起作用。

我的代码如下所示:

Inductive nat : Type :=
| zero
| succ (n : nat)
.

Fixpoint add (a b : nat) : nat :=
  match b with
  | zero => a
  | succ b' => add (succ a) b'
  end.

Theorem add_succ : forall a b : nat,
    add a (succ b) = succ (add a b).

Proof.
  induction b as [ |  b' IHb ].
  - simpl.
    reflexivity.
  -

我目前的证明状态是这样的:

- a, b' : nat
- IHb : add a (succ b') = succ (add a b')
============================
add a (succ (succ b')) = succ (add a (succ b'))

我的期望是,如果我 运行

rewrite -> IHb.

然后,coq 会将我目标的左侧重写为

succ (add a (succ b')

我这样想的原因是 (succ b')nat 类型,而 b'nat 类型,没有其他限制。所以我希望 coq 注意到 IHb 中的模式与目标的左侧匹配。但这并没有发生。

我做错了什么?

您的假设 IHb 只允许重写确切的术语 add a (succ b'),因为 ab' 在您的上下文中是变量。如果您的假设 IHbb' 上普遍量化,您可以执行您指出的重写步骤,例如IHb : forall x, add a (succ x) = succ (add a x)。也许你可以修改你的证明以获得更强的归纳假设(相关策略可能是 revertgeneralize)。

很简单:

Theorem add_succ : forall a b : nat,
    add a (succ b) = succ (add a b).

Proof.
  intros *. revert a. induction b as [|b' IHb].
  - simpl. reflexivity.
  - simpl. intro a'. rewrite <- IHb with (succ a'). reflexivity. 
Qed.