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 :

Besoin d'aide pour créer une fonction


Sujet :

Prolog

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Besoin d'aide pour créer une fonction
    Bonjour,
    J'ai un petit problème à résoudre et je ne sais pas trop comment m'y prendre...
    J ai deux variables X et Y. (en fait X et Y seront des personnes). X aime un certain type de livres, de musique et de sport. Je dois trouver le meilleur Y qui a le plus de points communs avec X sans pour autant que X et Y ont tous les types en commun. J'ai pensé à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    estmeilleurque(Y,Z,X) % Y est meilleur que Z concernant X, Z etant une autre personne.
    estmeilleurque(Y,Z,X) :- nombrecommundecaracteristique(Y,X) >= nombrecommundecaracteristique(Z,X)
    Mais je ne sais pas comment créer la fonction nombrecommundecaracteristique(Y,X) qui me renvoie le nombre commun d'activités...
    J'espère être suffisamment assez clair, merci de votre aide.

  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
    Il faut déjà savoir comment tu as codé ceci
    X aime un certain type de livres, de musique et de sport. Je dois trouver le meilleur Y qui a le plus de points communs avec X sans pour autant que X et Y ont tous les types en commun.
    Après on pourra voir.
    "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
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse.
    Mon code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    aimemusique(peter,classique).
    aimesport(peter,tennis).
    %et bien d'autres.
     
    memegoutmusique(X,Y) :- aimemusique(X,MusicX),aimemusique(X,MusicY),X\=Y,MusicX=MusicY.
    % idem pour sport et autres critères.
     
    partagentunmaxdegout(X,Y) :-    estmeilleurque(Y,Z,X)  %prédicat que j'ai explicité dans mon premier message.
    En fait je pense introduire une personne tierce pour la comparer à la première. mon problème est que nombrecommundecaracteristique n'est pas un prédicat et je ne vois pas comment lui faire retourner un nombre.

  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
    Dois-tu nécessairement distinguer les sports, la musique, la littérature ?

    Perso, je pensais que tu pouvais simplement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    aime(peter,classique).
    aime(peter,tennis).
    Est-ce possible ?

    Tu aurais, je pense intérêt à lister les préférences de la personne cible, et ensuite compter le nombre de préférences communes avec les autres personnes de la base de données.

    J'ai fait le prog en SWI-Prolog, est-ce le Prolog que tu utilises ?
    "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 habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Salut,

    Un bout de temps que je n'ai pas fait de Prolog, mais il me semble que tu n'utilises pas à fond l'instanciation.

    Citation Envoyé par xavxx58 Voir le message
    memegoutmusique(X,Y) :- aimemusique(X,MusicX),aimemusique(X,MusicY),X\=Y,MusicX=MusicY.
    Je l'aurais écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    memegout(X,Y) :- X/=Y, 
                    !, 
                    aime(X,Z), 
                    aime(Y,Z).
    (D'après mes souvenirs : SICStus Prolog, il y a .... pfiou, 6 ans déjà !).

    J'ai ajouté un point d'arrêt, histoire d'optimiser la recherche :
    * si X = Y, on ne va pas plus loin ;
    * si X /= Y, alors on cherche les goûts communs et on échoue si on n'en trouve pas.

    L'idée de Trap D de ne pas différencier les types de goût me parait bien, ça allègera le code. Bien sûr, si tu as une contrainte qui nécessite de différencier les goûts, on oublie !

    Sinon, pour l'algo général, ma première idée serait de faire une liste complète des goûts de X, de faire une copie de cette liste et d'en supprimer les goûts de Y.

    On garde le nombre d'éléments restants dans cette liste (en notant que ce nombre est associé à Y), s'il est différent de 0 (et même strictement supérieur à 0, pour éviter tout problème).

    On procède de même (copie de liste, suppression des éléments et archivage du nombre d'éléments) pour tous les autres candidats.

    Ensuite, on cherche le minorant de tous les nombres que l'on a gardé.

    C'est la méthode que je ferais en premier mais, comme je l'ai dit, ça fait un bout de temps que je n'ai pas fait de Prolog : je ne saurais te dire si c'est simple ou complexe, rapide ou long (au niveau temps d'exécution).

    De même, cette méthode "oublie" les goûts communs entre X et son "meilleur ami", ce qui peut disqualifier cette méthode.

    A toi de voir.

    Bon courage !

    /Olivier

    Edit : La façon dont j'ai expliqué l'algo ne respecte pas du tout la logique Prolog, mais tu vois le principe.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord merci à vous pour vos réponses. Après une journée de travail j'y vois un plus clair. (même si je n'ai maintenant que 3 jours d'expérience Prolog )
    J'ai fait le prog en SWI-Prolog, est-ce le Prolog que tu utilises ?
    Je dois utiliser celui ci également.

    memegout(X,Y) :- X/=Y,
    !,
    aime(X,Z),
    aime(Y,Z).
    C'est vrai que maitenant que tu le dis. C'est plus simple. En fait j'avais repris mon code dans l'exemple du tutoriel de ce site de pcaboche.

    Sinon, pour l'algo général, ma première idée serait de faire une liste complète des goûts de X, de faire une copie de cette liste et d'en supprimer les goûts de Y.
    Là je vois toute ton expérience. Je n'arrive même pas un faire un XOR alors ce que tu me suggères me parait de la haute programmation!!

    Cependant je vais poster mon résultat de la journée: (le code est en anglais, j'espère que ca ne pose de problème à personne)
    Je reconnais parfaitement qu'il y a un passage très encombrant (à lire et encore plus à écrire) mais je n'ai pas trouvé d'autres alternatives que d'expliciter tous les cas. Voici en gros mon algorithme. J'ai trois filles trois garcons le but étant de former des couples. 2 personnes font une paire s'ils sont de sexe opposé, et que les gouts attendus de l'un correspond aux gouts de l'autre et vice et versa. Pour ca je dois trouver la meilleure personne des trois correspondant à X. Cette personne est meilleure si les points communs sont supérieurs que les deux autres. Et c'est la que le gros passage intervient, vu ma faible expérience je suis obligé d'écrire toutes les possibiltés de points communs... Cependant quand j'exécute ce monstre j'ai : "Arguments ne sont pas suffisamment instanciés." d'ou vient le problème??

    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
     
    age(kelvin,young).
    age(dennis,mature).
    age(alice,averageage).
    age(eva,young).
    age(lynne,young).
     
    wantstall(peter,tall).
    wantstall(kelvin,small).
    wantstall(dennis,small).
    wantstall(alice,tall).
    wantstall(eva,averageheight).
    wantstall(lynne,tall).
     
    wantshair(peter,fair).
    wantshair(kelvin,fair).
    wantshair(dennis,fair).
    wantshair(alice,dark).
    wantshair(eva,fair).
    wantshair(lynne,dark).
     
    wantsage(peter,young).
    wantsage(kelvin,young).
    wantsage(dennis,averageage).
    wantsage(alice,averageage).
    wantsage(eva,young).
    wantsage(lynne,mature).
     
    likesmusic(peter,classical).
    likesmusic(kelvin,rock).
    likesmusic(dennis,jazz).
    likesmusic(alice,rock).
    likesmusic(eva,rock).
    likesmusic(lynne,classical).
     
    likessport(peter,swimming).
    likessport(kelvin,tennis).
    likessport(dennis,tennis).
    likessport(alice,swimming).
    likessport(eva,tennis).
    likessport(lynne,swimming).
     
    likesbook(peter,adventure).
    likesbook(kelvin,sf).
    likesbook(dennis,detective).
    likesbook(alice,adventure).
    likesbook(eva,sf).
    likesbook(lynne,adventure).
     
    oppositesex(X,Y) :- (male(X),female(Y));(male(Y),female(X)).
     
    sametastemusic(X,Y) :- likesmusic(X,MusicX),likesmusic(Y,MusicY),X\=Y,MusicX==MusicY.
    sametastesport(X,Y) :- likessport(X,SportX),likessport(Y,SportY),X\=Y,SportX==SportY.
    sametastebook(X,Y) :- likesbook(X,BookX),likesbook(Y,BookY),X\=Y,BookX==BookY.
     
    samerequiredheight(X,Y) :- istall(Y,TallY),wantstall(X,TallX),X\=Y,TallX==TallY.
    samerequiredhair(X,Y) :- hair(Y,HairY),wantshair(X,HairX),X\=Y,HairY==HairX.
    samerequiredage(X,Y) :- age(Y,AgeY),wantsage(X,AgeX),X\=Y,AgeY==AgeX.
     
     
     
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 6.
     
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 5.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 5.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 5.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 5.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 5.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 5.
     
     
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 4.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 4.
     
     
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- \+ sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 3.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 3.
     
     
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 2.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),samerequiredage(X,Y),M is 2.
     
     
     
    commonnumberofcaracteristic(Y,X,M) :- sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 1.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 1.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),\+sametastesport(X,Y),sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 1.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 1.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 1.
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),samerequiredage(X,Y),M is 1.
     
     
     
    commonnumberofcaracteristic(Y,X,M) :- \+sametastemusic(X,Y),\+sametastesport(X,Y),\+sametastebook(X,Y),\+samerequiredheight(X,Y),\+samerequiredhair(X,Y),\+samerequiredage(X,Y),M is 0.
     
     
     
    isbetter(Y,Z,X) :- M>=N,commonnumberofcaracteristic(Y,X,M),commonnumberofcaracteristic(Z,X,N).
     
    better(Y,Z,T,X) :- isbetter(Y,Z,X),isbetter(Y,T,X).
     
    match(X,Y) :- oppositesex(X,Y),oppositesex(X,Z),oppositesex(X,T),oppositesex(Y,U),oppositesex(Y,V),better(X,U,V,Y),better(Y,Z,T,X).

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Tout d'abord, quand j'écrivais "instanciation", je pensais "unification" (soyons clairs sur les termes).

    Regarde si, dans ton code, peter a un âge car dans le copier/coller que tu as fait, il n'en a pas => ça ne risque pas de marcher car il va manquer une info.

    Citation Envoyé par xavxx58 Voir le message
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ...
    match(X,Y) :- oppositesex(X,Y),oppositesex(X,Z),oppositesex(X,T),oppositesex(Y,U),oppositesex(Y,V),better(X,U,V,Y),better(Y,Z,T,X).
    Houlà ! J'ai l'impression que tu fais 2 fois le boulot. Une fois que tu as trouvé le meilleur partenaire pour X, pourquoi cherche-tu à trouver le meilleur partenaire de Y ?
    Supprime le 2° better/4 (et les oppositesex/2 contenant Z et T), ça ne sert à rien.

    Bon courage,

    /Olivier

    P.S. et fais un petit tour là:
    http://pcaboche.developpez.com/artic...mation-prolog/

    ça donne de bonnes méthodes pour la programmation Prolog.

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    re-bonjour,

    Il manque même plus que l'age de peter. Le copier/coller en a oublié un bon bout. Voici le début manquant:
    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
    male(peter).
    male(kelvin).
    male(dennis).
     
    female(alice).
    female(eva).
    female(lynne).
     
    istall(peter,tall).
    istall(kelvin,averageheight).
    istall(dennis,small).
    istall(alice,averageheight).
    istall(eva,small).
    istall(lynne,tall).
     
    hair(peter,dark).
    hair(kelvin,fair).
    hair(dennis,dark).
    hair(alice,fair).
    hair(eva,red).
    hair(lynne,fair).
     
    age(peter,mature).
    age(kelvin,young).
    age(dennis,mature).
    age(alice,averageage).
    age(eva,young).
    age(lynne,young).
    En revanche je l'ai bien inséré dans mon programme.

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    J'ai oublié de répondre à ta question:
    Houlà ! J'ai l'impression que tu fais 2 fois le boulot. Une fois que tu as trouvé le meilleur partenaire pour X, pourquoi cherche-tu à trouver le meilleur partenaire de Y ?
    Je pense que X peut etre un bon partenaire pour Y sans pour autant que Y plaise à X. C'est pour ca que je vérifie dans les deux sens. J'espère avoir répondu à la question.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Citation Envoyé par xavxx58 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    isbetter(Y,Z,X) :- M>=N,commonnumberofcaracteristic(Y,X,M),commonnumberofcaracteristic(Z,X,N).
    Je dirais qu'ici, tu cherches à faire un test comparatif entre M et N sans qu'ils soient encore calculés.
    Essaie de placer le test à la fin et vois ce que ça te donne (au mieux, ça résout ton problème et au pire, ça augmentera la vitesse de ton programme).

    Bon courage,

    /Olivier

    Edit : Je ne sais pas comment marche SWI-Prolog, mais si tu as un debugger, ça te faciliterait la vie de l'activer lorsque tu rencontres un problème, histoire de voir au moins où il se situe, voire comment le programme en est arrivé là.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut Et un debugger SWI-Prolog, un !

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Citation Envoyé par xavxx58 Voir le message
    Je pense que X peut etre un bon partenaire pour Y sans pour autant que Y plaise à X. C'est pour ca que je vérifie dans les deux sens. J'espère avoir répondu à la question.
    En effet, tu as bien répondu, c'est ce que je pensais aussi, mais y'avait quelque chose qui me chagrinait, et je viens de mettre le doigt dessus !

    Si peter est le meilleur partenaire de lynne et que alice est le meilleur partenaire de peter, tu n'auras pas de solution. Mais peut être est-ce le but recherché.

    /Olivier

    Edit : En tout cas, il ne devrait pas te donner le message d'erreur que tu obtiens s'il ne trouve pas de solution. Je reste intiment persuadé que c'est le test M>N qui est placé trop tôt. Quid ?

  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
    Je viens de regarder un peu ton problème. Voilà comment je le sens :
    Pour une personne donnée que j'appelle X , je vais chercher la liste des personnes compatibles du point de vue sexe (d'ailleurs j'ai modifié ta bdd avec un fait sexe(Personne, Sexe) : par exemple sexe(peter, male) et sexe(alice, female) celà m'a paru plus logique.
    Pour la liste des personnes obtenues je recherche si ces personnes correspondent aux critères de taille, age et chevelure recherchés par X.
    Ensuite je recherche si ces personnes ont les mêmes gouts en littérature , sports et musique. J'obtiens donc une série de résultats quon peut ensuite analyser pour faire des calculs.
    Exemple de résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12 ?- test(peter).
    Noms possibles : [alice, eva, lynne] 
    age : [non, oui, oui] 
    taille : [non, non, oui] 
    chevelure : [oui, non, oui] 
    Gouts communs
    Nom : alice     Musiqe : non Sports : oui Livres : oui
    Nom : eva       Musiqe : non Sports : non Livres : non
    Nom : lynne     Musiqe : oui Sports : oui Livres : oui
     
    Yes
    Manifestement, ici c'est lynne qui est la favorite ! D'autant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    13 ?- test(lynne).
    Noms possibles : [peter, kelvin, dennis] 
    age : [oui, non, oui] 
    taille : [oui, non, non] 
    chevelure : [oui, non, oui] 
    Gouts communs
    Nom : peter     Musiqe : oui Sports : oui Livres : oui
    Nom : kelvin    Musiqe : non Sports : non Livres : non
    Nom : dennis    Musiqe : non Sports : non Livres : non
     
    Yes
    Ce genre de recherche te va-t-il ?
    Si oui, je peux te donner des indications pour le faire.

    Il faut que tu te plonges dans bagof et maplist.
    "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 Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    pour Nardo47:
    Je dirais qu'ici, tu cherches à faire un test comparatif entre M et N sans qu'ils soient encore calculés.
    Essaie de placer le test à la fin et vois ce que ça te donne
    Effectivement le problème venait de là! Je n'avais pas pris en compte le fait de l'ordre. Pour moi, a,b était pareil que b,a!

    Si peter est le meilleur partenaire de lynne et que alice est le meilleur partenaire de peter, tu n'auras pas de solution. Mais peut être est-ce le but recherché.
    Là encore c'est vrai. Mais j'ai un peu "triché" j'ai vérifié manuellement les cas il n'y a pas de double liaison. Juste Alice et Eva qui ont le même nombre de points communs pour Dennis mais le >= dans la comparaison fait l'affaire.

    Pour TrapD:
    Je suis sur que ton code est plus pure que le mien je vais regarder plus tard les deux indics.

    Merci à tous.

Discussions similaires

  1. Besoin d'aide pour créer une application web qui se connecte sur AS/400
    Par wyzer dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 04/06/2010, 15h32
  2. [C++] Besoin d'aide pour créer une dll.
    Par Vince dans le forum Débuter
    Réponses: 3
    Dernier message: 15/03/2010, 13h55
  3. Besoin d'aide pour créer une requête
    Par cedric/copy dans le forum ASP
    Réponses: 6
    Dernier message: 13/03/2009, 16h29
  4. Besoin d'aide pour créer une requête
    Par fabien59420 dans le forum Requêtes et SQL.
    Réponses: 44
    Dernier message: 26/05/2008, 11h08
  5. Besoin d'aide pour créer une BD
    Par desfrags dans le forum Débuter
    Réponses: 6
    Dernier message: 30/01/2008, 22h20

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