为什么Coq在归纳中重命名变量?

时间:2019-02-26 23:48:49

标签: rename coq

我试图证明以下定理。

Theorem subseq_trans : forall (l1 l2 l3 : list nat),
  subseq l1 l2 -> subseq l2 l3 -> subseq l1 l3.
Proof.
  intros l1 l2 l3 H12 H23. generalize dependent l1. (* here l2 l3 *) induction H23.
  - intros. inversion H12. apply empty.
  - (* here l1 l2 *) rename l2 into l3. rename l1 into l2. ...

generalize dependent l1.之后的第3行中,我具有以下上下文:

l2, l3 : list nat
H23 : subseq l2 l3

但是在第5行中,我有重命名

l1, l2 : list nat
H23 : subseq l1 l2
IHsubseq : ...

因此l2l3变成了l1l2。为什么会发生?如何防止这种情况发生?

我认为这并不重要,但是subseq的定义如下:

Inductive subseq : list nat -> list nat -> Prop :=
  | empty l : subseq [] l
  | first x l1 l2 (H : subseq l1 l2) : subseq (x :: l1) (x :: l2)
  | skip x l1 l2 (H : subseq l1 l2) : subseq l1 (x :: l2).

我的Coq版本:

The Coq Proof Assistant, version 8.8.2 (January 2019)

1 个答案:

答案 0 :(得分:4)

将其重命名为l1l2,因为这是subseq定义中给出的名称。要解决此问题,您可以在进行归纳时显式命名变量:

induction H23 as [ | ? l2 l3 | ].

这里subseq有3种情况,因此您需要3个分支。我只为first用例命名了列表,因此我在其他情况下将名称留空并使用了?一次,这两个都告诉Coq使用默认命名。