← Retour au cours Logique booléenne Essayer le simulateur

Les deux lois

à retenir

Nier un ET/OU revient à nier chaque terme et à inverser l'opérateur.

non (a et b)
= (non a) ou (non b)
non (a ou b)
= (non a) et (non b)
de_morgan.py
age = 16
paye = False

# Condition d'origine
bloque = not (age >= 18 and paye)

# Reécrite avec De Morgan : équivalente, souvent plus lisible
bloque_v2 = age < 18 or not paye

print(bloque == bloque_v2)  # True, quel que soit age/paye

Preuve par table de vérité

démonstration

Deux expressions sont équivalentes si leurs colonnes finales sont identiques sur toutes les lignes.

4 lignes
Toutes les combinaisons de a, b
Colonnes égales
= équivalence logique prouvée

📦 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)

aba et bnon (a et b)non anon b(non a) ou (non b)
0001111
0101101
1001011
1110000

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

garde.py
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

📋 Aide-mémoire

non(a et b) = (non a) ou (non b) — non(a ou b) = (non a) et (non b).

La négation « traverse » la parenthèse et inverse l'opérateur.