使用子集的概念作为谓词,
ℙ : ∀ {b a} → Set a → Set (a ⊔ suc b)
ℙ {b} {a} X = X → Set b
我想考虑赋予子集谓词的结构,
record SetWithAPredicate {a c} : Set {!!} where
field
S : Set a
P : ∀ {b} → ℙ {b} S → Set c
由于ℙ
中使用的水平量化,这是一种结构错误的结构。当我使用S, P
作为模块的参数时,一切正常,但我希望它们是记录,以便我可以在它们上形成构造并给出它们的实例。
我尝试过其他一些事情,例如通过存在主义移动定义中b
的等级ℙ
,但这导致了可能性更大的麻烦。我还尝试更改P
的类型,
P : ℙ {a} S → Set c
然后我再也不能要求空集来拥有该属性:
P-⊥ : P(λ _ → ⊥)
自Set != Set a
以来输入效果不好---我必须承认,我试图在这里使用Level.lift
,但未能这样做。
更一般地说,这也不允许我表达闭包属性,例如P
在任意联合下被关闭 - 这是我真正感兴趣的。
我明白我可以避免级别多态,
ℙ' : ∀ {a} → Set a → Set (suc zero ⊔ a)
ℙ' {a} X = X → Set
然后是简单的项目,例如最大的子集
ℙ'-⊤ : ∀ {i} {A : Set i} → ℙ' A
ℙ'-⊤ {i} {A} = λ e → Σ a ∶ A • a ≡ e
-- Σ_∶_•_ is just syntax for Σ A (λ a → ...)
甚至不会进行类型检查!
也许我没有意识到子集作为谓词的概念 - 任何建议都会受到赞赏。感谢您!
答案 0 :(得分:6)
您需要b
从P
这样抬起
record SetWithAPredicate {a c} b : Set {!!} where
field
S : Set a
P : ℙ {b} S → Set c
是的,这很丑陋,但是这就是Agda(an example中标准库的完成方式:{{1}}不是宇宙多态的。 _>>=_
有时可以提供帮助,但很快gets out of hand。
也许我没有意识到子集作为谓词的概念 适当的 - 任何建议都会受到赞赏。
您的定义是正确的,但还有另一个定义,请参阅Conor McBride的lecture notes中的4.8.3。