理解 `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
).
编译以下函数:
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
).