Coq归纳假设是错误的

时间:2019-03-27 09:49:49

标签: coq induction

我正在尝试证明两个清单上的简单归纳, 出于某种原因,Coq将归纳假设写错了。 这是我的证明:

Lemma eqb_list_true_iff_left_to_right :
  forall A (eqb : A -> A -> bool),
    (forall a1 a2, eqb a1 a2 = true <-> a1 = a2) ->
    forall l1 l2, eqb_list eqb l1 l2 = true -> l1 = l2.
Proof.
  intros A eqb H1.
  induction l1 as [|a1 l1' IHl1'] eqn:E1.
  - induction l2 as [|a2 l2' IHl2'] eqn:E2.
    + reflexivity.
    + intros H2. simpl in H2. discriminate H2.
  - (* where did l1 = l1' come from ??? *)

以下是到达最后一行(注释)时的假设和目标:

1 subgoal
A : Type
eqb : A -> A -> bool
H1 : forall a1 a2 : A, eqb a1 a2 = true <-> a1 = a2
l1 : list A
a1 : A
l1' : list A
E1 : l1 = a1 :: l1'
IHl1' : l1 = l1' ->
        forall l2 : list A, eqb_list eqb l1' l2 = true -> l1' = l2
______________________________________(1/1)
forall l2 : list A, eqb_list eqb (a1 :: l1') l2 = true -> a1 :: l1' = l2

很显然,IHl1'涉及一个false -> _,所以它是无用的。 l1 = l1'是哪里来的???我在这里想念什么???谢谢!

1 个答案:

答案 0 :(得分:2)

简短答案:删除对eqn:E1的通话中的induction l1

此伪指令要求induction策略在要通过归纳证明的语句中添加相等性。但是,如果添加这样的等式,则它会出现在语句中,可以通过归纳证明,这会弄乱归纳证明。