Outils d'utilisateurs

Outils du Site


boole_et_morgan

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

boole_et_morgan [2015/07/19 22:28]
winjerome [Eléments neutres]
boole_et_morgan [2016/07/05 18:53] (Version actuelle)
gbdivers
Ligne 1: Ligne 1:
  
-^ [[nombres_reels|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[virgule_fixe|Chapitre suivant]] ^+^ [[string|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[complex|Chapitre suivant]] ^
  
-====== L'algèbre de Boole ======+====== [Aller plus loin] L'algèbre de Boole ======
  
 Vous avez vu dans les chapitres précédents comment utiliser les booléens et les opérations de base : ET, OU, NON et OU-EXCLUSIF. En fait, l'utilisation des booléens est plus riche et complexe que cela. Ils sont à la base d'une branche des mathématiques, appelée [[https://fr.wikipedia.org/wiki/Alg%C3%A8bre_de_Boole_(logique)|Algèbre de Boole]], en l'honneur de son créateur, le mathématicien George Boole.  Vous avez vu dans les chapitres précédents comment utiliser les booléens et les opérations de base : ET, OU, NON et OU-EXCLUSIF. En fait, l'utilisation des booléens est plus riche et complexe que cela. Ils sont à la base d'une branche des mathématiques, appelée [[https://fr.wikipedia.org/wiki/Alg%C3%A8bre_de_Boole_(logique)|Algèbre de Boole]], en l'honneur de son créateur, le mathématicien George Boole. 
Ligne 36: Ligne 36:
   * NON-ET (//NAND//) correspond à ''!(a && b)'' ;   * NON-ET (//NAND//) correspond à ''!(a && b)'' ;
   * OU-Exclusif (//XOR//) correspond à ''(a && !b) || (!a && b)'' ;   * OU-Exclusif (//XOR//) correspond à ''(a && !b) || (!a && b)'' ;
-  * NON-OU-Exclusif (//XNOR//) correspond à ''!((a && !b) || (!a && b))''.+  * NON-OU-Exclusif (//XNOR//) correspond à ''!( (a && !b) || (!a && b) )''.
  
 Ces opérateurs n'ont pas d'équivalent direct en C++, mais il est facile de les écrire en utilisant les opérateurs de base du C++. Ces opérateurs n'ont pas d'équivalent direct en C++, mais il est facile de les écrire en utilisant les opérateurs de base du C++.
Ligne 123: Ligne 123:
 ==== Idempotence ==== ==== Idempotence ====
  
-La première notion est relativement simple : appliquer un opérateur en utilisant deux fois la même valeur est équivalent à utiliser directement la variable. Si on regarde le tableau de vérité précédent, on peut remarquer que lorsque ''a'' et ''b'' sont égaux, alors le résultat des opérations logiques aura la même valeur :+La première notion est relativement simple : appliquer un opérateur en utilisant deux fois la même valeur est équivalent à utiliser directement la variable. Si on regarde la table de vérité précédente, on peut remarquer que lorsque ''a'' et ''b'' sont égaux, alors le résultat des opérations logiques aura la même valeur :
  
 |  ''a''  |  ''b''  |  ''a && b''   |  ''a || b''  | |  ''a''  |  ''b''  |  ''a && b''   |  ''a || b''  |
Ligne 146: Ligne 146:
 ^  1      ^  1      ^  1            ^ ^  1      ^  1      ^  1            ^
  
-Pour l'opérateur OU, ça sera la valeur ''false'' qui est l'élément neutre :+Pour l'opérateur OU, ça sera faux qui est l'élément neutre :
  
 |  ''a''  |  ''b''  |  ''a || b''  | |  ''a''  |  ''b''  |  ''a || b''  |
Ligne 163: Ligne 163:
 ==== Absorption ==== ==== Absorption ====
  
-L'absorption peut être considéré comme l'inverse de l'élément neutre : si ''a'' est faux, le résultat de l'opérateur ET sera toujours faux.+L'absorption peut être considérée comme l'inverse de l'élément neutre : si ''a'' est faux, le résultat de l'opérateur ET sera toujours faux.
  
 |  ''a''  |  ''b''  |  ''a && b''  | |  ''a''  |  ''b''  |  ''a && b''  |
Ligne 184: Ligne 184:
 $$ \text{A} ~ \text{OU} ~ \text{Vrai} ~ = ~ \text{Vrai} $$ $$ \text{A} ~ \text{OU} ~ \text{Vrai} ~ = ~ \text{Vrai} $$
  
-Cette propriété est particulièrement intéressant en C++, puisque cela permet de ne pas évaluer une expression, si possible. Comme expliqué dans le chapitre [[logique_et_calcul_booleen]], le C++ utilise la //lazy evaluation// lorsque c'est possible. Pour évaluer les expressions suivantes :+Cette propriété est particulièrement intéressante en C++, puisque cela permet de ne pas évaluer une expression, si possible. Comme expliqué dans le chapitre [[logique_et_calcul_booleen]], le C++ utilise la //lazy evaluation// (évaluation paresseuse) lorsque c'est possible. Pour évaluer les expressions suivantes :
  
 $$ \text{A} ~ \text{ET} ~ \text{Expression complexe} $$ $$ \text{A} ~ \text{ET} ~ \text{Expression complexe} $$
 $$ \text{B} ~ \text{OU} ~ \text{Expression complexe} $$ $$ \text{B} ~ \text{OU} ~ \text{Expression complexe} $$
  
-Si ''A'' est faux, le résultat sera toujours faux, quelque soit la valeur de l'expression complexe. Le programme C++ va donc évaluer la valeur de ''A'' dans un premier temps. Si cette valeur est faux, le programme n'évaluera pas l'expression complexe et retournera directement faux. De même, si ''B'' est vrai, le programme n'évaluera pas l'expression complexe et retournera directement vrai. +Si ''A'' est //faux//, le résultat sera toujours //faux//quelle que soit la valeur de l'expression complexe. Le programme C++ va donc évaluer la valeur de ''A'' dans un premier temps. Si cette valeur est //faux//, le programme n'évaluera pas l'expression complexe et retournera directement //faux//. De même, si ''B'' est //vrai//, le programme n'évaluera pas l'expression complexe et retournera directement //vrai//.
 ==== Commutativité ==== ==== Commutativité ====
  
-La commutativité signifie que l'on peut changer l'ordre des valeurs (opérandes) dans une expression, sans changer le résultat. Cette propriété est valide pour les opérateurs binaires (qui prennent deux opérandes, donc les opérateurs ET et OU), mais pas pour NON (opérateur unaire, qui prend qu'une opérande).+La commutativité signifie que l'on peut changer l'ordre des valeurs (opérandes) dans une expression, sans changer le résultat. Cette propriété est valide pour les opérateurs binaires (qui prennent deux opérandes, donc les opérateurs ET et OU), mais pas pour NON (opérateur unaire, qui ne prend qu'une opérande).
  
 En utilisant une écriture plus formelle, on peut donc écrire : En utilisant une écriture plus formelle, on peut donc écrire :
Ligne 226: Ligne 225:
 </code> </code>
  
-**Exercice** : écrire les trois autres lignes, correspondant A vrai et B faux, A faux et B vrai et A vrai et B vrai.+**Exercice** : écrire les trois autres lignes, correspondant à A vrai et B faux, à A faux et B vrai et à A vrai et B vrai.
  
 ==== Associativité ==== ==== Associativité ====
  
-Comme vu précédemment, les opérateurs identiques sont évalués de gauche droite. En fait, les opérateurs logiques sont associatifs et l'ordre d’évaluation ne change pas le résultat :+Comme vu précédemment, les opérateurs identiques sont évalués de gauche à droite. En fait, les opérateurs logiques sont associatifs et l'ordre d’évaluation ne change pas le résultat :
  
 <code cpp> <code cpp>
Ligne 238: Ligne 237:
 </code> </code>
  
-**Exercice** : compléter les tables de vérité correspondantes :+**Exercice** : compléter les tables de vérité suivantes :
  
 ^  ''a''  ^  ''b''  ^  ''c''  ^  ''a && b''  ^  ''(a && b) && c''  ^  ''b && c''  ^  ''a && (b && c)''  ^ ^  ''a''  ^  ''b''  ^  ''c''  ^  ''a && b''  ^  ''(a && b) && c''  ^  ''b && c''  ^  ''a && (b && c)''  ^
 |  0      |  0      |  0      |  ...         |  ...                |  ...         |  ...                | |  0      |  0      |  0      |  ...         |  ...                |  ...         |  ...                |
 +|  ...    |  ...    |  ...    |  ...         |  ...                |  ...         |  ...                |
  
 ^  ''a''  ^  ''b''  ^  ''c''  ^  ''a || b''  ^  ''(a || b) || c''  ^  ''b || c''  ^  ''a || (b || c)''  ^ ^  ''a''  ^  ''b''  ^  ''c''  ^  ''a || b''  ^  ''(a || b) || c''  ^  ''b || c''  ^  ''a || (b || c)''  ^
 |  0      |  0      |  0      |  ...         |  ...                |  ...         |  ...                | |  0      |  0      |  0      |  ...         |  ...                |  ...         |  ...                |
 +|  ...    |  ...    |  ...    |  ...         |  ...                |  ...         |  ...                |
  
 ==== Distributivité ==== ==== Distributivité ====
Ligne 257: Ligne 257:
 </code> </code>
  
-Note : il est classique de noté l'opérateur ET comme une multiplication et l'opérateur OU comme une addition, du fait de leur similarité. Avec cette écriture, les opérateurs logiques deviennent :+Note : il est classique de noter l'opérateur ET comme une multiplication et l'opérateur OU comme une addition, du fait de leur similarité. Avec cette écriture, les opérateurs logiques deviennent :
  
 $$ ( \text{A} ~ \text{OU} ~ \text{B} ) ~ \text{ET} ~ \text{C} \iff ( \text{A} ~ + ~ \text{B} ) ~ \times ~ \text{C} $$ $$ ( \text{A} ~ \text{OU} ~ \text{B} ) ~ \text{ET} ~ \text{C} \iff ( \text{A} ~ + ~ \text{B} ) ~ \times ~ \text{C} $$
  
-Sous cette forme, on reconnait plus facilement la propriété : "le produit d'une somme est égal à la somme des produits". Celle-ci est connu sous le nom de "distributivité de la multiplication par rapport à l'addition" et permet d'écrire :+Sous cette forme, on reconnaît plus facilement la propriété : "le produit d'une somme est égal à la somme des produits". Celle-ci est connue sous le nom de "distributivité de la multiplication par rapport à l'addition" et permet d'écrire :
  
 $$ ( \text{A} ~ + ~ \text{B} ) ~ \times ~ \text{C} \iff  \text{A} ~ \times ~ \text{C} ~ + ~ \text{B} ~ \times ~ \text{C} $$ $$ ( \text{A} ~ + ~ \text{B} ) ~ \times ~ \text{C} \iff  \text{A} ~ \times ~ \text{C} ~ + ~ \text{B} ~ \times ~ \text{C} $$
  
-Si on revient aux opérateur logiques, on obtient finalement :+Si on revient aux opérateurs logiques, on obtient finalement :
  
 $$ \text{A} ~ \times ~ \text{C} ~ + ~ \text{B} ~ \times ~ \text{C} \iff  ( \text{A} ~ \text{ET} ~ \text{C} ) ~ \text{OU} ~ ( \text{B} ~ \text{ET} ~ \text{C} ) $$ $$ \text{A} ~ \times ~ \text{C} ~ + ~ \text{B} ~ \times ~ \text{C} \iff  ( \text{A} ~ \text{ET} ~ \text{C} ) ~ \text{OU} ~ ( \text{B} ~ \text{ET} ~ \text{C} ) $$
Ligne 277: Ligne 277:
 ^  ''a''  ^  ''b''  ^  ''c''  ^  ''a && b''  ^  ''(a && b) || c''  ^  ''a || c''  ^  ''b || c''  ^ ''(a || c) && (b || c)''  ^ ^  ''a''  ^  ''b''  ^  ''c''  ^  ''a && b''  ^  ''(a && b) || c''  ^  ''a || c''  ^  ''b || c''  ^ ''(a || c) && (b || c)''  ^
 |  0      |  0      |  0      |  ...         |  ...                |  ...         |  ...         |  ...       | |  0      |  0      |  0      |  ...         |  ...                |  ...         |  ...         |  ...       |
 +|  ...    |  ...    |  ...    |  ...         |  ...                |  ...         |  ...                |
  
 ^  ''a''  ^  ''b''  ^  ''c''  ^  ''a || b''  ^  ''(a || b) && c''  ^  ''a && c''  ^  ''b && c''  ^  ''(a && c) || (b && c)''  ^ ^  ''a''  ^  ''b''  ^  ''c''  ^  ''a || b''  ^  ''(a || b) && c''  ^  ''a && c''  ^  ''b && c''  ^  ''(a && c) || (b && c)''  ^
 |  0      |  0      |  0      |  ...         |  ...                |  ...         |  ...         |  ...       | |  0      |  0      |  0      |  ...         |  ...                |  ...         |  ...         |  ...       |
 +|  ...    |  ...    |  ...    |  ...         |  ...                |  ...         |  ...                |
  
 ===== Lois de De Morgan ===== ===== Lois de De Morgan =====
Ligne 293: Ligne 295:
 ===== Exercices ===== ===== Exercices =====
  
-1. Ecrire les opérateurs NON-ET, NON-OU, OU-Exclusif et NON-OU-Exclusif avec les opérateurs de base du C++. 
  
-2. Ecrire tous les opérateurs en utilisant uniquement l'opérateur NON-ET. 
  
-3Ecrire un additionner à un bit. Un additionner va prendre deux valeurs booléennes et retourne la somme et la retenu de ces valeurs, suivant la table de vérité suivante :+  * Écrire les opérateurs NON-ET, NON-OU, OU-Exclusif et NON-OU-Exclusif avec les opérateurs de base du C++. 
 +  * Écrire tous les opérateurs en utilisant uniquement l'opérateur NON-ET. 
 +  * Écrire un additionneur à un bit. Un additionneur va prendre deux valeurs booléennes et retournera la somme et la retenue de ces valeurs, suivant la table de vérité suivante :
  
-^  a  ^  b  ^  Somme  ^  Retenu +^  a  ^  b  ^  Somme  ^  Retenue  
-|  0  |  0  |  0      |  0      | +|  0  |  0  |  0      |    0      | 
-|  0  |  1  |  1      |  0      | +|  0  |  1  |  1      |    0      | 
-|  1  |  0  |  1      |  0      | +|  1  |  0  |  1      |    0      | 
-|  1  |  1  |  0      |  1      |+|  1  |  1  |  0      |    1      |
  
 __ faire un schéma __ __ faire un schéma __
  
-4. Ecrire un additionner quatre bits. 
- 
-5. Ecrire un multiplicateur 4x4 bits. 
  
-6Ecrire un multiplexeur.+  * Écrire un additionneur quatre bits. 
 +  * Écrire un multiplicateur 4x4 bits. 
 +  * Écrire un multiplexeur.
  
-^ [[nombres_reels|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[virgule_fixe|Chapitre suivant]] ^+^ [[string|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[complex|Chapitre suivant]] ^
  
-{{tag> Cours C++}} 
boole_et_morgan.1437337689.txt.gz · Dernière modification: 2015/07/19 22:28 par winjerome