【发布时间】:2018-05-22 16:55:43
【问题描述】:
从这个例子:
Example foo : forall (X : Type) (x y z : X) (l j : list X),
x :: y :: l = z :: j ->
y :: l = x :: j ->
x = y.
对第二个假设做inversion就可以解决:
Proof.
intros X x y z l j eq1 eq2. inversion eq2. reflexivity. Qed.
但是,在第一个假设中也使用inversion,会产生明显矛盾的假设:
Proof.
intros X x y z l j eq1 eq2. inversion eq2. inversion eq1. reflexivity. Qed.
因为,在最后一个证明中,生成的假设是:
H0 : y = x
H1 : l = j
H2 : x = z
H3 : y :: l = j
但是,如果我没有遗漏一些明显的东西,H1 和 H3 不可能同时为真。
有人可以解释一下发生了什么吗?只是这个例子是“糟糕的设计”(两个假设都是矛盾的)并且 Coq 倒置策略只是吞下了它们?它是基于一起考虑的两个假设的爆炸原理吗?如果是这样,那么是否有可能仅通过从虚假中推导出任何东西来证明这个例子?怎么样?
【问题讨论】:
标签: coq proof coq-tactic