理解 `k : Nat ** 5 * k = n` 签名

Understanding `k : Nat ** 5 * k = n` Signature

编译以下函数:

onlyModByFive : (n : Nat) -> (k : Nat ** 5 * k = n) -> Nat
onlyModByFive n k = 100

但是 k 用其 Nat ** 5 * k = n 语法表示什么?

还有,请问怎么调用呢?这是我试过的,但我不明白输出结果。

*Test> onlyModByFive 5 5
When checking an application of function Main.onlyModByFive:
        (k : Nat ** plus k (plus k (plus k (plus k (plus k 0)))) = 5) is not a
        numeric type

答案来源 - https://groups.google.com/d/msg/idris-lang/ZPi9wCd95FY/eo3tRijGAAAJ

(k : Nat) ** (5 * k = n) 是由

组成的依赖对
  • 第一个元素k : Nat
  • 第二个元素prf : 5 * k = n

换句话说,这是一个说"there exists some k : Nat such that 5 * k = n"的存在类型。要有建设性,你必须给出这样一个k和一个确实满足5 * k = n.

的证明

在您的示例中,如果您将 onlyModByFive 部分应用到 5,您会得到类型为

的东西
onlyModModByFive 5 : ((k : Nat) ** (5 * k = 5)) -> Nat

所以第二个参数必须是 (k : Nat) ** (5 * k = 5) 类型。我们在这里只能选择 k,将其设置为 1,并证明 5 * 1 = 5:

foo : Nat
foo = onlyModByFive 5 (1 ** Refl)

这是可行的,因为 5 * 1 减少到 5,所以我们必须证明 5 = 5,这可以通过直接使用 Refl : a = a 简单地完成(统一 a ~ 5).