【问题标题】:Coq induction hypothesis is wrongCoq 归纳假设是错误的
【发布时间】:2019-03-27 09:49:48
【问题描述】:

我试图在两个列表上证明一个简单的归纳, 并且出于某种原因,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 -&gt; _,所以它没用。 l1 = l1' 哪里来的???我在这里想念什么???谢谢!!

【问题讨论】:

  • 你的例子不是独立的。我看不出eqb_list 来自哪里。是你刚刚定义的函数吗?

标签: coq induction


【解决方案1】:

简答:删除对induction l1的调用中的eqn:E1

该指令要求induction 策略在要通过归纳证明的语句中添加相等性。但是如果你添加这样一个等式,那么它就会出现在要通过归纳证明的陈述中,这会破坏归纳证明。

【讨论】:

  • 我插入了我自己对eqb_list 的定义并且能够完成证明。我相信您的问题说明了 induction 策略中的设计错误,其中 eqn: 指令的处理应该被区别对待。
  • 确实,从归纳中删除 eqn:E1 和 eqn:E2 解决了这个问题。是否有任何简单的方法可以跟踪归纳的哪个分支正在进行?像 eqn:E in destruct?
  • 我相信评论中问题的答案是肯定的,因为来自ssreflectpackage 的elim 策略做得更好。但是在这个过程中添加的额外相等性比 destruct 的eqn:Evariant 更加人为。我认为应该向 Coq 开发人员提出改进的愿望。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-05-10
相关资源
最近更新 更多