当refine
某个程序时,我试图在inversion
假设时False
结束目标是Type
时的结果。这是我试图做的证据的简化版本。
Lemma strange1: forall T:Type, 0>0 -> T.
intros T H.
inversion H. (* Coq refuses inversion on 'H : 0 > 0' *)
Coq抱怨
Error: Inversion would require case analysis on sort
Type which is not allowed for inductive definition le
但是,由于我对T
不做任何事情,这不重要,......或者?
我摆脱了这样的T
,证据经过了:
Lemma ex_falso: forall T:Type, False -> T.
inversion 1.
Qed.
Lemma strange2: forall T:Type, 0>0 -> T.
intros T H.
apply ex_falso. (* this changes the goal to 'False' *)
inversion H.
Qed.
Coq抱怨的原因是什么?这仅仅是inversion
,destruct
等的缺陷吗?
答案 0 :(得分:7)
我之前从未见过这个问题,但这有道理,虽然有人可能会认为这是inversion
中的错误。
这个问题是由inversion
通过案例分析实现的。在Coq的逻辑中,如果结果不能一般对逻辑假设(即类型为Prop
的某些事物)执行案例分析是计算性质的东西(即,如果返回的东西的类型是Type
)。这样做的一个原因是Coq的设计者希望能够在以一种合理的方式将代码提取到代码中时从程序中删除证明参数:因此,只允许对假设进行案例分析以产生计算的东西,如果被破坏的东西不能改变结果。这包括:
False
。True
,Acc
(用于执行有根据的递归的可访问性),但不包括存在量词ex
。然而,正如您所注意到的那样,可以通过将您想要用于生成结果的某个命题转换为另一个命令来规避该规则,您可以直接进行案例分析。因此,如果你有一个相互矛盾的假设,就像你的情况一样,你可以先用它来证明False
(这是允许的,因为False
是Prop
),而然后消除False
以产生你的结果(上述规则允许)。
在您的示例中,inversion
过于保守,因为它无法在该上下文中对0 < 0
类型的内容进行案例分析。确实,它不能直接通过逻辑规则对其进行案例分析,如上所述;然而,人们可以想到一个稍微聪明的inversion
实现,它承认我们正在消除一个矛盾的假设,并添加False
作为中间步骤,就像你一样。不幸的是,似乎我们需要手工完成这个技巧才能使它发挥作用。