Types 我如何说服Agda';这就是我所说的';我做的有根据吗?

Types 我如何说服Agda';这就是我所说的';我做的有根据吗?,types,functional-programming,agda,dependent-type,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} -> {

我有一个函数,可以将自然数映射到相应的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
data U l:Setn l其中
...
提升:{l':Nat}->{l'ul'->ul
在这里,Agda抱怨说
Set(l级)
不小于或等于
Set(l级)
,这显然是错误的,尽管我知道Agda不具备推导
Set(l级)的能力


这可能不是你想要听到的答案,但Agda拒绝使用这种类型有很好的理由,即使你使用宇宙级别的方式似乎是正确的。特别是,如果Agda允许这种情况,那么就可以使用强规范化(从而可以判定是否进行了类型检查)可能会丢失:在一个有
1证明的开放上下文中,
U
中的其他
东西是什么?
答案取决于此。如果你不放置
(a:设置l)
在任何构造函数中,即
U
中的类型格式化程序只引用
U
中的类型,那么就可以将
level
全部删除。我对这类事情有所了解。这里的技巧不使用自然,但您可能可以添加它们(并且您可能根本不需要它们).@AndrásKovács不幸的是,我的构造函数确实使用了
Set l
@user3237465中的参数,谢谢,你的帖子看起来很棒,可能会取代我使用自然语言的需要。不幸的是(如果我理解正确的话),在不禁用严格正性的情况下使用它似乎是不可能的,而且我不理解在我的项目环境中这样做的潜在后果。@NJay我想在某个时候Agda开发人员修复了正性仅在参数中跟踪而不是索引的行为,因此如果您有最新版本的Agda,我建议从帖子中复制粘贴代码并检查是否仍然需要
无阳性检查
。但不保证不需要。我想告诉Agda信任我的一种方法是关闭宇宙检查器,但如果某个条件成立,则无法告诉Agda信任我。理论上,应该可以实现这样一个se如果我没弄错的话,我会为Agda打电话。(我不是打算这么做,我只是想确保我理解正确。)您可以使用
{-\NO\u universe\u CHECK}
pragma(请参阅)在本地为单个数据类型声明关闭universe。这样,您可以告诉Agda在特定定义上信任您,但在其他情况下仍会检查universe。