Я написал несколько простых типов для просмотра значений 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])
и поскольку ++
не является инъективным, мне нужно поработать магией, чтобы убедить контролер типов в том, что все имеет смысл. Но я недостаточно хорошо это понимаю, чтобы сказать наверняка.