在组件上配对相等

时间:2019-01-30 08:41:48

标签: equality idris

我想定义以下类型的函数

pairEquality :
     (a, b : (obj1, obj2))
  -> (fst a) = (fst b)
  -> (snd a) = (snd b)
  -> a = b

但是我对实现有些困惑。

我知道我会写

pairEquality' :
     a1 = b1
  -> a2 = b2
  -> (a1, a2) = (b1, b2)

但是在我需要使用它的地方似乎并没有编译(这是另一个问题:这两个函数之间的最大区别是什么?)

2 个答案:

答案 0 :(得分:2)

第一个实现非常简单。将元组拆分成pairEquality (a, b) (x, y) prf1 prf2 = ?t并检查孔之后,您已经看到编译器推断出prf1 : a = xprf2: b = y,a:

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'中构建元组。通常,后者是一种更好的方法,我想您可以在调用方函数中进行更改,以便可以使用它。

答案 1 :(得分:0)

我实际上发现我可以根据pairEqualitypairEquality'定义为

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}