启用了impredicative-set的大型类型的反转

时间:2017-02-15 17:27:15

标签: coq

在我的设置中,我使用带有-impredicative-set标志的Coq,并在其构造函数中具有以下数据类型和存在类型。

Set Implicit Arguments.

Inductive ext : Set :=
| ext_ : forall (X: Set), X -> ext.

然后我为我的数据类型定义了一个等式。

Variable eqXY: forall X, X -> X -> Prop.

Inductive Eq_ext : ext  -> ext -> Prop :=
| eq_ext : forall (X : Set)
             (x y: X),
    eqXY x y ->
    Eq_ext (ext_ x) (ext_ y).

我喜欢我的平等是一种关系,因此,反身性,对称性和传递性将是更好的属性。前两个没有问题,但为了传递,我最终遇到了inversion的问题。

Variable eqXY_trans: forall X (x y z:X), eqXY x y -> eqXY y z -> eqXY x z.

Lemma Eq_trans :
  forall (x y z: ext),
    Eq_ext x y -> Eq_ext y z -> Eq_ext x z.
Proof.
  intros.
  inversion H; subst.
  (* here is a snippet of the current hypothesis:

     X : Set
     x0, y0 : X
     H0 : Eq_ext (ext_ y0) z
     H1 : eqXY x0 y0

   *)
  inversion H0; subst.
  (*
     X : Set
     x0, y0 : X
     X0 : Set
     y : X0
     H0 : Eq_ext (ext_ y0) (ext_ y)
     H : Eq_ext (ext_ x0) (ext_ y0)
     H1 : eqXY x0 y0
     x : X0
     H3 : ext_ x = ext_ y0
     H2 : eqXY x y
  *)
  Fail apply eq_ext.
  admit.
Admitted.

在我的天真期望中,我希望zext_ y y类型X统一,而不是新类型X1。因为现在,对我而言,看起来H2是一个错误的假设并且应该导致矛盾(因此,不应该首先出现或者在使用{{1}时应该被丢弃} 再来一次)。 在我最初的期望中,我可以使用inversion,因为eq_extx0的类型相同,yy之间的关联会产生假设y0

由于这不是我第一次偶然发现这种数据类型的问题,我知道我无法投影我的H3: eqXY y y0 - 构造函数的第一个组件。所以我的第一个猜测是,这一切都与我的例子中的反演行为一起发挥。

但是,我想确定存在某种联系,或者对此行为有不同的解释。由于我对这种数据类型的经验较晚,我认为没有解决方法可以获得我的传递性引理,但如果这是一个错误的假设,我真的很感激一些见解!

编辑:正如评论中所提到的,我需要在ext_中定义数据类型,并且由于其他限制而无法在Set中定义它。

0 个答案:

没有答案