📦 Le cours : nier une expression composée
Les lois de De Morgan (Augustus De Morgan, XIXe siècle) relient la négation, le ET et le OU. Elles sont indispensables pour simplifier une condition niée sans se tromper.
Preuve : non (a et b) = (non a) ou (non b)
| a | b | a et b | non (a et b) | non a | non b | (non a) ou (non b) |
| 0 | 0 | 0 | 1 | 1 | 1 | 1 |
| 0 | 1 | 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 0 | 0 | 0 | 0 |
Les deux colonnes en gras sont identiques sur les 4 lignes : les expressions sont bien équivalentes. La seconde loi (non (a ou b) = (non a) et (non b)) se prouve de la même façon.
Moyen mnémotechnique
« La négation traverse la parenthèse, distribue sur chaque terme, et retourne l'opérateur » : ET devient OU, OU devient ET.
Généralisation à n variables
Les lois se généralisent à n termes : non (a et b et c) = (non a) ou (non b) ou (non c), et de même pour le OU.
💻 Exemples
Simplifier une condition de garde
def acces_autorise(age, badge_valide):
# Moins lisible : négation d'un ET
if not (age >= 18 and badge_valide):
return False
return True
def acces_autorise_v2(age, badge_valide):
# De Morgan : plus direct à lire
if age < 18 or not badge_valide:
return False
return True