Coq中一致的套装配方?

时间:2013-06-01 15:34:09

标签: set subset coq

我在Coq很新,并试图根据我的研究开发一个框架。我的工作定义很重,而且由于Coq似乎对待集合而我编码很困难。

TypeSet,他们称之为“排序”,我可以使用它们来定义新的集合:

Variable X: Type.

然后有一个编码(子)的库设置为“Ensembles”,它们是从TypeProp的函数。换句话说,它们是Type

的谓词
Variable Y: Ensemble X.

Ensemble感觉更像是正确的数学集合。此外,它们是由许多其他图书馆构建的。我已经尝试过关注它们:定义一个通用集U: Set,然后将自己限制在Ensemble上的(子)U s。但不是。 Ensemble不能用作其他变量的类型,也不能用于定义新子集:

Variable y: Y.           (* Error *)
Variable Z: Ensemble Y.  (* Error *)

现在,我知道有几种方法可以解决这个问题。问题“Subset parameter”提供了两个问题。两者都使用强制。第一个坚持到Set s。第二个主要使用Ensemble s(虽然不是名字)。但两者都需要相当多的机制才能完成如此简单的事情。

问题:一致(优雅)处理集合的推荐方法是什么?

示例:以下是我想要做的示例:假设一组 DD 。定义一对 dm =(D,<),其中 D DD < 的有限子集是 D 的严格部分顺序。

我确信通过对强制或其他结构进行足够的修补,我可以完成它;但不是特别易读;并没有很好的直觉,如何进一步操纵结构。例如,以下类型检查:

Record OrderedSet {DD: Set} : Type := {
  D     : (Ensemble DD);
  order : (relation {d | In _ D d});

  is_finite         : (Finite _ D);
  is_strict_partial : (is_strict_partial_order order)
}.

但我不确定这是我想要的;它当然看起来不太漂亮。请注意,我在SetEnsemble之间以一种看似随意的方式前后移动。

有很多库使用Ensemble,因此必须有一种很好的方法来处理它们,但这些库似乎没有很好地记录(或者......根本没有)

更新:为了使问题更加复杂,似乎还有许多其他设置实现,例如MSets。这个似乎是完全独立的,与Ensemble不兼容。出于某种原因,它还使用bool而不是Prop。还有FSets,但它似乎是MSets的过时版本。

1 个答案:

答案 0 :(得分:4)

自从我使用Coq以来已经(几乎)了几年,但让我试着帮助。

我认为从数学角度讲U: Set就像说U是一个元素世界,而Ensemble U则意味着来自该世界的一组元素。因此,对于通用概念和定义,您几乎肯定会使用SetEnsemble是推理元素子集的一种可能方式。

我建议您看一下Matthieu Sozeau的精彩作品,他介绍了type classes to Coq,这是一个基于Haskell类型类的非常有用的功能。特别是在标准库中,您会在问题中找到基于类的PartialOrder定义。

另一个参考是证明终止术语重写所需的CoLoR library形式化概念。它有一套相当大的generic purpose definitions订单和什么不是。