作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在 Coq 中定义不同类型的等式。在大学类(class)中,我的教授给了我们四种不同类型的规则,如下(我只提供了规则的链接):
最佳答案
你不能完全使用归纳类型来获得完全体现前两个原则的东西而不获得其他两个。这样做的原因是 Coq 归纳数据类型自动支持强依赖消除,这意味着允许结果类型引用被消除的元素。这就是您在给定的最后两组规则中看到的:类型 C
允许引用证明p
那两点a
和 b
是平等的。任何合理的归纳定义的相等类型都将自动支持规则 3 和 4,从而支持较弱的规则 1 和 2。例如,下面是如何使用 Coq 的标准相等来获得 1 和 2。
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.
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.
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.
Prop
,这是由于 Coq 基本理论中与不可预测性相关的限制。但这是一个正交问题。)
forall P, P a -> P b
类型的元素进行案例分析。 ,并认为所有这些元素的形式都是
refl
应用于某事。但是,这是一种函数,在 Coq 的基础理论中没有办法对它们进行案例分析。请注意,这个论点超出了 Coq 的理论:将 3 和 4 对这种新类型有效作为额外公理的断言并不矛盾;如果没有这些公理,就不可能证明这一点。
关于equality - 在 Coq 中将不同的相等类型定义为归纳类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45495135/
我一直在阅读Practical Foundations for Programming Languages并发现迭代和同时归纳定义很有趣。我能够很容易地对偶函数和奇函数的相互递归版本进行编码 onli
我是一名优秀的程序员,十分优秀!