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 :

Tp Programmation logique


Sujet :

Prolog

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Tp Programmation logique
    Bonsoir,

    Dans le cadre de mon apprentissage, je souhaiterai être capable de réaliser une fiche de tp comme celle ci liris.cnrs.fr/amille/enseignements/Master_PRO/BIA/TP_5_6_2008/TP5_6.doc

    Malheureusement je ne sais pas du tout comment procéder pour répondre aux questions, mon université se concentre beaucoup trop sur la théorie et bien trop peu sur la pratique, en séance de tp on a eu droit qu'a quelques notion très basique de prolog comme faire des boucles ou encore consulter un fichier ...

    Et donc pour compléter ma formation je souhaiterai au moins être capable de réaliser un tp comme celui que j'ai link qui ma l'air asser consistant

    J'ai vu les principes du chaînage avant et arriéré en cours, théoriquement je sais comment sa marche mais pratiquement je ne sais pas du tout comment démarrer, la première question est "Définir la base de règles grâce à un prédicat regle(ri) :- si(Liste de prémisses), alors(Liste de conclusions). "

    je veux bien mais comment je procède pour définir ces règles ?

    Pour moi le chaînage avant consiste a : passer les règles dont on dispose jusqu’à en trouver une dont l’antécédent est vrai, si une tel règle est trouvé elle est déclenchée et une nouvelle donnée est alors ajouter a la base de donnée, puis on recommence jusqu'a arriver au but sachant qu'une règle ne peut être déclenchée qu'une fois.

    Pouvez vous m'aider svp ?

    Merci

  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
    Le lien donne est incorrect !
    D'autre part, sur ce forum on ne peut t'aider que sur des questions précises.
    Il y a les cours dont tu trouveras les liens dans ma signature (Faites du Prolog, ça vous changera les idées !) mais pour les bases il faut chercher sur Internet (tape "Base de Prolog" et tudevrais trouver des choses intéressantes).
    Bon courage et n'hésite pas à poser tes questions ici !
    "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
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre réponse, je vais jeter un œil a vos cours.

    Concernant le lien, je viens de tester il fonctionne pour moi ! il télécharge automatiquement un fichier nommé TP5_6, le tp est composé de plusieurs parties, j'essaye de le résoudre progressivement mais je n'arrive même pas a démarrer

    J'aurai grand besoin qu'une personne me guide a travers les différentes étapes, si vous avez de bon conseils/exemple ou un document qui explique plus précisément comment procéder, je suis preneur !

    Je vais copier/coller ici la première partie de la fiche, a savoir la réalisation d'un moteur d’inférence a chaînage avant ( je précise que j'ai bien compris la partie théorique du chaînage avant mais pour l’implémentation en prolog .. )

    On donne une base de règles à titre d’exemple :
    r1 : Si fleur et graine Alors phanérogame
    r2 : Si phanérogame et graine_nue Alors sapin et ombre
    r3 : Si phanérogame et 1cotylédone Alors monocotylédone
    r4 : Si phanérogame et 2cotylédone Alors dicotylédone
    r5 : Si monocotylédone et rhizome Alors muguet
    r6 : Si dicotylédone Alors anémone
    r15 : Si joli Alors non rhizome
    r7 : Si monocotylédone et non rhizome Alors lilas
    r8 : Si feuille et non fleur Alors cryptogame
    r9 : Si cryptogame et non racine Alors mousse
    r10 : Si cryptogame et racine Alors fougère
    r11 : Si non feuille et plante Alors thallophyte
    r12 : Si thallophyte et chlorophylle Alors algue
    r13 : Si thallophyte et non chlorophylle Alors champignon et non bon
    r14 : Si non feuille et non fleur et non plante Alors colibacille

    1 Moteur en chaînage avant

    On veut réaliser un moteur d’inférence d’ordre zéro, fonctionnant en chaînage avant, en régime irrévocable et monotone, et qui ne constitue pas d’ensemble de conflit (dès qu’une règle est déclenchable, elle est déclenchée).
    • Définir la base de règles grâce à un prédicat regle :
    regle(ri) :- si(Liste de prémisses), alors(Liste de conclusions).
    • Définir un prédicat permettant à l’utilisateur d’initialiser la base de faits. On utilisera le prédicat assert pour ajouter vrai(Fait) pour les faits positifs et faux(Fait) pour les faits négatifs.
    • Définir un prédicat qui sature la base de règles et produit une trace de son fonctionnement (on pourra s’inspirer du troisième moteur d’inférence présenté en cours).

    Exemple d’exécution :
    ?- faits([fleur,graine,un_cotyledone,non(rhizome)]).
    Yes

    ?- saturer.
    r1
    non(rhizome) fleur graine un_cotyledone phanerogame
    r3
    non(rhizome) fleur graine un_cotyledone phanerogame monocotyledone
    r7
    non(rhizome) fleur graine un_cotyledone phanerogame monocotyledone lilas
    Yes

  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

    Le téléchargement a fonctionné. Je peux dire que j'ai déjà vu passer ce TP ll y a quelques années.
    En cherchant sur ce forum tu devrais trouver quelques réponses.
    En tout cas, par exemple, la phrase " Si fleur et graine Alors phanérogame" peut se traduire en Prolog par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    phanerogame :-  fleur, graine.
    C'est une règle qui signifie que le fait phanerogame n'est vrai que si les faits fleur et graine sont vrais.
    On peut être plus général en disant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    phanerogame(X) :-  fleur(X), graine(X).
    Il faudra donc avoir dans la base de faits par exemple (c'est n'importe quoi attention) fleur(rose). graine(pommier). ...
    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

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Désolé pour ma réponse tardive, je suis un peu surchargé ces derniers jours :/

    Je pense avoir grosso-modo compris pour la base de réglés mais pour la base de fais c'est encore un peu ambigu, on nous dis qu'il faut définir un prédicat permettant à l’utilisateur d’initialiser la base de faits et d'utiliser la fonction assert !

    Si j'ai bien compris je devrai donc définir une base de fait et créer un prédicat que j’appellerai valider_fait par exemple valider_fait(X) :- assert(fruit(X)) , ainsi l'utilisateur ferai appelle a ce prédicat pour valider un fait donné, est ce bien cela ?

  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
    C'est une possibilité, poser une suite de questions, demander par exemples des noms de pomes et faire des assert(pomme(...)), en déclarant avant les faits pommes/1 comme dynamic.
    "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

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    J'ai enfin eu un moment aujourd'hui pour m'y mettre sérieusement, j'ai donc commencer par créer ma base de règles cependant je me rend compte qu'il y'a encore des points qui me pose problème !

    voila j'ai essayer de suivre scrupuleusement ce qu'on nous demande de faire dans l'exercice et le mur que je rencontre c'est que pour moi la base de règle que l'on nous donne est semblable a des faits tout prêt ... je vais essayer de détailler un peu ce que j'ai fait jusqu’à présent pour que vous puissiez mieux me comprendre

    voici une partie de la base de règles que j'ai défini après avoir fait quelques recherches :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    :- Dynamic if/1, then/1.
    regle(a1) :- if([fleur,graine]), then([phanérogame]).
    regle(a2) :- if([phanérogame, graine_nue]), then([sapin, ombre]).                    
    regle(a3) :- if([phanérogame, un_cotylédone]), then([monocotylédone]).
    pour interroger ma BC j'utilise le prédicat clause : clause(regle(R),(if(X),then(Y))). jusque la pas de problèmes

    mais pour la suite, je ne vois pas comment je dois définir les faits, habituellement pour définir des faits et des règles je m'y prend comme cela par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    % faits
    fruits(pomme).
    aime(bernard, pomme).
    % regle
    sante(X) :- aime(X,Y), fruits(Y).
    tandis que dans cette exercice, il n'y a rien a définir vu qu'on ne fait pas appelle a des variables dans les règles ...

  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
    On peut définir beaucoup de choses avec des assert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ?- assert(fleur(iris)).
    true.
     
    ?- assert(rouge(iris)).
    true.
     
    ?- assert((fleur_rouge(X):-fleur(X), rouge(X))).
    true.
     
    ?- fleur_rouge(X).
    X = iris.
    "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
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Je pense comprendre ce que vous voulez dire mais si on regarde l'exemple d’exécution de l'exercice on a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    faits([fleur,graine,un_cotyledone,non(rhizome)]).
    il faut donc définir un prédicat faits, c'est un peu la que je coince car dans ces assertion il n'y a pas de variable X qui me permettrai de suivre votre exemple comme assert(fleur(iris)). ...

    voici ce que j'ai fait pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    faits(L):-assert(L).
    faits(L):-assert(H|T).
    H etant la tete de liste et T la queue, le but est de realiser un assert sur l'ensemble des éléments de la liste mais pour le moment cela ne fonctionne pas, je fais actuellement des recherches la dessus mais je n'ai encore rien trouvé pour résoudre mon problème.

    qu'en pensez vous ?

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    C'est bon j'ai finalement réussi a faire ce que je voulais pour la 2eme question, si je fais par exemple faits([fleur, graine]). j'obtient bien un true, j’espère être sur la bonne voie!

    Parcontre maintenant je bloque totalement sur la 3eme question, a savoir : Définir un prédicat qui sature la base de règles et produit une trace de son fonctionnement (on pourra s’inspirer du troisième moteur d’inférence présenté en cours).

    Je suppose que c'est la que je dois implémenter le chaînage avant,, pourriez vous m'indiquer la marche a suivre pour démarrer svp ?

    J'ai également une autre question maintenant que l'utilisateur peut initialiser la base de fait a travers le prédicats faits, comment faire pour savoir quel est la base de fait actuel avec laquel je travail ?

    par exemple si je fais assert(fleur). je considère que fleur est ajouté a ma base de faits mais comment je fais pour confirmer cela a travers prolog ?

  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
    Pour le chaînage avant, vous pouvez consulter ce pdf
    "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
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Merci, cela ma l'air intéressant !

    Pouvez vous également me dire comment consulter ma base de faits svp une fois que j'ai fait un assert ? et surtout comment accéder a ces faits ?

    J'ai probablement mal chercher mais je n'ai toujours pas trouvé réponse a cette question pour le moment

  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
    Il me semble que j'ai donné un exemple au post 8
    "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
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Ce n'est pas vraiment sa, enfaîte mon but serai de pouvoir créer un prédicat ( si ce dernier n'existe pas déjà de base ) qui afficherai les faits courant, par exemple si je fais : assert(A).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    true
    assert(B).
    true 
    affiche_fais. % prédicat pour consulter les faits 
    % afficherai : 
    A, B
    Je cherche également un moyen pour vider la base de faits car actuellement je suis obliger de fermer le logiciel et de le relancer afin de pouvoir tester mon code avec différents faits.

    Sinon j'avance plutôt bien, j'ai réussi a implémenter le chaînage avant et arriéré !

  15. #15
    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
    Ceci peut-être intéressant pour vous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    fleur(iris).
    fleur(rose).
    fleur(pensee).
     
    list_predicat(Pr) :-
        call(Pr,X),
        writeln(X),
        fail.
    Exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ?- list_predicat(fleur).
    iris
    rose
    pensee
    false.
    "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

  16. #16
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Merci , c'est en effet quelque chose comme ça que je cherche, je vais essayer d'exploiter votre code au mieux.

Discussions similaires

  1. Utilisation de la programmation logique
    Par Neuromancien2 dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 22/07/2010, 14h25
  2. Les langages de programmation logique
    Par hanou88 dans le forum Autres langages
    Réponses: 2
    Dernier message: 28/12/2009, 02h31
  3. Tendances et limites de la programmation logique
    Par mohamed98 dans le forum Prolog
    Réponses: 1
    Dernier message: 10/01/2009, 12h27

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