在Coq中将不同的相等类型定义为归纳类型

时间:2017-08-03 21:53:56

标签: equality coq coq-tactic

我试图在Coq中定义不同类型的平等。在大学课程期间,我的教授给了我们四种不同类型的规则,如下(我只提供规则的链接):

这四种类型之间的差异依赖于类型C.

我试图证明他们之间的同构性。不幸的是,我在将第一个和第二个声明为归纳类型方面遇到了一些麻烦,因为我找不到指定类型C的方法。我对第三个和第四个有一个定义,我已经证明了它们之间的同构。

提前致谢。

1 个答案:

答案 0 :(得分:3)

你不能完全使用归纳类型来获得完全体现 前两个原则的东西而不会得到另外两个原则。原因是Coq归纳数据类型自动支持强依赖消除,这意味着允许结果类型引用被消除的元素。这是您在最后两组规则中看到的内容:类型C可以引用两个pa两个点相等的证明b 。任何合理的归纳定义的相等类型将自动支持规则3和4,因此1和2更弱。例如,这里是你如何得到1和2与Coq的标准相等。

Section Gentzen.

Variables (A : Type) (C : A -> A -> Type).

Definition e_id_g {a b : A} (p : a = b) (c : C a a) : C a b :=
  match p with eq_refl => fun c => c end c.

Definition c_id_g (a : A) (c : C a a) : e_id_g (eq_refl a) c = c :=
  eq_refl.

End Gentzen.

Section Leibniz.

Variables (A : Type) (C : A -> A -> Type).

Definition e_id_l {a b : A} (p : a = b) (c : forall x, C x x) : C a b :=
  match p with eq_refl => c a end.

Definition c_id_l (a : A) (c : forall x, C x x) :
                  e_id_l (eq_refl a) c = c a :=
  eq_refl.

End Leibniz.

通过使用等式的 Church编码,可以提供仅支持规则1和2但不支持3和4的不同定义:

Definition eq {A} (a b : A) : Prop :=
  forall P : A -> Prop, P a -> P b.

Definition refl {A} (a : A) : eq a a :=
  fun P x => x.

这里的想法 - 就像lambda演算中数据类型的类似编码一样 - 是将类型定义为其(非依赖)消除器或折叠的类型。这个定义有时被称为Leibniz等式,实际上提供了与1和2中相同的证明规则,如下面的脚本所示。

Section Gentzen.

Variables (A : Type) (C : A -> A -> Prop).

Definition e_id_g {a b : A} (p : eq a b) (c : C a a) : C a b :=
  p (C a) c.

Definition c_id_g (a : A) (c : C a a) : e_id_g (refl a) c = c :=
  eq_refl.

End Gentzen.

Section Leibniz.

Variables (A : Type) (C : A -> A -> Prop).

Definition e_id_l {a b : A} (p : eq a b) (c : forall x, C x x) : C a b :=
  p (C a) (c a).

Definition c_id_l (a : A) (c : forall x, C x x) :
                  e_id_l (refl a) c = c a :=
  eq_refl.

End Leibniz.

(这些原则实际上有点不同:由于Coq与 impredicativity 相关的基本理论的限制,它们仅限于Prop。但这是一个正交问题。)

在不断言额外公理的情况下,不可能为这种新的相等编码获得原则3和4。证明这一点需要对forall P, P a -> P b类型的元素进行案例分析,并认为所有这些元素都是refl形式应用于某些东西。然而,这是一种功能,Coq的基本理论无法对这些功能进行案例分析。请注意,这个论点超出了Coq的理论:断言作为一个额外的公理,即3和4对这种新类型是有效的并不矛盾;没有这些公理,就不可能证明这一点。