_+_
-Operation forは通常、Nat
最初の引数で再帰的に定義されるため、型チェッカーがそれを知ることは明らかに自明ではありませんi + 0 == i
。ただし、固定サイズのベクトルに関数を記述すると、この問題に頻繁に遭遇します。
一例: アグダ関数を定義するにはどうすればよいですか
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 のケースに関連しています)。
.m != .m + zero of type Nat
when checking that the expression xs has type Vec .A (.m + zero)
それで、私の質問: アグダにどのように教えm == m + zero
ますか? swap
そして、そのような関数をAgdaでどのように書くのですか?