types - 我如何说服 Agda 的宇宙检查器我所做的事情是有根据的?

标签 types functional-programming agda dependent-type

我有一个函数可以将自然数映射到它们相应的 Agda 宇宙级别。

level : Nat -> Level
level zero = lzero
level (suc l) = lsuc (level l)

Setn : (l : Nat) -> Set (level (suc l))
Setn l = Set (level l)
我以这种方式在归纳数据类型的定义中使用此函数:
data U l : Setn l where
  ...
  Lift : {l' : Nat} -> {l' <= l} -> U l' -> U l
在这里,Agda 提示 Set (level l')不小于或等于 Set (level l) ,这显然是错误的,尽管我知道 Agda 没有能力推导出 Set (level l') <= Set (level l)来自 l' <= l .我如何向 Agda 的 Universe checker 暗示这个定义确实是有根据的?

最佳答案

你没有。
这可能不是您想听到的答案,但 Agda 拒绝这种类型是有充分理由的,即使您使用 Universe 级别的方式似乎是正确的。特别是,如果 Agda 允许这样做,那么强规范化(以及类型检查的可判定性)将丢失:在具有 1 <= 0 证明的开放上下文中。 ,您将能够利用此数据类型(或其变体)来定义不遵守 Universe 层次结构的数据类型,然后可以使用它(通过 Girard 悖论)来定义非终止项。由于 Agda 无法确定假设是否一致,因此它完全排除了这些用户证明的级别不等式,只相信自己的求解器。

关于types - 我如何说服 Agda 的宇宙检查器我所做的事情是有根据的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62750671/

相关文章:

reflection - 是否可以使用其中一种方法获取结构的名称?

haskell - 比代数数据类型更喜欢 CPS 的要求是什么?

javascript - 如何将when.map与node.lift-ed函数一起使用?

agda - 在 Agda 中证明当且仅当的错误情况

agda - 如何解决隐式与显式函数类型错误?

string - 无法使用 'UTTypeEqual' 类型的参数列表调用 '(CFString!, CFString!)'

c++ - 获取给定对象的类型说明符

c# - 如何从 C# 方法返回多种数据类型?

c - 是否可以将类型推断添加到 C 语言中?

haskell - 是否有可能在具有简单不一致公理的构造演算中提取 Sigma 的第二个元素?