Adloun

Simplifier not (a and not b) à l'aide des lois de De Morgan

Exercice d'entraînement · niveau 2 · NSI (première), chapitre 2 — Flottants, booléens et textes · Court-circuit, tables et équivalences

Énoncé

Simplifier not (a and not b) à l'aide des lois de De Morgan. Écrire ensuite une fonction equivalentes(f, g) qui vérifie automatiquement que deux fonctions booléennes à deux variables ont la même table.

Corrigé

La simplification. De Morgan échange and et or en passant la négation à l'intérieur :

On reconnaît l'implication : « si alors » est faux dans le seul cas vrai et faux.

La vérification automatique.


def equivalentes(f, g):
    """Vrai si f et g ont la meme table de verite (2 variables).

    Precondition : f et g prennent deux arguments booleens. On teste
    les 4 = 2**2 lignes, ce qui est une PREUVE : la table est finie.
    """
    return all(f(a, b) == g(a, b)
               for a in (False, True) for b in (False, True))

>>> equivalentes(lambda a, b: not (a and not b),
...              lambda a, b: (not a) or b)
True

Ce qui rend la logique confortable. Sur variables il y a lignes : un nombre fini. Un test exhaustif n'est donc pas un échantillonnage, c'est une démonstration complète. C'est un luxe rarissime en informatique — on ne peut pas tester une fonction sur tous les entiers.

Prolongement : le luxe a un prix. À variables, dépasse le milliard de lignes : la démonstration exhaustive devient impraticable. C'est le problème SAT, l'un des plus célèbres de l'informatique théorique.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.