在记录中实现级别多态子集
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 → ...)
甚至不会进行类型检查!
也许我没有适当地意识到子集作为谓词的概念---任何建议都将不胜感激。谢谢!
你需要像这样将 b
从 P
中取出
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。
使用子集的概念作为谓词,
ℙ : ∀ {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 → ...)
甚至不会进行类型检查!
也许我没有适当地意识到子集作为谓词的概念---任何建议都将不胜感激。谢谢!
你需要像这样将 b
从 P
中取出
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。