实现记录中的级别多态子集

Mus*_*ssy 2 set subset agda

使用子集的概念作为谓词,

? : ? {b a} ? Set a ? Set (a ? suc b)
? {b} {a} X = X ? Set b
Run Code Online (Sandbox Code Playgroud)

我想考虑赋予子集谓词的结构,

record SetWithAPredicate {a c} : Set {!!} where
  field
   S : Set a
   P : ? {b} ? ? {b} S ? Set c
Run Code Online (Sandbox Code Playgroud)

由于使用了水平量化,这是一个结构不良的结构?.当我S, P用作模块的参数时,一切正常,但我希望它们是记录,以便我可以在它们上形成构造并给出它们的实例.

我尝试了一些其他的东西,比如通过存在主义来移动定义内部的水平b,?但这导致了可能性的麻烦.我也尝试过更改类型P,

P : ? {a} S ? Set c
Run Code Online (Sandbox Code Playgroud)

但是我再也不能要求空集来拥有这个属性了:

P-? : P(? _ ? ?)
Run Code Online (Sandbox Code Playgroud)

这是打字不好,因为Set != Set a---我必须承认,我试图在Level.lift这里使用,但未能这样做.更一般地说,这也不允许我表达闭包属性,例如P在任意联合下关闭 - 这是我真正感兴趣的.

我明白我可以避免级别多态,

?' : ? {a} ? Set a ? Set (suc zero ? a)
?' {a} X = X ? Set
Run Code Online (Sandbox Code Playgroud)

但随后是简单的项目,如最大的子集,

?'-? : ? {i} {A : Set i} ? ?' A
?'-? {i} {A} = ? e ? ? a ? A • a ? e
-- ?_?_•_ is just syntax for ? A (? a ? ...)
Run Code Online (Sandbox Code Playgroud)

甚至都不会做出来!

也许我没有认识到子集作为谓词的概念 - 任何建议都会受到赞赏.谢谢!

use*_*465 6

你需要像这样b摆脱出来P

record SetWithAPredicate {a c} b : Set {!!} where
  field
   S : Set a
   P : ? {b} S ? Set c
Run Code Online (Sandbox Code Playgroud)

是的,这是丑陋和烦人的,但这就是它在Agda中的表现(标准库的一个例子:_>>=_不是正确的宇宙多态).Lift有时可以提供帮助,但很快就会失控.

也许我没有认识到子集作为谓词的概念 - 任何建议都会受到赞赏.

你的定义是正确的,但还有另一个,见Conor McBride的讲义中的 4.8.3 .