La factorisation d'équations booléennes !
Par David Julot le dimanche, 3 février 2008, 20:00 - La chronique de David Julot - Lien permanent
Si avec un titre pareil je ne vous fais pas fuir, c'est que vous êtes peut-être un peu masochiste ! Ce titre pompeux pour simplement faire une formule de politesse, en tenant compte de deux rubriques : civilité et titre.
Vous allez surtout apprendre à utiliser les fonctions ET (AND) et OU (OR). Alors, maintenant prenez une feuille de papier, et silence dans la classe...
Il est indispensable à tout développeur de connaître les opérateurs and (et), or (ou), xor (ou exclusif) et not (non) pour les formules de calculs et surtout dans le cadre de programmation conditionnelle (qui fait appel aux fonctions de condition).
Mais avant de voir les fonctions booléennes, il faut donc revoir les conditions.
Les conditions
L'art de bien utiliser les conditions est la clef de voûte de la programmation. Dans FileMaker Pro, les conditions se trouvent dans les cas suivants :
- Dans l'action de script
Si []; - Dans l'action de script
Sinon si []; - Dans l'action de script
Fin de boucle si []; - Dans les calculs conditionnels.
Dans les formules de calculs, pour effectuer une condition il existe deux instructions :
SI(
condition ;
résultat si vrai ;
résultat si faux
)
CAS(
condition 1 ; résultat si vrai ;
condition 2 ; résultat si vrai ;
...
résultat par défaut
)Dans tous les cas, une condition est une comparaison entre deux valeurs, par exemple :
A = B
A > 12
B ≠ "texte"ATTENTION ! À une condition, le système doit être capable de répondre par vrai ou par faux. À une condition, il y a toujours deux résultats possibles.
Avantage à utiliser l'instruction CAS
L'instruction CAS a l'avantage d'être plus lisible, ce qui évite des erreurs de formulation que l'on peut avoir lors d'imbrication de fonctions SI.
En effet, il suffit pour s'en convaincre de comparer les deux formulations suivantes :
SI(A=1;"v1";SI(A=2;"v2";SI(A=3;"v3";"v4")))
CAS(
A = 1 ; "v1" ;
A = 2 ; "v2" ;
A = 3 ; "v3" ;
"v4"
)Parmi vous, il y en aura bien un qui va me dire qu'il existe une fonction (CHOIX) qui fait ceci encore mieux ! Oui, mais j'ai pris cet exemple pour illustrer mon propos... Fin de l'aparté... 
Il est évident que si l’usage de l’instruction CAS est plus lisible que l’instruction SI, elle est aussi plus économe en parenthèses, principales sources de confusion dans l’usage de l’instruction SI, et elle est surtout plus rapide.
Les fonctions booléennes
Il est possible d'assembler plusieurs conditions dans une formule booléenne, du nom du mathématicien anglais du XIXe siècle : George Boole. Pour ce type d'assemblage, on doit utiliser les fonctions logiques suivantes :
- AND, et logique ;
- OR, ou logique ;
- XOR, ou logique exclusif ;
- NOT, non logique.
Et pour ceux qui ont fait de l'électronique, se souviendront des fonctions NAND, NOR, YES (pour le changement d'impédance, par exemple CMOS/TTL ), etc... Ha que de souvenirs... Fin du deuxième aparté 
Les tables de vérité des fonctions booléennes
À chaque fonction booléenne correspond une table de vérité. En effet, pour une des formulations suivantes :
condition 1 AND condition 2
condition 1 OR condition 2
condition 1 XOR condition 2
NOT condition 1La condition 1 peut être vraie ou fausse, idem pour la condition 2. Il faut donc savoir ce que donne comme résultat la fonction booléenne, et pour cela, se référer aux tables de vérités suivantes.
AND (ET)
condition 1 condition 2 résultat
faux faux faux
faux vrai faux
vrai faux faux
vrai vrai vrai
OR (OU)
condition 1 condition 2 résultat
faux faux faux
faux vrai vrai
vrai faux vrai
vrai vrai vraiXOR (OU EXCLUSIF)
condition 1 condition 2 résultat
faux faux faux
faux vrai vrai
vrai faux vrai
vrai vrai faux
NOT (NON)
condition 1 résultat
faux vrai
vrai faux
La priorité
Tout comme en arithmétique, entre les fonctions booléennes il existe des ordres de priorité. La fonction logique AND est prioritaire sur la fonction logique OR ou XOR. C'est-à-dire que les deux formulations suivantes sont égales :
A > 1 OR B = 2 AND C ≠ 123
A > 1 OR ( B = 2 AND C ≠ 123 )Pour s'en souvenir, il faut savoir qu'en algèbre de Boole on écrit un x en lieu et place de la fonction AND et un + en lieu et place de la fonction OR.
A > 1 OR B = 2 AND C ≠ 123
// si on remplace :
// A > 1 par a
// B = 2 par b
// C ≠ 123 par c
// alors on peut écrire :
a + b x c
// ce qui est bien égale à :
a + ( b x c )
// ce qui est bien différent de :
( a + b ) x c
La simplification par la mise en facteur
Une équation booléenne ( cond1 AND cond2 OR cond3 est une équation) peut se simplifier par la mise en facteur d'un élément commun. Prendre l'équation suivante :
cond1 AND cond2 OR cond1 AND cond3 OR cond4 AND cond2 OR cond4 AND cond3Elle peut donc s'écrire, après une première mise en facteur :
cond1 x ( cond2 + cond3 ) + cond4 x ( cond2 + cond3 )Qui peut à son tour s'écrire après une seconde mise en facteur :
( cond1 + cond4 ) x ( cond2 + cond3 )
// donc
( cond1 OR cond4 ) AND ( cond2 OR cond3 )
Je vais vous rappeler un très mauvais souvenir de collège : a x b + a x c = a x ( b + c ) ! 
Exemple d'une utilisation de fonctions booléennes
Pour illustrer l'usage des opérateurs booléens, on va créer une formule de calcul qui donnera une formule de politesse à appliquer suivant le contenu de deux rubriques :
- civilité, de type texte, pouvant contenir les valeurs suivantes :
M.,MmeetMle; - titre, de type texte, pouvant contenir les valeurs suivantes :
DretMe.
La formule de politesse devra retourner les résultats suivants les valeurs des deux rubriques Civilité et Titre :
Civilite Titre Formule de politesse
M. Cher Monsieur
M. Dr Cher confrère
M. Me Cher confrère
Mme Chère Madame
Mme Dr Chère consœur
Mme Me Chère consœur
Mle Chère Mademoiselle
Mle Dr Chère consœur
Mle Me Chère consœur
Chère Madame, Cher Monsieur
Pour connaître l'opérateur booléen à utiliser, il faut savoir que la réunion des conditions d'une même rangée utilisera la fonction AND, alors que la réunion des conditions de deux rangées (ou plus) utilisera la fonction OR.
Mais pour commencer, on peut écrire la formule suivante en prenant en compte chaque rang :
CAS(
Civilite = "M." AND Titre = "" ; "Cher Monsieur" ;
Civilite = "M." AND Titre = "Dr" ; "Cher confrère" ;
Civilite = "M." AND Titre = "Me" ; "Cher confrère" ;
Civilite = "Mme" AND Titre = "" ; "Chère Madame" ;
Civilite = "Mme" AND Titre = "Dr" ; "Chère consœur" ;
Civilite = "Mme" AND Titre = "Me" ; "Chère consœur" ;
Civilite = "Mle" AND Titre = "" ; "Chère Mademoiselle" ;
Civilite = "Mle" AND Titre = "Dr" ; "Chère consœur" ;
Civilite = "Mle" AND Titre = "Me" ; "Chère consœur" ;
"Chère Madame, Cher Monsieur"
)
La formule peut paraître un peu longue, mais elle est totalement opérationnelle.
Si maintenant on ne prend plus en compte chaque rang, mais seulement les différents résultats possibles, on n'a alors plus que cinq équations à écrire au lieu de neuf.
// cas n° 1 - "Cher Monsieur" :
Civilite = "M." AND Titre = ""
// cas n° 2 - "Cher confrère" :
Civilite = "M." AND Titre = "Dr" OR Civilite = "M." AND Titre = "Me"
// cas n° 3 - "Chère Madame" :
Civilite = "Mme" AND Titre = ""
// cas n° 4 - "Chère consœur" :
Civilite = "Mme" AND Titre = "Dr" OR Civilite = "Mme" AND Titre = "Me" OR
Civilite = "Mle" AND Titre = "Dr" OR Civilite = "Mle" AND Titre = "Me"
// cas n° 5 - "Chère Mademoiselle" :
Civilite = "Mle" AND Titre = ""On obtient donc la formule suivante, après mise en facteur :
CAS(
Civilite = "M." AND Titre = "" ; "Cher Monsieur" ;
Civilite = "M." AND ( Titre = "Dr" OR Titre = "Me" ) ; "Cher confrère" ;
Civilite = "Mme" AND Titre = "" ; "Chère Madame" ;
( Civilite = "Mme" OR Civilite = "Mle" ) AND
( Titre = "Dr" OR Titre = "Me" ) ; "Chère consœur" ;
Civilite = "Mle" AND Titre = "" ; "Chère Mademoiselle" ;
"Chère Madame, Cher Monsieur"
)
C'est tout pour aujourd'hui !
Si après tout ça vous n'avez pas mal à la tête, c'est que vous aimez les mathématiques.... Comme d'habitude, si vous avez des questions, des suggestions ou des corrections à apporter, n'hésitez pas à mettre un commentaire ci-après...
Bonne semaine à toutes et à tous.
Commentaires
Toujours intéressant de vous lire mon cher David.
Bon travail et merci !
Merci David pour cette leçon qui m'en apprend encore un peu plus sur FileMaker. J'attends vos "Reviews" chaque semaine avec la plus grande impatience. L'utilisation des XOR a toujours été un mystère pour moi...
Paul.
P. S. : je viens t'appliquer votre leçon sur les clés primaires sur mes trois banques et surtout, j'en ai fait profité à tous mes collègues de travail qui vous remercie en passant. Rendons à César ce qui est à César !
Bonsoir David,
Super la chronique, tu devrai en faire une par jour et non pas une par semaine.
Merci encore.
Bonjour et merci à tout le monde.
Pour répondre à Amar, faire une chronique hebdomadaire c'est déjà beaucoup de travail, alors en faire une par jour...
David
Rebonjour David,
J'en doute pas un seul instant que cela soit beaucoup de travail, c'était juste un peu d'humour à la "amar".
Merci encore.
Je n'en doutais pas, Amar...
Et ton humour est toujours le bienvenu !
Au plaisir de te voir à Nice ?