En savoir plus

Les lois de De Morgan

Comment retourner une condition qui contient and ou or sans se tromper, et pourquoi not (a and b) n'est pas not a and not b.

La règle, en une phrase

Pour inverser une condition faite de deux morceaux, on inverse chaque morceau et on échange and et or. Les deux lois disent exactement ça :

Première loi
not (a and b) == (not a) or (not b)
« Pas les deux à la fois » veut dire « au moins un des deux manque ».
Seconde loi
not (a or b) == (not a) and (not b)
« Ni l'un ni l'autre » veut dire « le premier manque et le second manque aussi ».

Augustus De Morgan, mathématicien britannique du 19e siècle, a formalisé ces deux règles. Les logiciens du Moyen Âge les connaissaient déjà, mais son nom est resté.

Exemple : quand le cours a-t-il lieu ?

On a vu en classe que le cours est annulé s'il y a une tempête or si la prof est malade. Question inverse : quand le cours a-t-il lieu ? Pas quand il est annulé, donc :

tempete = False profMalade = False coursAnnule = tempete or profMalade coursALieu = not (tempete or profMalade) # version 1 : on nie tout le bloc

La seconde loi permet de dire la même chose sans parenthèses, en lisant chaque morceau à l'envers : pas de tempête and la prof pas malade. Il faut les deux pour que le cours ait lieu.

coursALieu = (not tempete) and (not profMalade) # version 2 : De Morgan print(not (tempete or profMalade) == ((not tempete) and (not profMalade))) # True, et ce sera True pour les quatre combinaisons possibles

Remarque le or devenu and : c'est le cœur de la loi. Si tu gardes le or, tu obtiens « pas de tempête or la prof pas malade », et le cours aurait lieu en pleine tempête tant que la prof est en santé. Faux.

Exemple : qui ne peut pas voter ?

Le droit de vote demande deux conditions à la fois : avoir 18 ans ou plus and habiter au Québec. Qui ne peut pas voter ? Ceux à qui il manque au moins une des deux : les mineurs, or ceux qui n'habitent pas au Québec. C'est la première loi.

majeur = True habiteAuQuebec = False peutVoter = majeur and habiteAuQuebec nePeutPasVoter = not (majeur and habiteAuQuebec) # version 1 nePeutPasVoter = (not majeur) or (not habiteAuQuebec) # version 2 : De Morgan, même résultat

Ici le and est devenu or : un seul défaut suffit pour être exclu du vote.

Le piège classique, montré par la table

L'erreur la plus fréquente : nier les morceaux sans échanger l'opérateur. On écrit not a and not b en croyant traduire not (a and b). La table de vérité montre que ça se trompe sur deux lignes sur quatre :

abnot (a and b)not a or not b
(De Morgan)
not a and not b
(le piège)
FalseFalseTrueTrueTrue
FalseTrueTrueTrueFalse
TrueFalseTrueTrueFalse
TrueTrueFalseFalseFalse

Les deux cases rouges sont les cas où un seul des deux morceaux est vrai : le piège dit « non » alors que la vraie négation dit « oui ».

Démo : deux interrupteurs, quatre expressions

Clique sur les interrupteurs pour changer tempete et profMalade. À chaque état, les deux côtés de chaque loi affichent la même valeur, et la ligne active de la table s'allume.

Interrupteurs

Seconde loi, côté gauche
not (tempete or profMalade)
-
Seconde loi, côté droit
(not tempete) and (not profMalade)
-
Première loi, côté gauche
not (tempete and profMalade)
-
Première loi, côté droit
(not tempete) or (not profMalade)
-
tempeteprofMaladenot (t or p)not t and not pnot (t and p)not t or not p

À quoi ça sert, concrètement

1. Rendre un if lisible. Une condition niée en bloc se lit mal ; De Morgan la déplie. Attention en passant : le contraire de < est >=, pas >.

if not (note < 0 or note > 100): # difficile à lire ... if note >= 0 and note <= 100: # la même chose, dépliée ... if 0 <= note <= 100: # et Python permet même ce raccourci ...

2. Écrire la condition d'une boucle. « Continuer tant que ce n'est pas fini et qu'il n'y a pas d'erreur » se dit de deux façons équivalentes :

while not (fini or erreur): ... while not fini and not erreur: # De Morgan : même boucle ...

3. Vérifier son else. Le else d'un if a and b s'exécute quand not (a and b), donc quand not a or not b : dès qu'un seul morceau manque. Se le dire à voix haute évite bien des surprises.

Pour voir les tables de and, or et not une à une : les tables de vérité. Complément jumeau de la semaine : comparer des nombres à virgule.