如果我有以下一行:
Definition Foo : Set := list nat.
然后我编译没有问题。
但是,假设我想对Coq.Lists.ListSet
做同样的事情,(*Section first_definitions.
Variable A : Type.
Definition listset := list A.*)
Definition Bar : Set := listset nat.
是一个将有限集表示为列表的库:
The term "listset nat" has type "Type" while it is expected to have type
"Set" (universe inconsistency).
我收到以下错误:
listset
Set
,使其驻留在Type
中而不是listset
中?即,如果我知道我将使用Set
类型的参数Set
,是否有办法使其以某种方式存在于listset
层次结构中?list
定义为listset
时,为什么list
而不是set
会发生错误? 注意:实际类型称为listset
,但为了避免与Set
混淆,我将其重命名为=
。
编辑::=
替换为log.level.root=WARN
答案 0 :(得分:2)
- 当将listset定义为list时,为什么listset而不是list会发生错误?
因为list
是template universe polymorphic的归纳定义(请参见About list.
),在这种情况下,这意味着如果将list
应用于Set
中的类型,结果仍在Set
中。
- 是否有一种方法可以“投射”
listset
,使其驻留在Set
中而不是Type
中?
AFAIK,无法使定义模板世界具有多态性,但是您可以像这样使它们universe polymorphic:
Polymorphic Definition listset (A : Type) : Type := list A.
Check listset nat : Set.
另一种选择是使用Set Universe Polymorphism
命令,因此您不需要在定义前加上Polymorphic
关键字。
在撰写本文时,此功能具有实验状态。而且它不具有追溯力,因此我想您需要分叉自己的ListSet
。