我正在尝试为给定上限的自然数集定义一个类型。标准图书馆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。
答案 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}.