我在比较属于两个不同的集合的元素时遇到了麻烦 相同记录类型的实例。请考虑以下记录。
Record ToyRec := {
X:Set;
Labels:Set;
r:X->Labels
}
假设类型为T1
的两个对象T2
和ToyRec
组成一对
对于T1.(X)
中的每个元素,T2.(X)
中都有一个元素
相同的标签。
Definition GoodPair(T1 T2:ToyRec):Prop :=
forall x1:T1.(X), exists x2:T2.(X), T1.(r) x1 = T2.(r) x2.
问题是我收到错误消息,指出T1.(r) x1
属于X1.(Labels)
类型,
T2.(r) x2
的类型为X2.(Labels)
。
我理解这个问题,我想如果我可以以某种方式解决它
声明记录外的集标签,然后将其作为参数传递。
有没有办法在Coq中做到这一点?或者最优雅的方式是什么
定义我想要的记录和属性GoodPair
?
答案 0 :(得分:2)
我从你的代码中得到的最接近的东西是:
Record ToyRec {Labels : Set} := {
X:Set;
r:X->Labels
}.
Definition GoodPair {Labels:Set} (T1 T2 : @ToyRec Labels) : Prop :=
forall x1: X T1, exists x2: X T2, r T1 x1 = r T2 x2.
通过将Labels
作为ToyRec
的依赖项,您可以确保两个记录都使用相同的类型。
PS:我使用{Labels : Set}
代替(Labels : Set)
来指定此参数是隐式的,并且应尽可能推断。