Coq - 将参数传递给记录

时间:2015-01-07 14:02:23

标签: record coq

我在比较属于两个不同的集合的元素时遇到了麻烦 相同记录类型的实例。请考虑以下记录。

Record ToyRec := {
    X:Set;
    Labels:Set;
    r:X->Labels
}

假设类型为T1的两个对象T2ToyRec组成一对 对于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

1 个答案:

答案 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)来指定此参数是隐式的,并且应尽可能推断。