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 :

la concaténation de liste


Sujet :

Prolog

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Points : 82
    Points
    82
    Par défaut la concaténation de liste
    Bonjour,

    Je ne n'arrive pas à continuer mon raisonnement dans l'arbre.
    J'ai ces deux règles prolog:

    C1: concat([X|Y],L,[X|R]):-concat(Y,L,R).
    C2: concat([],L,L).

    Ces deux règles permettent de concaténer deux listes. Par exemple,
    concat([a,b,c],[e,f,g],Liste). va renvoyer:
    L=[a,b,c,e,f,g]

    Pouvez vous m'expliquer la suite de mon raisonnement car je ne vois pas ensuite comment cela s'enchaîne.

    Moi, je me dis, C1 est vérifié, on peut unifier. Donc X=a Y=[b,c] L=[e,f,g] et Liste=[a|R] => concat([b,c],[e,f,g],[f,g]).

    On remonte C1 est vérifié:
    concat([c],[e,f,g],[g]).

    On continue, C1 est vérifié:
    concat([],[e,f,g],[]).

    Et c'est là que je ne comprends pas trop. Pourquoi arrive t-on ensuite à:
    concat([],[e,f,g],[e,f,g])?

    Je vous remercie 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
    L'unification se passe comme ça :
    C1: concat([X|Y],L,[X|R]):-concat(Y,L,R).
    C2: concat([],L,L).

    1- concat([a,b,c],[e,f,g],Liste)
    C1 : concat([X|Y],L,[X|R]):-concat(Y,L,R).
    Donc X = a; Y = [b, c]; L = [e,f,g]; Liste = [X | R] soit Liste = [a | R]
    on doit maintenant effectuer concat(Y, L, R) soit concat([b, c], [e, f, g], R).

    2- concat([b,c],[e,f,g],R1)
    C1 : concat([X|Y],L,[X|R]):-concat(Y,L,R).
    Donc X = b; Y = [c]; L = [e,f,g]; R1 = [X | R] soit R1 = [b | R]
    on doit maintenant effectuer concat(Y, L, R1) soit concat([c], [e, f, g], R1).

    3- concat([c],[e,f,g],R1)
    C1 : concat([X|Y],L,[X|R]):-concat(Y,L,R).
    Donc X = c; Y = []; L = [e,f,g]; R1 = [X | R] soit R1 = [c | R]
    on doit maintenant effectuer concat(Y, L, R1) soit concat([], [e, f, g], R1).

    4- concat([], [e, f, g], R1).
    On applique maintenant C2
    C2: concat([],L,L).
    concat([], [e,f,g], [e,f,g]).

    On remonte maintenant en 3 car R1 est [e,f,g], R1 est le R du 3
    3 donne R1 = [c | R] avec R = [e,f,g] donc R1 = [c,e,f,g]

    On remonte maintenant en 2 avec R = [c,e,f,g]
    2 donne R1 = [b | R] avec R = [c,e,f,g] donc R1 = [b,c,e,f,g]

    On remonte maintenant en 1 avec R = [b,c,e,f,g]
    1 donne Liste = [a | R] avec R = [b, c,e,f,g] donc Liste = [a, b,c,e,f,g]
    "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
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    bonsoir;

    tout d'abord merci Trap_D de votre réponse donnée précédement;

    permettez moi de remonter ce sujet, pour poser la question suivante.


    comment se passe SVP l'unification du prédicat suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    C1: pref([],_).
    C2: pref([H|T1],[H|T2]) :- pref(T1,T2).
    Si on exécute par exemple pref(W,[1,2,3]).

    Merci d'avance

  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
    Bonjour
    Si tu utilises SWI-Prolog, passe en mode trace et tape pref(W,[1,2,3]).Voici ce que tu obtiens :
    [trace] 10 ?- pref(W,[1,2,3]).
    Call: (7) pref(_G1758, [1, 2, 3]) ? creep
    Exit: (7) pref([], [1, 2, 3]) ? creep
    W = [] ;
    Redo: (7) pref(_G1758, [1, 2, 3]) ? creep
    Call: (8) pref(_G1834, [2, 3]) ? creep
    Exit: (8) pref([], [2, 3]) ? creep
    Exit: (7) pref([1], [1, 2, 3]) ? creep
    W = [1] ;
    Redo: (8) pref(_G1834, [2, 3]) ? creep
    Call: (9) pref(_G1837, [3]) ? creep
    Exit: (9) pref([], [3]) ? creep
    Exit: (8) pref([2], [2, 3]) ? creep
    Exit: (7) pref([1, 2], [1, 2, 3]) ? creep
    W = [1,2] ;
    Redo: (9) pref(_G1837, [3]) ? creep
    Call: (10) pref(_G1840, []) ? creep
    Exit: (10) pref([], []) ? creep
    Exit: (9) pref([3], [3]) ? creep
    Exit: (8) pref([2, 3], [2, 3]) ? creep
    Exit: (7) pref([1, 2, 3], [1, 2, 3]) ? creep
    W = [1,2,3] ;
    Redo: (10) pref(_G1840, []) ? creep
    Fail: (10) pref(_G1840, []) ? creep
    Fail: (9) pref(_G1837, [3]) ? creep
    Fail: (8) pref(_G1834, [2, 3]) ? creep
    Fail: (7) pref(_G1758, [1, 2, 3]) ? creep
    false.
    Tu peux vois s'enchaîner les différents appels, d'abord la première régle qui permet d'afficher le premier résultat W = [], puis si tu tapes ';' au lieu de <Enter> tu vois que la deuxième régle est appelée qui appelles la première régle qui permet de compléter le [1|T1] avec T1 = [], etc etc.
    "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
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    salut;

    ok je voix bien maintenant;

    je vous remercie encore Trap_D, j'ai bien compris.

Discussions similaires

  1. Réponses: 25
    Dernier message: 04/03/2008, 16h15
  2. Concaténer deux listes déroulantes dans un champs texte en direct
    Par arnaudperfect dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 11/12/2007, 17h50
  3. concaténer 2 listes en C#
    Par loic72 dans le forum C#
    Réponses: 3
    Dernier message: 16/08/2007, 11h11
  4. Concaténation de liste
    Par thierrybatlle dans le forum Delphi
    Réponses: 1
    Dernier message: 21/06/2006, 18h45
  5. Concaténer deux listes
    Par Dunk dans le forum Pascal
    Réponses: 13
    Dernier message: 25/04/2006, 18h09

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