Coq - 将参数传递给记录

Coq - Passing parameters to a record

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

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

假设 T1T2 类型 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) x1X1.(Labels) 类型, T2.(r) x2 的类型是 X2.(Labels)

我明白这个问题,我想如果我能以某种方式解决这个问题 在记录外声明集合标签,然后将其作为参数传递。 有没有办法在 Coq 中做到这一点?或者什么是最优雅的方式 定义我想要的记录和属性 GoodPair?

我从你的代码中得到的最接近的是:

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