当目标是类型时,为什么Coq不允许反转,破坏等?

时间:2014-12-05 19:08:08

标签: coq proof inversion

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抱怨的原因是什么?这仅仅是inversiondestruct等的缺陷吗?

1 个答案:

答案 0 :(得分:7)

我之前从未见过这个问题,但这有道理,虽然有人可能会认为这是inversion中的错误。

这个问题是由inversion通过案例分析实现的。在Coq的逻辑中,如果结果不能一般逻辑假设(即类型为Prop的某些事物)执行案例分析是计算性质的东西(即,如果返回的东西的类型是Type)。这样做的一个原因是Coq的设计者希望能够在以一种合理的方式将代码提取到代码中时从程序中删除证明参数:因此,只允许对假设进行案例分析以产生计算的东西,如果被破坏的东西不能改变结果。这包括:

  1. 没有构造函数的命题,例如False
  2. 只有一个构造函数的命题,只要该构造函数不带有计算性质的参数。这包括TrueAcc(用于执行有根据的递归的可访问性),但不包括存在量词ex
  3. 然而,正如您所注意到的那样,可以通过将您想要用于生成结果的某个命题转换为另一个命令来规避该规则,您可以直接进行案例分析。因此,如果你有一个相互矛盾的假设,就像你的情况一样,你可以先用它来证明False(这是允许的,因为FalseProp),而然后消除False以产生你的结果(上述规则允许)。

    在您的示例中,inversion过于保守,因为它无法在该上下文中对0 < 0类型的内容进行案例分析。确实,它不能直接通过逻辑规则对其进行案例分析,如上所述;然而,人们可以想到一个稍微聪明的inversion实现,它承认我们正在消除一个矛盾的假设,并添加False作为中间步骤,就像你一样。不幸的是,似乎我们需要手工完成这个技巧才能使它发挥作用。