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] Création d'une liste en récursif


Sujet :

Prolog

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [Débutant] Création d'une liste en récursif
    Bonjour,

    Je débute en PROLOG et j'ai un petit souci.

    Je vais simplifier mon problème car je pense que mon erreur est une erreur classique.

    Soit la base de fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    homme(toto).
    homme(tata).
    homme(tutu).
    homme(titi).
    La question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    homme(X). renvoie plusieurs solutions
    Maintenant je voudrais créer une liste qui contienne toutes les solutions de
    X Sans utiliser la fonction findall/3 .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    liste([]).
    liste([T|Q]):- liste(Q), !, homme(T).
    Voila le résultat :
    SWI Prolog me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Pour liste(L).
    L = [] ;
    L = [toto] ;
    L = [tata] ;
    L = [tutu] ;
    L = [titi] ;
    Je voudrais donc enlever la liste vide et mettre tous les éléments dans L.
    En fait, j'ai du mal avec les conditions d'arrêt de mes fonctions récursives.

    Merci d'avance,

  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
    J'utiliserais un prédicat construit_liste à 2 arguments
    construit_liste(ListeEnCours, ListeFinale).
    Tu construis ListeEnCours de manière récursive en testant si homme(X) n'est pas déjà membre de la liste en construction puis à la fin tu identifies ListeEnCours et ListeFinale.

    Tu peux aussi le faire en utilisant la base de données de Prolog (assert/retract).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Déjà, merci pour ta réponse Trap D.

    J'y avais pensé mais le truc, c'est qu'étant donné que je cherche à construire ListeFinal je ne vois pas comment savoir quand m'arrêter ?
    Qu'entends tu par identifier les deux listes ?

    Un prédicat final comme ceci ?
    I'm keep searching

  4. #4
    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
    Citation Envoyé par Neosis Voir le message
    Qu'entends tu par identifier les deux listes ?

    Un prédicat final comme ceci ?

    construit_liste(L, L).

    I'm keep searching
    Yes, lorsque homme(X) échoue.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bon, je m'en sors vraiment pas...

    j'arrive à un truc comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    liste(L,L):- \+ homme(X).
    liste([T|Q],L):- liste(Q,L), homme(T),\+ memberchk(T,Q).
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    liste(L,L):- \+ homme(X).
    liste([T|Q],L):- liste(Q,L), homme(T),\+ memberchk(T,Q), !.
    J'ai essayé d'appeler avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    liste(L,L1).
    liste([],L).
    liste(L,[]).
    Rien à faire je dépasse la pile d'exécution...
    Encore un petit coup de pouce s'il te plait...

  6. #6
    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'unification des deux listes se faisant en cas d'échec de homme(X), (on a épuisé toute la base de données), la règle doit figurer après là régle qui teste homme(X).

    Donc tu as deux règles et la deuxième s'écrit simplement
    La première régle doit appeller homme(X), tester si X est déjà présent et si ce n'est pas le cas on continue avec la nouvelle liste construite avec X en tête de la précédente.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Okay okay,

    Encore une dernière indication s'il te plait... du coup comment je gère
    les deux listes entre elles ?

    Voilà tout mon super code

    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
     
    % La base de faits
    homme(jean).
    homme(toto).
    homme(titi).
     
    % Là, j'ajoute l'homme à la liste finale si c'est un homme et si il n'ai pas déjà % membre de cette liste et après j'ai mon problème de comprhension de la 
    % récursivité PROLOG je ne vois pas comment après il va rappeler le prédicat
    % enfin j'ai compris les points de choix et les branches
    % mais j'ai du mal...
     
    liste(Q,[T|L]):- homme(T),\+ memberchk(T,L), liste([T|Q],L). 
     
    % Là je comprend bien que si notre ListeEnConstruction est équivalente
    % à la ListeFinale on a trouvé et que ce prédicat doit être en deuxième
    % comme ça il n'est appelé que lorsque notre premier prédicat essaye 
    % d'ajouter un homme qui est déja membre de la liste
     
    liste(L,L).
    J'ai réussi à résoudre mon problème en faisant un mic-mac avec le findall/3
    mais ça m'énerve de pas comprendre, pour te dire j'aime même essayer de dessiner l'arbre...

    Ah ! j'ai failli oublier après j'appel avec :
    ou bien je rajoute un prédicat enfin comment fera prolog pour partir d'une liste vide et la remplir ?

  8. #8
    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 presque tout bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste(Q,[T|L]):- homme(T),\+ memberchk(T,L), liste([T|Q],L).
    c'est en gras que ça m***e !
    Pourquoi modifies-tu la liste finale au moment de la construction alors qu'elle ne doit être unifiée qu'à la fin ???

    mais ça m'énerve de pas comprendre, pour te dire j'aime même essayer de dessiner l'arbre...
    C'est bien, dommage que ça ne t'aie pas donné la solution

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci Trap D pour tes indications.

    J'ai abandonné cette méthode j'ai trouver ce que je voulais faire.
    C'est un truc plus compliqué et comme j'avais simplifié mon problème j'ai arrêté de chercher sur celui ci.

    A plus tard !

    Et merci encore.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/12/2007, 22h16
  2. <débutant> création d'une liste dynamique (aspx/vb)
    Par akara dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 11/09/2007, 15h46
  3. Création d'une liste ...
    Par keryss dans le forum Access
    Réponses: 6
    Dernier message: 21/10/2004, 09h00
  4. [Débutante] Création d'une image avec un composant
    Par gwendo dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 09/07/2004, 09h58

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