我试图在Coq中定义不同类型的平等。在大学课程期间,我的教授给了我们四种不同类型的规则,如下(我只提供规则的链接):
这四种类型之间的差异依赖于类型C.
我试图证明他们之间的同构性。不幸的是,我在将第一个和第二个声明为归纳类型方面遇到了一些麻烦,因为我找不到指定类型C的方法。我对第三个和第四个有一个定义,我已经证明了它们之间的同构。
提前致谢。
答案 0 :(得分:3)
你不能完全使用归纳类型来获得完全体现 前两个原则的东西而不会得到另外两个原则。原因是Coq归纳数据类型自动支持强依赖消除,这意味着允许结果类型引用被消除的元素。这是您在最后两组规则中看到的内容:类型C
可以引用两个p
和a
两个点相等的证明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对这种新类型是有效的并不矛盾;没有这些公理,就不可能证明这一点。