在 Idris 中强制一个参数大于另一个参数
Force one argument to be greater than another in Idris
我正在尝试编写一个函数 mSmallest
,它将两个自然数 n
和 m
作为输入并生成一个向量。输出向量包含有限集的 m
个最小成员,其中 n
个成员。
例如 mSmallest 5 3
应该产生 [FS (FS Z), FS Z, Z]
这是一个 Vect 3 (Fin 5)
我想限制输入参数 m
小于 n
。我试过这样的事情:
mSmallest : (n : Nat) -> (m : Nat) -> {auto p : n > m = True} -> Vect m (Fin n)
mSmallest Z Z = ?c_3
mSmallest Z (S k) = ?c_5
mSmallest (S k) m = ?c_2
由于输入p
,第二种情况应该是不可能的。我该怎么做才能消除 Z (S k)
案例?
此外,是否有更好的方法来定义 mSmallest
函数?
我认为n > m = True
不够有建设性;如果您改为使用 GT
命题,则可以消除前两个分支,因为在这种情况下无法在 p
上进行模式匹配:
-- Note that mSmallest is accepted as total with just this one case!
total mSmallest : (n : Nat) -> (m : Nat) -> {auto p : n `GT` m} -> Vect m (Fin n)
mSmallest (S k) m {p = LTESucc p} = replicate m FZ
(这个有趣的案例使用了 mSmallest
的虚拟实现,因为它应该与原始问题正交)。
我正在尝试编写一个函数 mSmallest
,它将两个自然数 n
和 m
作为输入并生成一个向量。输出向量包含有限集的 m
个最小成员,其中 n
个成员。
例如 mSmallest 5 3
应该产生 [FS (FS Z), FS Z, Z]
这是一个 Vect 3 (Fin 5)
我想限制输入参数 m
小于 n
。我试过这样的事情:
mSmallest : (n : Nat) -> (m : Nat) -> {auto p : n > m = True} -> Vect m (Fin n)
mSmallest Z Z = ?c_3
mSmallest Z (S k) = ?c_5
mSmallest (S k) m = ?c_2
由于输入p
,第二种情况应该是不可能的。我该怎么做才能消除 Z (S k)
案例?
此外,是否有更好的方法来定义 mSmallest
函数?
我认为n > m = True
不够有建设性;如果您改为使用 GT
命题,则可以消除前两个分支,因为在这种情况下无法在 p
上进行模式匹配:
-- Note that mSmallest is accepted as total with just this one case!
total mSmallest : (n : Nat) -> (m : Nat) -> {auto p : n `GT` m} -> Vect m (Fin n)
mSmallest (S k) m {p = LTESucc p} = replicate m FZ
(这个有趣的案例使用了 mSmallest
的虚拟实现,因为它应该与原始问题正交)。