我试图证明以下定理。
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 : ...
因此l2
和l3
变成了l1
和l2
。为什么会发生?如何防止这种情况发生?
我认为这并不重要,但是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)
答案 0 :(得分:4)
将其重命名为l1
和l2
,因为这是subseq
定义中给出的名称。要解决此问题,您可以在进行归纳时显式命名变量:
induction H23 as [ | ? l2 l3 | ].
这里subseq
有3种情况,因此您需要3个分支。我只为first
用例命名了列表,因此我在其他情况下将名称留空并使用了?
一次,这两个都告诉Coq使用默认命名。