当有证据证明转换有效时,natToFin

时间:2015-04-28 01:28:01

标签: idris

标准库中的natToFin函数具有以下签名:

natToFin : Nat -> (n : Nat) -> Maybe (Fin n)

natToFin 4 5会返回Just (FS (FS (FS (FS FZ)))) : Maybe (Fin 5) natToFin 5 5会返回Nothing

我想要一个带有以下签名的函数:

myNatToFin : (m : Nat) -> (n : Nat) -> { auto p : n `GT` m } -> Fin n

它的行为与标准的lib函数相同,但不需要返回Maybe,因为Fin n总是可以从m生成n m }大于myNatToFin

如何实施AVG()

1 个答案:

答案 0 :(得分:5)

您可以通过同时递归mnn `GT` m的证据来直接执行此操作:

import Data.Fin

myNatToFin : (m : Nat) -> (n : Nat) -> {auto p : n `GT` m} -> Fin n
myNatToFin Z (S n) = FZ
myNatToFin (S m) (S n) {p = LTESucc _} = FS $ myNatToFin m n

请注意,在第二种情况下,您需要在p上进行模式匹配(即使它的值未在右侧使用),以便可以填充递归调用的自动参数。 / p>