组件对等

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 = xprf2: 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' 中构建元组。后者通常是更好的方法,我猜你可以在你的调用函数中改变一些东西,这样它就可以使用了。