TP Python – Vérifier une équivalence par énumération
BTS SIO SISR 1re année – Mathématiques pour l'informatique – S08
Note
Comment ce TP fonctionne. Chaque exercice a un éditeur Python intégré à la page (il s'exécute dans ton navigateur, rien à installer). Avant de lancer, écris sur ta feuille ce que tu anticipes (« J'anticipe »). Puis lance et compare. Le bouton Valider exécute des tests : un test réussi ne dispense pas de comprendre pourquoi.
Exercice A – Toutes les combinaisons de valeurs
Écris combinaisons(n) qui renvoie la liste des \(2^n\) combinaisons de n booléens, sous forme de tuples, dans l'ordre de la table de vérité (False avant True, la première variable change le moins vite). Indice : le numéro de ligne k, écrit en binaire sur n bits (S01), donne les valeurs.
J'anticipe. Que doit renvoyer combinaisons(2) ? Quelle ligne de la table correspond à k = 2 ?
def combinaisons(n):bksl-nl """Liste des 2py-strpy-strn tuples de n booléens, dans l'ordre de la table de vérité."""bksl-nl liste = []bksl-nl for k in range(2 py-strpy-str n):bksl-nl ligne = []bksl-nl for i in range(n):bksl-nl # À compléter : le bit de rang (n - 1 - i) de k, converti en booléenbksl-nl ligne.append(False)bksl-nl liste.append(tuple(ligne))bksl-nl return listebksl-nlbksl-nl
Exercice B – Équivalence par énumération
À l'aide de combinaisons, écris equivalentes(f, g, n) qui renvoie True si les fonctions f et g (à n arguments booléens) donnent le même résultat sur toutes les combinaisons.
def combinaisons(n):bksl-nl liste = []bksl-nl for k in range(2 py-strpy-str n):bksl-nl ligne = []bksl-nl for i in range(n):bksl-nl ligne.append(bool((k >> (n - 1 - i)) & 1))bksl-nl liste.append(tuple(ligne))bksl-nl return listebksl-nlbksl-nldef equivalentes(f, g, n):bksl-nl """True si f et g donnent le même résultat sur toutes les combinaisons de n booléens."""bksl-nl ...bksl-nlbksl-nl
Je comprends. Vérifie avec equivalentes les lois de De Morgan et l'équivalence \(p \Rightarrow q \equiv \neg p \vee q\). Quelle différence avec une preuve par table sur papier ?
Exercice C – Tautologie et comptage
Écris est_tautologie(f, n) et nombre_de_vrais(f, n).
def combinaisons(n):bksl-nl liste = []bksl-nl for k in range(2 py-strpy-str n):bksl-nl ligne = []bksl-nl for i in range(n):bksl-nl ligne.append(bool((k >> (n - 1 - i)) & 1))bksl-nl liste.append(tuple(ligne))bksl-nl return listebksl-nlbksl-nldef estpy-undtautologie(f, n):bksl-nl """True si f vaut True pour toutes les combinaisons."""bksl-nl ...bksl-nlbksl-nldef nombrepy-unddepy-undvrais(f, n):bksl-nl """Nombre de combinaisons pour lesquelles f vaut True."""bksl-nl ...bksl-nlbksl-nl
Exercice D – La règle de pare-feu
Écris autorise(protocole, port) qui applique la règle \((t \wedge (a \vee b)) \vee i\) de l'exercice 7.
def autorise(protocole, port):bksl-nl """Règle : (TCP et port 80 ou 443) ou ICMP."""bksl-nl ...bksl-nlbksl-nl
Exercice E – Table de vérité affichée
Écris afficher_table(f, n) qui affiche une ligne par combinaison, avec V ou F (essaie avec lambda p, q: p and q).
def combinaisons(n):bksl-nl liste = []bksl-nl for k in range(2 py-strpy-str n):bksl-nl ligne = []bksl-nl for i in range(n):bksl-nl ligne.append(bool((k >> (n - 1 - i)) & 1))bksl-nl liste.append(tuple(ligne))bksl-nl return listebksl-nlbksl-nldef afficherpy-undtable(f, n):bksl-nl """Affiche une ligne par combinaison : les valeurs puis le résultat, en V / F."""bksl-nl for valeurs in combinaisons(n):bksl-nl ...bksl-nlbksl-nlafficherpy-undtable(lambda p, q: p and q, 2)bksl-nlbksl-nl