在 Coq 中定义同构类
Defining isomorphism classes in Coq
如何在 Coq 中定义同构类?
假设我有一条记录 ToyRec:
Record ToyRec {Labels : Set} := {
X:Set;
r:X->Labels
}.
以及 ToyRec 类型的两个对象之间的同构定义,说明两个
如果存在保留映射元素标签的双射 f:T1.(X)->T2.(X) ,则对象 T1 和 T2 是同构的。
Definition Isomorphic{Labels:Set} (T1 T2 : @ToyRec Labels) : Prop :=
exists f:T1.(X)->T2.(X), (forall x1 x2:T1.(X), f x1 <> f x2) /\
(forall x2:T2.(X), exists x1:T1.(X), f x1 = f x2) /\
(forall x1:T1.(X) T1.(r) x1 = T2.(r) (f x1)).
现在我想定义一个接受对象 T1 和 returns 集合的函数
包含与 T1 同构的所有对象。
g(T1) = {T2 | Isomorphic T1 T2}
如何在 coq 中做这样的事情?我知道我可能在理论上推理太过固定
在这里,但是同构类的正确类型理论概念是什么?或者更基本地说,如何定义满足给定属性的所有元素的集合(或类型)?
这真的取决于你想用它做什么。在 Coq 中, 是 一个理解类型 {x : T | P x}
,它是类型 T
中所有元素 x
的类型,满足 属性 P
。然而,它是一个类型,意味着它是用来对其他术语进行分类的,而不是一个你可以用传统方法计算的数据结构感觉。因此,您可以使用它,例如,在 T
上编写一个函数,该函数仅适用于满足 P
的元素(在这种情况下,函数的类型将为 {x : T | P x} -> Y
,其中Y
是它的结果类型),但是你不能用它来编写一个函数来计算 T
中有多少元素满足 P
.
如果你想用这个集合来计算,事情会变得有点复杂。让我们假设 P
是可判定的 属性 这样事情就会变得更容易一些。如果 T
是有限类型,那么您可以设置一个具有理解运算符的数据结构(例如,查看 Ssreflect 库)。但是,当 T
是无限时,这会中断,这就是您的 ToyRec
类型的情况。正如 Vinz 所说,没有通用的方法可以建设性地将此集合构建为数据结构。
如果您准确地解释了您要使用此类型做什么,也许会更容易获得完整的答案。
如何在 Coq 中定义同构类?
假设我有一条记录 ToyRec:
Record ToyRec {Labels : Set} := {
X:Set;
r:X->Labels
}.
以及 ToyRec 类型的两个对象之间的同构定义,说明两个 如果存在保留映射元素标签的双射 f:T1.(X)->T2.(X) ,则对象 T1 和 T2 是同构的。
Definition Isomorphic{Labels:Set} (T1 T2 : @ToyRec Labels) : Prop :=
exists f:T1.(X)->T2.(X), (forall x1 x2:T1.(X), f x1 <> f x2) /\
(forall x2:T2.(X), exists x1:T1.(X), f x1 = f x2) /\
(forall x1:T1.(X) T1.(r) x1 = T2.(r) (f x1)).
现在我想定义一个接受对象 T1 和 returns 集合的函数 包含与 T1 同构的所有对象。
g(T1) = {T2 | Isomorphic T1 T2}
如何在 coq 中做这样的事情?我知道我可能在理论上推理太过固定 在这里,但是同构类的正确类型理论概念是什么?或者更基本地说,如何定义满足给定属性的所有元素的集合(或类型)?
这真的取决于你想用它做什么。在 Coq 中, 是 一个理解类型 {x : T | P x}
,它是类型 T
中所有元素 x
的类型,满足 属性 P
。然而,它是一个类型,意味着它是用来对其他术语进行分类的,而不是一个你可以用传统方法计算的数据结构感觉。因此,您可以使用它,例如,在 T
上编写一个函数,该函数仅适用于满足 P
的元素(在这种情况下,函数的类型将为 {x : T | P x} -> Y
,其中Y
是它的结果类型),但是你不能用它来编写一个函数来计算 T
中有多少元素满足 P
.
如果你想用这个集合来计算,事情会变得有点复杂。让我们假设 P
是可判定的 属性 这样事情就会变得更容易一些。如果 T
是有限类型,那么您可以设置一个具有理解运算符的数据结构(例如,查看 Ssreflect 库)。但是,当 T
是无限时,这会中断,这就是您的 ToyRec
类型的情况。正如 Vinz 所说,没有通用的方法可以建设性地将此集合构建为数据结构。
如果您准确地解释了您要使用此类型做什么,也许会更容易获得完整的答案。