Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coq诱导假说是错误的_Coq_Induction - Fatal编程技术网

Coq诱导假说是错误的

Coq诱导假说是错误的,coq,induction,Coq,Induction,我想证明两个列表上的简单归纳法, 出于某种原因,柯克把归纳假设写错了。 这是我的证据: 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

我想证明两个列表上的简单归纳法, 出于某种原因,柯克把归纳假设写错了。 这是我的证据:

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 ??? *)
Lemma eqb_list_true_iff_left_至_right:
对于所有A(等式:A->A->bool),
(对于所有a1 a2,方程式a1 a2=true a1=a2)->
对于所有l1 l2,eqb_列表eqb l1 l2=true->l1=l2。
证明。
介绍一个等式H1。
感应l1为[| a1 l1'IHl1']式:E1。
-诱导l2为[| a2 l2'IHl2']式:E2。
+自反性。
+简介H2。H2中的siml。辨别H2。
-(*l1=l1'来自哪里?*)
以下是到达最后一行(注释)时的假设和目标:

1子目标
A:类型
等式B:A->A->bool
H1:对于所有a1 a2:A,等式B a1 a2=真a1=a2
l1:列表A
a1:A
l1':列表A
E1:l1=a1::l1'
IHl1':l1=l1'->
对于所有l2:列表A,eqb_列表eqb l1'l2=true->l1'=l2
______________________________________(1/1)
对于所有l2:列表A,eqb_列表eqb(a1::l1’)l2=true->a1::l1’=l2

显然,IHl1'包含一个
false->
,因此它是无用的。
l1=l1'
从哪里来???我在这里错过了什么???谢谢

简短回答:删除调用
感应l1
中的
eqn:E1


该指令要求
归纳法
策略在要通过归纳法证明的语句中添加一个等式。但是如果你加上这样一个等式,那么它在语句中似乎是由归纳法证明的,这就弄乱了归纳法证明。

简短回答:删除调用
归纳法l1
中的
eqn:E1


该指令要求
归纳法
策略在要通过归纳法证明的语句中添加一个等式。但是,如果你加上这样一个等式,那么它在陈述中似乎是由归纳法证明的,这就弄乱了归纳法的证明。

你的例子并不完整。我看不出
eqb_列表
从何而来。这是您刚刚定义的函数吗?您的示例不是自包含的。我看不出
eqb_列表
从何而来。这是你刚刚定义的函数吗?我插入了我自己定义的
eqb_列表
,并且能够完成证明。我相信你的问题说明了
归纳法
策略中的一个设计错误,
eqn:
指令的处理应该有所不同。事实上,从归纳法中删除eqn:E1和eqn:E2解决了问题。是否有任何简单的方法可以跟踪正在进行的入职培训的哪个分支?像destruct中的eqn:E?我相信评论中的问题答案是肯定的,因为
ssreflect
包中的
elim
策略做得更好。但是,与析构函数的
eqn:E
变体相比,在这个过程中添加的额外等式更为人为。我认为应该向Coq开发人员发出改进的愿望。我插入了我自己对
eqb_列表的定义,并且能够完成证明。我相信你的问题说明了
归纳法
策略中的一个设计错误,
eqn:
指令的处理应该有所不同。事实上,从归纳法中删除eqn:E1和eqn:E2解决了问题。是否有任何简单的方法可以跟踪正在进行的入职培训的哪个分支?像destruct中的eqn:E?我相信评论中的问题答案是肯定的,因为
ssreflect
包中的
elim
策略做得更好。但是,与析构函数的
eqn:E
变体相比,在这个过程中添加的额外等式更为人为。我认为应该向Coq开发者发布改进的愿望。
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