2017-03-29 2 views
2

J'essaye de définir un type pour l'ensemble des nombres naturels avec la limite supérieure donnée. MSet de la bibliothèque standard semble être une voie à suivre. J'ai trouvé this discussion qui donne un bel exemple de la façon de définir un ensemble de nat. Cependant je ne peux pas comprendre comment l'étendre aux types de sous-ensembles. J'ai essayé quelque chose comme ceci:Coq MSet de naturels bornés

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

Je vais travailler avec des ensembles avec différentes limites supérieures. Mais je ne vois pas comment instancier ce module avec un 'n' donné. Idéalement, j'aimerais pouvoir écrire quelque chose comme ceci:

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

P.S. Cette question est probablement ancrée dans ma compréhension insuffisante du système de modules Coq, et non spécifique aux Sets.

+0

Est-ce que le module 'OWL <: OrderedType.' aide? – ejgallego

+0

Je pense que mon problème n'est pas de commander mais de paramétrer. Je voudrais avoir un ensemble paramétré par 'n'. – krokodil

+0

Vous aurez besoin d'utiliser un foncteur j'ai peur. – ejgallego

Répondre

1

Vous devez utiliser un foncteur. Quelque chose comme:

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. 

Vous pouvez ensuite appliquer OWL aux modules de signature FIXED_NAT.

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

Module OWL1 := OWL N1. 

Require Import MSets. 

Module M1 := Make OWL1. 

EDIT: Qu'en est-:

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

Merci! Ça aide un peu, mais ce n'est pas exactement ce que je veux accomplir. Je voudrais que 'n' soit un paramètre de type MNatSet, donc je peux utiliser différentes tailles dans différentes situations, sans instancier un module à chaque fois. Par exemple en utilisant 'Ensembles' je pourrais faire quelque chose comme ceci: Exiger Importer Coq.Sets.Ensembles. Définition EFinNatSet (n: nat): Type: = Ensemble {x: nat | (x krokodil

+0

Je joue avec la dernière solution que vous avez suggérée dans la mise à jour. Ça a l'air intéressant. Je vais mettre à jour ici une fois que je le comprendrai mieux. Merci! – krokodil

+1

Il semble que la méthode suggérée puisse fonctionner pour moi. J'ai juste une question de suivi rapide: 1) Pourquoi avez-vous choisi 'bool' au lieu de' prop'. 2) Pourquoi "fold" pas "For_all" 3) Comment obtenir des lemmes supplémentaires tels que MSetFacts ou MSetInterface pour cet ensemble? Merci! P.S. Voici un petit exemple retravaillant votre suggestion à Prop/Forall et essayant de prouver un simple lemme en l'utilisant. http://ideone.com/gKcl6j Tous les commentaires sont les bienvenus. – krokodil