在Coq中定义同构类

时间:2015-01-07 22:47:36

标签: 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)->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并返回一个集合的函数 包含与T1同构的所有对象。

g(T1) = {T2 | Isomorphic T1 T2}

如何在coq中做这样的事情?我知道理论上我可能也有理由 在这里,但同构类的正确类型理论概念是什么?或者更基本的是,如何定义满足给定属性的所有元素的集合(或类型)?

1 个答案:

答案 0 :(得分:3)

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

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

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