你的例子假设了相互矛盾的假设:它们意味着
length l + 2
等于
length l + 1
.
Require Import Coq.Lists.List.
Require Import Omega.
Example foo : forall (X : Type) (x y z : X) (l j : list X),
x :: y :: l = z :: j ->
y :: l = x :: j ->
x = y.
Proof.
intros X x y z l j eq1 eq2.
apply (f_equal (@length _)) in eq1.
apply (f_equal (@length _)) in eq2.
simpl in *.
omega.
Qed.
根据爆炸原理,COQ能够得出一个矛盾的上下文并不奇怪。
除了这个小小的怪事之外,产生的假设是矛盾的,这一点没有错:即使最初的假设是一致的,也可能产生这样的背景。考虑以下(公认是人为的)证据:
Goal forall b c : bool, b = c -> c = b.
Proof.
intros b c e.
destruct b, c.
- reflexivity.
- discriminate.
- discriminate.
- reflexivity.
Qed.
第二和第三分支机构有相互矛盾的假设。(
true = false
和
false = true
,即使最初的假设,
b = c
,是无害的。这个例子与原来的有点不同,因为矛盾不是通过组合假设得到的。相反,当我们打电话的时候
destruct
通过对案例分析得到的几个子目标的考虑,我们保证质量成本能够证明这一结论。如果一些子目标恰好是矛盾的,甚至更好:在那里没有任何工作要做。