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 :

Intégrer une clause dans la base de connaissance


Sujet :

Prolog

  1. #1
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Intégrer une clause dans la base de connaissance
    Par MP, j'ai reçu la question suivante:

    Citation Envoyé par bakhoucha
    Bonjour (ou Bonsoir)

    Je cherche comment integrer une clause ds la base de connaissance d'un programme prolog de sorte a pouvoir le retracter apres pour integrer une autre.

    Merci bien d'avance.
    Une fonctionnalité intéressante de Prolog est de pouvoir déclarer des prédicats dynamiques.

    Pour cela, il faut d'abord déclarer le prédicat comme dynamique :
    Ici "age" est le nom du prédicat en question, et 2 est son arité (le nombre d'arguments qu'il compte).

    Ensuite, on il est possible:
    1) d'ajouter des clauses grâce aux prédicats:

    - asserta/1 : ajoute une clause en début de prédicat
    - assertz/1 : ajoute une clause en fin de prédicat
    - assert/1 : synonyme de assertz/1

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert( age('Julie', 26) ).
    2) d'ajouter des clauses grâce aux prédicats:
    - retract/1 : retire une clause
    - retractall/1 : retire toutes les clauses qui s'unifie avec le terme passé en paramètre

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    retract( age('Julie', 26) ).
    retractall( age(_, 21) ).
    ********

    Maintenant, un petit rappel des règles du forum:
    Il est interdit de poster des questions techniques par MP.
    Posez vos questions technique exclusivement dans le forum approprié.

    En posant votre question sur le forum:
    • elle devient accessible à tous et tout le monde peut profiter de la réponse et ajouter des commentaires
    • la discussion peut être référencée dans un moteur de recherche, ce qui permet aux internautes de trouver la réponse à leur question technique. Une fois sur le forum, ils trouveront très facilement les tutoriels présents sur www.developpez.com, en particulier ceux de la rubrique Prolog
    • cela permet de faire connaître developpez (au travers des moteurs de recherche)
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  2. #2
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 25
    Points
    25
    Par défaut encore moi
    Bonjour,

    SUr mon programme je ne peux pas mettre un atome deja untilisé avec les faits instancié, comme regle.

    Je vous donne ci-dessous la partie de mon pg qui pose pb.

    Mon Langage

    predicats([(vole,1),(oiseau,1),(leger,1)]).

    constantes([1,2]).

    variables([x, y, z ,t]).

    Mes faits

    vole(1).

    oiseau(2).

    non(leger(1)).

    Mes regles:

    oiseau(X):- vole(X).

    alors il me donne comme erreur Warning :

    warning: discontiguous predicate oiseau/1 - clause ignored
    Et pas consequent la regle est ignorée

    Merci

  3. #3
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par bakhoucha
    alors il me donne comme erreur Warning :

    warning: discontiguous predicate oiseau/1 - clause ignored
    Et pas consequent la regle est ignorée

    En Prolog, les clauses d'un même prédicat doivent être placée ensemble (de manière non discontinue), sinon ça lève un avertissement (warning).

    Suivant les implémentation:
    - soit la clause est ignorée (comme dans ton cas)
    - soit la clause est quand même prise en compte (comme en swi-prolog)


    Dans tous les cas, et quel que soit le langage (pas seulement Prolog), il faut éviter d'avoir des warning (car ils sont le plus souvent le signe d'une mauvaise conception, mais pas toujours).

    Cependant, voici un programme qui marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    :- dynamic( oiseau/1 ).
    :- dynamic( vole/1 ).
     
    :- assert( oiseau(2) ).
     
    vole(1).
     
    oiseau(X):- vole(X).
    Voici son exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    |?- oiseau(X).
     
    X = 2 ;
     
    X = 1 ;
     
    No
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 25
    Points
    25
    Par défaut Merci
    Merci pour votre reponse, ca marche...

    Mais comme je savais pas qu'il faut declarer les clauses dynamic, alors je les ai integrées directement, ce qui fait que mon programme me garde toujours les mm connaissances mm si je les enlève du programme, alors pour enlever une caulse qui n'etait pas declarée dynamic, je fais comment...g mm essayé de desinstaller le GNprolog mais g toujours les mm connaissances

  5. #5
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Je ne comprends rien à ton problème. La base de connaissances (base de faits + règles) est propre à une exécution. Si tu arrêtes le programme, la basede connaissance est vidée.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 25
    Points
    25
    Par défaut
    Normalement...

    Mais je comprends pas pourkoi il garde toujours les connaissances.

    Et lorsque je veux les retracter il me donne comme erreur:

    modify,static_procedure,leger/1),retract/1

    Sachant que je cherche a renlever la clause : leger(X) :- vole(X)

    je m'explique:

    Je garde toujours le fait vole(a), mais j'enleve de mon programme la clause leger(X) :- vole(X), puis j'edite la liste de mes faits positifs et je trouve toujours leger(a), et pourtant je retracte toutes les listes avant d'excuter mon programme (base de harbrand, les faits positifs et les faits negartifs).

    Alors g pensé qu il garde les connaissances qlq part...mais ou??!!

  7. #7
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Montre-nous ton code, stp.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 25
    Points
    25
    Par défaut Mon programme
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    /* ================================================= */
    /*                      LANGAGE 			                             */
    /* ================================================= */
     
    predicats([(vole,1),(oiseau,1),(leger,1),(couple,2)]).
     
    constantes([1,2]).
     
    variables([x, y, z ,t]).
     
    /* ================================================= */
    /*                      FAITS 			                             */
    /* ================================================= */
    vole(1).
     
    oiseau(1).
     
    non(leger(1)).
    /* ================================================= */
    /*                        REGLES 		                                          */
    /* ================================================= */
     
    %leger(X):- vole(X).
     
    creer_atome_libre(Atome):-  
       predicats(LP),
       member((Predicat,Arite),LP),       
       creer_variables(Arite,Lvariables),
       Atome=..[Predicat|Lvariables].
     
    creer_variables(0,[]):-
    	!.
     
    creer_variables(N,[_|Lv]):-
       N1 is N-1,
       creer_variables(N1,Lv).
     
    construire_atomes_libres(LAL):-
       findall(Atome, creer_atome_libre(Atome), LAL).
     
     
    atome_herbrand(A):-
    	construire_atomes_libres(LA),
          member(A,LA),
          instancier_terme(A).
     
    instancier_terme(A):-
          A=..[Pred|Larguments],
          instancier_liste(Larguments),
          A=..[Pred|Larguments].
     
    instancier_liste([]).
     
    instancier_liste([X|L]):-
          constantes(LC),
          member(X,LC),
          instancier_liste(L).
     
    construire_base_Herbrand(LBH):-
          findall(A, atome_herbrand(A), LBH), 
          asserta(base_Herbrand(LBH)).
     
     
    construire_faits_positifs(P) :-
       findall(Atome, fait_positif(Atome), P),
       asserta(faits_positifs(P)).
     
    fait_positif(Atome) :-
    	base_Herbrand(LBH),  
    	member(Atome, LBH),
    	Atome.
     
    construire_faits_negatifs(N) :-
    	findall(Atome, fait_negatif(Atome), N),
        asserta(faits_negatifs(N)).
     
    fait_negatif(Atome) :-
    	base_Herbrand(LBH),
    	member(Atome, LBH),
    	non(Atome).	
     
    construire_faits_incertains(I) :-
    	findall(Atome, fait_incertain(Atome), I),
    	asserta(faits_incertains(I)).
     
    fait_incertain(Atome) :-
    	base_Herbrand(LBH),
    	faits_positifs(LP),
    	faits_negatifs(LN),
    	member(Atome, LBH),
    	\+ member(Atome,LP),
    	\+ member(Atome,LN).

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 25
    Points
    25
    Par défaut fait positif
    Aussi au niveau des faits positifs:

    Je construis la base de Herbrand, et puis je demande les faits positifs, il parcourt la base de Herbrand et il bloque dés qu'il rencontre un atome qui n'est pas declaré avec les faits, alors qu'il doit (selon la negation par echec) le considerer faux et basta

    Voici l'execution de la partie qui me pose un pb:
    ---------------------------------------------------------------------------
    | ?- construire_base_Herbrand(LBH).

    LBH = [vole(1),vole(2),oiseau(1),oiseau(2),leger(1),leger(2),couple(1,1),couple(1,2),couple(2,1),couple(2,2)]

    yes
    | ?- fait_positif(P).

    P = vole(1) ? ;

    P = oiseau(1) ? ;
    uncaught exception: error(existence_error(procedure,leger/1),fait_positif/1)
    --------------------------------------------------------------------------
    J'espere que ca ne vous embete pas, et merci

  10. #10
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    J'ai jeté un oeil à ton programme.

    Au début de ton programme, il faut déclarer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :- dynamic( leger/1 )
    :- dynamic( fait_positif/1 )
    sinon Prolog ne trouve pas le prédicat, provoque un échec et basta.

    Sinon, au lieu d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    creer_variables(Arite,Lvariables),
    tu peux essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    length(Lvariables, Arite),
    pour générer une liste de variables libres (en SWI-Prolog, on a le prédicat length/2 implémenté de base).


    Au fait: n'oublie pas la balise "code" (l'icone # dans l'interface).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  11. #11
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 25
    Points
    25
    Par défaut Pourkoi?
    Alors je dois faire le mm travaille pour tous mes predicats (dynamic), car sinon il plante encore sur couple/2 (G pas essayé mais c ce que je comprends )

  12. #12
    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 pcaboche
    Je ne comprends rien à ton problème. La base de connaissances (base de faits + règles) est propre à une exécution. Si tu arrêtes le programme, la basede connaissance est vidée.
    Tu en es sûr ?
    "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

  13. #13
    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
    Voilà ce que j'ai obtenu en mettant tous les prédicats en dynamic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /* ================================================= */
    :- dynamic( oiseau/1 ).
    :- dynamic( vole/1 ).
    :- dynamic( leger/1 ).
    :- dynamic( couple/2 ).
    2 ?- fait_positif(X).
    X = vole(1) ;
    X = oiseau(1) ;
    No
    3 ?- fait_negatif(X).
    X = leger(1) ;
    No
    4 ?- fait_incertain(X).
    X = vole(1) ;
    X = vole(2) ;
    X = oiseau(1) ;
    X = oiseau(2) ;
    X = leger(1) ;
    X = leger(2) ;
    X = couple(1, 1) ;
    X = couple(1, 2) ;
    X = couple(2, 1) ;
    X = couple(2, 2) ;
    X = vole(1) ;
    X = vole(2) ;
    X = oiseau(1) ;
    X = oiseau(2) ;
    X = leger(1) ;
    X = leger(2) ;
    X = couple(1, 1) ;
    X = couple(1, 2) ;
    X = couple(2, 1) ;
    X = couple(2, 2) ;
    PS tu as des fautes de frappe avec des s en trop dans les prédicats.
    "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

  14. #14
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 25
    Points
    25
    Par défaut
    Il faut carrement quitter le console pour vider la base de connaissances, sinon mm on reconsulte avec les nouvelles modifications on trouve toujours les mm connaissances.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 25
    Points
    25
    Par défaut
    mais est ce qu il y a moyen de mettre toute ma liste des predicats en dynamic d'un seul coup? ca va me faciliter le travail apres.

  16. #16
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Trap D
    Tu en es sûr ?
    C'est ça que je voulais dire quand je parlais d'exécution :

    Citation Envoyé par bakhoucha
    Il faut carrement quitter le console pour vider la base de connaissances, sinon mm on reconsulte avec les nouvelles modifications on trouve toujours les mm connaissances.

    C'est un problème récurrent en Prolog: en faisant des reconsult, on se retrouve avec des relicats des exécutions précédentes. Pour éviter ce problème, je relance mon programme à chaque fois.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  17. #17
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par bakhoucha
    mais est ce qu il y a moyen de mettre toute ma liste des predicats en dynamic d'un seul coup? ca va me faciliter le travail apres.
    En swi-prolog:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :- dynamic oiseau/1, vole/1, leger/1, couple/2.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  18. #18
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 25
    Points
    25
    Par défaut
    Moi je travaille avec gnu prolog et ca a marché en mettant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :- dynamic(leger/1, couple/2, oiseau/1, vole/1).

  19. #19
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 25
    Points
    25
    Par défaut
    Je reviens sur ma premiere question: (comment introduire des clauses ds une base de connaissances)

    J'ai essayé d'introduire des clause ds ma base, mais ca marche si je fais le asserta/1 sur le console directement, alors que si je le mets ds le code il me donne comme erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    native code procedure asserta/1 cannot be redefined (ignored)
    ??!!!

  20. #20
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par bakhoucha
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    native code procedure asserta/1 cannot be redefined (ignored)
    ??!!!
    Là, ça veux dire que tu as fait ceci (en dehors d'un prédicat):
    alors qu'il faut faire ceci (en dehors d'un prédicat) :
    :- asserta( machin(1) ).
    ou cela (à l'intérieur d'un prédicat):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    monpredicat :-
      ...
      asserta( machin(1) )
      ...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

Discussions similaires

  1. saugarde d'une image dans la base
    Par dali20022 dans le forum Oracle
    Réponses: 1
    Dernier message: 10/03/2006, 23h49
  2. Récuperer valeurs d'une checkbox dans la base Mysql
    Par pod1978 dans le forum SQL Procédural
    Réponses: 13
    Dernier message: 10/03/2006, 14h29
  3. Lire une donnée dans la base de registre
    Par K.othmane dans le forum Langage
    Réponses: 1
    Dernier message: 06/01/2006, 11h32
  4. impossible d'insérer une date dans la base
    Par bobic dans le forum ASP
    Réponses: 3
    Dernier message: 03/10/2005, 11h29
  5. Oracle Designer: récupération d'une vue dans la base
    Par BILLYPATOU dans le forum Designer
    Réponses: 2
    Dernier message: 19/03/2004, 11h08

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