IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages fonctionnels Discussion :

[COQ] Débuter, arbres binaires de recherche


Sujet :

Langages fonctionnels

  1. #1
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut [COQ] Débuter, arbres binaires de recherche
    Premières impressions.

    Pour un système qui est déjà en version 8, je m'attendais à trouver plus d'exemples et de tutoriels.
    Là j'ai l'impression de quelque chose de confidentiel avec quelques tutoriels qui paraissent insipides sur le plan algorithmique.
    Par exemple la librairie standard et les contributions sont loin de couvrir toutes les structures arborescentes.
    Pourtant le système a l'air mature, à mon avis c'est surtout une question de (manque de) popularité, à partir du moment où l'utilisateur accepte sa condition de "pionnier" il n'est pas censé avoir besoin d'encouragements.

    Premiers essais

    Je ne sais pas si on peut parler d'essai puisque je n'ai fais que recoder ce que je connais déjà.
    Par exemple la recherche et l'insertion dans un arbre binaire ne m'ont pas posé de difficultés, hormis le fait que < est de type natnatProp et non de type natnatbool ce qui m'a ralenti un certain moment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Inductive tree : Set :=
      | Leaf
      | Node: tree -> nat -> tree -> tree.
    
    (* je dois vraiment coder nat_less moi-même ? *)
    Fixpoint nat_less (a b : nat) {struct a} :=
      match a,b with
      | O,S n => true
      | m,O => false
      | S m,S n => nat_less m n 
      end.
      
    Fixpoint find (t:tree) (n:nat) {struct t} :=
      match t with
      | Leaf => false
      | Node l m r =>
          if nat_less n m then find l n
          else if nat_less m n then find r n
          else true
      end.
    
    Fixpoint insert (t:tree) (n:nat) {struct t} :=
      match t with
      | Leaf => Node Leaf n Leaf
      | Node l m r =>
          if nat_less n m then Node (insert l n) m r
          else Node l m (insert r n)
      end.
    Propriétés

    J'ai pensé que dans un second temps il serait bon d'avoir quelques propriétés intéressantes sur les arbres binaires de recherche.

    Notamment tree_ordered, la propriété caractéristique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Definition less a b := nat_less a b = true.
    
    Inductive tree_between : tree -> nat -> nat -> Prop :=
      | leaf_tree_between :
          forall a b,
          tree_between Leaf a b
      | node_tree_between :
          forall l m r, forall a b,
          tree_between l a m -> less a m -> less m b -> tree_between r m b ->
          tree_between (Node l m r) a b
    with tree_less : tree -> nat -> Prop :=
      | leaf_tree_less :
          forall b,
          tree_less Leaf b
      | node_tree_less :
          forall l m r, forall b,
          tree_less l m -> less m b -> tree_between r m b ->
          tree_less (Node l m r) b
    with tree_more : tree -> nat -> Prop :=
      | leaf_tree_more :
          forall a,
          tree_more Leaf a
      | node_tree_more :
          forall l m r, forall a,
          tree_between l a m -> less a m -> tree_more r m ->
          tree_more (Node l m r) a.
      
    Inductive tree_ordered : tree -> Prop :=
      | leaf_tree_ordered :
          tree_ordered Leaf
      | node_tree_ordered :
          forall l m r,
          tree_less l m -> tree_more r m ->
          tree_ordered (Node l m r).
    Et member, pour exprimer que mon TAD est un conteneur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Inductive member : tree -> nat -> Prop :=
      | left_member :
          forall m n l r,
          member l n ->
          member (Node l m r) n 
      | right_member :
          forall m n l r,
          member r n ->
          member (Node l m r) n 
      | root_member :
          forall l n r,
          member (Node l n r) n.
    Bien sûr, je n'en suis pas arrivé là sans m'inspirer du code existant, d'où un certain doute :
    • pourquoi le code existant ressemble si peu au mien ?
    • est-ce que j'ai suivi une bonne approche ?
    • est-ce que je n'aurais pas du commencer par les tutoriels rébarbatifs ?


    Théorèmes

    Mon idée c'était d'en arriver au point où je suis en mesure d'exprimer les théorèmes qui valident mes opérations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Theorem find_iff_member :
    forall t, tree_ordered t ->
    forall n, find t n = true <-> member t n.
    
    Theorem insert_conservative :
    forall t, tree_ordered t ->
    forall m n, member t m -> member (insert t n) m.
    
    Theorem insert_inclusive :
    forall t, tree_ordered t ->
    forall n, member (insert t n) n.
    Démarche

    D'un certain point de vue je n'ai pas progressé puisque je retrouve la difficulté que j'avais différé jusqu'ici.
    Est-ce qu'au moins j'ai pris un bon départ ?
    Si oui, est-ce que les preuves sont à ma portée ou est-ce que je dois d'abord me faire la main sur des exemples plus abordables ?
    Pour l'équivalence find_iff_member, je peux la prouver directement ou bien je dois prouver l'implication dans les deux sens ?
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    je pense qu'une question s'impose : qu'attends-tu réellement de Coq ?
    si tu veux un système syntaxique très proche de OCaml, pour pouvoir générer via camlp4 ou autre un "fichier de preuve", puis de compléter les rares étapes à la main... ben le projet me semble très éloigné de cel


    quoiqu'il en soit, mieux vaut que Steki-kun passe par là
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    alex_pi
    Invité(e)
    Par défaut
    Je crois que quand tu veux comparer deux nombres, tu vas plutôt utiliser les fonction de décidabilité sur la comparaison, comme trouvable ici : http://coq.inria.fr/V8.1/stdlib/Coq....mpare_dec.html. Comme ça, quand tu matches sur le résultat, tu trouves facilement dans quel cas tu te trouves. Mais je ne suis pas forcément sûr hein, je ne pratique pas dutout Coq

    Pour un bon tuto, je te conseille http://www.cis.upenn.edu/~plclub/popl08-tutorial/. Je ne pense pas qu'il soit trop rébarbatif.

    Bon courage pour ta plongé dans le merveilleux monde de la certification :-)

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par alex_pi Voir le message
    Bon courage pour ta plongé dans le merveilleux monde de la certification :-)

    heu... faudrait pas essayer de faire croire que Coq sert à la certification non plus.
    à part le théorème des 4 couleurs, je ne sais pas si ça a servi à autre chose de difficile et concret
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  5. #5
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    heu... faudrait pas essayer de faire croire que Coq sert à la certification non plus.
    à part le théorème des 4 couleurs, je ne sais pas si ça a servi à autre chose de difficile et concret
    Un compilateur C ?

  6. #6
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par alex_pi Voir le message
    Un compilateur C ?
    je reprécise... un VRAI projet utile industriellement
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  7. #7
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    je reprécise... un VRAI projet utile industriellement
    Et tu peux m'expliquer en quoi un compilo C certifié vers PowerPC (qui tourne sur un peu tous les avions...) n'est pas utile ?

    Je suppose qu'une certification EAL7 d'un produit JavaCard n'est pas non plus un projet industriel utile ?

  8. #8
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par alex_pi Voir le message
    Et tu peux m'expliquer en quoi un compilo C certifié vers PowerPC (qui tourne sur un peu tous les avions...) n'est pas utile ?
    tu peux me détailler le nombre de projets industriels l'utilisent ?
    tu peux m'expliquer comment tu vas certifier du code qui n'est pas totalement ANSI, mais qui étaient certifiés par d'autres méthodes auparavant ?
    tu peux m'expliquer comment tu vas certifier des bibliothèques binaires dont tu n'as pas forcemment les sources ?
    etc

    nb : j'ai l'air sévère comme cela, mais en fait je pourrais faire les mêmes remarques sur le projet qu'on fait dans notre labo... si l'on est pas capable de permettre du véritable utilisation par des types en R&D, et non uniquement par des docteurs es sémantique & vérification, je ne suis pas convaincu que ça percera


    je ne dis pas que c'est totalement inutile, j'ai juste un ENORME doute sur l'utilisation qui va en être faite à l'avenir... il y a tellement de super projets morts-nés en recherche qui auraient mérité un peu d'attention de la part du monde industriel (ou du reste du monde académique )
    donc une fois que cela aura servi à autre chose que montrer que ça peut être fait, on en reparlera
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  9. #9
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    tu peux me détailler le nombre de projets industriels l'utilisent ?
    tu peux m'expliquer comment tu vas certifier des bibliothèques binaires dont tu n'as pas forcemment les sources ?
    etc
    Qui envisagerait *une seule seconde* d'utiliser une bibliothèque binaire dont il ne disposerait pas des sources dans un projet avec le moindre besoin de certification ??? Bien sûr qu'on ne va pas utiliser un compilo certifié pour le "ls" de mon OS ou svn, ou que sais-je...

    Citation Envoyé par gorgonite Voir le message
    tu peux m'expliquer comment tu vas certifier du code qui n'est pas totalement ANSI, mais qui étaient certifiés par d'autres méthodes auparavant ?
    Uh ? Le but est de pouvoir compiler le code C produit par les outils de certification utilisés dans l'aéronautique justement. Et le but n'est absolument pas de certifier du code hein. Juste de le compiler. Je ne vois pas ce qu'ANSI fait là dedans.
    Dernière modification par gorgonite ; 09/12/2008 à 22h48. Motif: fusion*

  10. #10
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par alex_pi Voir le message
    Qui envisagerait *une seule seconde* d'utiliser une bibliothèque binaire dont il ne disposerait pas des sources dans un projet avec le moindre besoin de certification ???

    ben quelques personnes... malheureusement
    (aucun détail supplémentaire ne sera donné ici )

    je ne connais pas exactement qui sont les clients de ton labo, mais je peux t'assurer que dans un petit cercle assez fermé dont tu fais sans doute désormais parti, on a vu quelques cas de ce style (pas moi en direct bien sur, mais j'ai eu des echos de plusieurs personnes sérieuses sur des projets distincts pour des clients différents, donc ça arrive )

    Citation Envoyé par alex_pi Voir le message
    Uh ? Le but est de pouvoir compiler le code C produit par les outils de certification utilisés dans l'aéronautique justement. Et le but n'est absolument pas de certifier du code hein. Juste de le compiler. Je ne vois pas ce qu'ANSI fait là dedans.
    si tu ne vois pas, soit je me trompe sur l'utilisation qui est faite de ce compilo (pas impossible puisque j'ai des echos du projet, mais rien de concret en interne ), soit tu as la chance que tous les outils que vous utilisiez soit déjà si "propres" qu'il n'y a plus grand chose à vérifier réellement... c'est juste histoire de s'en assurer pour la forme



    bon j'arrête pour ce débat... en résumé Coq est merveilleux, mais j'ai toujours un énorme doute sur l'utilisation qu'on pourrait en faire (et dire que je suis en train d'essayer de me contredire avec mon boulot en ce moment même )
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  11. #11
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    @gorgonite
    Si l'opérateur < est de type natnatProp c'est sans doute parce que le système est plus orienté vers l'extraction que vers la preuve de programmes Caml. J'en suis conscient, il faut bien cependant commencer par quelque chose, et pour un autodidacte la meilleure approche est celle qui minimise les risques d'abandon/échec/démotivation.

    Citation Envoyé par alex_pi Voir le message
    Pour un bon tuto, je te conseille http://www.cis.upenn.edu/~plclub/popl08-tutorial/. Je ne pense pas qu'il soit trop rébarbatif.

    Bon courage pour ta plongé dans le merveilleux monde de la certification :-)
    Merci .

    CoqIntro POPL-2008 s'attache particulièrement au langage de tactiques, ça s'annonce long, difficile, mais instructif, et je me demande bien comment on pouvait s'en sortir avant Coq-Art et POPL-2008 (fallait vraiment en vouloir ).
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  12. #12
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    (après un très rapide survol du langage de tactique.)

    Je lui trouve une sorte de parfum 'impératif' dans sa syntaxe.
    On entre des commandes au lieu d'entrer une expression.
    L'avantage c'est de pouvoir faire du back-tracking

    Si j'ai bien compris le tutoriel de Coq et la preuve de (A ⇒ B ⇒ C) ⇒ (A ⇒ B) ⇒ A ⇒ C :
    • "intros." correspond à "abc:W(A ⇒ B ⇒ C) ↦ ab:W(A ⇒ B) ↦ a:W(A)" dans le formalisme d'Alain Prouté
    • là où Alain Prouté écrirait "abc(a)(ab(a))",
      le Coqueur écrit "apply H; [ assumption | apply H0; assumption ]."


    Ce qui donne, dans mon typeur ultra-minimaliste (http://www.developpez.net/forums/m3656330-63/) où il n'y a même pas l'implication :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # abc:W(A) -> W(B) -> W(C) |-> ab:W(A) -> W(B) |-> a:W(A) |-> abc(a)(ab(a)).
    : W(?abc:W(A) -> W(B) -> W(C) ?ab:W(A) -> W(B) ?a:W(A) C)
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  13. #13
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    Si j'ai bien compris le tutoriel de Coq et la preuve de (A ⇒ B ⇒ C) ⇒ (A ⇒ B) ⇒ A ⇒ C :
    • "intros." correspond à "abc:W(A ⇒ B ⇒ C) ↦ ab:W(A ⇒ B) ↦ a:W(A)" dans le formalisme d'Alain Prouté
    • là où Alain Prouté écrirait "abc(a)(ab(a))",
      le Coqueur écrit "apply H; [ assumption | apply H0; assumption ]."


    Ce qui donne, dans mon typeur ultra-minimaliste (http://www.developpez.net/forums/m3656330-63/) où il n'y a même pas l'implication :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # abc:W(A) -> W(B) -> W(C) |-> ab:W(A) -> W(B) |-> a:W(A) |-> abc(a)(ab(a)).
    : W(?abc:W(A) -> W(B) -> W(C) ?ab:W(A) -> W(B) ?a:W(A) C)
    Tu peux écrire ça comme ça si tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Theorem abc : forall A B C: Prop,
      (A -> B -> C) -> (A -> B) -> A -> C.
    Proof.
      intros A B C abc ab a. 
      exact (abc a (ab a)).
    Qed.

  14. #14
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    je préfère comme ça.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  15. #15
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    je préfère comme ça.
    Sérieusement, je ne pense pas que tu préfères vraiment Construire un terme de preuve, c'est rigolo 5 minutes, mais quand tu vas devoir faire des inductions ou que sais je... Ça devient vite pénible ! Mais bon, tu verras bien

  16. #16
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    @gorgonite : Je trouve que tu y vas un peu fort tout de même !

    Quand j'étais à Toulouse, par exemple, tout le monde, dans les systèmes critiques, utilisait Coq. Et quand je dis tout le monde, ça comprend aussi les industriels, et pas que les geeks qui passaient leur week-end derrière leur PC.

    Le compilo Lustre a été vérifié grâce à Coq, si je me souviens bien, et pour le certifier, comme ça a été fait en OCaml, il a fallu également certifier, avec Coq, le compilo OCaml. C'est d'ailleurs pour ça qu'il existe deux versions de Lustre : le compilo gratuit écrit en C non certifié, et le compilo en OCaml, très cher, certifié.

    Et aujourd'hui, tous les systèmes avioniques des Airbus, depuis l'A320, utilisent Lustre, tout comme les systèmes pour centrales nucléaires développés par Schneider Electric.

    Le problème avec les projets comme Coq, tout comme celui sur lequel je travaillais à l'INRIA, ghs3D dont le nom commercial est Tetmesh je crois (ou peut-être Tethmesh...), c'est qu'il ne servent qu'en interne, et donc les entreprises ne communiquent jamais sur ce qu'elles font avec. Pourtant, c'est bien avec ghs3D que l'on a pèté le record du monde en maillage anisotrope non structuré et adaptatif : 800 000 000 d'éléments, et c'était pas nous, au labo. Et tous les jours Michelin fabrique des pneus maillés avec ; Dassault l'intègre dans son *a*a Catia ; etc...

    C'est comme ADA : tu connais un gros projet très connu qui soit écrit en ADA ? Moi non, par contre un paquet de gens l'ont utilisé... entre autres Ariane IV.

    Et PROLOG ? Ca aussi, moi je connais rien fait en PROLOG ! Par contre plein de boîtes l'ont utilisé pendant des décennies.

    @alex_pi
    Pas la peine de s'énerver
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  17. #17
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par InOCamlWeTrust Voir le message
    Le compilo Lustre a été vérifié grâce à Coq, si je me souviens bien, et pour le certifier, comme ça a été fait en OCaml, il a fallu également certifier, avec Coq, le compilo OCaml. C'est d'ailleurs pour ça qu'il existe deux versions de Lustre : le compilo gratuit écrit en C non certifié, et le compilo en OCaml, très cher, certifié.
    a priori, la certification de Lustre en Coq était encore un projet qui était proposé en stage au MPRI quand je l'ai fait (ou alors ma mémoire me joue un tour )
    http://www.lri.fr/~pouzet/stages/lustrencoq.pdf

    à vérifier... faudra que je demande, mais je n'ai pas souvenir de cela.
    mais effectivement, si c'est le cas, tout ce que j'ai dit plus haut est à effacer


    Citation Envoyé par InOCamlWeTrust Voir le message
    C'est comme ADA : tu connais un gros projet très connu qui soit écrit en ADA ? Moi non, par contre un paquet de gens l'ont utilisé... entre autres Ariane IV.
    de tête non... mais ça se trouve facilement
    (bon ça veut pas dire que je pense que du bien d'Ada )


    Citation Envoyé par InOCamlWeTrust Voir le message
    Et PROLOG ? Ca aussi, moi je connais rien fait en PROLOG ! Par contre plein de boîtes l'ont utilisé pendant des décennies.

    on utilise des moteurs d'inférence dans des projets industriels ok... Ilog l'a prouvé je crois bien, mais c'est pas codé en Prolog
    en ce qui concerne Prolog, je me souviens d'une appli sérieuse de système expert pour diagniostic médical dans les années 80
    et maintenant on voit arriver les domaines finis, mais j'ai plutot l'impression qu'actuellement seuls les gens ayant développé le moteur sont capables de faire un code efficace avec (perso, j'ai jamais réussi à faire une résolution de sudoku en Gnu Prolog qui soit plus performant qu'un algo type min-max en C++ ; et j'ai essayé pas mal de trucs )
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  18. #18
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Je me suis familiarisé avec Coq en parcourant les notes du cours de Benjamin Pierce (qui constitue un bon complément à son bouquin "Types and Programming Languages") qui se trouvent ici. Les fichiers Coq sont largement commentés et remplis d'exemples et d'exercices.

    Pour en revenir au post d'origine:
    Est-ce qu'au moins j'ai pris un bon départ ?
    Si oui, est-ce que les preuves sont à ma portée ou est-ce que je dois d'abord me faire la main sur des exemples plus abordables ?
    Pour l'équivalence find_iff_member, je peux la prouver directement ou bien je dois prouver l'implication dans les deux sens ?
    Bon, j'ai pas le niveau de la plupart des autres intervenants de ce forum, mais le départ me semble bon. Les deux derniers théorèmes peuvent être généralisés car ils restent vrai si l'arbre n'est pas ordonné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Theorem insert_conservative :
      forall t m n, member t m -> member (insert t n) m.
    Theorem insert_inclusive :
      forall t n, member (insert t n) n.
    J'ai pu les prouver assez facilement; il vaut donc mieux commencer par ceux-là.
    Pour prouver le premier (find_iff_member), j'ai préféré d'abord prouver quelques théorèmes plus simples (j'ai utilisé < au lieu de 'less' et 'nat_compare' au lieu de 'nat_less').
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Theorem tree_between_more:
      forall t a b,
      tree_between t a b -> tree_more t a.
    Theorem tree_between_less:
      forall t a b,
      tree_between t a b -> tree_less t b.
    Theorem tree_less_ordered:
      forall t n,
      tree_less t n -> tree_ordered t.
    Theorem tree_more_ordered:
      forall t n,
      tree_more t n -> tree_ordered t.
    Theorem member_more:
      forall t n a,
      member t n -> tree_more t a -> a < n.
    Theorem member_less:
      forall t n a,
      member t n -> tree_less t a -> a > n.
    Ensuite, j'ai prouvé l'implication dans les deux sens. Prouver l'équivalence directement est sans doute possible mais ne fait que repousser le travail dans des théorèmes annexes je pense.

    Je peux poster les preuves si qq'un en veut, mais ça déborde pas de commentaires...

  19. #19
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par dividee Voir le message
    Ensuite, j'ai prouvé l'implication dans les deux sens. Prouver l'équivalence directement est sans doute possible mais ne fait que repousser le travail dans des théorèmes annexes je pense.
    La définition de l'équivalence étant une conjonction d'implication...

  20. #20
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    @dividee
    avec un guide comme toi je n'ai plus d'excuse pour ne pas progresser.

    Je peux poster les preuves si qq'un en veut
    Seulement quand on te suppliera de le faire!

    edit
    Je pense que ma fonction insert était sous-spécifiée et qu'il faudrait ajouter cette propriétée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Theorem insert_preserves_order :
    forall t, tree_ordered t ->
    forall n, not (member t n) -> tree_ordered (insert t n).
    remarque: la condition not (member t n) est nécessaire parce que mon prédicat tree_ordered impose que tous les éléments soient distincts (j'ai pensé que ça ne pouvait que simplifier la tâche).
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

Discussions similaires

  1. Arbre Binaire De Recherche
    Par dream_lover dans le forum C
    Réponses: 4
    Dernier message: 19/05/2007, 23h45
  2. Suppression dans un arbre binaire de recherche
    Par zeine77 dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2007, 20h40
  3. Réponses: 3
    Dernier message: 31/12/2005, 12h30
  4. Réponses: 11
    Dernier message: 07/04/2004, 13h06
  5. [Arbre binaire de Recherche]
    Par Giovanny Temgoua dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 06/02/2004, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo