在伊德里斯强制一个参数大于另一个参数

时间:2015-04-20 21:04:26

标签: idris

我正在尝试编写一个函数mSmallest,它将两个自然数nm作为输入并生成一个向量。输出向量包含具有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函数吗?

1 个答案:

答案 0 :(得分:6)

我认为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的虚拟实现用于有趣的情况,因为它应该与原始问题正交)。