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 :

Automate pour l'analyse Syntaxique


Sujet :

Prolog

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut Automate pour l'analyse Syntaxique
    Bonjour,
    j'ai arrivé a tracer un automate qui reconnait les chaines de caracteres de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pourquoi PERSONNE1 est le fils (de|du){fils|pere|frere....} PERSONNE2
    http://www.facebook.com/album.php?id...&id=1115590624

    mon automate est un peu similaire a celui-ci
    le code prolog que j'ai ecrit:
    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
    etat1([pourquoi|L]):-etat2(L).
    etat2([X|L]):-etat3(L).
    etat3([est|L]):-etat4(L).
    etat4([le|L]):-etat5(L).
    etat4([l|L]):-etat6(L).
    etat4([la|L]):-etat10(L).
    etat5([P|L]):-element(P,[pere,fils,frere,cousin,grand_pere,petit_fils]),etat7(L).
    etat6([P|L]):-element(P,[ancle,ancetre]),etat7(L).
    etat7([de|L]):-etat8(L).
    etat7([du|L]):-etat5(L).
    etat8([P|L]):-homme(P) or femmme(P),etat9(L).
    etat8([l|L]):-etat6(L).
    etat8([la|L]):-etat10(L).
    etat9([]).
    etat10([P|L]):-element(P,[soeur,mere,fille,cousine,grand_mere,petite_fille]),etat7(L).
    ces regles sont basées sur une base de connaissances généalogique:
    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
     
    # fait
    #Homme
    homme(mohamed).
    homme(said).
    homme(taher).
    homme(ismail).
    homme(ramzi).
    homme(hamza).
    homme(nadir).
    homme(hussein).
    homme(raouf).
    homme(yasser).
    /* les femmes */
    femme(lamia).
    femme(karima).
    femme(amina).
    femme(soumia).
    femme(souad).
    femme(assia).
    femme(malak).
    femme(zeineb).
    femme(zouhel).
     
    #les relations de parenté
     
    enfant(said,mohamed).
    enfant(said,lamia).
    enfant(taher,mohamed).
    enfant(taher,lamia).
    enfant(amina,mohamed).
    enfant(amina,lamia).
    enfant(ismail,said).
    enfant(ismail,karima).
    enfant(souad,taher).
    enfant(assia,amina).
    enfant(assia,nadir).
    enfant(hussein,amina).
    enfant(hussein,nadir).
    enfant(ramzi,ismail).
    enfant(ramzi,soumia).
    enfant(hamza,ismail).
    enfant(hamza,soumia).
    enfant(zeineb,ismail).
    enfant(zeineb,soumia).
    enfant(raouf,hussein).
    enfant(raouf,malak).
    enfant(yasser,hussein).
    enfant(yasser,malak).
    enfant(zouhel,hussein).
    enfant(zouhel,malak).
     
    parent(Y,X) :- enfant(X,Y).
     
    pere(X,Y) :- parent(X,Y),homme(X).
    mere(X,Y) :- parent(X,Y),femme(X).
     
    fils(X,Y) :- enfant(X,Y),homme(X).
    fille(X,Y) :- enfant(X,Y),femme(X).
     
    grand_parent(X,Y) :- parent(X,Z),parent(Z,Y).
    grand_pere(X,Y) :- grand_parent(X,Y),homme(X).
    grand_mere(X,Y) :- grand_parent(X,Y),femme(X).
     
    petit_enfant(X,Y) :- grand_parent(Y,X).
    petit_fils(X,Y) :-  petit_enfant(X,Y),homme(X).
    petite_fille(X,Y) :-  petit_enfant(X,Y),femme(X).
     
    frere_ou_soeur(X,Y) :- pere(P,X),pere(P,Y),mere(M,X),mere(M,Y),X\==Y.
    frere(X,Y) :- frere_ou_soeur(X,Y),homme(X).
    soeur(X,Y) :- frere_ou_soeur(X,Y),femme(X).
     
    oncle_ou_tante(X,Y) :- parent(Z,Y),frere_ou_soeur(X,Z).
    oncle(X,Y) :- oncle_ou_tante(X,Y),homme(X).
    tante(X,Y) :- oncle_ou_tante(X,Y),femme(X).
     
    cousin_ou_cousine(X,Y) :- oncle_ou_tante(Z,X),enfant(Y,Z).
    cousin(X,Y) :- cousin_ou_cousine(X,Y),homme(X).
    cousine(X,Y) :- cousin_ou_cousine(X,Y),femme(X).
    quand j'execute une requete,par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    etat1([pourquoi,said,est,le,fils,de,mohamed]).
    qui devrai m'afficher soit true soit false,
    le swi m'affiche le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Correct to: "etat10([pourquoi, said, est, le, fils, de, mohamed])"?
    aider moi svp!
    Fichiers attachés Fichiers attachés
    • Type de fichier : pl BC1.pl (2,4 Ko, 84 affichages)

  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
    J'ai testé le code, avec les corrections pour l'adapter à SWI-Prolog, il fonctionne bien :
    3 ?- etat1([pourquoi,said,est,le,fils,de,mohamed]).
    true ;
    maintenant, on peut se poser la question : quel est le sens de true à la question "Pourquoi said est le fils de mohamed ?" !
    "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 membre du Club
    Inscrit en
    Novembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Quelles sont les corrections que vous avez faites,et quelle version de SWI-PROLOG vous utilisez?
    j'utilse "SWI-Prolog version 5.8.3 by Jan Wielemaker (jan@swi-prolog.org)",
    sinon veuillez me decrire comment vous arriviez a l'executer,car je suis un debutant en prolog.
    merci d'avance

  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
    La version que j'utilise est la 5.9.4
    J'ai remplacé les # par des % pour les commentaires

    J'ai remplacé les "element" par "member" et je crois que tout fonctionne (je ne suis pas sur le poste où j'ai testé le code) !
    "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 membre du Club
    Inscrit en
    Novembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut la sémantique de l'automate
    au fait,La semantique de
    1. true:chaine valide de type de la grammaire citée avant
    2. false:chaine non valide(n'a pas de chemin depuis l'entrée jusqu'a la sortie de l'automate).

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut OUPS
    pourriez vous m'envoyer le code que vous avez corrigé??meme avec les modificatiions que vous venez de me citer,par la requete que j'ai fournie,le swi m'affiche false

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Points : 42
    Points
    42
    Par défaut
    Je utilise GNU Prolog pour tester.
    Le commentaire qui commence par # doit être remplace par %, ou mette /**/

    et puis, je trouve une erreur sur expression "or"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    compiling /chemin/bc.pl for byte code...
    /chemin/bc.pl:92:28: syntax error: . or operator expected after expression
    	1 error(s)
    compilation failed
    Je ne sais pas SWI-Prolog est definie cette expression?

  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
    Le code corrigé pour SWI-Prolog :
    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
    %Analyse Syntaxique
    etat1([pourquoi|L]):-etat2(L).
    etat2([X|L]):-etat3(L).
    etat3([est|L]):-etat4(L).
    etat4([le|L]):-etat5(L).
    etat4([l|L]):-etat6(L).
    etat4([la|L]):-etat10(L).
    etat5([P|L]):-
      member(P,[pere,fils,frere,cousin,grand_pere,petit_fils]),etat7(L).
    etat6([P|L]):-member(P,[ancle,ancetre]),etat7(L).
    etat7([de|L]):-etat8(L).
    etat7([du|L]):-etat5(L).
    etat8([P|L]):-
      (homme(P) ; femme(P)),etat9(L).
    etat8([l|L]):-etat6(L).
    etat8([la|L]):-etat10(L).
    etat9([]).
    etat10([P|L]):-
      member(P,[soeur,mere,fille,cousine,grand_mere,petite_fille]),etat7(L).
    "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 membre du Club
    Inscrit en
    Novembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut Merci beaucoup!
    merci beaucoup Mr.Trap D
    alors je n'ai commis que des erreurs de syntaxe dans mon premier programme prolog !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] [DEB] Analyse syntaxique pour macro (court)
    Par torquemada dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/09/2014, 13h14
  2. Forum pour analyse syntaxique
    Par Raikyn dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 1
    Dernier message: 06/05/2014, 13h36
  3. plugins pour analyse syntaxique sur vim ou xemacs
    Par gfranck dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 15/08/2009, 21h33
  4. Aide pour l'analyse d'un problème de gestion de temps
    Par PAINCO dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 03/06/2005, 15h49
  5. Réponses: 6
    Dernier message: 07/03/2005, 13h45

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