1. #1
    Membre habitué Avatar de sologne
    Homme Profil pro
    Chargé de missions
    Inscrit en
    mai 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Service public

    Informations forums :
    Inscription : mai 2011
    Messages : 67
    Points : 117
    Points
    117

    Par défaut etre_avant dans une liste

    Bonjour,

    je cherche à savoir comment on fait pour savoir dans une liste si un élément est avant un autre.
    J'ai rédige cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    est_avant(A, B, [A, B | _]).
    est_avant(A, B, [_ | Y]) :- est_avant(A, B, Y).
    qui fonctionne correctement si A est juste avant B dans la liste, mais pas si il y a des éléments entre A et B.

    Avez vous des idées pour améliorer ce début de code ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Inscrit en
    septembre 2003
    Messages
    4 657
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 4 657
    Points : 5 916
    Points
    5 916

    Par défaut

    Oui, as-tu entendu parler de append ?
    Si oui, réfléchis bien à son utilisation.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi

  3. #3
    Membre habitué Avatar de sologne
    Homme Profil pro
    Chargé de missions
    Inscrit en
    mai 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Service public

    Informations forums :
    Inscription : mai 2011
    Messages : 67
    Points : 117
    Points
    117

    Par défaut

    Bonjour Trap D,

    merci à toi de t'être intéressé à mon pb. D'après ce que j'ai vu la fonction "append" permet de réaliser des concaténations de listes, et étant débutant dans ce langage, je ne vois pas comment en détourner l'usage pour résoudre mon pb...
    D'un point de vu algorithmique, et avec un langage 'classique' : Java, C, php cela ne me poserai aucun souci. je ferai une implémentation de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function est_avant(A, B, Liste) : bool {
     int IndA = indexe(A,Liste); // la fonction indexe étant déjà implémenté
     int IndB = indexe(B,Liste);
       if(IndA <  IndB) {
          return true;
       } else {
          return false;
       }
    }
    Voila, ce n'est pas de la mauvaise volonté et j'ai l'habitude de coder mais l'apprentissage de prolog est assez déroutant lorsque l'on vient des langages 'clasiques'.

    Pourrais-tu stp m'éclairer un peu plus ?

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Inscrit en
    septembre 2003
    Messages
    4 657
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 4 657
    Points : 5 916
    Points
    5 916

    Par défaut

    Voilà bien ce qui est ennuyeux quand on vient d'un langage impératif, on est formaté par ce type de raisonnement et ça ne marche pas du tout avec Prolog. Ne t'en fais pas, cela viendra, mais il faut persister, je suis aussi passé par la.
    Pour t'éclairer sur le mode de raisonnement : si l'élément A est avant B dans la liste L, cela veut d'abord dire qu'il existe une sous-liste de L qui commence par A, donc on peut écrire
    je pense que tu connais la signification du '_'.
    Maintenant, je te laisse terminer : si B est après A dans L, cela veut dire qu'il existe ...
    En Prolog, au début, il faut éviter toute considération d'efficacité de code, cela viendra après, quand tu commenceras à comprendre le mécanisme de réflexion.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi

  5. #5
    Membre habitué Avatar de sologne
    Homme Profil pro
    Chargé de missions
    Inscrit en
    mai 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Service public

    Informations forums :
    Inscription : mai 2011
    Messages : 67
    Points : 117
    Points
    117

    Par défaut

    Bonjour TrapD,

    J'ai eu beau chercher dans la direction que tu m'indiques et malheureusement je n'arrive pas à aboutir ...

    Par contre j'ai fini par réussir à écrire ce bout de code qui répond à mon problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    rang(X,[X|Q],0).
    rang(X,[T|Q], Somme) :-
      rang(X,Q,S),
      Somme is S+1.
      
    estavant(A, B, Liste):-
    	rang(A,Liste,RangA),
    	rang(B,Liste,RangB),
    	RangA < RangB.
    mais qui est fortement inspiré de l'algo écrit dans mon post précédent et qui s'éloigne à mon sens de l'esprit de prolog ...

    Ayant trouvé une solution, certes pas la meilleurs, acceptes-tu de me communiquer la solution que tu proposes avec le append ?

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Inscrit en
    septembre 2003
    Messages
    4 657
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 4 657
    Points : 5 916
    Points
    5 916

    Par défaut

    Ben, elle est "toute simple" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    est_avant(A, B, L) :-
            % il existe une sous-liste de L qui commence par A,
    	append(_, [A | X], L),
           % il existe une sous-liste de X qui commence par B,
    	append(_, [B | _], X ).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi

  7. #7
    Membre habitué Avatar de sologne
    Homme Profil pro
    Chargé de missions
    Inscrit en
    mai 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Service public

    Informations forums :
    Inscription : mai 2011
    Messages : 67
    Points : 117
    Points
    117

    Par défaut

    En effet,

    une fois que l'on voit la solution c'est simple : j'ai du chemin à parcourir, pour rentrer dans cet esprit...

    Merci de ton aide précieuse.

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

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