Coq如何定位和转换假设以表明它们是假的?

时间:2017-07-11 22:15:28

标签: coq

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

然而,在这样做的过程中,我最终处于假设是假/无人居住的情况,但不是字面False(因此不能被{{1}作为目标。战术)。

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

contradiction

此后,"目标状态" coqide所示的coq(正确的词是什么?)看起来像这样。

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.

清除一些无关的细节......

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_bool_eq [] (a :: b) = true并非按字面意思H,因此我们无法使用False

我如何从Coq"的角度来关注/"关注我的注意力?根据假设contradiction,我可以证明它无人居住。有没有大致类似于证明子弹H的东西在我的证明中创建了一个新的上下文,专门用于表明给定的假设是假的?

1 个答案:

答案 0 :(得分:3)

如果您简化了您的假设(simpl in H),您会发现它等同于false = true。此时,您可以使用easy策略来结束目标,该策略能够释放出这样的"显而易见的"即使它们在语法上等于False,也会产生矛盾。事实上,你甚至不需要事先进行简化; easy应该足够强大,能够找出自身矛盾的内容。

(最好证明以下更强大的结果:forall l1 l2, list_bool_eq l1 l2 = true <-> l1 = l2。)