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 :

Comparer deux listes


Sujet :

Prolog

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Comparer deux listes
    Je cherche à faire un prédicat qui compare deux listes terme par terme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ?- comparer([a,b,c,d,e],[a,y,c,d,z],Resultat).
    Resultat=[1,3,4]
    Je vois pas comment le faire ... :\

  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
    A mon avis, il y a 3 cas à envisager:
    1) comp([X|T1], [X | T2], .......

    2) comp([X | T1], [Y | T2], ....


    3°) "cas terminal" comp(_, _, ...

    Je laisse les .. pour que tu trouves les arguments à ajouter.
    Je l'ai fait avec 5 arguments au total.
    "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 : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    J'ai fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    comp([X|T1], [X|T2],N,Compteur,R):-
      comp(T1,T2,N,NCompteur,R),
      Compteur is NCompteur+1.
     
    comp([X|T1], [Y|T2],N,Compteur,R):-
      comp(T1,T2,N,Compteur,R).
     
    comp(_,_,_,R,R).
    et j'appel avec comp([a,b,c,a,x],[a,e,c,a,f],N,0,R).
    mais ça ne fonctionne pas :\

  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
    Il faut que tu mémorises dans une liste les indices où les premiers élélments de liste sont identiques.
    Il faut aussi que tu incrémentes le compteur de tours.

    P.S. Je l'ai fait aussi d'une autre manière avec 4 arguments et qui est aussi plus "dans l'esprit de Prolog".
    "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 : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Prolog
    Bonjour,

    J'ai cherche à faire la même chose, j'arrive à obtenir un résultat mais pas celui voulu.

    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    comp(_,_,0,[0]).
    comp([X|T1],[X|T2], Compteur, [Compteur|Q]):- comp(T1,T2, NCompteur, Q), Compteur is NCompteur + 1,!.
    comp([X|T1],[Y|T2], Compteur, L3):- X\=Y,comp(T1,T2,NCompteur, L3).
    En testant le code avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? - comp([a,r,b,r,e],[a,r,l,e,e],N,X)
    J'obtiens bien l'indice 1 et 0 dans ma liste mais pas le quatrième.

  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
    Vous obtenez bien les indices 0 et 1 mais pas pour les raisons que vous croyez !
    essayez avec comp([r,a,b,r,e],[a,r,b,r,e],N,X).
    Lisez bien tout ce qui a été écrit avant, inspirez vous des codes montrés.
    Bon courage !
    "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 : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,

    Merci pour votre réponse, cependant je dois mal comprendre quelque chose, soit dans la récursivité ou bien le backtracking.
    Je reviens avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    comp(_,_,0,[]).
    comp([X|T1],[X|T2], Compteur, [Compteur|Q]):- comp(T1,T2, NCompteur, Q), Compteur is NCompteur + 1.
    comp([X|T1],[Y|T2], Compteur, L3):- X\=Y,comp(T1,T2,NCompteur, L3),Compteur is NCompteur + 1.
    Cependant, je m'aperçois que mon code n'est pas bon mais je ne sais pas pourquoi.

  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
    Bonjour

    Pour bien comprendre ce qui se passe, pensez à utiliser gtrace.
    Tapez le dans la console SWI-Prolog puis lancez la commande.
    Vous obtiendrez une boîte de dialogue où vous pourrez voir toutes les valeurs des variables dans l'évolution de votre code.

    Maintenant que se passe-t-il lorsque vous lancez comp([a,r,b,r,e],[a,r,l,e,e],N,X). ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ?- comp([a,r,b,r,e],[a,r,l,e,e],N,X).
    N = 0,
    X = [] ;
    N = 1,
    X = [1] ;
    N = 2,
    X = [2, 1] ;
    N = 3,
    X = [3, 2] ;
    N = 4,
    X = [4, 3] ;
    N = 5,
    X = [5, 4, 1] ;
    false.
    Prolog utilise les clauses dans l'ordre d'écriture :
    comp([a,r,b,r,e],[a,r,l,e,e],N,X).
    Première clause trouvée:
    comp(_,_,0,[]).
    Cette clause exprime le fait que quelque soit les deux premiers arguments de comp, N est instancié avec 0 et X avec [].
    C'est bien ce qui est obtenu en premier résultat.
    Vous tapez ensuite ';'. Celà veut sire que vous demandez à Prolog de continuer les recherches.
    Il regarde la deuxième clause :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    comp([X|T1],[X|T2], Compteur, [Compteur|Q]):-
        comp(T1,T2, NCompteur, Q),
        Compteur is NCompteur + 1.
    Les unifications faites sont
    X unifié à a
    T1 unifié à [r,b,r,e]
    T2 unifié à [r,l,e,e]
    On appelle donc comp([r,b,r,e], [r,l,e,e], NCompteur, Q).
    La premiere clause est donc rappelée
    NCompteur est unifé à 0, Q à [].
    On revient à la clause précédente
    Celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    comp([X|T1],[X|T2], Compteur, [Compteur|Q]):-
        comp(T1,T2, NCompteur, Q),
        Compteur is NCompteur + 1.
    Comme NCompteur est unifié à 0 Compteur est unifié à 1
    [Compteur|Q] est unifié à [1|[]] c'est-à-dire [1].
    etc etc,
    Essayez de trouver les explications des autres résultats obtenus en suivant le même processus.
    "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 : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

  1. Comparer deux listes
    Par jnauche dans le forum VBScript
    Réponses: 3
    Dernier message: 02/06/2008, 11h07
  2. operator== pour comparer deux listes
    Par docky dans le forum C++
    Réponses: 10
    Dernier message: 18/05/2008, 17h49
  3. Requete pour comparer deux listes
    Par Jean-Christoph dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/04/2008, 13h29
  4. Comparer deux listes de listes
    Par julien80 dans le forum Prolog
    Réponses: 5
    Dernier message: 05/03/2008, 18h18
  5. [C# 2.0] Comparer deux listes
    Par Rodie dans le forum Windows Forms
    Réponses: 4
    Dernier message: 01/08/2006, 00h40

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