在我的设置中,我使用带有-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.
在我的天真期望中,我希望z
与ext_ y
y
类型X
统一,而不是新类型X1
。因为现在,对我而言,看起来H2
是一个错误的假设并且应该导致矛盾(因此,不应该首先出现或者在使用{{1}时应该被丢弃} 再来一次)。
在我最初的期望中,我可以使用inversion
,因为eq_ext
和x0
的类型相同,y
和y
之间的关联会产生假设y0
。
由于这不是我第一次偶然发现这种数据类型的问题,我知道我无法投影我的H3: eqXY y y0
- 构造函数的第一个组件。所以我的第一个猜测是,这一切都与我的例子中的反演行为一起发挥。
但是,我想确定存在某种联系,或者对此行为有不同的解释。由于我对这种数据类型的经验较晚,我认为没有解决方法可以获得我的传递性引理,但如果这是一个错误的假设,我真的很感激一些见解!
编辑:正如评论中所提到的,我需要在ext_
中定义数据类型,并且由于其他限制而无法在Set
中定义它。