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 :

Normalisation d'une expression booléenne


Sujet :

Prolog

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Par défaut Normalisation d'une expression booléenne
    Il s'agit de transformer des expressions booléennes quelconques pour obtenir des expressions booléennes équivalentes mises sous forme normale disjonctive : sans constante, avec des noeuds 'non' appliqués à des feuilles seulement, et ne possédant pas de 'ou' dans les sous-arbres de racine 'et'. Exemple : non(et(ou(a,faux),b)) se transforme en ou(non(a),non(b)).

    Voila ce que j'ai fai mais ca marche pa et je sai pa c ou le probleme:
    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
     
    normaliser(a,p):-distribuerT(a,r),peigner(r,p);
     
    distribuerT(ou(a,b),ou(m,n)):-distribuerT(a,m),distribuerT(b,n);
    distribuerT(et(a,b),r):-distribuerT(a,m),distribuerT(b,n),distribuer1(et(m,n),r);
    distribuerT(non(a),r):-distribuerT(a,m),distribuerNon(non(m),r);
    distribuerT(a,a):-terminal(a);
     
    distribuer1(et(ou(a,b),c),ou(mn)):-distribuer1(et(a,c),m),distribuer1(et(b,c),n);
    distribuer1(et(a,ou(b,c)),ou(m,n)):-distribuer1(et(a,b),m),distribuer1(et(a,c),n);
    distribuer1(et(a,b),et(a,b)):-acheveEt(a),acheveEt(b);
     
    distribuerNon(non(ou(a,b)),r):-distribuerNon(non(a),m),distribuerNon(non(a),m),distribuerNon(non(b),n),distribuerT(et(m,n),r);
    distribuerNon(non(et(a,b),r):-distribuerNon(non(a),m),distribuerNon(non(a),m),distribuerNon(non(b),n),distribuerT(ou(m,n),r);
    distribuerNon(non(non(non(a)),r):-distribuerT(a,r);
    distribuerNon(non(a),non(a)):-terminal(a);
     
    peigner(ou(ou(a,b),c),r):-peigner(ou(a,ou(b,c)),r);
    peigner(ou(a,b),ou(m,n)):-feuille(a,o),peigner(a,m),peigner(b,n);
    peigner(non(a),non(a));
    peigner(a,a):-terminal(a);
     
    peigner(et(et(a,b),c),r):-peigner(et(a,et(b,c)),r);
    peigner(et(a,b),et(m,n)):-feuille(a,o),peigner(a,m),peigner(b,n);
    peigner(non(a),non(a));
    peigner(a,a):-terminal(a);
     
    acheveEt(et(a,b)):-acheveEt(a),acheveEt(b);
    acheveEt(non(a)):-terminal(a);
    acheveEt(a):-terminal(a);
     
    feuille(et(a,b),ou);
    feuille(non(a),ou);
    feuille(a,ou):-terminal(a);
     
    feuille(non(a),et):-terminal(a);
    feuille(a,et):-terminal(a);
    terminal(a):-ident(a);


    je suis debutant , alors merci d'avance pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 38
    Par défaut
    Déjà, les variables en Prolog s'écrivent toujours en majuscules. Donc par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    normaliser(a,p):-distribuerT(a,r),peigner(r,p);
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    normaliser(A,P):-distribuerT(A,R),peigner(R,P);
    Les minuscules, ça sert pour les atomes.

    Pour le reste, je n'ai pas eu le temps de regarder, mais essaie déjà d'écrire les variables correctement, ça peut aider...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Par défaut
    Ok , j'ai change mais ca marche tj pas :
    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
    normaliser(A,P):-distribuerT(A,R),peigner(R,P);
     
    distribuerT(ou(a,b),ou(m,n)):-distribuerT(a,m),distribuerT(b,n);
    distribuerT(et(a,b),r):-distribuerT(a,m),distribuerT(b,n),distribuer1(et(m,n),r);
    distribuerT(non(a),r):-distribuerT(a,m),distribuerNon(non(m),r);
    distribuerT(a,a):-a;
     
    distribuer1(et(ou(a,b),c),ou(mn)):-distribuer1(et(a,c),m),distribuer1(et(b,c),n);
    distribuer1(et(a,ou(b,c)),ou(m,n)):-distribuer1(et(a,b),m),distribuer1(et(a,c),n);
    distribuer1(et(a,b),et(a,b)):-acheveEt(a),acheveEt(b);
     
    distribuerNon(non(ou(a,b)),r):-distribuerNon(non(a),m),distribuerNon(non(a),m),distribuerNon(non(b),n),distribuerT(et(m,n),r);
    distribuerNon(non(et(a,b),r):-distribuerNon(non(a),m),distribuerNon(non(a),m),distribuerNon(non(b),n),distribuerT(ou(m,n),r);
    distribuerNon(non(non(non(a)),r):-distribuerT(a,r);
    distribuerNon(non(a),non(a)):-a;
     
    peigner(ou(ou(a,b),c),r):-peigner(ou(a,ou(b,c)),r);
    peigner(ou(a,b),ou(m,n)):-feuille(a,o),peigner(a,m),peigner(b,n);
    peigner(non(a),non(a));
    peigner(a,a):-a;
     
    peigner(et(et(a,b),c),r):-peigner(et(a,et(b,c)),r);
    peigner(et(a,b),et(m,n)):-feuille(a,o),peigner(a,m),peigner(b,n);
    peigner(non(a),non(a));
    peigner(a,a):-a;
     
    acheveEt(et(a,b)):-acheveEt(a),acheveEt(b);
    acheveEt(non(a)):-a;
    acheveEt(a):-a;
     
    feuille(et(a,b),ou);
    feuille(non(a),ou);
    feuille(a,ou):-a;

  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
    Par défaut
    Un début serait que tu commentes ton code, ce faisant, tu trouveras peut-être toi-même tes erreurs, et ensuite celà nous permettra de voir plus clair dans ce que tu veux faire.
    "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
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par Trap D Voir le message
    ...et ensuite celà nous permettra de voir plus clair dans ce que tu veux faire.
    Ce qu'il veut faire, c'est mettre sous cette forme:
    Forme Normale Disjonctive (resp. Conjonctive).

    En fait, il s'agit de traduire un certain nombre de règles du genre:
    - a OU faux = a
    - a OU vrai = vrai
    - (a OU b) ET c = (a ET c) OU (b ET c)
    - NON(a ET b) = NON(a) OU NON(b) [loi de De Morgan]
    - ...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  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
    Par défaut
    Oui, ça d'accord.
    Ce qui m'intéressait, c'était ce qu'il mettait derrière ses différentes appellations "distribuer, peigner" pour voir si elles correspondent bien à ce qu'il désire obtenir.
    "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

Discussions similaires

  1. [OS X] [Bash 3] Question de débutant pour l'évaluation d'une expression booléenne
    Par flamant dans le forum Shell et commandes POSIX
    Réponses: 5
    Dernier message: 08/11/2013, 10h52
  2. convertir une chaine de caractère en expression booléenne
    Par marion5515 dans le forum Débuter
    Réponses: 9
    Dernier message: 10/03/2011, 09h49
  3. Valeur d'une expression booléenne
    Par kha_yassine dans le forum Général Java
    Réponses: 3
    Dernier message: 19/02/2009, 13h24
  4. Réponses: 13
    Dernier message: 08/05/2007, 09h22
  5. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 17h06

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