Я пытаюсь написать функцию начальных сегментов для векторов, которая хранит длину вектора как фин, а не как Nat, следующим образом:
vectorsInits : Vect n t -> Vect n (p ** Vect (finToNat p) t)
vectorsInits Nil = Nil
vectorsInits (x::xs) = ((FS FZ) ** (x::Nil)) :: map (\(p ** ys) => ((FS p) ** x::ys)) (vectorsInits xs)
Однако это определение не работает, так как я получаю следующую ошибку типа:
When checking right hand side of vectorsInits with expected type
Vect (S len) (p : Fin n ** Vect (finToNat p) t)
When checking argument pf to constructor Builtins.MkDPair:
Type mismatch between
Vect 1 t (Type of [x])
and
Vect (finToNat (FS FZ)) t (Expected type)
Specifically:
Type mismatch between
1
and
finToNat (FS FZ)
Но из определения finToNat ясно, что finToNat (FS FZ) будет равен 1 ,. даже если я напишу следующую функцию, чтобы попытаться заставить idris понять, что они равны, я получу ошибку:
intproof : Vect 1 t -> Vect (finToNat (FS FZ)) t
intproof x = x
...
vectorsInits (x::xs) = ((FS FZ) ** intproof (x::Nil)) :: map (\(p ** ys) => ((FS p) ** x::ys)) (vectorsInits xs)
выдает ошибку:
When checking right hand side of vectorsInits with expected type
Vect (S len) (p : Fin n ** Vect (finToNat p) t)
When checking argument pf to constructor Builtins.MkDPair:
Type mismatch between
Vect (finToNat (FS FZ)) t (Type of intproof [x])
and
(\p => Vect (finToNat p) t) (FS FZ) (Expected type)
Specifically:
Type mismatch between
1
and
finToNat (FS FZ)
даже пишет:
intproof : Vect 1 t -> (\p => Vect (finToNat p) t) (FS FZ)
intproof x = x
получает ту же ошибку, что и выше
У меня итоговое значение по умолчанию%, и я импортирую Data.Vect в начале моего файла.
Есть ли способ заставить Idris признать, что finToNat (FS FZ) равен 1 (то есть S Z))?
Спасибо