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

时间:2016-04-07 01:43:43

标签: dependent-type existential-type idris

以下函数编译:

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

kNat ** 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

1 个答案:

答案 0 :(得分:5)

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

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

换句话说,这是一种存在主义类型,表示存在k : Nat5 * 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来简单地完成(统一{{1}} )。