Coq:Set中存在非列表数据结构吗?

时间:2018-07-11 04:47:24

标签: 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 nat" has type "Type" while it is expected to have type 
"Set" (universe inconsistency).

我收到以下错误:

listset
  1. 是否有一种方法可以“投射” Set,使其驻留在Type中而不是listset中?即,如果我知道我将使用Set类型的参数Set,是否有办法使其以某种方式存在于listset层次结构中?
  2. 当将list定义为listset时,为什么list而不是set会发生错误?

注意:实际类型称为listset,但为了避免与Set混淆,我将其重命名为=

编辑::=替换为log.level.root=WARN

1 个答案:

答案 0 :(得分:2)

  
      
  1. 当将listset定义为list时,为什么listset而不是list会发生错误?
  2.   

因为listtemplate universe polymorphic的归纳定义(请参见About list.),在这种情况下,这意味着如果将list应用于Set中的类型,结果仍在Set中。

  
      
  1. 是否有一种方法可以“投射” listset,使其驻留在Set中而不是Type中?
  2.   

AFAIK,无法使定义模板世界具有多态性,但是您可以像这样使它们universe polymorphic

Polymorphic Definition listset (A : Type) : Type := list A.
Check listset nat : Set.

另一种选择是使用Set Universe Polymorphism命令,因此您不需要在定义前加上Polymorphic关键字。 在撰写本文时,此功能具有实验状态。而且它不具有追溯力,因此我想您需要分叉自己的ListSet