Module 有界自然的Coq-MSet

Module 有界自然的Coq-MSet,module,set,coq,Module,Set,Coq,我试图为一组具有给定上界的自然数定义一个类型。标准库的MSet似乎是一条出路。我发现这是一个很好的例子,说明了如何定义一组nat。但是,我不知道如何将其扩展到子集类型。我试过这样的方法: Module OWL. Parameter n : nat. Definition t := {i:nat | i<n}. Definition eq := @eq t. Instance eq_equiv : @Equivalence t eq := eq_equivalence.

我试图为一组具有给定上界的自然数定义一个类型。标准库的
MSet
似乎是一条出路。我发现这是一个很好的例子,说明了如何定义一组
nat
。但是,我不知道如何将其扩展到子集类型。我试过这样的方法:

Module OWL.
  Parameter n : nat.
  Definition t := {i:nat | i<n}.
  Definition eq := @eq t.
  Instance eq_equiv : @Equivalence t eq := eq_equivalence.
  Definition lt (a b:t) := Peano.lt (proj1_sig a) (proj1_sig b).
  Instance lt_strorder : @StrictOrder t lt.
  ...
Module BoundedMNatSets := MakeWithLeibniz OWL.
Definition BoundedMNatSetN (n:nat) : Type := BoundedMNatSets n.

另外,这个问题可能源于我对Coq模块系统的理解不足,而不是特定于集合。

您需要使用函子。比如:

Require Import Orders.

Module Type FIXED_NAT.
    Parameter n : nat.
End FIXED_NAT.

Module OWL (N : FIXED_NAT) <: OrderedType.
    Definition t := {i:nat | i < N.n}.
    ...
End OWL.
编辑: 那么:

Require Import Orders.
Require Import OrdersEx.
Require Import MSets.
Require Import Arith.

Module M := Make Nat_as_OT.

Definition has_upper_bound s n := M.For_all (ge n) s.

Definition t n := {s : M.t | has_upper_bound s n}.

我想我的问题不在于排序,而在于参数化。我希望有一个由<代码> n>代码>参数化的集合。恐怕你需要使用一个函子。我不太清楚你在想什么应用程序,但是你考虑过类型类还是规范结构。我会欣然地考虑类型类。我需要的是支持有界自然数集的相当基本的库。我需要构造这些集合,最好使用索引函数,并执行简单的基本操作,如集合并集、交集和差集。我研究了数学课程必须提供的内容,但我没有想到如何将这些轻松地应用到有界自然中。请举个小例子,不胜感激!因为我已经在用数学课了,所以也可以用它来做集合!谢谢这有点帮助,但这并不是我想要实现的。我希望将
n
作为MNatSet类型的参数,这样我就可以在不同的情况下使用不同的大小,而无需每次实例化一个模块。例如,使用
Ensembles
我可以这样做:需要导入Coq.set.Ensembles。定义EFinNatSet(n:nat):类型:=集合{x:nat |(xI正在使用您在更新中建议的最后一个解决方案。它看起来很有趣。一旦我更好地理解它,我将在这里更新。谢谢!建议的方法似乎对我有效。我有一个快速的后续问题:1)为什么你选择了
bool
而不是
prop
.2)为什么
fold
而不是
For_all
3)我如何得到这个集合的额外引理,比如MSetFacts或MSetInterface?谢谢!附言。这里有一个小例子,修改你对prop/Forall的建议,并试图用它证明一个简单的引理。任何评论都非常好有些问题。真的很好的问题!2)是因为我不知道所有人的
,1)是因为我不知道所有人的
。我会更新答案。我不确定我是否理解3)。基本答案是应用函子,如
模块F:=Facts M.
。如果你想同时导入,你可以直接执行
Module导入F:=Facts M.
Require Import Orders.
Require Import OrdersEx.
Require Import MSets.
Require Import Arith.

Module M := Make Nat_as_OT.

Definition has_upper_bound s n := M.For_all (ge n) s.

Definition t n := {s : M.t | has_upper_bound s n}.