Infoforall

LES TESTS LOGIQUES : explications

Partie A : Les bases importantes

Partie B : Quelques compléments parfois utiles

Opérateur bit à bit : Cette fiche ne traite pas des opérateurs ET, OU ... sur les mots numériques. On ne traite ici que le cas des entrées booléennes qui ne contiennent donc qu'un seul bit. Allez voir la fiche dédié aux opérateurs bit à bit si c'est cela qui vous intéresse.

Les tests logiques vont partie des bases de toute programmation.

Il s'agit de répondre à une certaines quantités d'informations d'entrée par une réponse binaire : VRAI (1) ou FAUX (0).

Les entrées sont également des booléens : ils n'ont également accés qu'à deux valeurs VRAI (1) ou FAUX (0).

Comme VRAI et FAUX sont des états, je ne noterai pas VRAIE ou VRAIES ici. L'état est juste "VRAI" ou "FAUX". On pourrait noter aussi "HAUT" ou "BAS", ou encore "1" ou "0".

Les tests communs à tous les langages sont :

Opérateur Synthaxe Python Synthaxe Javascript Synthaxe C++ Synthaxe Java
a ET b a and b a && b a && b 2 versions différentes : a & b mais également a && b
a OU b a or b a || b a || b 2 versions différentes : a | b mais également a || b
NON a not a !a !a !a

Regardons de plus près ce que ces tests impliquent.

Remarque : on voit que Python utilise une codification plus 'humaine'. En réalité, on utilise également & et | avec Python, mais il s'agit alors de faire des tests de comparaison sur les bits des données.

Remarque 2 : Attention, si a et b ne sont pas des booléens mais des nombres ou des chaînes de caractères, vos tests auront des comportements plutôt étranges en fonction des langages utilisés. Soyez vigilant. Néanmoins, tous comportent des méthodes pour convertir les variables en booléens. Il suffit de vous renseigner.

Exemple avec Python et la fonction bool() qui renvoie un booléen issu de l'argument entre parenthèse :

>>> a = ""

>>> b = "bonjour"

>>> bool(a)

False

>>> bool(b)

True

a b s a s ET & OU ≥1 & ≥1 =1 1

1 - ET - AND

Premier type d'opérateur logique de l'algèbre de Boole : le ET logique entre deux entrées a et b.

Les variables a et b ne peuvent prendre comme valeur que VRAI (1) ou FAUX (0).

La question est de se demander quand la sortie s sera à l'état VRAI (1) ou FAUX (0).

Pour information : Symbole dans un schéma logique

On symbolise le ET comme une porte logique, une boîte comportant deux entrées a et b et une sortie s.

Le symbole est simple : la norme impose de noter & à l'intérieur de la boîte. On trouve parfois des versions avec un simple ET ou un AND.

On trouve également le symbole suivant qui correspond à la norme ANSI américaine :

Porte ET Ansi

Image dans le domaine public par jjbeard, récupérée sur Wikipedia

Table de vérité :

Voici la table de vérité du ET avec un code de sortie de type a ET b :

Valeur de a Valeur de b a ET b
VRAI VRAI VRAI
FAUX VRAI FAUX
VRAI FAUX FAUX
FAUX FAUX FAUX

Dans quel cas utiliser un ET ?

On peut utiliser un ET dès qu'on veut réagir à l'activation à l'état VRAI de toutes les entrées.

On peut prendre en exemple le cas d'un test d'identification. Pour lancer le test d'identification, il faut :

  • Test a : que l'identifiant x corresponde à un identifiant connu, ET
  • Test b : que le mot de passe y corresponde à l'identifiant x
Identifiant connu ? MdP correct ? Laisser passer
VRAI VRAI VRAI
FAUX VRAI ? Etrange... FAUX
VRAI FAUX FAUX
FAUX FAUX FAUX

On constatera d'ailleurs que certaines associations ne sont pas possibles : normalement, on ne peut pas avoir un FAUX sur l'identifiant et un VRAI sur le mot de passe. Néanmoins, même si cela arrivait, le résultat du test serait FAUX. C'est rassurant.

Equation mathématique :

Mathématiquement, cela revient à écrire une multiplication pour trouver la valeur de s : s = a . b.

Attention, ici a,b et s ne peuvent valoir que 0 ou 1.

Valeur de a Valeur de b Valeur de s a . b
1 1 1 1 x 1 donne 1
0 1 0 0 x 1 donne 0
1 0 0 1 x 0 donne 0
0 0 0 0 x 0 donne 0

Cas des 3 entrées : Table de vérité et équation mathématique :

Si on dispose de trois entrées a b c, on obtient alors un code de type (a ET b ET c) :

Valeur de a Valeur de b Valeur de c a ET b ET c
VRAI VRAI VRAI VRAI
FAUX VRAI VRAI FAUX
VRAI FAUX VRAI FAUX
VRAI VRAI FAUX FAUX
VRAI FAUX FAUX FAUX
FAUX VRAI FAUX FAUX
FAUX FAUX VRAI FAUX
FAUX FAUX FAUX FAUX

Visuellement, c'est clair : la réponse est VRAI uniquement si toutes les entrées sont VRAI.

Mathématiquement, cela donne : s = a . b . c

Associativité

On notera qu'on peut vérifier facilement la propriété d'associativité du ET : on peut calculer s = a . b . c

  • En commençant par a ET b : ( a . b ) . ( c )
  • a b a . b c a . b . c
  • En commençant par b ET c : ( a ) . ( b . c )
  • b c b . c a a . b . c

Commutativité

On notera d'ailleurs qu'on peut vérifier facilement la commutativité du ET.

Il s'agit de la propriété qui précise que a ET b est identique à b ET a.

a b a . b b a b . a

Mathématiquement, cela donne s = a . b = b . a

Un cas pratique avec un programme Python qui doit vérifier qu'une note est bien supérieure ou égale à 0 ET inférieure ou égale à 20 :

>>> note = 14

>>> a = note >= 0

>>> b = note <= 20

>>> print (a and b)

True

>>> print(b and a)

True

D'ailleurs, ce n'est pas totalement vrai en fonction des langages. PYTHON et JAVA, par exemple, n'évaluent pas le b si la valeur de a suffit pour connaitre la réponse.

Ainsi, dans a.b, si a est FAUX, ce n'est pas la peine d'évaluer b : la réponse est FAUX.

De même, dans a+b si a est VRAI, ce n'est pas la peine d'évaluer b : la réponspe est VRAI.

2 - OU - OR

Deuxième opérateur logique de l'algèbre de Boole : le OU logique entre deux entrées a et b.

Symbole dans un schéma logique :

La norme impose de noter ≥1 à l'intérieur de la boîte. On trouve des versions avec juste OU ou OR. L'explication du ≥1 est donnée plus bas.

On trouve également le symbole suivant qui correspond à la norme ANSI américaine ::

Porte OU Ansi

Image dans le domaine public par jjbeard, récupérée sur Wikipedia

Table de vérité :

Voici la table de vérité du OU avec un code de sortie de type a OU b :

Valeur de a Valeur de b a OU b
VRAI VRAI VRAI
FAUX VRAI VRAI
VRAI FAUX VRAI
FAUX FAUX FAUX

Dans quel cas utiliser un OU ?

On peut utiliser un OU dès qu'on veut réagir à l'activation de l'état VRAI d'une des entrées au moins.

On peut prendre en exemple le cas d'un programme de gestion d'images en transparence qui sait gérer les couches alpha des images .png et .gif. On lit une à une les images d'un dossier et on applique la gestion d'une transparence à 25% si :

  • Test a : le fichier possède une extension .png
  • Test b : le fichier possède une extension .gif
Extension png ? Extension de gif ? Ajouter transparence ?
VRAI VRAI aussi ? Etrange... VRAI
FAUX VRAI VRAI
VRAI FAUX VRAI
FAUX FAUX FAUX

Encore une fois, certains tests ne sont pas possibles normalement : on ne devrait pas pouvoir avoir VRAI pour le png et VRAI pour le gif. Ici, c'est plus embêtant : si cela arrive, c'est que nous avons un problème de test manifestement. Or, le test de sortie est bien VRAI. Comme quoi, le OU n'est peut-être pas la bonne fonction à utiliser ici. Nous verrons d'autres fonctions de type OU un peu plus loin.

Equation mathématique :

Mathématiquement, cela revient à écrire : s = a + b.

Ici, a,b et s sont des booléens : ils sont égaux à 0 ou 1.

Pourtant, si a vaut 1 et b vaut 1, alors a+b vaut 2 non ?

Non : a + b vaut "2" donc s n'est pas égal à 0 : s est donc VRAI ou égal à 1. D'où le symbole ≥1.

Retenez qu'un booléen ne vaut FAUX que s'il vaut 0. Sinon, il est VRAI car il est différent de 0.

Valeur de a Valeur de b Valeur de s a + b
1 1 1 1 + 1 donne 1
0 1 1 0 + 1 donne 1
1 0 1 1 + 0 donne 1
0 0 0 0 + 0 donne 0

Cas des 3 entrées : Table de vérité et équation mathématique :

Si on dispose de trois entrées a b c, on obtient alors un code de type a OU b OU c :

Valeur de a Valeur de b Valeur de c a OU b OU c
VRAI VRAI VRAI VRAI
FAUX VRAI VRAI VRAI
VRAI FAUX VRAI VRAI
VRAI VRAI FAUX VRAI
VRAI FAUX FAUX VRAI
FAUX VRAI FAUX VRAI
FAUX FAUX VRAI VRAI
FAUX FAUX FAUX FAUX

Visuellement, c'est clair : la réponse est VRAI si au moins une entrée est VRAI.

Mathématiquement, cela revient à s = a + b + c.

Associativité

On notera qu'on peut vérifier facilement la propriété d'associativité du OU : on peut calculer s = a + b + c

  • En commençant par a OU b : ( a + b ) + ( c )
  • a b a + b c a + b + c
  • En commençant par b OU c : ( a ) + ( b + c )
  • b c b + c a a + b + c

Commutativité

On notera d'ailleurs qu'on peut vérifier facilement la commutativité du OU.

Il s'agit de la propriété qui précise que a OU b est identique à b OU a.

a b a + b b a b + a

Mathématiquement, cela donne s = a + b = b + a

3 - OUI - YES

Troisième type de test logique : le OUI logique.

Symbole dans un schéma logique :

On note 1 à l'intérieur de la boîte qui ne possède qu'une entrée unique a.

Dans quel cas utiliser un OUI ?

En réalité, on l'utilise sans s'en rendre compte. Quand vous testez une variable booléenne a, vous utilisez en quelque sorte un OUI(a). Je présente le OUI surtout pour vous montrez ensuite le NON.

Avec Python, on peut en quelque sorte obtenir un OUI en utilisant la fonction bool() de l'introduction.

Table de vérité :

Voici la table de vérité du OUI.

Valeur de a s = a
VRAI VRAI
FAUX FAUX

Equation mathématique :

Mathématiquement, cela revient à écrire : s = a.

a et s sont des booléens : ils sont égaux à 0 ou 1.

Valeur de a Valeur de s a
1 1 1 donne 1
0 0 0 donne 0

4 - NON - NOT

Quatrième type d'opérateur logique : le NON logique.

Symbole dans un schéma logique :

Le symbole est simple : on note (comme pour le OUI) 1 à l'intérieur de la boîte qui ne possède qu'une entrée unique a. Pour indiquer qu'on inverse la sortie par rapport au OUI, on rajoute un rond ou une barre oblique sur la sortie.

On trouve également le symbole suivant qui correspond à la norme ANSI américaine ::

Porte NON Ansi

Image dans le domaine public par jjbeard, récupérée sur Wikipedia

Dans quel cas utiliser un NON ?

Lorsqu'il s'agit d'inverser l'information : le VRAI devient FAUX et le FAUX devient VRAI. On appelle cela également complémenter.

Imaginons que vous ayez un capteur de présence. Il renvoie a contenant VRAI si quelqu'un est dans la pièce et a contenant FAUX s'il n'y a personne.

Si vous avez besoin a un seul endroit de tester l'absence de personne dans la salle, vous pourriez tester a == FAUX par exemple : cela va renvoyer VRAI si a est bien FAUX.

Mais on pourrait également tester NOT(a) qui aura le même effet : il complémente a. Si a est FAUX, on renvoie donc VRAI.

Table de vérité :

Voici la table de vérité du NON avec un code qui se représente mathématiquement par s = a

A quoi correspond la barre supérieure ? Elle indique qu'il faut inverser ( ou complémenter ) l'opérateur a.

On dit d'ailleurs que a est le complément de a.

Valeur de a s = a
VRAI FAUX
FAUX VRAI

Equation mathématique :

Mathématiquement, cela revient à écrire : s = a.

Ici, a et s sont des booléens : ils sont égaux à 0 ou 1.

Valeur de a Valeur de s a
1 0 1 donne 0
0 1 0 donne 1

Suivant la façon dont une documentation est réalisée, il est parfois difficile de placer le trait supérieur. On trouve donc d'autres manières d'indiquer la complémentarité.

La complémentarité de a peut donc se noter a ou a/ ou encore ¬a

D'ailleurs, sachez que ce dernier caractère ¬ possède une valeur UNICODE 172 (en base 10). On peut donc l'afficher en HTML en utilisant &#172; mais il possède également un code raccourci : &not;. Vous voyez le rapprochement ?

Comme le NON est un OUI complémenté.

On peut faire pareil avec le ET : c'est le NON-ET ou NAND.

On peut faire pareil avec le OU. c'est le NON-OU ou NOR.

5 - NON-ET ou NAND

La plupart des langages ne possèdent pas d'instructions NON-ET ou NAND. Initialement, cette fonction provient des fonctions logiques électroniques où il existe des puces permettant de cabler des NAND.

Je vais donc présenter le NAND et son intéret mais nous allons voir comment le réaliser à partir des fonctions AND et OR qu'on trouve dans tous les langages. Contrairement à un composant physique qu'on ne peut pas utiliser s'il n'existe pas, nous allons voir comment générer un test NON-ET à partir des tests basiques ET-OU-NON.

En électronique, il s'agit par contre d'une fonction fondamentale car plusieurs NAND permettent de générer n'importe quelle autre fonction.

Pour information : Symbole dans un schéma logique

On symbolise le NON-ET comme une porte logique ET en rajoutant le cercle symbolisant qu'on complémente (inverse) à l'état de sortie.

On trouve également le symbole suivant qui correspond à la norme ANSI américaine :

Porte NON-ET Ansi

Image dans le domaine public par jjbeard, récupérée sur Wikipedia

Table de vérité :

Voici la table de vérité du NON-ET dont la sortie vaut a ET b :

Valeur de a Valeur de b a ET b a ET b
VRAI VRAI VRAI FAUX
FAUX VRAI FAUX VRAI
VRAI FAUX FAUX VRAI
FAUX FAUX FAUX VRAI

Dans quel cas utiliser un NON-ET (NAND) ?

On peut utiliser un NAND dès qu'on veut réagir à l'activation de l'état FAUX d'une des entrées au moins.

C'est assez courant sur les systèmes de maintenance par exemple. Vous avez deux systèmes a et b de détection de problème : ils sont à FAUX si il n'y a pas de problème et VRAI s'ils détectent un problème.

Au premier problème détecté (a passe à VRAI ou b passe à VRAI), il faut informer l'utilisateur. Cela se fait très bien avec un OU. Ainsi si l'alarme a ou l'alarme b est VRAI, on obtient VRAI.

Par contre, il n'est pas toujours nécessaire de lancer l'arrêt du système si uniquement un problème a été détecté.

L'état du système est commandé par un booléen. Avec VRAI, on le laisse en marche. Avec FAUX, on le stoppe.

Ainsi, l'état du système peut être commandé par a NAND b : si vous regardez la table de vérité, vous pouvez voir que le système reste actif (état VRAI) sauf si deux défauts VRAI sont détectés.

Problème a détecté ? Problème b détecté ? a ET b Arrêt du système ? : a ET b
VRAI VRAI VRAI FAUX
FAUX VRAI FAUX VRAI
VRAI FAUX FAUX VRAI
FAUX FAUX FAUX VRAI

Equation mathématique :

Mathématiquement, cela revient à complémenter le ET : s = a . b.

Attention, ici a,b et s ne peuvent valoir que 0 ou 1.

Valeur de a Valeur de b Valeur de a.b a . b
1 1 1 x 1 donne 1 0
0 1 0 x 1 donne 0 1
1 0 1 x 0 donne 0 1
0 0 0 x 0 donne 0 1

Le NAND avec un langage de programmation :

La première solution est de simplement reprendre le code : on fait un ET et on le complémente.

En Python par exemple :

s = not (a and b)

a . b a b a . b

Il existe une autre solution qu'on peut trouver en utilisant les lois de De Morgan.

Pour faire simple : lorsqu'on complémente l'opération (a ET b), on peut obtenir le même résultat en utilisant un OU sur les états complémentés de a et b.

En équation, ca donne : a . b = a + b

On voit que la multiplication (du ET) devient une addition (du OU).

En Python par exemple :

s = not (a and b)

# On peut obtenir le même test en remplacant le and par un or si on complémente les variables

s = not a or not b

# On peut rajouter les parenthèses si on veut

s = (not a) or (not b)

a + b   =   a . b a a b b

6 - NON-OU ou NOR

Tout comme le NAND, le NOR n'existe pas directement dans la plupart des langages. Par contre, ce type de fonction est régulièrement nécessaire. Il suffit de la construire en utilisant les fonctions basiques ET-OU-NON.

Pour information : Symbole dans un schéma logique

On symbolise le NON-OU comme une porte logique OU en rajoutant le cercle symbolisant qu'on complémente (inverse) à l'état de sortie.

On trouve également le symbole suivant qui correspond à la norme ANSI américaine :

Porte NON-ET Ansi

Image dans le domaine public par jjbeard, récupérée sur Wikipedia

Table de vérité :

Voici la table de vérité du NON-OU dont la sortie vaut a OU b :

Valeur de a Valeur de b a OU b a OU b
VRAI VRAI VRAI FAUX
FAUX VRAI VRAI FAUX
VRAI FAUX VRAI FAUX
FAUX FAUX FAUX VRAI

Dans quel cas utiliser un NON-OU (NOR) ?

On peut utiliser un NOR dès qu'on veut réagir à l'activation à l'état FAUX de toutes les entrées.

Nous pourrions utiliser le cas d'une chambre de décontamination. Elle possède deux portes. On possède un booléen par porte qui teste si la porte est ouverte : VRAI si elle est ouverte, FAUX si elle est fermée.

On ne doit lancer la phase de décontamination que si les deux portes sont bien fermées (état FAUX des entrées).

Porte a ouverte ? Porte b ouverte ? a OU b Process possible ?a OU b
VRAI VRAI VRAI FAUX
FAUX VRAI VRAI FAUX
VRAI FAUX VRAI FAUX
FAUX FAUX FAUX VRAI

Equation mathématique :

Mathématiquement, cela revient à complémenter le OU : s = a + b.

Valeur de a Valeur de b Valeur de a + b a + b
1 1 1 + 1 donne 1 0
0 1 0 + 1 donne 1 0
1 0 1 + 0 donne 1 0
0 0 0 + 0 donne 0 1

Le NOR avec un langage de programmation :

La première solution est de simplement reprendre le code : on fait un OU et on le complémente.

En Python par exemple :

s = not (a or b)

a + b a b a + b

Il existe une autre solution qu'on peut trouver en utilisant les lois de De Morgan.

Pour faire simple : lorsqu'on complémente l'opération (a OU b), on peut obtenir le même résultat en utilisant un ET sur les états complémentés de a et b.

En équation, ca donne : a + b = a . b

En Python par exemple :

s = not (a or b)

# On peut obtenir le même test en remplacant le or par un and si on complémente les variables

s = not a and not b

# On peut rajouter les parenthèses si on veut

s = (not a) and (not b)

a . b   =   a + b a a b b

7 - OU EXCLUSIF ou XOR

X-OR héros de la galaxie

Ah non. Il ne s'agit pas d'eux. On parle bien toujours de portes logiques.

Il s'agit simplement d'un OU qui répond FAUX si les deux entrées sont VRAI.

Tout comme le NAND et le NOR, le XOR n'existe pas directement dans la plupart des langages. Par contre, ce type de fonction est régulièrement nécessaire. Il suffit de la construire en utilisant les fonctions basiques ET-OU-NON.

On l'utilise aussi beaucoup en cryptographie.

Pour information : Symbole dans un schéma logique

On symbolise le XOR presque comme une porte logique OU : on ne note pas ≥1 mais =1 pour indiquer que 1+1 ne déclenche pas VRAI.

On trouve également le symbole suivant qui correspond à la norme ANSI américaine :

Porte XOR Ansi

Image dans le domaine public par jjbeard, récupérée sur Wikipedia

Table de vérité :

Voici la table de vérité du XOR :

Valeur de a Valeur de b a XOR b
VRAI VRAI FAUX
FAUX VRAI VRAI
VRAI FAUX VRAI
FAUX FAUX FAUX

C'est donc exactement comme un OU mais sans le cas VRAI-VRAI.

Dans quel cas utiliser un XOR ?

On peut utiliser un XOR dès qu'on veut réagir à l'activation à l'état VRAI d'une unique entrée.

Nous pourrions utiliser le cas d'une console de réponse tactile comportant un bouton OUI et un bouton NON : l'entrée passe à VRAI lorsqu'on appuie sur la bonne case.

Nous pourrions vouloir réaliser un test pour voir si on doit stocker la réponse et passer à la suite.

Oui, sauf que quelqu'un pourrait appuyer à la fois sur OUI et sur NON ! La réponse : utiliser un XOR pour être certain de ne passer à la suite que si un unique bouton est activé.

On ne doit lancer la phase de décontamination que si les deux portes sont bien fermées (état FAUX des entrées).

Activation du OUI ? Activation du NON ? Enregistrement de la demande ? : a XOR b
VRAI VRAI FAUX
FAUX VRAI VRAI
VRAI FAUX VRAI
FAUX FAUX FAUX

Equation mathématique :

Mathématiquement, on doit créer un nouvel opérateur : s = a ⊕ b.

Il s'agit du symbole de l'addition (comme le OU) mais entouré d'un cercle. Ce cercle signale que l'état VRAI-VRAI donne FAUX contrairement au OU standard.

Valeur de a Valeur de b Valeur de a + b a ⊕ b
1 1 1 + 1 donne 1 0
0 1 0 + 1 donne 1 1
1 0 1 + 0 donne 1 1
0 0 0 + 0 donne 0 0

Le XOR avec un langage de programmation :

La première solution est de simplement reprendre l'opérateur XOR bit à bit qu'on trouve dans certains langages. En anglais, on nomme ça les "bitwise operators".

Comme u bit est un mot numérique d'un seul bit, si cela fonctionne avec plusieurs bits, ça fonctionnera avec un seul !

En Python par exemple on utilise le symbole ^ :

>>> True ^ True

False

>>> True ^ False

True

>>> False ^ True

True

>>> False^False

False

Il existe une autre solution qu'on peut trouver en utilisant des combinaisons de ET et OU.

On peut faire un XOR sur a et b en cherchant : ( a OR b ) ET ( not (a ET b ) ).

En équation, ca donne : ( a + b ) . ( a . b )

En Python par exemple, je peux créer et utiliser la fonction xor() suivante (plutôt que de retaper tout le code à chaque fois) :

>>> def xor(a,b):

...    return ((a or b) and not(a and b))

...

>>> xor(True,True)

False

>>> xor(True,False)

True

>>> xor(False,True)

True

>>> xor(False,False)

False

a + b a b a . b a b a XOR b

8 - Quelques précisions

Le but ici n'est pas de faire une fiche sur les portes logiques en électronique mais bien sur l'utilisation simple des tests dans le cadre des langages en informatique.

Je vous présente donc quelques règles de façon à mieux comprendre les tests et à ne pas vous tromper en les définissant.

Attention : dans tous les cas a et b sont des booléens. Ils ne peuvent être égaux qu'à VRAI (1) ou FAUX (0).

Nous avons déjà vu les propriétés suivantes :

Associativité

a . b . c   =   ( a . b ) . c   =   a . ( b . c )

a + b + c   =   ( a + b ) + c   =   a + ( b + c )

Commutativité

a . b   =   b . a

a + b   =   b + a

Lois de De Morgann

a . b = a + b

a + b = a . b

Priorité : on garde la même priorité qu'en mathématiques :

Bien entendu, il reste encore deux trois choses.

1 - La complémentarité

Nous allons voir ici quelques cas qui ne mérite pas de test puisqu'on peut prédire le résultat à l'avance.

Cela veut dire que NON(NON(a)) vaut a.

Mathématiquement, cela donne : a = a.

En gros, inverser deux fois, revient à prendre le résultat de base.

a a a

Ainsi, ces deux instructions Python a et not(not a) donnent la même chose :

>>> a = True

>>> print(a)

True

>>> print(not(not a))

True

On obtient également des choses intéressantes si on utilise une fonction ET ou OU avec une entrée a et une entrée a :

Pour le ET, on obtient l'équation a.a = 0 puisque l'une des deux entrées est forcément à l'état 0.

Si on regarde la table de vérité du ET avec a et son complément a :

Valeur de a Valeur de a s = ( a ET a )
FAUX VRAI FAUX
VRAI FAUX FAUX

Pour le OU, on obtient l'équation a + a = 1 puisque l'une des deux entrées est forcément à l'état 1.

Si on regarde la table de vérité du OU avec a et son complément a :

Valeur de a Valeur de a s = ( a OU a )
FAUX VRAI VRAI
VRAI FAUX VRAI

Résumé de la complémentarité :

a = a

a . a = 0

a + a = 1

2 - Elément neutre et Absorption

Il s'agit de regarder l'influence de VRAI et FAUX sur l'une des entrées d'un ET et d'un OU.

C'est évident en regardant les tables de vérité, je passe directement au résumé :

Résumé de l'élement neutre et de l'absorption

Influence du VRAI (1)

a . 1   =   a       : 1 est neutre dans un ET car c'est a qui impose le résultat.

a + 1   =   1       : 1 absorbe le résultat d'un OU en imposant une valeur VRAI (1) en sortie.

Influence du FAUX (0)

a . 0   =   0       : 0 absorbe le résultat d'un ET en imposant une valeur FAUX (0) en sortie.

a + 0   =   a       : 0 est neutre dans un OU car c'est a qui impose le résultat.

3 - L'idempotence

Le nom est à lire ainsi : idem potence. En gros, l'influence d'utiliser le même opérateur.

Dans le cas qui nous concerne, cela veut dire qu'appliquer la fonction une fois ou plus ne change pas l'état de sortie.

Dans le cas du ET : a ET a donne a. Mathématiquement a.a = a.

a a a a

Si on reprend la table de vérité du ET en ne gardant que les entrées identiques :

Valeur de a Valeur de a s = ( a ET a )
VRAI VRAI VRAI
FAUX FAUX FAUX

Dans le cas du OU : a OU a donne a. Mathématiquement a + a = a.

a a a a

Si on reprend la table de vérité du OU en ne gardant que les entrées identiques :

Valeur de a Valeur de a s = ( a OU a )
VRAI VRAI VRAI
FAUX FAUX FAUX

Résumé de l'idempotence du ET et du OU

a . a . a . a ...   =   a

a + a + a + a ...   =   a

4 - La distributivité du et

On retrouve d'abord la distributivité que vous connaissez puisque la fonction ET est représentée par une multiplication de booléens.

Mathématiquement, cela donne :

a . ( b+c ) = ( a.b ) + ( a.c ).

En logique booléenne, on remplace la multiplication par le ET et l'addition par le OU et cela donne :

a ET ( b OU c ) équivalent à ( a ET b ) OU ( a ET c ).

On commence à comprendre l'intérêt de la notation mathématique ...

Voici la table de vérité des 8 cas possibles pour vous convaincre de l'équivalence :

a b c b + c a . (b + c) a.b a.c (a.b) + (a.c)
VRAI VRAI VRAI VRAI VRAI VRAI VRAI VRAI
FAUX VRAI VRAI VRAI FAUX FAUX FAUX FAUX
VRAI FAUX VRAI VRAI VRAI FAUX VRAI VRAI
VRAI VRAI FAUX VRAI VRAI VRAI FAUX VRAI
VRAI FAUX FAUX FAUX FAUX FAUX FAUX FAUX
FAUX VRAI FAUX VRAI FAUX FAUX FAUX FAUX
FAUX FAUX VRAI VRAI FAUX FAUX FAUX FAUX
FAUX FAUX FAUX FAUX FAUX FAUX FAUX FAUX

Graphiquement, les deux cas équivalents sont :

Première façon d'obtenir le résultat : a.( b + c ) :

b c b + c a a . ( b + c )

Deuxième façon d'obtenir le résultat : ( a.b ) + ( a.c ) :

( a.b ) + ( a.c ) b a a . b a c a . c

On voit néanmoins que dans le premier cas on utilise 2 opérateurs (un ET et un OU) alors que dans le second on utilise 3 opérateurs (deux ET et un OU).

Avec Python, les deux cas suivants test1 et test2 sont donc équivalents :

test1 = (x>50) and (y<20 or z<20)

test2 = (x>50 and y<20) or (x>50 and z<20)

5 - La distributivité du ou

Ce deuxième cas de distributivité est plus "troublant" car il n'est pas vrai en algèbre classique :

Mathématiquement, cela donne :

a + ( b.c ) = ( a + b ) . ( a + c ).

En logique booléenne, on remplace la multiplication par le ET et l'addition par le OU et cela donne :

a OU ( b ET c ) équivalent à ( a OU b ) ET ( a OU c ).

Voici la table de vérité des 8 cas possibles pour vous convaincre de l'équivalence :

a b c b.c a + (b.c) a + b a + c (a+b) . (a+c)
VRAI VRAI VRAI VRAI VRAI VRAI VRAI VRAI
FAUX VRAI VRAI VRAI VRAI VRAI VRAI VRAI
VRAI FAUX VRAI FAUX VRAI VRAI VRAI VRAI
VRAI VRAI FAUX FAUX VRAI VRAI VRAI VRAI
VRAI FAUX FAUX FAUX VRAI VRAI VRAI VRAI
FAUX VRAI FAUX FAUX FAUX VRAI FAUX FAUX
FAUX FAUX VRAI FAUX FAUX FAUX VRAI FAUX
FAUX FAUX FAUX FAUX FAUX FAUX FAUX FAUX

Graphiquement, les deux cas équivalents sont :

Première façon d'obtenir le résultat : a + ( b . c ) :

b c b . c a a + ( b . c )

Deuxième façon d'obtenir le résultat : ( a + b ) . ( a + c ) :

( a + b ) . ( a + c ) b a a + b a c a + c

Avec Python, les deux cas suivants test1 et test2 sont donc équivalents :

test1 = (x>50) or (y<20 and z<20)

test2 = (x>50 or y<20) and (x>50 or z<20)

Résumé de la distributivité

a . ( b + c )   =   ( a . b ) + ( a . c )

a + ( b . c )   =   ( a + b ) . ( a + c )

6 - Règles de simplification

Il existe enfin un certain nombre de simplifications possibles. Voici les plus courantes.

Règles de simplification

a + a . b    =    a + b

a . a + b    =    a . b

a . b + a . c + b . c   =   a . b + a . c

Voilà. Reste le résumé qu'on peut trouver ici :