Logique propositionnelle
Cours · informatique (MP2I/MPI), chapitre 20 · MP2I et MPI · le début du chapitre, la suite sur Adloun
20.1 Séparer ce qu'on écrit de ce que cela veut dire
Le programme assigne à ce chapitre un objectif qu'il faut prendre au mot : « familiariser progressivement les étudiants avec la différence entre syntaxe et sémantique ». Cette distinction est l'une des plus fécondes de l'informatique, et elle sera reprise telle quelle au chapitre chap:automates — où une expression régulière (syntaxe) dénotera un langage (sémantique) — et au chapitre chap:deduction, où l'on opposera à .
| Syntaxe | Sémantique | |
|---|---|---|
| Ce que c'est | une suite de symboles | une valeur de vérité |
| Ce qu'on manipule | un arbre | une fonction des valuations |
| Deux formules égales si | mêmes arbres | mêmes tables de vérité |
Le second usage de ce chapitre est plus concret : le programme veut « donner le vocabulaire permettant de modéliser une grande variété de situations (satisfaction de contraintes, planification, diagnostic, vérification de modèles) ». Une formule logique est un format d'entrée universel — et sat, le problème de sa satisfiabilité, sera au cœur du chapitre chap:decidabilite.
20.2 Syntaxe
On se donne un ensemble de variables propositionnelles L'ensemble des formules est le plus petit ensemble tel que :
et de même pour . Les notations sont celles que le programme fixe : . L'arité d'un connecteur est son nombre d'arguments : pour , pour les autres.
Le programme est explicite deux fois : « les formules sont des données informatiques », et « on implémente uniquement les formules propositionnelles sous forme d'arbres ».
type formule =
| Var of string
| Non of formule
| Et of formule * formule
| Ou of formule * formule
| Implique of formule * formule
C'est le type inductif du chapitre chap:induction, et tout ce qui y a été démontré s'applique : les fonctions sur les formules terminent par l'ordre induit, et se prouvent par induction structurelle. Rien n'est à réapprendre.
Les sous-formules de sont elle-même et, récursivement, celles de ses arguments — ce sont exactement les sous-arbres. La taille est le nombre de nœuds, la hauteur celle de l'arbre.
let rec taille = function
| Var _ -> 1
| Non f -> 1 + taille f
| Et (a, b) | Ou (a, b) | Implique (a, b) -> 1 + taille a + taille b
Écrire est ambigu ; l'arbre, lui, ne l'est jamais. Les parenthèses ne servent qu'à écrire une formule en une ligne — et le programme demande de « faire le lien entre les écritures d'une formule comme mot et les parcours d'arbres » : l'écriture infixe parenthésée est le parcours infixe, la notation polonaise le parcours préfixe. C'est exactement le chapitre chap:arbres, et l'analyse syntaxique du chapitre chap:grammaires fera le trajet inverse.
20.2.1 Quantificateurs, variables libres et liées
Les quantificateurs et introduisent une notion de portée : dans , la portée de est . Une occurrence de dans cette portée est liée ; une occurrence hors de toute portée d'un quantificateur sur est libre.
Le programme le dit : ce sont des « notions que l'on retrouve dans la pratique de la programmation ». Dans let f x = x + a, le est lié par fun, le est libre et va chercher sa valeur ailleurs. Renommer un lié ne change rien ; renommer un libre change tout. C'est le même phénomène, et le même piège.
« On ne soulève aucune difficulté technique sur la substitution. L'unification est hors programme. » Et la sémantique n'est présentée que pour des formules sans quantificateurs — « par souci d'éviter trop de technicité ». Les quantificateurs reviendront au chapitre chap:deduction, par leurs règles d'inférence seulement.
Exercices du chapitre
- L'implication n'est pas associative, l'équivalence l'est corrigé
- Tautologie, antilogie, ou ni l'un ni l'autre corrigé
- Conséquence logique, implication, et ex falso corrigé
- Mise sous forme normale, pas à pas corrigé
- Ce que coûte une modélisation : le pigeonnier corrigé
- La parité : les DEUX formes normales explosent corrigé