由于_+_
-Operation forNat
通常是在第一个参数中递归定义的,因此类型检查器知道它显然不是微不足道的i + 0 == i
。但是,当我在固定大小的向量上编写函数时,我经常遇到这个问题。
一个例子:我如何定义一个 Agda 函数
swap : {A : Set}{m n : Nat} -> Vec A (n + m) -> Vec A (m + n)
哪个将第一个n
值放在向量的末尾?
由于 Haskell 中的一个简单解决方案是
swap 0 xs = xs
swap n (x:xs) = swap (n-1) (xs ++ [x])
我在 Agda 中类似地尝试过,如下所示:
swap : {A : Set}{m n : Nat} -> Vec A (n + m) -> Vec A (m + n)
swap {_} {_} {zero} xs = xs
swap {_} {_} {suc i} (x :: xs) = swap {_} {_} {i} (xs ++ (x :: []))
但是类型检查器失败并显示消息(与{zero}
上述swap
-Definition 中的 -case 相关):
.m != .m + zero of type Nat
when checking that the expression xs has type Vec .A (.m + zero)
所以,我的问题是:如何教 Agda m == m + zero
?以及如何swap
在 Agda 中编写这样的函数?