我正在使用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)不知道
对这些问题的回答以及简要说明将受到高度赞赏。感谢
答案 0 :(得分:5)
ezero
的类型是什么?
可以从数据声明中读取数据构造函数ezero
的类型:ezero : Even 0
表明它具有类型Even 0
。
是否有
Even 1
类型的条款?
不,没有。这可以通过一个案例区分来看出:如果有一个术语,那么它将从两个构造函数中的任何一个开始。因为它们具有特定的回报指数,所以它们必须与1
统一。
ezero
会强制执行1 = 0
esuc
意味着有一个1 = 2+ n
这两种情况都是不可能的。
有多少条款是偶数2?列出他们
只有一个:esuc ezero
。通过类似于上一个问题的推理,我们可以证明ezero
和esuc (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)
。