====== Expressions logiques ======
===== Exemple =====
"Un individu est un super-héros s'il a des super-pouvoirs ou des super-gadgets et si ce n'est pas un vilain."
On identifie ici :
* des booléens :
- "est un super-héros" -> SH
- "a des super-pouvoirs" -> SP
- "a des super-gadgets" -> SG
- "est un vilain" -> V
* des opérateurs logiques :
- "ou" -> or
- "et" -> and
- "ne... pas" -> not
On peut reformuler : SH = SP or SG and not V
Décider pour les cas suivants : Batman, Superman, le Joker, Magneto.
Pour l'instant L'expression est ambiguë : Il faudrait clarifier l'ordre dans lequel le calcul est fait, définir des priorités ou mettre des parenthèses.
- SH = (SP or SG) and (not V)
- SH = SP or (SG and (not V))
Dans notre exemple, nous voulons le parenthésage numéro 1
===== Opérateurs logiques =====
On peut prouver que les opérateurs ''or'', ''and'' et ''not'' suffisent à faire tout ce qui est nécessaire. Il faut donc très bien les comprendre.
==== not ====
''not a'' est vrai si et seulement si a est faux.
On peut représenter cela sous forme d'un tableau de vérité.
^ a ^ not a ^
| False | True |
| True | False |
Il est plus commode d'écrire 0 pour False et 1 pour True :
^ a ^ not a ^
| 0 | 1 |
| 1 | 0 |
==== or ====
''a or b'' est vrai si et seulement si au moins un parmi ''a'' et ''b'' est vrai.
On peut représenter cela sous forme d'un tableau de vérité.
^ a ^ b ^ a or b ^
| False | False | False |
| False | True | True |
| True | False | True |
| True | True | True |
Il est plus commode d'écrire 0 pour False et 1 pour True :
^ a ^ b ^ a or b ^
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
On peut généraliser au cas d'un ou à plus de 2 opérandes :
''%%a or b or c or d or ...%%'' est vrai si et seulement si au moins 1 des opérandes est vraie.
==== and ====
''a and b'' est vrai si et seulement si ''a'' et ''b'' sont tous les deux vrais.
On peut représenter cela sous forme d'un tableau de vérité.
^ a ^ b ^ a and b ^
| False | False | False |
| False | True | False |
| True | False | False |
| True | True | True |
Il est plus commode d'écrire 0 pour False et 1 pour True :
^ a ^ b ^ a and b ^
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
On peut généraliser au cas d'un ou à plus de 2 opérandes :
''%%a and b and c and d and ...%%'' est faux si et seulement si au moins 1 des opérandes est fausse.
===== Expressions =====
Comme on peut assembler des + et des - pour former une expression mathématique, on va pouvoir combiner des or, des and et des not pour former une expression logique.
On peut par exemple tester ces expressions en console :
>>> (True or True) and False
False
>>> True or (True and False)
True
>>> True or True and False
True
>>> not ( True and False ) and (False or True and True)
True
On décide, par convention, que ''not'' a la priorité d'exécution la plus élevée, ''and'' vient en second et ''or'' est le moins prioritaire. Autrement dit ''%%not a and b or c%%'' est équivalent à ''%%((not a) and b) or c%%''.
En Python, les opérateurs de comparaison sont prioritaires sur les opérateurs logiques. Ainsi,\\ ''%%(x >= 3) and (x < 10)%%'' <=> ''%%x >= 3 and x < 10%%''\\ Ce qui permet d'alléger grandement les expressions.