Coq中同构类的定义

Coq中同构类的定义,coq,isomorphism,Coq,Isomorphism,如何在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)->

如何在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)).
一个人怎么会在coq做这样的事?我知道我的推理可能过于理论化
在这里,什么是同构类的正确类型理论概念?或者更基本地说,如何定义满足给定属性的所有元素集(或类型)

这取决于你想用它做什么。在Coq中,有一个理解类型
{x:T | px}
,它是类型
T
中满足属性
P
的所有元素
x
的类型。但是,它是一种类型,这意味着它用于对其他术语进行分类,而不是传统意义上的数据结构。因此,您可以使用它,例如,在
T
上编写一个只对满足
P
的元素起作用的函数(在这种情况下,函数的类型将是
{x:T|px}->Y
,其中
Y
是它的结果类型),但您不能使用它,编写一个函数,计算
T
满足
P
的元素数

如果你想用这个集合进行计算,事情会变得更复杂一些。让我们假设
P
是一个可判定的属性,这样事情就变得更容易了。如果
T
是有限类型,则可以设置具有理解运算符的数据结构(例如,查看库)。但是,当
T
为无穷大时,这会中断,这是您的
ToyRec
类型的情况。正如Vinz所说,没有一种通用的方法可以建设性地将这个集合构建为一个数据结构


如果你准确地解释了你想用这种类型做什么,也许会更容易得到一个完整的答案

我不知道你是否可以做你想做的:我不知道你如何建设性地构建这个集合,你必须枚举所有可能的函数或这种风格的东西,这对我来说似乎是不可能的。注入性应该是
对于所有xy,fx=fy->x=y
对于所有xy,xy->fxfy
。对于所有y,存在x,f x=y,满射性应为
对于所有x y:T,f x f y
始终为false,除非
T
为空
对于所有的y,存在x,fx=fy
总是正确的。看起来你在尝试在类型理论中做集合论。你应该尝试使用谓词而不是集合。在集合论中,你通常采用等价关系并构建等价类,这样你就可以用“标准”等式重写。在类型理论中,你通常只是用等价关系重写。谢谢。图书馆的Ssreflect似乎有我所需要的一切。在我的应用程序中,X是有限的。实际上,我只需要在nat中为n\设置X=\{1,…,n\}。有一个很好的符号来定义这个X吗?我在Ssreflect中找不到它。Ssreflect的fintype库定义了
序数
类型,基本上就是您描述的类型。看一看。如果
X
标签在应用程序中总是有限的,那么
{T2 |同构T1 T2}
也是有限的;看看有限域上的函数库。谢谢!这很有帮助。
g(T1) = {T2 | Isomorphic T1 T2}