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 :

Modélisation d'un petit problème logique avec Prolog


Sujet :

Prolog

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut Modélisation d'un petit problème logique avec Prolog
    Bonjour à tous,

    N'étant pas familier avec ce cher Prolog, je cherche quelques exemples qui me permettraient d'avancer sur la modélisation d'un petit problème logique.

    J'ai trois classes d'objets : A, B et C. Chaque objet a 12 variables qui le caractérisent : X, Y, Z, W.... Mais chaque variable est pondérée d'un coefficient.

    J'obtiens donc ceci (les règles je suppose)

    SI 0.25X et 0.27Y et 0.29Z ALORS A
    SI 0.25W et 0.12X ALORS A
    SI 0.15X et 0.29W ALORS B
    etc.

    Ce que je veux faire, c'est de mettre en input les 12 variables d'un objet pour qu'en suite cela me sort sa classe d'appartenance, conformément aux règles déjà mentionnées.

    Si vous avez n'importe quelle piste à me donner pour que je puisse avancer je suis preneur!

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    Est-ce qu'un "raisonnement" de ce type pourrait aboutir à quelque chose?

    classe (A).
    classe (B).
    classe (C).
    variable1(0.27).
    variable1(0.47).
    variable1(0.97).
    variable1(0.17).
    variable2(0.47).
    variable2(0.37).
    variable2(0.27).
    variable2(0.17).
    %etc. pour toutes les variables

    Appartient (classe, variable1,variable2,variable3,variable4,variable5...) % Une sorte de constructeur

    %Ensuite je saisis mes données (y en a à peu près 1000, c'est pour cela que je demande avant de m'aventurer )

    Appartient (A, 0.27,0.17,0.25,0.9,0.1.....).
    Appartient (B, 0.27,0.17,0.25,0.9,0.1.....).
    Appartient (C, 0.27,0.17,0.25,0.9,0.1.....).
    etc.


    Quand toutes les données sont saisies, j'interroge la console avec un simple

    Appartient (X, 0.19, 0.23, 0.43.........). %Pour avoir la classe d'appartenance suivant les variables saisies.

  3. #3
    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 ne suis pas sur de bien comprendre, mais j'ai l'impression que ta dexuxième suggestion est intéressante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    classe(a, 0.27,0.17,0.25,0.9,0.1.....).
    classe(b, 0.27,0.17,0.25,0.9,0.1.....).
    classe(c, 0.27,0.17,0.25,0.9,0.1.....).
    Attention au nom en majuscules, ce sont des variables.
    Si par exemple la deuxième variable est la seule à avoir de l'importance et pas les autres, tu peux écrire par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classe(d, _, 0.35, _, _ ,_....).
    Un underscore signifie que n'importe quelle valeur convient.
    "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

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    Hello Trap D, donc du coup ça peut être considéré comme de la logique et non de la logique floue?
    Je vais essayer ce que tu m'as conseillé et voir ce que ça donne.

    Par contre une interrogation, ce que j'ai écris est "syntaxiquement" correct?

  5. #5
    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
    Pour une partie (classe et variableN) oui, pas pour Appartient.

    Je ne suis pas compétent pour décider si c'est de la logique floue ou pas, à mon avis ce n'en est pas, on discrimine les cas, c'est tout.
    "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

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    Cela répond à ma question! Merci!

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    Si jamais mes classes sont à représenter de cette manière :

    SI variable1 > 0.27 et variable2 <0.25 et variable3 >0.19
    ALORS
    classe a

    au lieu de (ce que j'ai actuellement fait)

    SI variable1 = 0.27 et variable2 =0.25 et variable3 =0.19
    ALORS
    classe a


    Est-ce possible de représenter cela via Prolog?


    PS : Je sais que ce Post a été résolu, mais puisque c'est dans la continuité de l'ancien je pense que cela ne servirait à rien d'en ouvrir un nouveau.

  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
    Dans ce cas on peut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    classe(a, V1, V2, V3,.....) :-
        V1> 0.27,  V2 < 0.25, V3 >0.19.
    Si il y a des ou par exemple (V1 > 0.27 ou V2 < 0.25) et V3 > 0.19 on écrira
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    classe(a, V1, V2, V3,.....) :-
        (V1> 0.27 ;  V2 < 0.25), V3 >0.19.
    "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

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    Excellent! Merci!

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    Une dernière question :

    Si pour certains cas il n'y a pas les 12 variables dans les conditions, exemple :

    classe(a, V1, V2,V3) :- V1<0.23, V2>0.45, V3>0.5.
    classe(b, V1,_,V3) :- V1<0.12, V3<0.5.

    Si je mets dans la console classe(X, 0.11, 0.11, 0.11).

    Je ne suis pas supposé avoir b? Là cela ne me sort que False. Suis-je obligé d'avoir un modèle "générique"?

  11. #11
    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
    classe(X, 0.11, 0.11, 0.11) ne figurant pas dans les faits, c'est normal d'obtenir FALSE.
    Suis-je obligé d'avoir un modèle "générique"?
    Ce n'est pas obligatoire mais c'est plus cohérent.
    Si des valeurs ne sont pas utiles pour la détermination des classes, on peut mettre les underscore comme je l'ai dit plus haut.
    Tout dépend en fait de ce qe tu veux faire exactement.
    "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

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    Quand je note classe(b, V1,_,V3) :- V1<0.12, V3<0.5.

    classe(X, 0.11, 0.11, 0.11).

    ne vérifie-t-il pas les faits puisque j'ai 0.11 < 0.12 et 0.11 < 0.5 ? (V1 et V3)

    dans ce cas précis ne peut-on pas nous passer de la variable V2?

    Ou suis-je obligé de faire classe(b, V1, V3) avant?

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    La finalité de ce que je veux faire, c'est d'avoir un objet avec un ensemble de variables (toujours 12). Il y a un ensemble de règles (des fois avec 2 variables, d'autres avec 4 variables etc.) à appliquer sur cet objet pour en déterminer la classe d'appartenance.

    C'est pour cela que je voulais avoir quelque chose de générique.

  14. #14
    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
    Ce que tu peux faire c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    classe(b, V1, _V2, V3, _V4, _V5, _V6, _V7 ..._V12) :-
        V1<0.12, V3<0.5.
    Le plus simple est d'écrire toutes les règles avec les 12 variables, il y a combien de cas possibles ?
    "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

  15. #15
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    J'ai 112 règles en tout.

    Des règles avec 2 variables, d'autres avec 4, d'autres avec 12...

    J'ai utilisé un algorithme de classification pour des objets. Cet algorithmes a généré environ 1900 règles. J'ai ensuite appliqué un algorithme de règles consensuelles. Cet algorithme là a généré 112 règles. Ce que je veux vérifier maintenant, c'est est-ce que ces 112 règles permettent de déterminer avec la même précision que mon algorithme de classification la classe d'appartenance de mes objets.

    Si la solution que tu m'as indiquée est la seule valable, je vais tout mettre en BDD et préparer un script qui me formate le tout pour l'injecter sous Prolog.

  16. #16
    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
    Est-ce qu'il y a une logique quelconque dans la création des 112 regles (sans doute puisque tu dis que ton algo à générer 112 règles).
    Il est possible de générer à run-time des prédicats, il faudrait que j'en sache plus sur ton problème.
    "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

  17. #17
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    Oui y a une logique, y a des algorithmes de génération de règles consensuelles, celles sur lesquelles les "experts" du domaine se mettent d'accord. Bref, sur les 1900 règles générées, les "experts" se sont mis d'accord sur 112 d'entre elles.


    Maintenant, pour vérifier qu'il s'agit de règles "correctes", qui peuvent autrement dit donner les mêmes résultats que les 1900 précédentes, il faut que je teste mon échantillon d'objets (120 en tout) pour voir si, à partir de leur 12 variables, j'obtiens une classification aussi correcte que celle obtenue via un algo de classification.

    J'espère que ce n'est pas trop tiré par les cheveux, j'ai moi-même du mal des fois à comprendre ce que je suis entrain d'écrire

    Sinon, j'ai essayé ta deuxième proposition et ça a l'air de bien fonctionner.

    Ayant les 112 règles stockées dans une BDD, je vais faire des opérations d'extraction de caractères pour générer un fichier .pl et appliquer donc ces 112 règles

  18. #18
    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 crois que j'ai compris !
    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

  19. #19
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 164
    Points : 43
    Points
    43
    Par défaut
    Trap D, je viens de me rendre compte d'un hic (après avoir saisi toutes les règles...) :

    si j'ai une règle avec 3 variables classifiant l'objet comme appartenant à la classe a, et que j'ai d'un autre côté une règle avec 6 variables classifiant l'objet comme appartenant à la classe b, mon objet est automatiquement classé en a s'il respecte les 3 premières variables.

    Exemple :


    classe (a, V1 > 0.1, V2 > 0.2, V3 > 0.3).
    classe (b, V1 > 0.1, V2 > 0.2, V3 > 0.3, V4> 0.4, V5>0.5, V6 >0.6).

    Etant donné que pour le premier cas, V4, V5 et V6 n'ont pas d'importance (je rajoute le "_" avant), mon objet est classé automatiquement en a.

    Quand j'appuie sur ";" à l'exécution cela me sort bien la classe b, mais pas en premier.

    Une idée comment faire cette "pondération"?

  20. #20
    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
    Peut-être en utilisant un findall, il faudrait voir l'appel des règles.
    ceci dit, il ny a pas un problème d'organisation des classes, d'après ce que tu dis, la classe b semble être une sous-classe de a, non ?
    "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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Python 3.X] Petit problème 2D avec OpenGL
    Par Toshima-Xx dans le forum Programmation multimédia/Jeux
    Réponses: 6
    Dernier message: 18/04/2015, 11h37
  2. problème logique avec un ou et &
    Par bokbok dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 03/03/2008, 07h36
  3. [VB NET] Petit probléme simpliste avec GDI+ !
    Par archimed111 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/05/2006, 09h17
  4. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45
  5. Petit problème avec SDL
    Par Nyarlathotep dans le forum C
    Réponses: 10
    Dernier message: 01/07/2005, 09h10

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