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