组件对等
Pair equality on components
我想定义一个如下类型的函数
pairEquality :
(a, b : (obj1, obj2))
-> (fst a) = (fst b)
-> (snd a) = (snd b)
-> a = b
但我对实现有点不知所措。
我知道我会写
pairEquality' :
a1 = b1
-> a2 = b2
-> (a1, a2) = (b1, b2)
但这似乎并没有在我需要使用它的地方编译(这是另一个问题:这两个函数之间的最大区别是什么?)
我实际上发现我可以根据 pairEquality'
定义 pairEquality
为
pairEquality :
(a, b : (obj1, obj2))
-> (fst a) = (fst b)
-> (snd a) = (snd b)
-> a = b
pairEquality (a1, a2) (b1, b2) = pairEquality' {a1} {a2} {b1} {b2}
第一个实现非常简单。拆分元组以获得 pairEquality (a, b) (x, y) prf1 prf2 = ?t
并检查漏洞后,您已经看到,编译器推断出 prf1 : a = x
、prf2: b = y
,唉:
pairEquality :
(a, b : (obj1, obj2))
-> (fst a) = (fst b)
-> (snd a) = (snd b)
-> a = b
pairEquality (x, y) (x, y) Refl Refl = Refl
在 pairEquality
中解构元组,在 pairEquality'
中构建元组。后者通常是更好的方法,我猜你可以在你的调用函数中改变一些东西,这样它就可以使用了。
我想定义一个如下类型的函数
pairEquality :
(a, b : (obj1, obj2))
-> (fst a) = (fst b)
-> (snd a) = (snd b)
-> a = b
但我对实现有点不知所措。
我知道我会写
pairEquality' :
a1 = b1
-> a2 = b2
-> (a1, a2) = (b1, b2)
但这似乎并没有在我需要使用它的地方编译(这是另一个问题:这两个函数之间的最大区别是什么?)
我实际上发现我可以根据 pairEquality'
定义 pairEquality
为
pairEquality :
(a, b : (obj1, obj2))
-> (fst a) = (fst b)
-> (snd a) = (snd b)
-> a = b
pairEquality (a1, a2) (b1, b2) = pairEquality' {a1} {a2} {b1} {b2}
第一个实现非常简单。拆分元组以获得 pairEquality (a, b) (x, y) prf1 prf2 = ?t
并检查漏洞后,您已经看到,编译器推断出 prf1 : a = x
、prf2: b = y
,唉:
pairEquality :
(a, b : (obj1, obj2))
-> (fst a) = (fst b)
-> (snd a) = (snd b)
-> a = b
pairEquality (x, y) (x, y) Refl Refl = Refl
在 pairEquality
中解构元组,在 pairEquality'
中构建元组。后者通常是更好的方法,我猜你可以在你的调用函数中改变一些东西,这样它就可以使用了。