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

Caml Discussion :

Tri d'une liste en ocaml : Polymorphisme


Sujet :

Caml

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 73
    Points : 57
    Points
    57
    Par défaut Tri d'une liste en ocaml : Polymorphisme
    le type liste defini par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       type  'a liste= Vide|Cons of 'a*'a liste;;
    Je souhaite faire un tri par fusion, selection et tri rapide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let rec insert elt liste  = match liste with 
        |Vide-> [elt]
        |Cons(a,l) -> if elt<a then elt::a::l
                      else a::(insert_ala_pos elt  l );;
    Error: This expression has type 'a liste
           but an expression was expected of type 'a list
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let rec tri_fusion l1 =match l1 with 
            |Vide -> Vide
            |Cons(a,l)-> insert a (tri_fusion l)
            and insert elt l2 = match l2 with 
            |Vide -> Vide
            |Cons(a1,l) ->if elt<a1 then elt::l2 else a1:: insert elt l;;
    Erreur :
    Error: The variant type liste has no constructor ::
    # 
    Je souhaite trier ma liste polymorphe , Merci d'y contribuer ?

  2. #2
    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 ça n'est pas un problème de polymorphisme
    D'une part :
    • [] et :: sont des constructeurs pour le type prédéfini 'a list
    • Vide et Cons sont des constructeurs pour le type utilisateur 'a liste

    Ces deux types, bien que similaires, sont considérés comme totalement différents.

    D'autre part tu n'es pas au bout de ta peine car :
    • le premier extrait de code ressemble à une insertion mais ne fait pas de tri par insertion
    • le second extrait de code ne ressemble en rien à un tri fusion
    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.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 73
    Points : 57
    Points
    57
    Par défaut
    Comment faire un tri par insertion et fusion en ocaml ? avec le type liste definie par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     type a' liste= Vide|Cons 'a*'a liste ;;

  4. #4
    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 Etapes intermédiaires
    • Pour le tri par insertion il te faut d'abord une fonction d'insertion d'un élément dans une liste triée
    • Pour le tri par fusion il te faut une fonction qui fusionne deux listes triées en une seule liste triée
    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.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 73
    Points : 57
    Points
    57
    Par défaut
    Merci pour ces reponses .
    est il possible que tu me fasse une partie du code ( tri par insertion avec le type polymorphe)?

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 73
    Points : 57
    Points
    57
    Par défaut
    type 'a liste= Vide|Cons of 'a*'a liste;;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec insert_ e l = match l with 
      |Vide -> Cons(e,Vide)
      |Cons(b,l)-> if e<b then Cons(e,Cons(b,l)) else Cons(b,(insert_ e l));;
    Error: Syntax error

  7. #7
    Membre du Club
    Homme Profil pro
    Chercheur en maths appli
    Inscrit en
    Novembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Chercheur en maths appli
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 29
    Points : 46
    Points
    46
    Par défaut
    Non non, ça fonctionne très bien.

  8. #8
    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 Encore un effort...
    Bravo

    Le squelette de la fonction de fusion de 2 listes triées (pointillés à compléter) :
    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let rec merge la lb =
       match la,lb with
       | _,Vide -> la   
       | Vide,_ -> lb
       | Cons(ha,ta),Cons(hb,tb) -> 
          if ha < hb then ...
          else ...

    Edit: cette fonction termine toujours parce que la fonction List.length la + List.length lb est strictement décroissante.
    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.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 73
    Points : 57
    Points
    57
    Par défaut
    Trie fusion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let rec merge la lb =
       match la,lb with
       | _,Vide -> la   
       | Vide,_ -> lb
       | Cons(ha,ta),Cons(hb,tb) -> 
          if ha < hb then Cons(ha,(merge ta lb))
          else Cons(hb, ( merge ta lb));;  
    ;;
    #

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 73
    Points : 57
    Points
    57
    Par défaut Trie par fusion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let rec divise_list l = function 
      |Vide -> Vide, Vide
      |Cons(a,Vide)-> Cons(a,Vide),Vide
      |Cons(b,Cons(a1,l))-> let ( l1,l2)= divise_list l in Cons(b,l1),Cons(a1,l2);;
    Characters 130-143:
    |Cons(b,Cons(a1,l))-> let ( l1,l2)= divise_list l in Cons(b,l1),Cons(a1,l2);;
    ^^^^^^^^^^^^^
    Error: This expression has type 'a liste -> 'a liste * 'b liste
    but an expression was expected of type 'c * 'd


    pas d erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    let rec fusion la lb =
       match la,lb with
       | _,Vide -> la   
       | Vide,_ -> lb
       | Cons(ha,ta),Cons(hb,tb) -> 
          if ha < hb then Cons(ha,(fusion ta lb))
          else Cons(hb, (fusion ta lb));;  
    ;;



    Characters 62-67:
    |Cons(a,l) -> begin
    ^^^^^
    Syntax error: 'end' expected, the highlighted 'begin' might be unmatched

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let rec tri_fusion = function
    	 |Vide -> Vide
    	 |Cons(a,l) -> begin  
    	   let  (liste1,liste2)= divise_list l in 
               fusion (tri_fusion liste1) (tri_fusion liste2)
    ;;

  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 Récapitulons
    Vocabulaire
    Un trie est une structure de données arborescente (et d'ailleurs on peut les fusionner).
    Ce qui nous occupe ici c'est plus simplement un tri, ranger dans l'ordre les éléments d'un (multi-)ensemble

    merge
    La ligne 7 est incorrecte car l'élément hb est présent 2 fois dans la liste renvoyée.

    divise_list
    C'est correct.
    Il suffit soit d'effacer l soit de remplacer function par match l with.

    tri_fusion
    Pas besoin de begin.
    Que devient a
    Sinon c'est presque correct : que se passe-t-il avec tri_fusion (Cons(1,Vide))
    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 du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 73
    Points : 57
    Points
    57
    Par défaut
    a doit etre concatené à l'une de liste : liste1 ou liste2. mais :

    Error: This expression has type 'a list liste
    but an expression was expected of type 'a list
    #

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let rec tri_fusion = function
    	 Vide -> Vide
             |Cons(a1,Vide)->Cons(a1,Vide) 
    	 |Cons(a,l) -> let  (liste1,liste2)= divise_list l in 
              (fusion (a@(tri_fusion liste1)) (tri_fusion liste2))
    ;;

  13. #13
    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
    Corrige d'abord fusion à la ligne 7 qui comporte deux erreurs :
    • hb est présent une seconde fois dans la liste renvoyée, par l'intermédiaire de lb.
    • ha est absent de la liste renvoyée.


    Après je t'invite à réfléchir sur tri_fusion :
    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let rec tri_fusion = function
       | Vide -> Vide
       | Cons(a,Vide) -> Cons(a,Vide)
       | l -> let la,lb = divise_list l in 
              fusion (tri_fusion la) (tri_fusion lb)
    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.

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 73
    Points : 57
    Points
    57
    Par défaut
    correction de fusion .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    let rec fusion la lb =match la,lb with
       | _,Vide -> la   
       | Vide,_ -> lb
       | Cons(ha,ta),Cons(hb,tb) -> 
          if ha < hb then Cons(ha,(fusion ta tb))
          else Cons(hb, (fusion ta tb));;

  15. #15
    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
    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let rec fusion la lb =
       match la,lb with
       | _,Vide -> la   
       | Vide,_ -> lb
       | Cons(ha,ta),Cons(hb,tb) -> 
          if ha < hb then Cons(ha,(fusion ta lb))
          else Cons(hb,(fusion la tb))
    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.

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 73
    Points : 57
    Points
    57
    Par défaut
    Merci pour votre aide .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Tri d'une liste!!!
    Par frutix dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/02/2006, 10h00
  2. [Requête] Tri via une liste déroulante
    Par Burnout dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 09/01/2006, 18h16
  3. Tri d'une liste d'objet CObList
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 13/07/2005, 13h50
  4. [TRI] tri d'une list provenant de LabelValueBean
    Par Canou dans le forum Struts 1
    Réponses: 6
    Dernier message: 20/09/2004, 14h55
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

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