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 :

règles sur des listes à 2 dimensions


Sujet :

Prolog

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Points : 19
    Points
    19
    Par défaut règles sur des listes à 2 dimensions
    Bonjour, je rencontre un problème concernant des listes à 2 dimensions:

    Je récupère une liste à partir d'une requete SQL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    odbc_connect('MYèODBC_LINK',_,[user(root),password(''),alias(db),open(once)]),
    findall(L, odbc_query(db,"SELECT * FROM maTable",L),List),
    maplist(writeln,List),
    odbc_disconnect(db).
    cela me retourne donc une liste à 2 dimensions contenant les données issues de la table lue.

    maTable contient une colonne id et une colonne label, je reçois donc dans prolog une liste de cette forme.
    à présent, je souhaite ajouter des règles du type: SI colonne label="AZERTY" Alors 1 Sinon 0
    et ajouter ce résultat en fin de liste, cad obtenir:
    [[id1,label1,0],[id1,azerty,1],....... ]

    Je prend toute idée.

    d'avance merci,

    cdt,

    jfv

  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
    Un simple maplist devrait suffire ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    maplist(modif, List, L1),
    writeln(L1).
     
    modif([A, azerty], [A, azerty,1]).
     
    modif([A, B], [A, B, 0]).

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    bonjour et merci de ta réponse,

    je comprend bien la logique, mais à la mise en oeuvre avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    test(List) :- maplist(modif,List,L1), write(L1).
     
    modif([A,azerty],[A,azerty,1]).
    modif([A,B],[A,B,0]).
    et avec un appel
    ou
    la réponse est , je pense que ça ne doit pas etre loin.

    merci pour vos suggestions,

    cdt,

    jfv.work

  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
    Oui, la liste d'appel à modif est de la forme [[...], [..], ..], donc pour un élément c'est test([[aaa,azerty]]).

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    effectivement, c'est donc que odbc ne me fournit probablement pas une liste à 2 dimensions

  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
    La question est donc "que te fournit odbc ? " : quel est le résultat de maplist(writeln,List) ?

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    ça affiche un row(champ1,champ2,.....)

    ce sont bien des ( ) et pas des []

  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
    Ok. pour récuperer la liste des champs il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row(Champ1,Champ2...) =.. [A|B].
    Par exemple
    ?- row(Champ1,Champ2) =.. [A|B].
    A = row,
    B = [Champ1,Champ2].

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    reprennons, on a :
    odbc_connect('MYèODBC_LINK',_,[user(root),password(''),alias(db),open(once)]),
    findall(L, odbc_query(db,"SELECT * FROM maTable",L),List),
    maplist(writeln,List),
    odbc_disconnect(db).

    qui affiche row(champ1,champ2)

    on a :
    row(Champ1,Champ2) =.. [A|B].,
    qui à partir de row(Champ1,Champ2) nous donne [Champ1,Champ2]

    on a :
    maplist(modif, List, L1),
    writeln(L1).
    modif([A, azerty], [A, azerty,1]).
    modif([A, B], [A, B, 0]).
    .
    qui va ajouter un champ en fin de ligne tel que si le 2nd champ vaut azerty alors 1 sinon 0 et afficher le résultat.

    maintenant il faut emboiter tout ça, et je comprend pas comment dans la partie

    odbc_connect('MYèODBC_LINK',_,[user(root),password(''),alias(db),open(once)]),
    findall(L, odbc_query(db,"SELECT * FROM maTable",L),List),
    maplist(writeln,List),
    odbc_disconnect(db).


    forcer ce que qualifirai de "conversion" par l'appel de row(Champ1,Champ2) =.. [A|B].

    la suite consistant à appeler modif via un maplist est ok

  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
    Première chose , ça évite les lignes de couleur !
    Deuxièmement, si j'ai bien compris ton code donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    odbc_connect('MYèODBC_LINK',_,[user(root),password(''),alias(db),open(once)]),
    findall(L, odbc_query(db,"SELECT * FROM maTable",L),List),
    % on ferme tout de suite la base de donnee
    odbc_disconnect(db).
    % maplist(writeln,List), <== inutile
    maplist(modif, List, L1),
    maplist(writeln, L1).
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    modif(In, Out) :-
      In =.. [_|A], % <== on n'a pas besoin du nom du foncteur
      modifie(A, Out).
     
    modifie([A, azerty], [A, azerty,1]).
    modifie([A, B], [A, B, 0]). .
    Je peux pas tester mais ça doit fonctionner.

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    super, ça marche très bien,

    encore merci

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

Discussions similaires

  1. pb sur des listes à 2 dimensions
    Par gerard tarquin dans le forum Général Python
    Réponses: 4
    Dernier message: 24/05/2007, 13h05
  2. Réponses: 5
    Dernier message: 27/02/2007, 12h43
  3. Liste d'iterateur sur des listes.
    Par jobherzt dans le forum C++
    Réponses: 5
    Dernier message: 24/11/2006, 15h06
  4. Problème de rafraîchissement de post sur des listes
    Par Greggggggg dans le forum Langage
    Réponses: 7
    Dernier message: 21/08/2006, 15h32
  5. [Javascript] Question pas difficile sur des listes dynamique...
    Par mulbek dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/04/2006, 10h55

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