Coq如何定位和转换假设,以证明它们';你错了吗?

Coq如何定位和转换假设,以证明它们';你错了吗?,coq,Coq,我试图证明,如果两个布尔值列表是相等的(使用一个在结构上以明显的方式遍历列表的相等定义),那么它们的长度是相同的 然而,在这样做的过程中,我最终遇到了一个假设是错误的/无人居住的,但不是字面上的false(因此不能被矛盾策略所针对) 这是我到目前为止所拥有的 Require Import Coq.Lists.List. Require Export Coq.Bool.Bool. Require Import Lists.List. Import ListNotations. Open Sco

我试图证明,如果两个布尔值列表是相等的(使用一个在结构上以明显的方式遍历列表的相等定义),那么它们的长度是相同的

然而,在这样做的过程中,我最终遇到了一个假设是错误的/无人居住的,但不是字面上的
false
(因此不能被
矛盾
策略所针对)

这是我到目前为止所拥有的

Require Import Coq.Lists.List.
Require Export Coq.Bool.Bool.

Require Import Lists.List.
Import ListNotations.

Open Scope list_scope.
Open Scope nat_scope.



Fixpoint list_bool_eq (a : list bool) (b: list bool) : bool :=
  match (a, b) with
  | ([], []) => true
  | ([], _) => false
  | (_, []) => false
  | (true::a', true::b') => list_bool_eq a' b'
  | (false::a', false::b') => list_bool_eq a' b'
  | _ => false
  end.

Fixpoint length (a : list bool) : nat :=
  match a with
  | [] => O
  | _::a' => S (length a')
  end.

Theorem equal_implies_same_length : forall (a b : list bool) , (list_bool_eq a b) = true ->  (length a) = (length b).
intros.
induction a.
induction b.
simpl. reflexivity.
在此之后,coqide显示的coq的“目标状态”(正确的词是什么?)如下所示

2 subgoals
a : bool
b : list bool
H : list_bool_eq [] (a :: b) = true
IHb : list_bool_eq [] b = true -> length [] = length b
______________________________________(1/2)
length [] = length (a :: b)
______________________________________(2/2)
length (a :: a0) = length b
清除一些无关的细节

Focus 1.
clear IHb.
我们得到

1 subgoal
a : bool
b : list bool
H : list_bool_eq [] (a :: b) = true
______________________________________(1/1)
length [] = length (a :: b)
对我们人类来说,
length[]=length(a::b)
显然是错误的/无人居住的,但这没关系,因为
H:list\u bool\u eq[](a::b)=true
也是错误的

然而,假设
H
并不是字面上的
False
,因此我们不能仅仅使用
矛盾


我如何将注意力集中在假设
H
上,从而证明它是无人居住的。有什么东西大致类似于一个证明子弹,它在我的证明中创建了一个新的上下文,专门用来证明给定的假设是错误的吗?

如果你简化你的假设(
simple in H
),你会看到它等价于
false=true
。在这一点上,您可以使用
easy
策略来结束目标,该策略能够消除这些“明显的”矛盾,即使它们在语法上等于
False
。事实上,你甚至不需要事先进行简化<代码>简单
应该足够强大,能够自己找出矛盾所在

(最好证明以下更强的结果:
对于所有l1-l2,列出l1-l2=true-l1=l2