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

时间:2016-03-20 06:00:15

标签: set subset agda

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

ℙ : ∀ {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 → ...)

甚至不会进行类型检查!

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

1 个答案:

答案 0 :(得分:6)

您需要bP这样抬起

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。