Vect
値を表示するための単純な型をいくつか書きました。
data SnocVect : Vect n a -> Type where
SnocNil : SnocVect []
Snoc : (xs : Vect n a) -> (x : a) -> SnocVect (xs ++ [x])
data Split : (m : Nat) -> Vect n a -> Type where
MkSplit : (xs : Vect j a) -> (ys : Vect k a) ->
Split j (xs ++ ys)
ベクトルの最後の要素を分離している場合、それSplit
を に変換できるはずですSnocVect
。
splitToSnocVect : .{xs : Vect (S n) a} -> Split n xs ->
SnocVect xs
残念ながら、これを実装する方法が見つからないようです。特に、引数のパターン マッチを可能にする方法がまったく見つかりませんでした。それがなけれSplit n xs
ば、明らかにどこにもたどり着けません。基本的な問題は、私がタイプの何かを持っていることだと思います
Split j (ps ++ [p])
単射ではないので++
、何らかの魔法をかけて、型チェッカーに意味があることを納得させる必要があります。しかし、私はこれを確実に言うには十分に理解していません。