====== 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.