使用子集的概念作为谓词,
? : ? {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)
甚至都不会做出来!
也许我没有认识到子集作为谓词的概念 - 任何建议都会受到赞赏.谢谢!
你需要像这样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 .