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

Realising level polymorphic subsets within records

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

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

甚至不会进行类型检查!

也许我没有适当地意识到子集作为谓词的概念---任何建议都将不胜感激。谢谢!

你需要像这样将 bP 中取出

record SetWithAPredicate {a c} b : Set {!!} where
  field
   S : Set a
   P : ℙ {b} S → Set c

是的,这很丑陋也很烦人,但这就是 Agda 中的做法 (an example from standard library: _>>=_ is not properly universe polymorphic). Lift can help sometimes, but it quickly gets out of hand.

Perhaps I did not realise the notion of subset as predicate appropriately ---any advice would be appreciated.

您的定义是正确的,但还有另一个定义,请参阅 Conor McBride 的 4.8.3 lecture notes