Coq - 将参数传递给记录
Coq - Passing parameters to a record
我在比较属于两个不同集合的元素时遇到问题
相同记录类型的实例。考虑以下记录。
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
?
我从你的代码中得到的最接近的是:
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)
来指定此参数是隐式的,应尽可能进行推断。
我在比较属于两个不同集合的元素时遇到问题 相同记录类型的实例。考虑以下记录。
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
?
我从你的代码中得到的最接近的是:
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)
来指定此参数是隐式的,应尽可能进行推断。