【发布时间】:2023-09-06 19:25:01
【问题描述】:
刚开始使用 Idris(如果重要的话,那就是 Idris 2),偶然发现了这个问题。我正在尝试实现一个函数,该函数返回一个由所有斐波那契数组成的向量,直到给定 n。这是到目前为止的定义(它不编译):
fibs : (n : Nat) -> Vect (n + 1) Int
fibs Z = [0]
fibs (S Z) = [0, 1]
fibs (S k) =
case (fibs k) of
(x :: y :: xs) => (x + y) :: x :: y :: xs
我得到的错误如下:
Can't solve constraint between:
S (S ?len)
and
plus ?_ (fromInteger 1)
错误指向表达式(x :: y :: xs)。
我知道我需要向 Idris 证明 fibs k 的长度至少为 2,但我不明白如何做到这一点,以及为什么从现有定义中不明显。对我来说,fibs (S k) 中的 k 肯定必须 >= 1,否则 fibs Z 或 fibs (S Z) 将匹配。 fibs k 的长度,其中k >= 1 因此必须>= 2,根据fibs : (n : Nat) -> Vect (n + 1) Int 的定义。我缺少什么以及如何在 Idris 中表达这一点?
【问题讨论】:
标签: idris dependent-type