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
)