简短的回答:你不能。
让我们举一个更简单的例子,我们也无法证明类似的事情:
Inductive baz : Prop :=
| baz1 : baz
| baz2 : baz.
Goal baz1 <> baz2.
intro H.
Fail discriminate H.
Abort.
以上失败并显示以下错误消息:
错误:不是可区分的平等。
现在,让我们尝试找出到底哪里discriminate
失败了。
首先,让我们绕道而行,证明一个很简单的说法:
Goal false <> true.
intro prf; discriminate.
Qed.
我们还可以通过直接提供其证明项来证明上述目标,而不是使用策略来构建它:
Goal false <> true.
exact (fun prf : false = true =>
eq_ind false (fun e : bool => if e then False else True) I true prf).
Qed.
以上是该discriminate
策略构建的简化版本。
让我们将证明项中的false
, ,true
和,相应地替换为 , , 看看会发生什么:bool
baz1
baz2
baz
Goal baz1 <> baz2.
Fail exact (fun prf : baz1 = baz2 =>
eq_ind baz1 (fun e : baz => if e then False else True) I baz2 prf).
Abort.
以上失败并出现以下情况:
该命令确实失败,并显示消息:归纳类型中的
不正确消除:
返回类型有排序而应该排序。
不允许在 sort 谓词上消除
排序的归纳对象,
因为只有在构建证明时才能消除证明。e
baz
Type
Prop
Prop
Type
错误的原因是这个抽象:
Fail Check (fun e : baz => if e then False else True).
以上产生相同的错误消息。很容易看出原因。抽象的类型是baz -> Prop
什么,什么baz -> Prop
是类型?
Check baz -> Prop. (* baz -> Prop : Type *)
从命题证明到命题的映射是存在的Type
,而不是存在的Prop
!否则会导致宇宙不一致。
我们的结论是,没有办法证明不等式,因为没有办法突破Prop
来做到这一点——你不能只使用重写 ( baz1 = baz2
) 来构建 的证明False
。
另一个论点(我看到@gallais 已经提出了):如果可以使用一些聪明的技巧并在 范围内进行证明Prop
,那么证明无关公理将与 Coq 的逻辑不一致:
Variable contra : baz1 <> baz2.
Axiom proof_irrelevance : forall (P:Prop) (p1 p2:P), p1 = p2.
Check contra (proof_irrelevance _ baz1 baz2). (* False *)
但是,众所周知,它是一致的,请参阅Coq 的常见问题解答。
您可能想查看CPDT的Universes
章节,特别是“Prop Universe”部分。