Chapitre 1 · 6 h
Algèbre de Boole
Opérateurs et tables de vérité, propriétés et théorèmes de De Morgan, formes canoniques, simplification par tableaux de Karnaugh.
En 1937, un étudiant du MIT de vingt et un ans rend un mémoire de maîtrise. Claude Shannon y remarque que l'algèbre publiée par George Boole en 1854 pour formaliser le raisonnement décrit exactement le comportement des circuits à relais des centraux téléphoniques : un relais ouvert ou fermé, une proposition fausse ou vraie, même algèbre. Le mémoire a été appelé le plus important du siècle, et il n'exagère qu'un peu — c'est lui qui autorise à calculer un circuit au lieu de le bricoler.
Ce chapitre est cette algèbre. Le chapitre 4 la câblera en portes ; ici, on apprend à poser une fonction logique, à la simplifier, et à savoir quand deux écritures différentes désignent le même circuit. La simplification n'est pas une coquetterie : chaque terme éliminé est une porte en moins, donc de la surface de silicium, de la consommation et du délai en moins.
Trois opérateurs, trois tables
Une variable booléenne ne prend que deux valeurs, 0 et 1. Trois opérateurs suffisent à tout décrire.
| (ET) | (OU) | (NON) | ||
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 |
Les notations empruntent à l'arithmétique — produit pour le ET, somme pour le OU — et le parallèle tient tant qu'on ne l'étire pas : en logique, pas 2. Le OU booléen est inclusif : « l'un, l'autre, ou les deux ». Le « ou bien » exclusif du langage courant est un quatrième opérateur, le OU exclusif noté , vrai quand les entrées diffèrent. On le retrouvera partout au chapitre 4 : c'est la somme de l'additionneur, et le détecteur d'égalité du comparateur.
Une fonction booléenne de variables associe 0 ou 1 à chacune des combinaisons d'entrée. Sa table de vérité est donc de taille finie, ce qui a une conséquence forte : deux expressions sont équivalentes si et seulement si elles ont la même table, et cela se vérifie exhaustivement. Aucune autre branche des mathématiques n'offre un test d'égalité aussi brutal.
Les propriétés, et les deux qui surprennent
Beaucoup de règles sont celles de l'arithmétique : commutativité, associativité, distributivité du ET sur le OU, éléments neutres (, ) et absorbants (, ).
Trois s'en écartent, et ce sont celles qui font tout le travail.
L'idempotence : et . Un terme répété ne compte qu'une fois.
La distributivité du OU sur le ET : . Elle n'a aucun équivalent arithmétique — — et c'est elle qui rend l'algèbre de Boole duale : toute identité reste vraie en échangeant simultanément ET avec OU et 0 avec 1.
L'absorption : . Si suffit, préciser « et » n'apporte rien. C'est la règle qui élimine le plus de termes à la main.
Restent les théorèmes de De Morgan, les plus utiles du chapitre :
En français : la négation d'un ET est le OU des négations, et réciproquement. « Il est faux que la porte soit fermée et l'alarme active » équivaut à « la porte est ouverte ou l'alarme est inactive ». La faute classique consiste à distribuer la barre sans changer l'opérateur, et elle donne un circuit faux — pas seulement inélégant.
De Morgan a une conséquence pratique majeure, exploitée au chapitre 4 : le NON-ET (NAND) est universel. Toute fonction booléenne se construit avec des NAND seuls, et c'est pourquoi les technologies de fabrication en font leur brique de base.
Quiz · 1 question
Un système déclenche une alarme si « il est faux que le capteur A soit actif et que le capteur B soit actif ». Quelle expression est correcte ?
- Ā · B̄ — on barre chaque variable en gardant l'opérateur — barre distribuée
- Ā + B̄ — la négation d'un ET est le OU des négations — De Morgan
- A + B — la négation inverse simplement les deux variables — sans négation
Réponse : C'est exactement le premier théorème de De Morgan : barre(A·B) = Ā + B̄. On le vérifie sur la table : l'expression de départ est fausse dans le seul cas A = B = 1, or Ā + B̄ n'est fausse que dans ce même cas. La première réponse est la faute classique — distribuer la barre en gardant l'opérateur — et elle donne une fonction vraie uniquement quand A = B = 0, c'est-à-dire tout autre chose. En français : « il est faux que les deux soient actifs » signifie « au moins l'un des deux est inactif », pas « les deux sont inactifs ».
Les formes canoniques
Toute fonction, si tordue soit son énoncé, s'écrit mécaniquement à partir de sa table de vérité. C'est ce qui permet de partir d'un cahier des charges en français et d'arriver à un circuit sans intuition.
La forme canonique disjonctive, dite somme de produits, se lit sur les lignes où la fonction vaut 1. Pour chacune, on écrit le produit de toutes les variables — barrées si elles valent 0 sur cette ligne — puis on fait le OU de ces produits. Chaque produit s'appelle un minterme.
Prenons la fonction « majorité » de trois variables, vraie dès que deux entrées au moins valent 1 — c'est le vote majoritaire des systèmes redondants, et la retenue sortante de l'additionneur du chapitre 4.
| minterme | ||||
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | |
| 0 | 0 | 1 | 0 | |
| 0 | 1 | 0 | 0 | |
| 0 | 1 | 1 | 1 | |
| 1 | 0 | 0 | 0 | |
| 1 | 0 | 1 | 1 | |
| 1 | 1 | 0 | 1 | |
| 1 | 1 | 1 | 1 |
La forme conjonctive, ou produit de sommes, est la duale : elle se lit sur les lignes à 0, chaque ligne donnant une somme dont les variables sont barrées si elles valent 1. On la préfère quand la fonction est majoritairement vraie — il y a alors moins de lignes à écrire.
Ces formes ont une vertu et un défaut. La vertu : elles sont automatiques, donc jamais fausses. Le défaut : elles sont grosses. Quatre mintermes de trois variables, c'est quatre portes ET à trois entrées plus une porte OU à quatre entrées — là où la fonction majorité s'écrit en réalité , trois portes ET à deux entrées.
Simplifier par tableau de Karnaugh
On peut simplifier à l'algèbre, mais c'est long et l'on ne sait jamais si l'on a fini. Le tableau de Karnaugh rend la simplification visuelle et permet de la mener jusqu'au bout.
Le tableau est une table de vérité repliée en deux dimensions, dont les en-têtes suivent un
code de Gray : 00, 01, 11, 10. Ce n'est pas une coquetterie d'ordre — c'est le cœur de
la méthode. Dans cet ordre, deux cases voisines ne diffèrent que par une seule variable,
donc leur regroupement élimine cette variable :
.
Voici la fonction majorité, avec en ligne et en colonne :
| 00 | 01 | 11 | 10 | |
|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 1 | 1 |
La méthode tient en quatre règles.
- On entoure des rectangles de 1 dont la taille est une puissance de 2 : 1, 2, 4, 8 cases. Jamais 3, jamais 6.
- On les prend aussi grands que possible : un groupe de cases élimine variables.
- Les groupes peuvent se chevaucher — l'idempotence l'autorise, .
- Le tableau est torique : les bords gauche et droit sont adjacents, de même que le haut et le bas. C'est l'oubli le plus fréquent, et il coûte systématiquement un terme.
Sur la majorité, trois groupes de deux cases suffisent : la colonne 11 donne , la paire
(1,01)-(1,11) donne , la paire (1,11)-(1,10) donne . D'où :
On est passé de quatre termes de trois variables à trois termes de deux. Il faut couvrir tous les 1 et aucun 0 ; un groupe entièrement recouvert par les autres est inutile et se retire.
Deux remarques de terrain. Le Karnaugh reste lisible jusqu'à quatre variables, tolérable à cinq, inutilisable au-delà — les outils de synthèse emploient alors des algorithmes comme Quine-McCluskey. Et lorsque certaines combinaisons d'entrée ne peuvent pas se produire, on note leur sortie « indifférente » et on s'autorise à les compter comme des 1 quand cela agrandit un groupe, comme des 0 sinon : c'est gratuit, et cela simplifie beaucoup.
Quiz · 1 question
Dans un tableau de Karnaugh à 4 variables, un étudiant obtient un groupe de 3 cases adjacentes et un autre de 4 cases, mais il n'a pas regroupé un 1 du coin haut-gauche avec un 1 du coin haut-droit. Quelles sont ses deux erreurs ?
- Aucune : un groupe de 3 est valide, et deux coins opposés ne sont jamais adjacents — aucune erreur
- Les groupes doivent avoir une taille en puissance de 2 (donc jamais 3), et le tableau est torique : les bords gauche et droit sont adjacents — puissance de 2 et bords adjacents
- Les groupes ne doivent jamais se chevaucher, et il manque un groupe de 8 — chevauchement interdit
Réponse : Un groupe de 2^k cases élimine k variables, ce qui suppose que la taille soit une puissance de 2 : un groupe de 3 ne correspond à aucune simplification algébrique et n'est pas valide — il faut le découper en un groupe de 2 et un groupe de 2 chevauchant, ou le compléter en 4. Et le code de Gray des en-têtes rend le tableau TORIQUE : la première et la dernière colonne ne diffèrent aussi que d'une variable, elles sont donc adjacentes, comme la première et la dernière ligne. Oublier cette adjacence est l'erreur la plus fréquente et coûte un terme à chaque fois. Enfin les chevauchements sont non seulement permis mais souvent nécessaires : l'idempotence a + a = a les justifie.
À vous
L'exercice construit la table de vérité d'une expression, puis compare deux écritures. C'est l'outil qui manque le plus en TD : il transforme « je crois que c'est équivalent » en preuve, puisque l'exhaustivité sur lignes est un test complet.
Vous vérifierez d'abord De Morgan, puis la simplification de la fonction majorité obtenue au Karnaugh — et enfin une simplification volontairement fausse, pour voir la table diverger.
Exercice de code
Vérifiez De Morgan, puis corrigez la simplification de la fonction majorité.
Point de départ
// Une fonction booléenne de n variables est ici une fonction JS qui reçoit
// un tableau de 0/1. On énumère les 2^n entrées et on compare les sorties.
function table(f, n) {
const lignes = [];
for (let m = 0; m < (1 << n); m++) {
// Bit de poids fort = première variable, pour lire comme au tableau.
const e = [];
for (let i = n - 1; i >= 0; i--) e.push((m >> i) & 1);
lignes.push({ e, s: f(e) ? 1 : 0 });
}
return lignes;
}
function equivalentes(f, g, n, nom) {
const tf = table(f, n), tg = table(g, n);
const ecarts = tf.filter((l, i) => l.s !== tg[i].s);
console.log(nom + " : " + (ecarts.length === 0 ? "équivalentes" : "DIFFÉRENTES"));
for (const l of ecarts) {
console.log(" contre-exemple " + l.e.join("") + " -> " +
l.s + " contre " + tg[table(g, n).indexOf(l)]);
}
return ecarts.length === 0;
}
// ── De Morgan ─────────────────────────────────────────────────────────────
const gauche = ([a, b]) => !(a && b);
const droite = ([a, b]) => !a || !b;
equivalentes(gauche, droite, 2, "De Morgan non(a.b) = na + nb");
// ── Majorité : forme canonique contre forme simplifiée ────────────────────
// Vraie dès que deux entrées au moins valent 1.
const canonique = ([a, b, c]) =>
(!a && b && c) || (a && !b && c) || (a && b && !c) || (a && b && c);
const simplifiee = ([a, b, c]) => (a && b) || (a && c); // ← il manque un terme
equivalentes(canonique, simplifiee, 3, "Majorité");
// ── À VOUS ────────────────────────────────────────────────────────────────
// 1. Le Karnaugh donnait ab + ac + bc. Corrigez simplifiee et relancez.
// 2. Écrivez le OU exclusif a XOR b de deux façons — (a et non b) ou
// (non a et b), puis a différent de b — et vérifiez leur équivalence.
Solution
function table(f, n) {
const lignes = [];
for (let m = 0; m < (1 << n); m++) {
const e = [];
for (let i = n - 1; i >= 0; i--) e.push((m >> i) & 1);
lignes.push({ e, s: f(e) ? 1 : 0 });
}
return lignes;
}
function equivalentes(f, g, n, nom) {
const tf = table(f, n), tg = table(g, n);
const ecarts = [];
for (let i = 0; i < tf.length; i++) {
if (tf[i].s !== tg[i].s) ecarts.push({ e: tf[i].e, f: tf[i].s, g: tg[i].s });
}
console.log(nom + " : " + (ecarts.length === 0 ? "équivalentes" : "DIFFÉRENTES"));
for (const x of ecarts) {
console.log(" contre-exemple " + x.e.join("") + " -> " + x.f + " contre " + x.g);
}
return ecarts.length === 0;
}
const gauche = ([a, b]) => !(a && b);
const droite = ([a, b]) => !a || !b;
equivalentes(gauche, droite, 2, "De Morgan non(a.b) = na + nb");
const canonique = ([a, b, c]) =>
(!a && b && c) || (a && !b && c) || (a && b && !c) || (a && b && c);
// Les trois groupes de deux cases lus au Karnaugh : ab, ac et bc. Le terme
// bc est celui que l'oubli de la colonne 11 fait sauter.
const simplifiee = ([a, b, c]) => (a && b) || (a && c) || (b && c);
equivalentes(canonique, simplifiee, 3, "Majorité");
// Le OU exclusif, deux écritures.
const xorPortes = ([a, b]) => (a && !b) || (!a && b);
const xorDiff = ([a, b]) => a !== b;
equivalentes(xorPortes, xorDiff, 2, "XOR");
En travaux pratiques
Travaux pratiques 3 · 3 h
Simplifier avant de câbler
Passer d'un énoncé en français à une expression booléenne, la simplifier, et prouver que la simplification n'a rien changé — parce qu'au TP suivant, chaque terme coûtera une porte.
Avant de commencer
- Le TP 1 pour la notation binaire
- De quoi écrire un petit programme, pour la vérification exhaustive
Énoncé
- De l'énoncé à la table — Un vote à trois : la sortie vaut 1 si au moins deux entrées valent 1. Écrivez la table de vérité complète, huit lignes.
- La forme canonique — Écrivez la somme des mintermes, un terme par ligne à 1. Comptez le nombre de portes ET, OU et NON qu'elle exigerait.
- Simplifier — Simplifiez par tableau de Karnaugh, puis vérifiez algébriquement en repartant de la forme canonique. Recomptez les portes. Indice : Les regroupements sont des paires de cases adjacentes valant 1, et un terme peut servir dans plusieurs regroupements.
- Prouver l'équivalence — Écrivez un programme qui parcourt les huit combinaisons et compare les deux expressions ligne à ligne. C'est la seule preuve que votre simplification est juste.
- Tout en NON-ET — Réécrivez l'expression simplifiée en n'utilisant que des portes NON-ET, avec De Morgan. Vérifiez à nouveau par le programme.
- Une fonction utile — Même démarche complète pour le comparateur d'égalité de deux nombres de 2 bits. Vous vous en resservirez au TP 4.
- Le piège de la simplification — Simplifiez A·B + A·NON(B) + NON(A)·B en gardant le compte des portes, puis dites lequel des deux résultats vous câbleriez si les entrées arrivaient à des instants différents.
C'est réussi quand
- Votre programme confirme l'équivalence sur les huit lignes, sans exception
- Vous passez de 3 portes ET à 3 portes ET… mais de 3 entrées à 2 entrées chacune
- Vous savez énoncer De Morgan sans le relire
Correction
A B C | S S = A'BC + AB'C + ABC' + ABC 0 0 0 | 0 0 0 1 | 0 4 termes de 3 littéraux 0 1 0 | 0 → 4 portes ET à 3 entrées 0 1 1 | 1 → 1 porte OU à 4 entrées 1 0 0 | 0 → 3 portes NON 1 0 1 | 1 1 1 0 | 1 1 1 1 | 1
La forme canonique s'obtient mécaniquement, sans réfléchir : une ligne à 1, un terme. C'est sa qualité — on ne peut pas se tromper — et son défaut : elle est toujours la plus coûteuse.
S = A'BC + AB'C + ABC' + ABC on duplique ABC (car X + X = X) : S = (A'BC + ABC) + (AB'C + ABC) + (ABC' + ABC) = BC(A' + A) + AC(B' + B) + AB(C' + C) = BC + AC + AB 3 portes ET à 2 entrées, 1 porte OU à 3 entrées, 0 porte NON
Dupliquer un terme pour pouvoir factoriser trois fois est le geste qui surprend, et il est parfaitement licite : en booléen, X + X = X. Le gain n'est pas dans le nombre de portes ET mais dans leur TAILLE — deux entrées au lieu de trois — et dans la disparition des trois inverseurs. Sur un circuit réel, moins d'entrées signifie moins de transistors et un chemin plus court.
for (int a = 0; a < 2; a++)
for (int b = 0; b < 2; b++)
for (int c = 0; c < 2; c++) {
int canonique = (!a&&b&&c) || (a&&!b&&c) || (a&&b&&!c) || (a&&b&&c);
int simplifie = (b&&c) || (a&&c) || (a&&b);
if (canonique != simplifie)
printf("DIFFÉRENCE en %d%d%d\n", a, b, c);
}Huit lignes seulement : l'exhaustif est ici possible, et c'est un luxe. Dès qu'on dépasse une vingtaine de variables il ne l'est plus, et il faut un vérificateur formel. Mais tant qu'il est possible, il est la meilleure preuve qui soit — supérieure à une relecture.
X + Y = (X' · Y')' (De Morgan) X · Y = ((X · Y)')' (double négation) X' = (X · X)' (une NON-ET à entrées reliées) S = BC + AC + AB = ( (BC)' · (AC)' · (AB)' )' → 3 NON-ET pour les produits, 1 NON-ET à 3 entrées pour la somme
La NON-ET est universelle : elle suffit à tout construire. Ce n'est pas une curiosité théorique — une usine qui ne fabrique qu'un seul type de porte simplifie sa production, et en technologie CMOS la NON-ET demande moins de transistors que la ET, qui est une NON-ET suivie d'un inverseur.
A·B + A·B' + A'·B = A + B (2 portes → 1 porte) mais si A et B n'arrivent pas au même instant, la forme simplifiée peut produire une impulsion parasite pendant la transition — un ALÉA que la forme redondante n'avait pas.
En combinatoire pure, sortie stable après stabilisation des entrées, la forme simplifiée gagne toujours. Dès qu'un signal est lu pendant la transition, on RAJOUTE volontairement des termes redondants pour supprimer l'aléa. C'est aussi pour cela que le TP 4 synchronisera tout sur une horloge : on n'observe les sorties qu'une fois qu'elles sont stables.
Ce que la suite en fait
Chaque objet de ce chapitre a un équivalent matériel immédiat, et le chapitre 4 ne fera guère que traduire. Une expression devient un assemblage de portes ; une somme de produits devient deux étages de portes ; De Morgan devient la possibilité de tout construire en NAND ; et le nombre de termes après Karnaugh devient un nombre de transistors.
La fonction majorité étudiée ici n'a rien d'un exemple gratuit : c'est exactement la retenue sortante de l'additionneur complet. Vous l'avez déjà simplifiée, il ne restera qu'à la câbler.
À retenir
Flashcards · 4 cartes
- Énoncez les deux théorèmes de De Morgan, et quelle faute classique guette.
- barre(a·b) = ā + b̄ et barre(a+b) = ā · b̄ : la négation d'un ET est le OU des négations, et réciproquement. La faute classique est de distribuer la barre en GARDANT l'opérateur (écrire ā · b̄ pour barre(a·b)), ce qui donne une fonction complètement différente. Conséquence pratique : le NAND est universel, toute fonction se câble en NAND seuls.
- Comment lit-on la forme canonique somme de produits sur une table de vérité ?
- On ne regarde que les lignes où la fonction vaut 1. Pour chacune, on écrit le produit de TOUTES les variables, barrées si elles valent 0 sur cette ligne — c'est un minterme — puis on fait le OU de ces produits. La méthode est automatique donc jamais fausse, mais elle produit une expression grosse, qu'il faut ensuite simplifier.
- Pourquoi les en-têtes d'un tableau de Karnaugh suivent-ils l'ordre 00, 01, 11, 10 ?
- C'est un code de Gray : deux cases voisines ne diffèrent que d'UNE variable. Leur regroupement élimine donc cette variable, puisque ab + ab̄ = a. Sans cet ordre, l'adjacence géométrique ne correspondrait à aucune simplification algébrique et la méthode ne fonctionnerait pas.
- Quelles sont les quatre règles de regroupement dans un Karnaugh ?
- 1) Les groupes ont une taille en puissance de 2 (1, 2, 4, 8) — jamais 3. 2) On les prend aussi grands que possible : 2^k cases éliminent k variables. 3) Ils peuvent se chevaucher, l'idempotence a + a = a l'autorise. 4) Le tableau est torique : bords gauche/droit et haut/bas sont adjacents — l'oubli le plus fréquent. Il faut couvrir tous les 1 et aucun 0.