Introduction
Des robots sont utilisés dans une usine de construction de véhicules automobiles, et un défaut de fabrication a été relevé dans la production. Les trois robots concernés, xam, arg et bax sont dotés d'un module d'auto-diagnostic et d'un module de synthèse vocale et lors de leur passage à l'atelier pour la révision, ils font les assertions suivantes :
bax et arg sont dans le même état.
|
bax est défectueux.
|
xam et arg sont en bon état.
|
🤖 | 🤖 | 🤖 |
xam | arg | bax |
Quand un robot est défectueux, son diagnostic est toujours faux et quand il fonctionne, son diagnostic est toujours vrai. On sait qu'il y a au moins un robot défectueux et au moins un robot en bon état. Quel(s) robot(s) faut-il réparer ?
L'un des objectifs de ce chapitre est de présenter l'outillage nécessaire pour répondre à ce type de question (et beaucoup d'autres), et plus généralement d'étudier des éléments de logique qui sont indispensables dans tout cursus en informatique.
Les mathématiques poursuivent quatre grands objectifs :
Le mathématicien pur contestera peut-être cette vision appliquée. On peut en effet étudier des objets mathématiques sans autre motivation que la pratique stimulante d'un jeu intellectuel et sans qu'ils aient le moindre rapport avec une quelconque réalité. Pourtant la très grande majorité des théories mathématiques a pour origine des problèmes bien réels engendrant de nouveaux questionnements qui parfois s'épanouissent au sein de théories autonomes. La dichotomie entre mathématiques pures et appliquées n'a donc pas de raison d'être et si distinction il y a, les deux vivent depuis longtemps en parfaite symbiose.
Selon la théorie de l'évolution de Lamarck, la fonction créant l'organe, le langage mathématique s'est progressivement structuré pour que cette science puisse se développer suivant ces quatre axes. Les mathématiques s'imposent naturellement en informatique dès que l'on cherche à analyser un problème, à élaborer des méthodes de résolution et à valider les résultats obtenus. Le langage mathématique est constitué de plusieurs langages formels imbriqués utilisant des signes et des termes qui leur sont propres et contrairement aux langages informatiques, la langue naturelle reste indispensable pour animer la partition. Ce métalangage est totalement formaté par et pour le raisonnement.
Les règles de construction des mots, des phrases et plus généralement des langues naturelles qui occupent les grammairiens ont leur pendant en mathématiques et en informatique. Les mathématiciens se sont intéressés à la théorie de la démonstration dès le début du xxème siècle et les informaticiens à la théorie des langages dans les années 1950. Les questions sur la nature du calcul ont largement contribué aux interactions entre les deux disciplines dans le cadre de la théorie de la calculabilité et l'isomorphisme de Curry-Howard établit des liens formels entre une démonstration dans un système logique et un programme dans un modèle de calcul, autrement dit
Ce résultat ne sera probablement pas de nature à rassurer l'étudiant qui espérait trouver une échappatoire à l'étude des mathématiques, mais il met en évidence les liens profonds qui existent entre ces deux disciplines.
La principale différence entre une langue naturelle et le métalangage mathématique concerne les ambiguïtés et la justesse des propos. Les ambiguïtés sont inhérentes aux langues naturelles et sont d'ailleurs largement exploitées dans la rhétorique (allusions, sous-entendus, jeux de mots, sophismes, etc.) alors qu'elles sont bannies du langage mathématique et des langages de programmation. Il est indispensable de les lever dès qu'un énoncé peut être interprété de différentes façons :
C'est ce qui explique la nature particulière des textes mathématiques qui emploient des tournures de phrases rarement utilisées dans le langage commun, comme si et seulement si, deux-à-deux disjoints, un et un seul, non-vide, etc. La logique naturelle n'est pas tout à fait celle de la logique classique des mathé­matiques, il existe d'ailleurs des logiques mathématiques (dites non-classiques par opposition) dont certaines ont précisément pour objet d'être plus proches de celle que nous pratiquons au quotidien. Là aussi, il est nécessaire de clarifier certaines situations. Notons que les problèmes d'interprétation de la logique ne concernent pas que les mathématiques, mais parfois les tribunaux.
Pour baptiser les objets que l'informaticien/mathématicien construit, les mots sont choisis avec beaucoup de précaution et sont censés être en adéquation avec l'acception qu'ils ont communément. Pourtant certaines distorsions existent parfois entre le sens que nous donnons à un mot et celui qu'il a en mathématiques, ce qui peut être une source d'erreurs ou de confusion. D'autre part, certains mots désignent des objets mathématiques différents selon le contexte où ils sont employés. Il faut en être conscient et comprendre le rôle réellement capital des définitions qui précisent leur sens dans un environnement particulier. Ceci explique la structuration litanique des textes mathématiques en alternance de définitions et de théorèmes.
Pour commencer ce cours, nous allons étudier le socle logique des mathématiques et de l'informatique. Pour illustrer notre propos, nous aurons souvent besoin d'exemples qui intègrent des objets ou des notions que nous n'aurons pas encore définies formellement mais qui sont bien connues du lecteur, ou qui sont censées l'être. Ce n'est pas contraire à ce qui se fait dans tout apprentissage, la pratique de la conduite d'un véhicule est un atout pour en comprendre le fonctionnement. Dans la suite, si certains objets mathématiques sont construits à l'aide d'outils qui auraient dû être définis en aval, c'est pour ne pas compliquer inutilement l'exposé, cela sous-entend que ces outils ne sont pas eux-mêmes définis à l'aide de ces objets, ce qui créerait alors un cercle vicieux.
Calcul propositionnel
Nécessité d'un cadre formel
L'étymologie du mot logique dévoile les mots raison et langage. La logique est à la base de l'articulation du discours mathématique et du fonctionnement atomique d'un ordinateur, il n'y a rien de surprenant à ce qu'elle se soit épanouie sur le formidable terrain de jeu qu'est l'informatique où elle est omniprésente. Les combinaisons de propositions à l'aide de connecteurs logiques constituent la première strate du raisonnement mathématique et de la construction des circuits électroniques. Il s'agit d'un langage à part entière, c'est le langage du calcul propositionnel dont nous allons fixer les règles de composition. Nous aborderons d'abord les aspects mathématiques, le chapitre Calcul booléen en donnera une vision plus proche de l'informatique et de l'électronique avec l'algèbre de Boole, les fonctions booléennes et les circuits logiques.
De manière analogue aux langues naturelles, un énoncé mathématique ou un programme informatique doit respecter :
Pour commencer, nous allons mettre en évidence les problèmes liés à la sémantique de la logique en langue naturelle et qui vont nous amener à la reconsidérer dans le cadre du langage du calcul propositionnel.
Il est important de noter dans cette définition informelle qu'il est possible d'attribuer une valeur de vérité à une proposition. Une proposition n'a pas besoin d'une valeur de vérité pour être une proposition, d'autre part si valeur de vérité il y a, elle n'est pas consubstantielle à la proposition. Certains auteurs parlent d'assertion pour une proposition, mais nous préférons ici réserver ce terme pour désigner une proposition énoncée comme vraie. Une assertion est donc une affirmation, ce qui rend son usage conforme à l'acception de ce terme en français.
À titre d'exemples voici quelques énoncés dont certains sont des propositions, d'autres non pour cette définition :
L'énoncé #2 est une interrogation, l'énoncé #8 est absurde, l'énoncé #10 n'est pas correct syntaxiquement. On ne peut pas attribuer de valeur de vérité à l'énoncé #12 sans connaître la valeur de la variable numérique \(x\), il ne s'agit pas stricto sensu d'une proposition, on utilise dans ce cas le terme de prédicat ou d'énoncé contingent, qui est le centre d'étude du prochain chapitre.
Tous les autres énoncés sont des propositions, mais il n'est pas toujours possible de leur affecter une valeur de vérité sans autres considérations. En effet, la valeur de vérité de la proposition #1 dépend implicitement du contexte, le lieu et le moment, tout comme celle de la proposition #3 qui dépend du lecteur. Il est donc délicat de les considérer comme des propositions mathématiques stricto sensu. La proposition #4 est vraie pour peu que l'on admette les règles de représentation des nombres et que l'on connaisse les rudiments du calcul. Établir une valeur de vérité de la proposition #5 est illusoire (ce qui ruine au passage mes espoirs de postérité). La proposition #6 demande une certaine connaissance de l'arithmétique pour établir qu'elle est vraie. La proposition #7 est vraie du point de vue du logicien, mais peut sembler absurde, voire fausse pour le lecteur lambda. Les propositions #9 et #11 sont des paradoxes logiques, elles ne peuvent être vraies ou fausses sans créer une contradiction. Les paradoxes logiques émergent parfois quand il y a autoréférence, c'est-à-dire quand un énoncé fait référence à lui-même* Par exemple la proposition Je suis un menteur ne peut être vraie ou fausse sans aboutir à une contradiction. mais cela n'a rien de systématique, par exemple la proposition #13 est fausse.
Il apparaît que l'interprétation d'une proposition en langue naturelle n'est pas un exercice trivial, loin s'en faut. Toujours dans ce cadre, nous allons voir qu'il est également délicat d'analyser les énoncés contenant des connecteurs logiques pourtant omniprésents dans nos langues naturelles. Considérons les phrases suivantes :
Certains connecteurs peuvent avoir une signification différente selon le contexte. Le connecteur ou de la première phrase est inclusif, le second est exclusif et le troisième exprime une conséquence. La quatrième phrase laisse entendre qu'Alice est mariée avec Bob, mais ce n'est pas une certitude, il est donc difficile de lui attribuer une valeur de vérité. Le connecteur et de l'énoncé #5 code une énumération et pas une simple conjonction. De même, la conjonction de l'énoncé #6 induit une conséquence et celle de l'énoncé #8 induit une obligation.
En général les connecteurs logiques des langues naturelles ne sont pas vérifonctionnels. Supposons par exemple que la proposition Le facteur dépose le courrier et la proposition le chien aboie soient toutes deux vraies. Si la proposition Le facteur dépose le courrier donc le chien aboie est très certainement vraie, la proposition Le chien aboie donc le facteur dépose le courrier est probablement fausse. Ainsi, en logique naturelle, d'autres éléments que la valeur de vérité des propositions connectées interviennent pour fixer la valeur de vérité de leur composition. Dans le langage mathématique, les connecteurs doivent être vérifonctionnels. Cette exigence élémentaire peut créer une césure entre la logique naturelle et la logique mathématique.
En anticipant un peu sur l'étude des connecteurs logiques, la valeur de vérité d'une proposition contenant le connecteur logique d'implication peut suprendre, ainsi la proposition \[({\color{steelblue}1+2=3})\ \then\ {(\color{steelblue}\text{la Terre est ronde}})\] est vraie, alors qu'il n'y a aucun lien de cause à effet entre les deux propositions connectées qui sont toutes les deux vraies. Pire, la proposition \[ ({\color{steelblue}1+2=0})\ \then\ {(\color{steelblue}\text{la Terre est ronde}}) \] est également vraie, alors que l'expression \(1+2=0\) est fausse (si on considère l'addition des entiers naturels) !
Nous avons déjà constaté que la valeur de vérité d'une proposition n'est pas consubstantielle à sa structure et nous venons de mettre en évidence que les connecteurs logiques dans les énoncés en langue naturelle peuvent être difficiles à interpréter ou impropres à un usage mathématique. La manière la plus efficace de se débarrasser de ces problèmes consiste à éliminer dans un premier temps toute interprétation dans une proposition, elle devient une construction purement syntaxique. C'est une façon bien commode de procéder, on limite le champ d'investigation de la logique à des entités simples en les détachant de la réalité. C'est ce que nous faisons en permanence en mathématiques. Même pour un simple calcul comme \begin{equation} \label{expr:decimal} 2\times (5+93)=196. \end{equation} On ne se préoccupe ni de sa signification, ni de savoir si \(196\) représente une quantité, le poids d'une table ou la hauteur d'un immeuble, seule l'application correcte de l'addition et de la multiplication dans l'expression abstraite importe. Le distinguo entre la syntaxe et la sémantique de l'expression \(196\) est peut-être difficile à percevoir pour le lecteur car la confusion a été volontairement entrenue par les règles de lecture d'un nombre (ici cent-quatre-vingt-seize) où le chiffre le plus significatif est intégré avant les autres afin d'assurer la perception rapide d'une mesure au lieu d'égrener les chiffres un, neuf, six. On encapsule ainsi forme et fond. C'est la raison exacte de l'apprentissage de la lecture des mots et des nombres, l'objectif est précisément de ne plus avoir à les déchiffrer (toujours cette analogie avec les nombres !) pour en saisir le sens. En remplaçant l'écriture des nombres en base 10 par leur écriture en chiffres romains, on fait ressurgir la séparation entre syntaxe et sémantique :
\begin{equation} \label{expr:romain} \text{II}\times\text{(V}+\text{XCIII)}=\text{CXCVI} \end{equation}La lecture des 5 chiffres romains CXCVI n'évoque pas mentalement la quantité que nous percevons sans peine sous forme décimale \(196\), et pourtant les deux représentations codent exactement le même nombre.
La conclusion de cette section est que la logique propositionnelle en mathématiques est bien plus contrainte que la logique en langue naturelle et ne recouvre qu'une partie de cette dernière. C'est le prix à payer pour la rigueur et lever toute ambiguïté.
Syntaxe du calcul propositionnel
Concentrons-nous pour le moment sur les aspects lexicaux et syntaxiques du langage, nous reviendrons sur l'aspect sémantique un peu plus loin. Il faut tout d'abord disposer d'un lexique de symboles — un alphabet — pour composer une proposition. Ces symboles sont répartis selon quatre catégories :
Passons à la syntaxe. À partir des variables propositionnelles, on peut créer de nouvelles expressions grâce aux connecteurs logiques qui les mettent en relation dans une formule (nous définirons précisément ce terme plus bas).
À l'instar de l'expression arithmétique \(2(x+1)+y\) contenant deux variables \(x\) et \(y\), la valeur d'une formule est fonction* dépend des valeurs des variables propositionnelles qu'elle contient. Les variables propositionnelles ne pouvant prendre qu'un nombre fini de valeurs (\(\top\) ou \({\bot}\)), un connecteur logique est entièrement caractérisé par les différentes valeurs possibles de l'expression suivant les valeurs des variables qu'il connecte. Notons que l'on ne peut pas caractériser les opérateurs arithmétiques de cette manière, l'addition dans \(\def\Z{{\Bbb Z}}\Z\) par exemple, car l'ensemble des valeurs possibles des variables est infini.
Il n'est pas nécessaire d'étudier l'analyse combinatoire, pour vérifier qu'il y a \(2^q\) combinaisons possibles pour les valeurs des \(q\) variables propositionnelles d'un connecteur \(q\)-aire, et donc \(2^{2^q}\) façons différentes de définir un connecteur \(q\)-aire. En effet pour chacune des \(2^q\) valeurs possibles du \(q\)-uplet constitué des \(q\) variables, l'expression peut prendre \(2\) valeurs distinctes \(\top\) ou \({\bot}\).
Considérons pour commencer les \(2^{2^1}=4\) connecteurs unaires possibles \(\star_i\) regroupés dans la table ci-dessous.
\(P\) | \(\star_1\) | \(\star_2\) | \(\star_3\) | \(\star_4\) |
\(\bot\) | \(\bot\) | \(\bot\) | \(\top\) | \(\top\) |
\(\top\) | \(\bot\) | \(\top\) | \(\bot\) | \(\top\) |
Les connecteurs unaires \(\star_1\) et \(\star_4\) sont constants et l'expression \(\star_2\;P\) prend exactement les mêmes valeurs que \(P\), le connecteur \(\star_2\) est ainsi l'identité. Le seul connecteur qui ne soit pas trivial est donc \(\star_3\), c'est la négation logique que l'on notera \(\neg\).
Passons aux \(2^{2^2}=16\) connecteurs binaires possibles \(\diamond_j\) et observons ceux qui présentent un intérêt particulier :
\(P\) | \(Q\) | \(\diamond_1\) | \(\diamond_2\) | \(\diamond_3\) | \(\diamond_4\) | \(\diamond_5\) | \(\diamond_6\) | \(\diamond_7\) | \(\diamond_8\) | \(\diamond_9\) | \(\diamond_{10}\) | \(\diamond_{11}\) | \(\diamond_{12}\) | \(\diamond_{13}\) | \(\diamond_{14}\) | \(\diamond_{15}\) | \(\diamond_{16}\) |
\(\bot\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\top\) | \(\top\) | \(\top\) | \(\top\) | \(\top\) | \(\top\) | \(\top\) | \(\top\) |
\(\bot\) | \(\top\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\top\) | \(\top\) | \(\top\) | \(\top\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\top\) | \(\top\) | \(\top\) | \(\top\) |
\(\top\) | \(\bot\) | \(\bot\) | \(\bot\) | \(\top\) | \(\top\) | \(\bot\) | \(\bot\) | \(\top\) | \(\top\) | \(\bot\) | \(\bot\) | \(\top\) | \(\top\) | \(\bot\) | \(\bot\) | \(\top\) | \(\top\) |
\(\top\) | \(\top\) | \(\bot\) | \(\top\) | \(\bot\) | \(\top\) | \(\bot\) | \(\top\) | \(\bot\) | \(\top\) | \(\bot\) | \(\top\) | \(\bot\) | \(\top\) | \(\bot\) | \(\top\) | \(\bot\) | \(\top\) |
Les deux connecteurs binaires \(\diamond_{1}\) et \(\diamond_{16}\) sont constants, les connecteurs \(\diamond_{4}\) et \(\diamond_{13}\) ne dépendent que de la valeur du premier opérande \(P\) et les connecteurs \(\diamond_{6}\) et \(\diamond_{11}\) ne dépendent que de la valeur du deuxième opérande \(Q\). Ces \(6\) opérateurs ont donc peu d'intérêt, mais il en reste malgré tout 10. Sept d'entre eux sont baptisés car ils sont communément utilisés en Mathématiques et/ou en Informatique et/ou en Électronique. On a finalement huit connecteurs utiles, un seul connecteur unaire et sept connecteurs binaires, et selon le contexte ou la discipline, on en utilise tout ou partie :
Connecteur | Nom | Symbole | Lecture | Usage |
\(\star_3\) | négation | \(\neg\) | non | M|I|É |
\(\diamond_2\) | conjonction | \(\wedge\) | et | M|I|É |
\(\diamond_8\) | disjonction | \(\vee\) | ou | M|I|É |
\(\diamond_{14}\) | implication | \(\Rightarrow\) | implique | M|I |
\(\diamond_{10}\) | équivalence | \(\Leftrightarrow\) | équivalent | M|I |
\(\diamond_{7}\) | disjonction exclusive | \(\veebar\) | ou exclusif | I|É |
\(\diamond_{15}\) | non conjonction | \(\uparrow\) | non et | I|É |
\(\diamond_{9}\) | non disjonction | \(\downarrow\) | non ou | I|É |
Quand un connecteur est placé avant ses opérandes, on dit qu'il est en notation préfixe, c'est le cas de l'opérateur unaire de négation \(\neg\). Quand un connecteur est placé après ses opérandes, on dit qu'il est en notation postfixe. Par exemple la transposée d'une matrice \(A\) est généralement écrite sous forme postfixe \(A^t\) bien que l'écriture préfixe \({}^t\!A\) soit également très commune. Quand l'opérateur est binaire et qu'il est placé entre les deux opérandes, on dit qu'il est en notation infixe et c'est généralement cette notation qui est employée en logique propositionnelle, on écrit donc plus volontiers \(P\Rightarrow Q\) que \(P\ Q\ \Rightarrow\), bien que la notation postfixe soit très utilisée en informatique, elle permet en effet de se passer des parenthèses et d'évaluer très facilement une expression (ce point sera étudié en cours d'algorithmique de deuxième année).
On dispose à présent d'une définition formelle d'une proposition qui est donc une formule de la logique propositionnelle.
Analyse d'une formule
Une expression comme \begin{equation} \label{eq:ex1} ((P\Rightarrow Q) \wedge (P\vee \neg R)) \end{equation} est suffisamment courte pour qu'une simple lecture suffise à nous convaincre qu'il s'agit bien d'une formule de la logique propositionnelle. Les exercices que l'on peut traiter à la main en mathématiques dans ce domaine se préoccupent rarement de ce type de question, c'est le calcul littéral qui est privilégié. C'est une tout autre histoire en informatique, c'est une machine qui doit analyser de telles expressions et elles ne se limitent pas à une poignée de symboles.
Avant même d'automatiser le processus, problème qui sera abordé en théorie des langages, il faut savoir démontrer qu'une expression est bien formée. Il faut être en mesure de décrire comment elle a été construite à partir des \(5\) règles fournies dans la définition d'une formule. On peut partir du bas avec les atomes et les constantes en construisant successivement de nouvelles formules (analyse ascendante) jusqu'à obtenir la formule souhaitée, ou du haut, en décomposant la formule et en recommençant sur chaque sous-formule (analyse descendante).
Voici une séquence de règles possible en analyse ascendante. À chaque étape, on définit une nouvelle formule qui sera exploitée dans la construction des formules suivantes. La règle appliquée est indiquée au-dessus de l'affectation : \begin{align*} f_1&\ {\color{#FF8}\overset{R_1}{\leftarrow}}\ P\\ f_2&\ {\color{#FF8}\overset{R_1}{\leftarrow}}\ Q\\ f_3&\ {\color{#FF8}\overset{R_5}{\leftarrow}}\ (f_1\then f_2)\\ f_4&\ {\color{#FF8}\overset{R_1}{\leftarrow}}\ R\\ f_5&\ {\color{#FF8}\overset{R_4}{\leftarrow}}\ \neg f_4\\ f_6&\ {\color{#FF8}\overset{R_5}{\leftarrow}}\ (f_1\vee f_5)\\ f_7&\ {\color{#FF8}\overset{R_5}{\leftarrow}}\ (f_3\wedge f_6)\\ \end{align*}
Voici une séquence de règles possible en analyse descendante. À chaque étape, un cadre numéroté indique la règle qui décompose la sous-formule : \begin{align*} &\boxed{{\color{#FFF}formule}}_{\;5}\\ (\boxed{{\color{#FFF}formule}}_{\;5}&\wedge{\color{#FFF}formule})\\ (({\boxed{{\color{#FFF}formule}}}_{\;1} \Rightarrow{\color{#FFF}formule})&\wedge{\color{#FFF}formule})\\ ((P \Rightarrow {\boxed{{\color{#FFF}formule}}_{\;1}})&\wedge {\color{#FFF}formule})\\ ((P \Rightarrow Q)&\wedge {\boxed{{\color{#FFF}formule}}_{\;5}})\\ ((P \Rightarrow Q)&\wedge ({\boxed{{\color{#FFF}formule}}_{\;1}}\vee{\color{#FFF}formule}))\\ ((P \Rightarrow Q)&\wedge (P\vee {\boxed{{\color{#FFF}formule}}_{\;4}}))\\ ((P \Rightarrow Q)&\wedge (P\vee \neg {\boxed{{\color{#FFF}formule}}_{\;1}}))\\ ((P \Rightarrow Q)&\wedge (P\vee \neg R)) \end{align*}
Sauf cas particuliers, il existe plusieurs séquences de règles possibles pour établir une formule. Une telle séquence de règles s'appelle une dérivation de la formule. La représentation d'une formule à l'aide d'un arbre de dérivation permet de mieux comprendre sa structure. C'est un arbre schématisé dont le principe de construction est simple et inductif. Une formule avec un connecteur \(q\)-aire est représentée à l'aide de \(q+1\) nœuds dans cet arbre, le connecteur est placé à la racine de l'arbre qui est reliée à chacun des \(q\) opérandes dans l'ordre de leur apparition dans la formule.
Les deux arbres suivants représentent respectivement une formule avec un connecteur unaire et son opérande et une formule avec un connecteur binaire et ses deux opérandes (les arbres sont dits unaire et binaire) :
Vous pouvez modifier la formule propositionnelle ci-dessus pour tracer son arbre de dérivation. Faute de symboles dédiés pour les connecteurs logiques sur le clavier, on les code comme suit : \[\displaystyle \frac{\neg}{\color{steelblue}!}\quad\frac{\then}{\color{steelblue}\gt}\quad\frac{\iff}{\color{steelblue}=}\quad \frac{\vee}{\color{steelblue}+}\quad\frac{\wedge}{\color{steelblue}*}\quad\frac{\veebar}{\color{steelblue}\#} \] et les lettres de l'alphabet codent les variables propositionnelles.
Si une formule peut admettre plusieurs dérivations, elle n'a qu'un seul arbre de dérivation, ce qui justifie l'emploi du singulier défini. Comme pour les opérations arithmétiques, on décide de certaines priorités pour simplifier les écritures. La négation est prioritaire sur la conjonction qui est prioritaire sur la disjonction, elle-même prioritaire sur l'implication. Néanmoins, il est hautement préférable d'écrire toutes les parenthèses, l'expérience prouve qu'elles facilitent beaucoup plus souvent la lecture qu'elles ne la compliquent. On simplifie malgré tout les formules en omettant les parenthèses aux extrémités, la formule simplifiée de \((\ref{eq:ex1})\) s'écrit \((P\Rightarrow Q) \wedge (P\vee \neg R).\)
Effectivement, dans ces deux graphes, les relations entre éléments matérialisées par des arcs sont strictement égales (vous pourrez en faire la preuve à titre d'exercice en définissant l'ensemble sur lequel sont définis les graphes de ces deux relations une fois cette partie du cours étudiée)* ils le sont également du point de vue topologique.. Néanmoins, il s'agit ici d'une représentation avec une sémantique, elle met en particulier en évidence la position des opérandes gauche et droit de part et d'autre d'un opérateur binaire comme l'implication \(\Rightarrow\). Autrement dit, la représentation à gauche ne fournit pas la même information que celle de droite compte tenu des conventions de représentation des arbres de dérivation. Je doute échapper à une contravention pour conduite à contresens en prétextant que les deux panneaux à sens unique ⬆ et ⬇ sont égaux…
Analogie avec un langage de programmation
Comme nous l'avons précisé en introduction, les mathématiques s'expriment grâce à un empilement de langages, celui de la logique propositionnelle étant le premier et le plus simple d'entre eux. On retrouve cette hiérarchie dans les langages de programmation eux même empilement de plusieurs langages et la logique propositionnelle en fait généralement partie, comme c'est le cas en Python.
Bien sûr, l'écriture des programmes informatiques passant par l'usage d'un clavier avec un alphabet restreint, le lexique du langage de la logique propositionnelle est nécessairement différent de celui des mathématiques et les symboles représentant les connecteurs logiques sont remplacés par leurs noms en toutes lettres, or pour \(\vee\), and pour \(\wedge\), etc. Mais, au même titre que le langage de la logique propositionnelle est un sous-langage du langage mathématique, le langage de la logique propositionnelle est un sous-langage du Python.
Par exemple dans la formule \(P\vee (Q\wedge R)\), les variables propositionnelles \(P\), \(Q\) et \(R\) sont codées en Python par les trois objets de type booléen P, Q et R et la formule homologue est P or (Q and P).
Ce n'est pas le seul sous-langage mathématique qui a été transposé en Python, celui de l'arithmétique l'a été également avec quelques bouleversements mineurs sur le lexique et la syntaxe pour les mêmes raisons de limitation du clavier. La multiplication \(\times\) est codée par le symbole * en Python par exemple.
Sémantique du calcul propositionnel
Revenons à la sémantique. Il s'agit d'attribuer un sens à une formule, on veut l'interpréter. Seules deux valeurs logiques sont possibles, vrai ou faux, c'est la valeur de vérité de la formule. Une interprétation est donc une fonction \(I:{\mathscr F}\rightarrow \{vrai,\;faux\}\) de l'ensemble des formules propositionnelles \(\mathscr F\) dans l'ensemble* Les termes ensemble et fonction ne sont pas définis formellement à ce stade mais la vision naïve est suffisante ici. \(\{vrai,\;faux\}.\)
Les règles qui permettent d'attribuer un sens aux formules doivent être cohérentes avec les règles de construction syntaxique. La fonction d'interprétation \(I\) est définie en fixant arbitrairement une valeur de vérité \(vrai\) ou \(faux\) à chacune des variables propositionnelles. C'est la seule marge de manœuvre dont on dispose si l'on décide que les constantes \(\top\) et \(\bot\) (objets syntaxiques) sont interprétées respectivement comme les valeurs logiques \(vrai\) et \(faux\) (objets sémantiques), c'est-à-dire \(I(\top):=vrai\) et \(I(\bot):=faux\) et que la fonction d'interprétation d'une formule se conforme aux tables de vérité des connecteurs logiques. Ainsi pour respecter la cohérence entre syntaxe et sémantique, l'interprétation des différentes variables propositionnelles qui sont impliquées dans une formule fixe l'interprétation de la formule.
Une formule de la logique propositionnelle est bien une proposition au sens de cette définition informelle. Nous pouvons donc employer le terme proposition pour désigner une formule de la logique propositionnelle.
En remplaçant \(\top\) par \(vrai\) et \(\bot\) par faux dans les tables des connecteurs logiques, on obtient leurs tables de vérité. Nous avons regroupé les 7 tables de vérité des connecteurs logiques binaires dans un unique tableau et avons résumé les valeurs de vérité vrai et faux par \(V\) et \(F\) respectivement pour plus de lisibilité.
|
|
La table de vérité d'une formule contient ses valeurs de vérité pour toutes les combinaisons possibles des variables propositionnelles qu'elle contient. La table de vérité de la formule \(((P\Rightarrow Q) \wedge (P\vee \neg R))\) est donnée ci-dessous et pour faciliter la compréhension, les deux sous-formules de cette conjonction y sont présentes également :
\(P\) | \(Q\) | \(R\) | \(\ P\Rightarrow Q\ \) | \(\ P\vee\neg R\ \) | \(\ (P\Rightarrow Q)\wedge( P\vee\neg R\ )\) | |
F | F | F | V | V | V | |
F | F | V | V | F | F | |
\(\color{#AA88FF}{I}\quad \) | F | V | F | V | V | V |
F | V | V | V | F | F | |
V | F | F | F | V | F | |
V | F | V | F | V | F | |
V | V | F | V | V | V | |
V | V | V | V | V | V |
Comment construit-on effectivement une table de vérité ? L'algorithme est simple, on se donne tout d'abord une interprétation \(\color{#AA88FF}{I}\) pour remplacer chaque variable propositionnelle \(P\) — donc chaque feuille de l'arbre de dérivation (sur fond gris dans les exemples) — par sa valeur de vérité \(I(P)\), puis on applique inductivement les deux opérations suivantes sur l'arbre de dérivation :
On montre aisément que pour toute proposition \(P\), on a \begin{equation}\label{eq:neg} \neg(\neg P)\ \equiv\ P \end{equation} et que deux propositions \(P\) et \(Q\) peuvent être échangées sans rien changer aux tables de vérités des formules \(P \vee Q\) et \(P\wedge Q\), autrement dit que les connecteurs logiques de disjonction et de conjonction sont commutatifs : \begin{align}\label{eq:comou} P \vee Q\ &\equiv\ Q\vee P\\ P \wedge Q\ &\equiv Q\wedge P\label{eq:comet} \end{align}
D'autre part, on a les deux équivalences logiques suivantes, qui sont souvent utilisées en mathématiques pour définir les connecteurs d'implication et d'équivalence à partir des trois connecteurs de négation, de conjonction et de disjonction : \begin{align}\label{eq:implique} P\Rightarrow Q&\ \equiv\ \neg{P}\vee Q\\ P\Leftrightarrow Q&\ \equiv\ (P\Rightarrow Q) \wedge (Q\Rightarrow P)\label{eq:eq} \end{align}
Nous verrons plus bas que le connecteur d'implication \(\Rightarrow\) n'est pas commutatif, alors que la commutativité du connecteur \(\wedge\) entraîne celle du connecteur \(\Leftrightarrow\) d'équivalence.
On peut se demander pourquoi nous n'avons pas étudié d'autres opérateurs que les opérateurs unaires et binaires ? Le théorème suivant et son corollaire fournissent une justification.
Nous verrons au chapitre sur le calcul booléen que l'on peut obtenir un résultat plus fort encore et que l'on peut se contenter d'un unique opérateur binaire. Mais le mathématicien savait déjà que l'on pouvait se contenter des trois connecteurs \(\neg\), \(\wedge\) et \(\vee\) pour tout exprimer.
\(P\) | \(Q\) | \(R\) | \(\Rrightarrow\) |
\(\bot\) | \(\bot\) | \(\bot\) | \(\bot\) |
\(\bot\) | \(\bot\) | \(\top\) | \(\top\) |
\(\bot\) | \(\top\) | \(\bot\) | \(\bot\) |
\(\bot\) | \(\top\) | \(\top\) | \(\top\) |
\(\top\) | \(\bot\) | \(\bot\) | \(\bot\) |
\(\top\) | \(\bot\) | \(\top\) | \(\bot\) |
\(\top\) | \(\top\) | \(\bot\) | \(\top\) |
\(\top\) | \(\top\) | \(\top\) | \(\top\) |
Déduction et connecteur d'implication
Nous allons étudier de plus près le connecteur logique d'implication (\(\then\)) et expliciter son rôle dans les mécanismes déductifs en mathématiques.
Observons sa table de vérité :
\(P\) | \(Q\) | \(\ P\Rightarrow Q\ \) |
F | F | V |
F | V | V |
V | F | F |
V | V | V |
Pour s'assurer que la proposition \(\color{#FF8}P\then Q\) est vraie, il suffit de vérifier que si \(P\) est vraie alors \(Q\) n'est pas fausse pour éliminer la troisième interprétation de la table. Dans les \(3\) autres cas, il n'y a rien à faire, cette proposition est toujours vraie. Si la proposition \(\color{#FF8}P\then Q\) est vraie, cela ne nous donne pas d'information sur la valeur de vérité de la proposition \(P\) ni de la proposition \(Q\). En effet \(\color{#FF8}P\then Q\) peut être vraie, que \(P\) (resp. \(Q\)) soit vraie ou fausse. On ne déduit rien de la seule véracité d'une implication.
Plus troublant, la proposition \((0=1)\Rightarrow (3\ \text{est pair})\) est vraie (cependant, si l'on se souvient que \((P\then Q)\equiv(\neg P\vee Q)\), la proposition \((0=1)\Rightarrow (3\ \text{est pair})\) est logiquement équivalente à la proposition \((0\not=1)\vee (3\ \text{est pair})\), ce qui est déjà moins troublant.) Le mot implication dans la langue naturelle induit une relation de cause à effet entre \(P\) et \(Q\) que l'on interprète comme une déduction, ce que ne dit pas l'assertion \(P\Rightarrow Q\). Les connecteurs logiques établissent des liens de corrélation entre les propositions \(P\) et \(Q\) et non des liens de causalité. Il y donc de bonnes raisons de ne pas interpréter le symbole \(\Rightarrow\) comme le mot donc en français.
Ceci nous amène à nous interroger légitimement sur le choix du mot implication pour qualifier ce connecteur logique, puisqu'il a sans conteste un sens déductif en français. Continuons nos investigations.
On peut se convaincre que le connecteur d'implication tel qu'il est défini en logique propositionnelle est le meilleur choix parmi les 16 connecteurs logiques binaires pour approximer son homologue en langue naturelle. En effet, la valeur de vérité de l'implication \(P\then Q\) ne peut pas dépendre exclusivement de \(P\), ni exclusivement de \(Q\) et le connecteur n'est manifestement pas commutatif, il ne reste alors que les connecteurs \(\diamond_3\), \(\diamond_5\), \(\diamond_{12}\) ou \(\diamond_{14}\) et uniquement \(\diamond_{14}\) si l'on admet que si \(P\) est vrai \(P\then Q\) doit avoir la valeur de \(Q.\)
Revenons à la table de vérité de l'implication. On observe que si \(P\then Q\) est vraie et que \(P\) l'est également, alors nécessairement la proposition \(Q\) est vraie. La règle ci-dessous décrit le rôle de la proposition \(P\Rightarrow Q\) dans le processus déductif et donne un sens précis aux mots donc ou alors dans le discours mathématique. La déduction logique est symbolisée par le signe \(\vdash\) (ou \(\therefore\)) séparant les prémisses (ou hypothèses) \(P\) et \(P\Rightarrow Q\), du conséquent (ou conclusion) \(Q\).
Ces notations sont largement utilisées dans l'étude des systèmes de décision, des logiques non classiques, en théorie de la démonstration, en intelligence artificielle, etc.
La proposition \(Q\Rightarrow P\) est appelée implication réciproque de l'implication \(P\Rightarrow Q\). Ce n'est pas sa négation, en effet
\begin{align*} \neg(P\Rightarrow Q)\ &\equiv\ \neg(\neg P\vee Q)\quad\text{d'après \((\ref{eq:implique})\)}\\ &\equiv\ (\neg(\neg P))\wedge\neg Q\quad\text{d'après \((\ref{eq:morganou})\)}\\ &\equiv\ P\wedge\neg Q\quad\text{d'après \((\ref{eq:neg})\)}\\ \end{align*}Pour vérifier une équivalence, d'après la définition \((\ref{eq:eq})\) il faut démontrer les deux implications \(P\Rightarrow Q\) et \(Q\Rightarrow P\), autrement dit que \(P\) est une condition nécessaire et suffisante de \(Q\) (ou réciproquement), ce que l'on énonce souvent en disant \(P\) si et seulement si \(Q\).
Il est aisé de vérifier les deux équivalences logiques qui suivent en construisant les tables de vérités des assertions qui les constituent et qui portent le nom du mathématicien* Augustus De Morgan était un mathématicien britannique du 19ème siècle. qui les a énoncées.
L'antilogie la plus simple est bien sûr \(P\wedge\neg P\).
On cherche bien sûr à éviter les théories mathématiques qui contiennent des paradoxes.
Les trois tautologies suivantes sont très utilisées pour construire des démonstrations mathématiques :
− La non contradiction : \(\neg(P\wedge \neg P)\)
− Le tiers exclu : \(P\vee \neg P,\)
− L'analyse de cas : \((P\then Q)\wedge(\neg P\then Q)\iff Q,\)
La non contradiction \(\neg(P\wedge \neg P)\) exprime qu'une proposition et sa négation ne peuvent être vraies simultanément, on ne veut pas de paradoxes. Elle permet d'élaborer une stratégie de démonstration dite démonstration par l'absurde. Plutôt que de montrer qu'une proposition \(P\) est vraie, on suppose qu'elle est fausse pour en déduire la contradiction \(P\wedge \neg P\) invalidant l'hypothèse et permettant de conclure que \(P\) est vraie grâce au tiers exclu. Ainsi un inspecteur qui suppose qu'un cambrioleur est passé par une fenêtre et après investigation, ne trouve aucune trace d'effraction sur cette fenêtre, conclura que son hypothèse était absurde et en déduira que le cambrioleur est entré par un autre moyen.
Le tiers exclu \(\neg(P\vee \neg P)\) exprime qu'une proposition ou sa négation doit être vraie, autrement dit que l'on exclut une troisième possibilité*. La logique intuitionniste rejette le tiers exclu et par conséquent le raisonnement par l'absurde. Notons que la non contradiction et le tiers exclu sont la négation l'une de l'autre d'après les lois de De Morgan \((\ref{eq:morganou})\) et \((\ref{eq:morganet})\). La troisième exprime le fait que c'est l'interprétation de \(Q\) qui fixe la valeur de vérité de la conjonction, quelle que soit l'interprétation de \(P\).
L'analyse de cas \((P\then Q)\wedge(\neg P\then Q)\iff Q\) exprime le fait que \(P\) soit vrai ou non, \(Q\) est vrai.
Après avoir plaidé coupable pour avoir vendu plus de 50 grammes de méthamphétamine, le requérant était confronté à une peine minimale obligatoire de 15 ans de prison. Lors du procès, il a cherché à bénéficier d'une disposition de remise de peine inscrite dans la loi fédérale et qui permet à un tribunal de ne pas infliger ce minimum statutaire si l'accusé remplit certains critères. L'un de ces critères exige qu'antérieurement, l'accusé n'a pas :
Le gouvernement a soutenu que le requérant ne satisfaisait pas cette exigence car il avait deux infractions antérieures de \(3\) points totalisant \(6\) points d'antécédents criminels. Selon le gouvernement, chacune de ces infractions antérieures le disqualifiait en vertu de la condition B et les \(6\) points au total le disqualifiaient en vertu de la condition A. Mais le requérant affirmait qu'il restait éligible en soulignant que son casier judiciaire ne comportait pas d'infraction violente de deux points, comme spécifié en C. Et selon lui, seule la combinaison des conditions du texte choisie par le gouvernement l'empêchait d'obtenir cette dispense de peine.
Autrement dit, dans le langage de la logique propositionnelle, le requérant affirmait que l'interprétation du texte de loi par le gouvernement était la formule \begin{equation}\label{eq:pulsifier} (\neg A)\;{\color{orange}\wedge}\;(\neg B)\;{\color{orange}\wedge}\;(\neg C), \end{equation} qui l'empêchait de bénéficier de la remise de peine et qu'il fallait en fait l'interpréter par la formule \[ \neg(A\;{\color{orange}\wedge}\;B\;{\color{orange}\wedge}\;C) \] qui, d'après les lois de De Morgan, était logiquement équivalente à \[ (\neg A)\;{\color{orange}\vee}\;(\neg B)\;{\color{orange}\vee}\;{\color{#FF8}(\neg C)} \] et qu'il satisfaisait puisqu'il n'avait pas commis d'infraction violente de 2 points antérieurement. Le gouvernement américain, qui a gagné malgré tout, a dû argumenter pour établir que le texte ne pouvait être interprété que par la conjonction \((\ref{eq:pulsifier})\) des trois négations des conditions. Voir Pulsifier v. United States.
Propriétés des connecteurs logiques
En guise de référence rapide, on regroupe ici les propriétés les plus importantes des connecteurs logiques. Soit \(P\), \(Q\) et \(R\) des propositions. AlorsCommutativité de \(\wedge\) et \(\vee\) : \( (P\wedge Q)\equiv (Q\wedge P)\ \text{et}\ (P\vee Q)\equiv (Q\vee P). \)
Associativité de \(\wedge\) et \(\vee\) : \( ((P\wedge Q)\wedge R)\equiv (P\wedge(Q\wedge R))\ \text{et}\ ((P\vee Q)\vee R)\equiv (P\vee(Q\vee R)). \)
Idempotence de \(\wedge\) et \(\vee\) : \( (P\wedge P)\equiv P\ \text{et}\ (P\vee P)\equiv P. \)
Lois de De Morgan : \( \neg(P\wedge Q)\equiv (\neg P\vee\neg Q)\ \text{et}\ \neg(P\vee Q)\equiv (\neg P\wedge\neg Q) \)
Distributivité : \( (P\wedge(Q\vee R))\equiv ((P\wedge Q)\vee (P\wedge R))\ \text{et}\ (P\vee(Q\wedge R))\equiv ((P\vee Q)\wedge (P\vee R)). \)
Absorption : \( (P\wedge(P\vee Q))\equiv P\ \text{et}\ (P\vee(P\wedge Q))\equiv P. \)
Éléments neutres : \( (P\wedge V)\equiv P\ \text{et}\ (P\vee F)\equiv P. \)
Éléments absorbants : \( (P\vee V)\equiv V\ \text{et}\ (P\wedge F)\equiv F. \)
Transitivité de l'implication : \( ((P\then Q)\wedge(Q\then R))\then(P\then R). \)
Formalisation des problèmes et raisonnement
Les robots
Nous pouvons à présent étudier le problème de robots que nous avons présenté en introduction. On rappelle qu'un robot en bon état (resp. défectueux), fait toujours un bon (resp. mauvais) diagnostic et que les trois robots font les affirmations suivantes :
bax et arg sont dans le même état.
|
bax est défectueux.
|
xam et arg sont en bon état.
|
🤖 | 🤖 | 🤖 |
xam | arg | bax |
On introduit les variables propositionnelles \(\color{#FF8}X\), \(\color{#F44}B\) et \(\color{#88F}A\) définies par
Si l'on observe la table de vérité du connecteur d'équivalence \(\iff\), on note que \(P\iff Q\) est vrai si et seulement si les deux variables \(P\) et \(Q\) ont la même valeur de vérité, c'est-à-dire si les deux sont vraies ou si les deux sont fausses (on en déduit au passage que \((P\iff Q)\equiv(P\wedge Q)\vee (\neg P\wedge\neg Q)\)). On formalise alors les propositions de xam, arg et bax respectivement par :
Il faut également traduire l'hypothèse qui dit qu'un robot en bon état fait toujours un bon diagnostic et qu'un robot défectueux fait toujours un mauvais diagnostic. Autrement dit, les propositions \(X\) (resp. \(A\) et \(B\)) et \(P_X\) (resp. \(P_A\) et \(P_B\)) ont la même valeur de vérité, ce qui se traduit par la formule \begin{equation} \label{formrobot} {\mathscr F}:=({\color{#FF8}P_X}\iff {\color{#FF8}X})\wedge({\color{#F44}P_A}\iff {\color{#F44}A})\wedge({\color{#88F}P_B}\iff {\color{#88F}B}). \end{equation}
On construit ensuite la table de vérité des trois propositions \({\color{#FF8}P_X}\), \({\color{#F44}P_A}\) et \({\color{#88F}P_B}\) ainsi que celle de la formule \(\mathscr F\) :
\({\color{#FF8}P_X}\) | \({\color{#F44}P_A}\) | \({\color{#88F}P_B}\) | |||||
\(\color{#FF8}X\) | \(\color{#F44}A\) | \(\color{#88F}B\) | \({\color{#FF8}(A\iff B)}\) | \({\color{#F44}\neg B}\) | \({\color{#88F}(X\wedge A)}\) | \(\mathscr F\) | |
1 | F | F | F | V | V | F | F |
2 | F | F | V | F | F | F | F |
3 | F | V | F | F | V | F | V |
4 | F | V | V | V | F | F | F |
5 | V | F | F | V | V | F | F |
6 | V | F | V | F | F | F | F |
7 | V | V | F | F | V | V | F |
8 | V | V | V | V | F | V | F |
Comme on peut le constater, seule l'interprétation #3 satisfait la formule \((\ref{formrobot})\), il faut donc réparer xam et bax.
Le logicien amoureux
Traitons un deuxième exemple. On interroge un logicien, qui dit toujours la vérité, sur sa vie sentimentale et il affirme :On peut traduire ces deux assertions en formules propositionnelles. Pour cela on définit les variables propositionnelles \(A\) et \(M\) qui sont interprétées de la manière suivante :
La proposition (a) se traduit par \(M\vee A\) et la proposition (b) par \(M\then A\). On construit leurs tables de vérité :
\(A\) | \(M\) | \(M\vee A\) | \(M\then A\) |
F | F | F | \(V\) |
F | \(V\) | \(V\) | F |
\(V\) | F | \(V\) | \(V\) |
\(V\) | \(V\) | \(V\) | \(V\) |
Les deux dernières lignes de cette table de vérité (les seules qui assurent que les assertions du logicien sont vraies) montrent que le logicien aime nécessairement Anne mais on ne sait rien de plus au sujet de la nature de sa relation avec Marie. Il nous faut donc un complément d'information pour conclure. À la question Est-il vrai que si vous aimez Marie, alors vous aimez Anne ?, le logicien répond*Notez que cette demande de confirmation de (b) était en soi inutile puisque le logicien dit toujours la vérité.
Si on traduit ces deux dernières affirmations en propositions, on obtient \((M\then A)\then M\) pour (c) et \(M \then (M\then A)\) pour (d) et on reconnaît là l'équivalence \((M\then A)\iff M\) que l'on rajoute dans la table de vérité. Cette fois il ne reste qu'une seule interprétation propositionnelle de \(A\) et \(M\) qui assure la vérité des trois propositions, celle où le logicien aime les deux femmes :
\(A\) | \(M\) | \(M\vee A\) | \(M\then A\) | \((M\then A)\iff M\) |
F | F | F | \(V\) | F |
F | \(V\) | \(V\) | F | F |
\(V\) | F | \(V\) | \(V\) | F |
\(V\) | \(V\) | \(V\) | \(V\) | \(V\) |
Les différentes assertions du logicien ont donc été traduites sous formes de propositions et nous avons cherché les interprétations \(I\) des différentes variables assurant que leur conjonction était vraie, ici \(I(A)=V\) et \(I(M)=V\).
Limites de la logique propositionnelle
De manière générale, un énoncé peut très bien aboutir à la formalisation d'une proposition avec plusieurs interprétations valides (si elles le sont toutes, c'est une tautologie) ou aucune (antilogie). Ceci justifie la définition suivante :
On utilise la même terminologie pour un ensemble de formules pour signifier que c'est leur conjonction qui est satisfaisable ou non.
Déterminer si une formule est satisfaisable est un problème extrêmement difficile. Les scientifiques pensent, dans leur grande majorité, qu'aucun moyen efficace ne permet d'y répondre en toute généralité (cette question sera abordée en détail en master.) On peut, bien sûr, construire la table de vérité de la formule pour faire cette vérification, mais c'est un travail qui devient littéralement infaisable, même pour un ordinateur, dès qu'il y a plus de quelques dizaines de variables propositionnelles dans la formule.
Les exemples de formalisation que nous venons de traiter illustrent les limites de la logique propositionnelle. Son manque d'expressivité nous a contraint à créer un grand nombre de variables pour décrire les différents cas et l'exercice ci-dessus montre que faute de stratégies, il peut être difficile d'automatiser la résolution de problèmes logiques.
D'autre part, nombre d'énoncés et de raisonnements logiques en langue naturelle ne sont pas transposables en formules de la logique propositionnelle, par exemple Tout étudiant·e en licence d'informatique suit le cours de mathématiques, Alice est étudiante en licence d'informatique donc Alice suit le cours de mathématiques. Les relations entre objets ne peuvent pas être exprimées, seuls des faits isolés sont modélisables, si Idris est l'ami de Sacha et
Mais, pire encore, que se passerait-il si une énigme faisait référence à des entiers naturels ? Par exemple, si l'on évoquait dans un énoncé une combinaison secrète qui serait un nombre de taille arbitraire ? Manipuler un très grand nombre de variables propositionnelle voire une infinité de variables propositionnelles n'est envisageable ni pour humain, ni pour une machine. Il faut pouvoir décrire une infinité de situations à l'aide d'une description finie.
L'apport du calcul des prédicats permettra également de formaliser des situations finies de manière bien plus concise, on exprimera par exemple qu'une partie \(X=\{x_1,x_2,\ldots,x_n\}\) de \(\N\) ne contient que des entiers pairs par la phrase \[ \forall x\in X\ \ \exists k\in\N\ \ x=2\, k. \] plutôt que par l'ensemble des \(n\) propositions suivantes : \[ x_1\ \text{est pair},\ x_2\ \text{est pair},\ x_3\ \text{est pair},\ldots,\ x_n\ \text{est pair}. \]
Le prochain chapitre est consacré à l'étude de la logique des prédicats dans le cadre de la théorie des ensembles de Zermelo-Fraenkel (abrégée en théorie zf).
Travaux pratiques
En séance
Exemple : si L = [(False,),(True,)], alors
Quelle serait le contenu de la liste LA à l'issue de l'exécution de votre script si la liste L était initialisée à [()] qui ne contient que le tuple vide ? Répondez à la question sous forme de commentaire au début de votre script.
Exemple : l'appel Interpretations(2) doit renvoyer la liste
[(False,False),(False,True),(True,False),(True,True)]
Exemple : la chaîne FP = "V[0] or (V[1] and not(V[2]))", code la formule propositionnelle \(V_0 \vee (V_1\wedge\neg(V_2))\) dont les variables propositionnelles sont \(V_0,V_1\) et \(V_2\).
Écrivez une fonction TV(FP,n) qui renvoie la table de vérité de la formule codée par FP sous forme de liste de tuples à l'aide de la fonction Interpretations et la fonction d'évaluation eval(chaine) du Python qui évalue une chaine de caractères si elle respecte la syntaxe d'une expression du langage Python.
Exemple. Avec la chaîne de caractère FP = "V[0] and V[1]", l'appel de la fonction TV(FP,2) doit renvoyer la liste des 4 triplets
[(False,False,False),(False,True,False),(True,False,False),(True,True,True)]Les deux premières projections correspondent aux interprétations possibles des variables, la troisième l'interprétation de la formule propositionnelle. Indication : la fonction Interpretations(nbvar) génère les 2nbvar interprétations possibles des variables V[i] et pour chacune d'entre elles, il suffit d'évaluer l'expression FP grâce à eval(FP) pour calculer l'interprétation de la formule pour cette interprétation des variables.
Exemple : pour la formule "V[0] and not(V[1])", la fonction doit renvoyer la liste
[(True,False)]puisque \(V[0]\wedge \neg V[1]\) n'est vraie que pour l'interprétation \(V[0]\leftarrow\top,V[1]\leftarrow\bot\).