有界自然的Coq MSet

时间:2017-03-29 02:15:37

标签: module set coq

我正在尝试为给定上限的自然数集定义一个类型。标准图书馆MSet似乎是一种方法。我发现this discussion给出了一个很好的例子来说明如何定义一组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.
  ...

我将使用具有不同上限的集合。但是我没有看到如何用给定的&#39; n来实例化这个模块。理想情况下,我希望能够写出这样的内容:

Module BoundedMNatSets := MakeWithLeibniz OWL.
Definition BoundedMNatSetN (n:nat) : Type := BoundedMNatSets n.

P.S。这个问题可能源于我对Coq模块系统的不充分理解,而不是特定于Set。

1 个答案:

答案 0 :(得分:1)

您需要使用仿函数。类似的东西:

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.

然后,您可以将OWL应用于签名FIXED_NAT的模块。

Module N1 <: FIXED_NAT.
    Definition n := 10.
End N1.

Module OWL1 := OWL N1.

Require Import MSets.

Module M1 := Make OWL1.

编辑: 怎么样:

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}.