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

Prolog Discussion :

[Débutant] Récupérer l'indice d'un élément d'une liste


Sujet :

Prolog

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [Débutant] Récupérer l'indice d'un élément d'une liste
    Bonjour à tous,

    je suis débutant en prolog et je galère sur un truc qui n'est surement pas dur...
    Je souhaite récuperer l'indice d'un élément d'une liste.

    Par exemple : L = [haut,gauche,droite,bas].
    Et donc faire quelque chose qui me renverrai 2 si j'y passe droite en parametre..

    Alors j'ai essayé quelque chose mais ça ne marche pas.. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    testA(T,[T|_], Compt).
    testA(T,[K|L], Compt):-  Compt1 is Compt+1, testA(T, L, Compt1).
     
    testAB(T,X,R):-testA(T, [nord,est,sud,ouest], X), nth0(X, [nord,est,sud,ouest], R).
    testA est mon algo recursif qui incrémente un compteur jusqu'a tomber sur le bon élément et donc on l'apelle avec testAB et j'utilise le resultat du compteur "X" pour la suite. Seulement X ne garde pas sa valeur une fois sortie de testA... testA me renvoit juste true ou false..

    Si quelqu'un pouvait m'expliquer ce que j'ai mal fait..
    Merci par avance

    Max

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    C'est un parcours classique de liste, deux méthodes, une avec accumalteur qui compte le rang pas à pas et qui s'arrête quand l'élément est trouvé, et qui unifie la valeur de retour avec l'accumulateur. Cet accumulateur est initialisé à 0 au début de la recherche.
    L'autre méthode consite à construire le resultat en sortie de récursion : tant que tu n'as pas trouvé l'élément, tu parcours la liste.
    Qund tu as trouvé l'élément tu initialises la valeur de retour à 0, et en dépilant les appels de la récursion tu augment à chaque fois de 1 la valeur de retour.

    exemple avec le calcul de la longueur d'une liste.
    méthode 1 avec accumulateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my_len1([], Len, Len).
     
    my_len1([_H| T], LE, LF) :-
      L1 is LE + 1,
      my_len1(T, L1, LF).
    méthode 2 sans accumulateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my_len2([], 0).
     
    my_len2([_H | T], L) :-
      my_len2(T, L1),
      L is L1 + 1.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    merci beaucoup "Trap D", je vais essayer ça et je te dis

    Max

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    C'est bon ça marche niquel

    Merci beaucoup

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu as pensé au tests d'erreur e.g. l'élément recherché n'est pas dans la liste ?
    Si c'est bon, pense au tag

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Pour le test d'erreur, je vais utiliser "memberchk" pour voir si l'élément est bien dans la liste.

    Je vais mettre en résolu

    Merci encore, bye

    Max

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Oui mais ça fait deux parcours de liste au lieu d'un, tu devrais plutôt utiliser le résultat de la recherche, ce serait plus efficace.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    mmh oui très juste..
    Je vais suivre ton conseil .
    Merci

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Trap D Voir le message
    méthode 2 sans accumulateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my_len2([], 0).
     
    my_len2([_H | T], L) :-
      my_len2(T, L1),
      L is L1 + 1.
    Question de débutant : Pourquoi L n'est pas positionné dans la récursion ?

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    L est calculé en sortie de récursion.

    Je te laisse faire le test avec la liste [1,2,3] par exemple.
    Fais la trace à la main.

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 02/05/2015, 17h21
  2. Réponses: 20
    Dernier message: 02/05/2010, 16h56
  3. Réponses: 6
    Dernier message: 06/12/2007, 22h40
  4. Réponses: 6
    Dernier message: 09/01/2007, 11h38
  5. Réponses: 4
    Dernier message: 01/05/2006, 23h02

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