了解关于Agda的练习考试

时间:2017-03-06 05:15:12

标签: programming-languages agda agda-mode

我正在使用agda进行编程语言基础的练习考试,它有以下问题:

您将获得以下Agda声明:

data Even : N → Set where
 ezero : Even 0
 esuc : { n : N }  → Even n  → Even (2+ n)

假设已导入标准自然数库。回答以下问题:

a)ezero的类型是什么?

b)是否有Even 1类型的条款?

c)Even 2类型的条款数量是多少?列出他们

d)描述如果我们将esuc的返回类型更改为Even (n+2)而不是Even (2+n)可能会出现的一个潜在问题。

我们未提供解决方案手册。这个问题似乎很基本,但我不确定这些问题。我认为前三个问题的答案是:

a)设置

b)没有类型的条款偶数1

c)一个类型的偶数2

d)不知道

对这些问题的回答以及简要说明将受到高度赞赏。感谢

1 个答案:

答案 0 :(得分:5)

  

ezero的类型是什么?

可以从数据声明中读取数据构造函数ezero的类型:ezero : Even 0表明它具有类型Even 0

  

是否有Even 1类型的条款?

不,没有。这可以通过一个案例区分来看出:如果有一个术语,那么它将从两个构造函数中的任何一个开始。因为它们具有特定的回报指数,所以它们必须与1统一。

  • ezero会强制执行1 = 0
  • esuc意味着有一个1 = 2+ n

这两种情况都是不可能的。

  

有多少条款是偶数2?列出他们

只有一个:esuc ezero。通过类似于上一个问题的推理,我们可以证明ezeroesuc (esuc p)(对于某些p)不会这样做。

  

如果我们将esuc的返回类型更改为Even (n+2)而不是Even (2+n),请描述可能出现的一个潜在问题。

考虑证明plus-Even : {m n : N} → Even m → Even n → Even (m + n)。由于(+)是由第一个参数的归纳定义的,因此您无法在步骤案例中立即应用esuc。您需要使用重写来预先将Even ((m +2) + n)(或Even (m + (n +2))取决于您执行归纳的参数)的目标类型重新组织为Even ((m + n) +2)