2017-04-30 6 views
1

J'ai la configuration habituelle: d'abord je définis certains types, puis certaines fonctions de ces types. Cependant, comme il y a plusieurs façons de formaliser ce que je fais, je le ferai en 3 versions. Pour la simplicité (et pour maintenir une vue d'ensemble), je veux mon code dans un dossier. Je veux également minimiser le code répétitif. À cette fin, une installation w/3 Module s pour des choses spécifiques et définitions générales devant eux pourraient travailler - mais pas dans le type de situation décrite ci-dessous:Structuration Coq code

  1. Une Definition générale de la fonction f: A -> B, accessible dans toutes les sections (ou modules)

  2. module- (ou section-) des définitions spécifiques des A

  3. f doivent être calculable dans toutes les sections (ou modules)

Quelle configuration me recommandez-vous d'utiliser?

+1

Avez-vous regardé [Un tutoriel sur l'utilisation des modules] (https://coq.inria.fr/cocorico/ModuleSystemTutorial)? – larsr

+0

Merci, a jeté un coup d'oeil maintenant. Il semble que 'Module Type' ne peut contenir que' Axiom's et 'Parameter's. Puisque 'f' aurait un corps (je l'ai défini avec' Definition'), je ne pourrais pas le mettre dans 'Module Type'. ATM Je ne sais pas comment satisfaire les points 1-2 dans ma question (n'en ai même pas sérieusement considéré 3 encore) – jaam

Répondre

3
Require Import Arith. 

(* Create a module type for some type A with some general properties. *) 
Module Type ModA. 
    Parameter A: Type. 
    Axiom a_dec: forall a b:A, {a=b}+{a<>b}. 
End ModA. 

(* Define the function that uses the A type in another module 
    that imports a ModA type module *) 

Module FMod (AM: (ModA)). 
    Import AM. 
    Definition f (a1 a2:A) := if a_dec a1 a2 then 1 else 2. 
End FMod. 

(* Here's how to use f in another module *) 
Module FTheory (AM:ModA). 
    Module M := FMod AM. 
    Import M. 
    Import AM. 

    Theorem f_theorem: forall a, f a a = 1. 
    intros. compute. destruct (a_dec _ _). 
    auto. congruence. 
    Qed. 
End FTheory. 

(* Eventually, instatiate the type A in some way, 
    using subtyping '<:'. *) 

Module ModANat <: ModA. 
    Definition A := nat. 
    Theorem a_dec: forall a b:A, {a=b}+{a<>b}. 
    apply eq_nat_dec. 
    Qed. 
End ModANat. 

(* Here we use f for your particular type A *) 
Module FModNat := FMod ModANat. 

Compute (FModNat.f 3 4). 

Recursive Extraction FModNat.f. 

Goal FModNat.f 3 3 = 1. 
    Module M := FTheory ModANat. 
    apply M.f_theorem. 
Qed. 
+0

PS. Vous pouvez (plus commodément) commencer à calculer 'f' sur' nat' déjà dans 'FTheory' - il suffit d'insérer' Variable na:> nat -> A. Compute f 3 4.' après 'Import AM.' il ya – jaam

+0

L'idée c'était montrer comment séparer les propriétés générales, comme être un groupe, être décidable, être ordonné etc., et créer des théories générales à leur sujet. Plus tard, ces théories peuvent être spécialisées dans des instances particulières telles que des matrices, des listes, des arbres, etc. Il est possible de placer des lemmes qui se réfèrent à une instance particulière (comme nat, qui sont décidables) dans la théorie générale des types décidables. la séparation entre les choses qui sont vraies pour tous les types décidables et les choses qui sont vraies spécifiquement pour les nats. – larsr