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 :

Prédicat qui permet à l'utilisateur d'initialiser la base de faits


Sujet :

Prolog

  1. #1
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut Prédicat qui permet à l'utilisateur d'initialiser la base de faits
    Bonjour,
    Je dois écrire un prédicat qui permet à l'utilisateur d'initialiser la base de faits.
    Je sais faire la base de fait mais comment permettre à l'utilisateur d'initialiser la base de faits.
    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
    Si j'ai bien compris ce que tu veux dire, tu fais un dialogue avec un repeat.
    Ce n'est pas testé mais c'est du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    :- dynamic fait/1.
    initialisation :-
      repeat
        write('Nouveau fait (0 pour arrêter) '),
        read(X),
        (X \= 0 -> assert(fait(X)), fail; true).
    Après test, il faut ajouter fail après l'assert.
    "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
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    ok merci donc ce n'est pas la peine que je declare les faits un par un.
    Et le X il correspond à quoi? j'ai pas compris les arguments de write

  4. #4
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    j'ai reussi a faire la base des règle en fait il fallait faire des assert(vrai(fait)) et assert(faux(fait) et faire un prédicat qui permet à l'utilisateur de mettre des faits

  5. #5
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    maintenan j'ai besoin d'aide pour faire le moteur d'inférence dont l'algo est le suivant:
    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
     
    ça marche
    tant que ça marche
         ça ne marche pas
         boucle sur les Ri 
            boucle sur les Fj non marqués
              si Ri est de la forme « Si Fj Alors Fk"
                  ajouter Fk à la BdF
                  marquer Fj 
                  ça marche
                  sinon
                       boucle sur les Fl 
                           si Ri est de la forme « Si Fj ^ Fl Alors … »
                              ajouter Fm = (Fj ^ Fl) à la BdF
                                  marquer Fj
                                  ça marche
                           finsi
                      finboucle
               finsi
          finboucle
       finboucle
    fintant
    Merci!

  6. #6
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    j'ai fait ces deux prédicats mais ça ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    boucle_sur_fi(Lmark,Baf,R):-not(member(X,Lmark)),repeat,(faits(X),R is "si X, alors Y" -> append(Y,Baf, [Y|Baf]), append(X,Lmark,[X|Lmark]),fail; R is "si (X,Y), alors T", faits(Y), faits(T),append([X,Y],Baf, [X,Y|Baf]), append(X,Lmark,[X|Lmark])).
     
    saturer:-repeat,regle(R),boucle_sur_fi([],[],R).

  7. #7
    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
    Euh, tu es sûr de cette ligne ??
    append(Y,Baf, [Y|Baf]),
    append permet de concaténer la liste L1 et La liste L2 pour obtenir la liste L3, par exemple append([1,2,4], [4,5,6], L) réussit et unifie L avec [1,2,3,4,5,6].

    not(member(X,Lmark)), cette clause en début du prédicat boucle_sur_fi(Lmark,Baf,R), avec X unifié avec rien du tout ne peut rien donner de bon.

    R is "si X, alors Y" ne passe pas en SWI-Prolog.

    Peux-tu donner quelques exemples pour regle et faits pour voir un peu ce que tu cherches à faire ?

    PS l'algo que tu veux coder est trop orienté impératif, boucle, il faut que tu l'adapte au récursif, le repeat à une sémantique particulière en Prolog et n'est pas vraiment adapté au genre de boucle que tu veux faire.

    Par exemple, pour le saturer, tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    saturer:-
    	regle(R),
    	boucle_sur_fi([],[],R),
    	fail.
    Ce qui fait que tu parcoureras toutes les occurences de regle(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

  8. #8
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    Voici ce que je cherche à faire
    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 de regle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    regle(r1):-si([fleur,graine]), alors([phanerogame]).
    regle(r2):-si([phanerogame,graine_nue]),alors([sapin, ombre]).
    regle(r3):-si([phanerogame,un_cotyledone]), alors([monocotyledone]).
    regle(r4):-si([phanerogame, deux_cotyledone]), alors([dicotyledone]).
    regle(r5):-si([monocotyledone, rhizome]), alors([muguet]).
    regle(r6):-si([dicotyledone]),	alors([anemone]).
     
    faits([]):-!.
    faits([X|L]):-vrai(X),faits(L).
    faits([X|L]):-faux(X),faits(L).

  9. #9
    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 ne serait pas çà par hasard ton travail ?
    "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

  10. #10
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    c'est ça mais je l'ai réussi je pense.

  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
    Tant mieux, n'oublie pas le clic sur
    "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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/05/2012, 17h12
  2. Code qui permet à l'utilisateur de cliquer sur un bouton une seule fois
    Par FLORE2222 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 18/03/2012, 10h31
  3. fonction qui permet de connaître l'utilisateur courant
    Par new_wave dans le forum Développement
    Réponses: 5
    Dernier message: 18/04/2008, 15h37
  4. Réponses: 1
    Dernier message: 11/02/2008, 17h03
  5. cherche une fonction qui permet de faire une recherche
    Par vbcasimir dans le forum Langage
    Réponses: 7
    Dernier message: 01/09/2005, 17h24

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