Functional programming Coq:生活在集合中的非列表数据结构?
如果我有以下行:Functional programming Coq:生活在集合中的非列表数据结构?,functional-programming,coq,dependent-type,theorem-proving,Functional Programming,Coq,Dependent Type,Theorem Proving,如果我有以下行: 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
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).
列表集
,使其位于集合
中,而不是类型
?i、 e.如果我知道我将使用列表集
和集
类型的参数,有没有办法让它活在集
继承权中列表集
定义为列表
时,为什么列表集
会发生错误,而列表
不会发生错误set
,但我已将其重命名为listset
,以避免与排序set
混淆
编辑:=
替换为:=
list
是一个归纳定义(请参见关于list.
),在本例中,这意味着如果list
应用于Set
中的某个类型,则结果仍在Set
中
列表集
,使其位于集合
中,而不是类型
Set-Universe-Polymorphic
命令,这样您就不需要在定义前面加上Polymorphic
关键字。
在撰写本文时,此功能处于实验状态。而且它不具有追溯性,所以我想你需要拿出你自己的
列表集
@larsr我的错,我正试图得到一个关于这个问题的MWE。我已经用更多的上下文(即节变量)对其进行了更新,并修复了=
和:=
混淆仅供参考:对于MWE,我认为导入列表集会更有帮助,这样我们就可以确切地知道您使用的定义。至于set
vsset
,我认为大多数Coq用户都习惯于区分大小写,不会感到困惑如果一个定义最初不是这样声明的,并且我无法控制它的声明,那么有没有一种方法可以以宇宙多态的方式使用它?i、 如果我试图使用?我认为这是不可能的。另外,有人说Set
是传统。我很好奇:您的用例是什么?我正在使用Ott从语言文件生成定义和LaTeX,它在任何地方都生成Set
。我可能会运行一个后处理器,将设置
更改为类型
,或者做一些可怕的事情,比如定义集:=类型
,如果Coq允许的话。我不知道Set
是遗留的,这很好。您可能可以重用的方法。完美,看起来正是我需要的!
Polymorphic Definition listset (A : Type) : Type := list A.
Check listset nat : Set.