Logique
Logique
Logique
Département d’informatique
Notes de cours
Version du 2019-08-08
UNIVERSITÉ DE
SHERBROOKE
Notes de cours (très) synthétiques complétées par les présentations en classe.
i
Contenu
ii
2.7 Les suites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.7.1 Suite géométrique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.7.2 Suite arithmétique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.7.3 Limite et monotonie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.7.4 Séries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
2.7.5 Opérateur du langage B sur les suites . . . . . . . . . . . . . . . . . . . . . . 60
2.8 Propriétés des relations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
2.8.1 Exemples de relations réflexives . . . . . . . . . . . . . . . . . . . . . . . . . . 62
2.8.2 Exemples de relations irréflexives . . . . . . . . . . . . . . . . . . . . . . . . . 63
2.8.3 Exemple de relation transitive . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
2.8.4 Exemple de relation symétrique . . . . . . . . . . . . . . . . . . . . . . . . . . 64
2.8.5 Exemple de relation asymétrique . . . . . . . . . . . . . . . . . . . . . . . . . 64
2.8.6 Exemple de relation antisymétrique . . . . . . . . . . . . . . . . . . . . . . . . 64
2.8.7 Exemple de relation d’équivalence . . . . . . . . . . . . . . . . . . . . . . . . 64
2.8.8 Exemple de relation d’ordre . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
2.8.9 Exemple de relation d’ordre strict . . . . . . . . . . . . . . . . . . . . . . . . . 65
2.8.10 Relations bien fondée et acyclique . . . . . . . . . . . . . . . . . . . . . . . . 65
2.9 Lois des ensembles, fonctions et relations . . . . . . . . . . . . . . . . . . . . . . . . . 66
2.10 Utilisation de ProB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
2.11 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3 Types de preuve 73
3.1 Preuve par induction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.1.1 Preuve par induction sur les naturels . . . . . . . . . . . . . . . . . . . . . . . 73
3.1.2 Règle générale de preuve par induction . . . . . . . . . . . . . . . . . . . . . . 81
3.1.3 Application de la règle générale d’induction aux naturels . . . . . . . . . . . . 81
3.1.4 Plusieurs cas de base sur les naturels . . . . . . . . . . . . . . . . . . . . . . . 83
3.1.5 Preuve par induction sur d’autres structures . . . . . . . . . . . . . . . . . . . 85
3.1.6 Preuve de la règle générale de preuve par induction . . . . . . . . . . . . . . . 88
3.2 Exprimer une preuve en langage naturel . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.2.1 A ⇒ B - Implication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.2.2 A ⇔ B - Équivalence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.2.3 A ∧ B - Conjonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.2.4 Preuve par contradiction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.2.5 Preuve par contraposition (contraposée) . . . . . . . . . . . . . . . . . . . . . 91
3.2.6 Preuve par cas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.2.7 ∀ - Quantification universelle . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.2.8 ∃ - Quantification existentielle . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
3.2.9 Illustration d’une preuve en langage naturel . . . . . . . . . . . . . . . . . . . 92
3.3 Preuve dans le style équationnel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
3.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4 Automate 97
4.1 Automate fini déterministe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
4.2 Automate fini non-déterministe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.3 Déterminisation d’un AFND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.4 Minimisation d’un AFD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
4.5 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
iii
Bibliographie 118
1
Chapitre 1
2
à partir de formules considérées comme vraies. Une preuve, au sens de la logique formelle, est une
suite de déductions. Les déductions sont effectuées en appliquant des règles d’inférence.
Les formules de logique sont énoncées à l’aide d’une syntaxe formelle (c’est-à-dire précise et sans
ambiguïté). Plusieurs types de logiques ont été proposées. La logique propositionnelle constitue
la base de tous les types de logique. Une formule est une représentation formelle d’un fait, d’une
connaissance à propos d’un concept d’intérêt pour l’humain. La première compétence que vous
devrez acquérir sera de représenter des faits, des connaissances, sous forme de formules logiques.
La deuxième sera de raisonner sur ces formules. Le verbe “représenter” a une importance capitale:
une formule n’est rien d’autre qu’une suite de symboles. Il faut aussi associer ces symboles à des
objets, des concepts, des faits du “monde” représenté par la formule. Le “monde” dénote ce dont la
formule traite, sur quoi porte la formule. On appelle interprétation le lien entre les symboles d’une
formule et les objets du monde qu’ils représentent La beauté de la logique est que le raisonnement
et les calculs effectués sont indépendants du “monde” en question.
La logique est utilisée dans tous les domaines de l’informatique. Tous les langages de program-
mation utilisent les connecteurs (c’est-à-dire les opérateurs) de la logique propositionnelle. Les
méthodes les plus avancées pour déterminer la correction d’un logiciel (c’est-à-dire vérifier qu’un
logiciel fait bien ce qu’il est supposé faire, vérifier qu’un logiciel est correct, vérifier qu’un logiciel
ne contient pas de faute (bug)) sont fondées sur la logique. Les logiciels contrôlent maintenant une
foule d’objets comme des trains, des avions, des autos, des centrales nucléaires, des stimulateurs
cardiaques, des appareils de radiologie. Une erreur dans ces logiciels peut entraîner des conséquences
dramatiques pour les humains et l’environnement. L’étude de leur correction est primordiale. Cela
ne serait possible sans la logique. Les opérations les plus élémentaires d’un ordinateur (opéra-
tions arithmétiques) sont exprimées en logique propositionnelle. Le fonctionnement de base d’un
ordinateur est fondé sur l’algèbre de Boole, qui est essentiellement la même chose que la logique
propositionnelle. Une algèbre permet de faire des calculs, c’est-à-dire appliquer des opérateurs à
des opérandes. La logique permet aussi de faire des calculs, comme déterminer si une formule est
vrai ou fausse pour une interprétation donnée, mais aussi de déduire de nouvelles formules.
• ¬ : la négation,
3
Une variable propositionnelle peut prendre la valeur vrai ou la valeur faux. Dans les exemples et
définitions, nous utiliserons, par convention, X pour dénoter une variable propositionnelle (possi-
blement indexée par un nombre, comme X0 , X1 , . . ., si plusieurs variables sont nécessaires). Nous
utiliserons A, B, C, . . . pour désigner des formules propositionnelles.
Définition 1 Une formule propositionnelle est une suite de symboles construite seulement à partir
des règles suivantes:
• A∧B
• A∨B
• A⊕B
• A⇒B
• A⇐B
• A⇔B
5. si A est une formule propositionnelle, alors (A) est une formule propositionnelle.
Les parenthèses servent à définir un ordre dans l’évaluation des connecteurs logiques, exactement
comme dans les expressions arithmétiques.
Remarque 1 Dans le cadre du cours, par souci de lisibilité, les connecteurs sont parenthésés selon
les priorités suivantes, de la plus forte à la plus faible; les opérateurs sur une même ligne ont la
même priorité:
1. ¬,
2. ∧,
3. ∨, ⊕
4. ⇒, ⇐
5. ⇔.
Attention : Il n’existe pas de convention universelle pour la priorité en logique. Elle peut varier
d’un livre à l’autre et d’un outil à l’autre. Il vous incombe de prendre connaissance de la priorité
utilisée selon le livre ou l’outil.
4
1.1.2 Tables de vérité des connecteurs logiques
La valeur de vérité d’une formule, qui est soit vrai, soit faux, peut-être calculée à l’aide des tables
de vérité suivantes. Elles se lisent de la même manière que les tables de calculs des opérateurs
arithmétiques que l’on vous a enseignées dès l’école primaire, comme pour les additions et les
multiplications. Par soucis de concision, on utilise 0 et 1 pour les valeurs faux et vrai, respectivement.
Les lignes indiquent les valeurs de l’opérande de gauche, alors que les colonnes indiquent les valeurs
de l’opérande de droite (cela a une importance pour les connecteurs ⇒ et ⇐, qui ne sont pas
commutatifs, alors que les autres opérateurs le sont).
¬ 0 1 ∧ 0 1 ∨ 0 1 ⇒ 0 1 ⇐ 0 1 ⇔ 0 1 ⊕ 0 1
1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1
1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0
Voici une représentation équivalente et plus compacte des tables de vérité des opérateurs binaires.
X1 X2 ∧ ∨ ⇒ ⇐ ⇔ ⊕
0 0 0 0 1 1 1 0
0 1 0 1 1 0 0 1
1 0 0 1 0 1 0 1
1 1 1 1 1 1 1 0
La valeur de vérité d’une formule propositionnelle peut être calculée si la valeur de chaque variable
propositionnelle qu’elle contient est connue. Nous noterons X := 0 le fait que la valeur de la variable
X est 0. Notons que X := 0 n’est pas une formule propositionnelle, car le symbole “:=” ne fait pas
partie de la syntaxe de la logique propositionnelle. La valeur de la formule X1 ∨ (X2 ∧ X3 ) est 0 pour
X1 := 0, X2 := 1, X3 := 0. On peut aussi calculer la valeur d’une formule propositionnelle pour
toutes les combinaisons des valeurs de ses variables. Voici le calcul pour la formule X1 ∨ (X2 ∧ X3 ).
Cela est plutôt fastidieux, car le nombre de combinaisons est égal à 2n pour une formule contenant
n variables propositionnelles.
no X1 X2 X3 X2 ∧ X3 X1 ∨ (X2 ∧ X3 )
1 0 0 0 0 0
2 0 0 1 0 0
3 0 1 0 0 0
4 0 1 1 1 1
5 1 0 0 0 1
6 1 0 1 0 1
7 1 1 0 0 1
8 1 1 1 1 1
Le problème de la satisfaction d’une formule propositionnelle est un problème classique en algorith-
mique. Il s’agit de trouver une combinaison de valeur des variables d’une formule de sorte que la
formule est vrai. Dans l’exemple précédent, les lignes 4 à 8 sont des solutions pour la satisfaction
de la formule X1 ∨ (X2 ∧ X3 ). Ce problème de la satisfaction d’une formule propositionnelle est
très important pour les outils de vérification automatique des logiciels (appelés en anglais model
checking tools) et la preuve automatique de théorèmes. C’est un problème dit NP-complet (ce qui
veut dire, pour simplifier, que le meilleur algorithme connu actuellement exige un temps de cal-
cul qui augmente de manière exponentielle en fonction de la taille de la formule, qu’une solution
5
peut-être vérifiée en temps polynomial, et que si un jour on trouve un algorithme polynomial pour
calculer une solution, cet algorithme pourra aussi résoudre tous les autres problèmes NP-complet).
Ce théorème de Stephen A. Cook, considéré comme un théorème fondamental en théorie de la
complexité, lui mérita (avec d’autres contributions) le prix Alan Turing en 1982. Il existe une
compétition annuelle en informatique pour déterminer les meilleurs algorithmes de satisfaction de
formules propositionnelles.
¬aLaGrippe (1.2)
signifie que la personne n’a pas la grippe. Dans un langage de programmation comme le C ou
le Java, on aurait plutôt écrit “aLaGrippe == 1” et “aLaGrippe == 0”. On voit que la logique
propositionnelle a une notation distincte de la programmation. Bien sûr, on pourrait aussi écrire en
logique propositionnelle quelque chose qui ressemble à la programmation, en utilisant l’équivalence,
qui est analogue à l’égalité:
aLaGrippe ⇔ vrai (1.3)
et
aLaGrippe ⇔ faux (1.4)
(1.1) est équivalent à (1.3), et (1.2) est équivalent à (1.4), mais elles sont plus compliquées que
nécessaire. Les sous-section suivantes présentent brièvement quelques traductions pour chaque con-
necteur.
6
1.1.3.2 Conjonction (∧)
La conjonction est généralement, mais pas toujours, équivalente au “et” du langage naturel. La
phrase suivante
“Dans la table d’hôte, vous avez le choix entre la soupe et le dessert.” (1.6)
ne signifie pas que la soupe et le dessert sont inclus dans le forfait de la table d’hôte. Il s’agit de
l’un ou l’autre. Cela serait plutôt représenté par un “ou exclusif” ⊕.
soupe ⊕ dessert
“Pour s’inscrire au cours IFT003, il faut avoir réussi IFT001 ou IFT002.” (1.7)
IFT001Réussi ∨ IFT002Réussi
Une personne qui a réussi IFT001 seulement, IFT002 seulement, ou bien les deux, peut s’inscrire à
IFT003.
La phrase suivante, qui est presque identique à la phrase (1.6), mais avec un “ou” au lieu d’un
“et”, sera aussi traduite avec un “ou exclusif”.
“Dans la table d’hôte, vous avez le choix entre la soupe ou le dessert.” (1.8)
aLaGrippe ⇒ faitDeLaFièvre
Le connecteur ⇒ est souvent décrit en terme de condition nécessaire ou condition suffisante. Ainsi,
dans une formule de la forme A ⇒ B, on dit que B est une condition nécessaire pour A, et, de
7
manière duale, que A est une condition suffisante pour B. Par exemple, on dit que faitDeLaFièvre
est une condition nécessaire pour aLaGrippe; faire de la fièvre n’est pas suffisant pour diagnostiquer
une grippe; on peut faire de la fièvre pour plusieurs autres raisons (par exemple, pour une infection
bactérienne, alors que la grippe est une infection virale, ou à la suite d’une insolation). De manière
duale, on dit que que aLaGrippe est une condition suffisante pour faitDeLaFièvre, parce que on est
sûr qu’une personne ayant la grippe fait de la fièvre.
Les mathématiciens utilisent aussi la formulation “seulement si” pour représenter les conditions
nécessaires et suffisantes. La phrase “A seulement si B” indique que B est une condition nécessaire
pour A et, de manière duale, que A est une condition suffisante pour B. Par exemple, la phrase
suivante est équivalente à la phrase (1.9).
Grâce aux tautologies présentées dans la prochaine section (Section 1.3.1), cette phrase peut aussi
s’écrire, de manière équivalente, comme suit:
On dit que IFT001Réussi est une condition suffisante pour PeutSinscrireIFT003 (c’est-à-dire, que
réussir IFT001 est une condition suffisante pour s’inscrire à IFT003). IFT002Réussi est aussi une
condition suffisante pour PeutSinscrireIFT003. On remarque que réussir un des cours IFT001 et
IFT002 est suffisant pour s’inscrire à IFT003. On remarque que le dual, “PeutSinscrireIFT003 est
une condition nécessaire pour IFT001Réussi”, semble un peu bizarre. Cela est techniquement correct
d’un point de vue mathématique, mais pas usuel dans le langage courant, car cela porterait à
confusion; personne ne dira que “pouvoir s’inscrire à un cours” est une condition nécessaire pour
la réussite d’un cours préalable! La formule suivante, qui n’a pas le même sens, permet de mieux
visualiser la distinction entre condition nécessaire et suffisante pour ce contexte.
On voit que “réussir IFT001 ou réussir IFT002” est une condition nécessaire pour réussir IFT003.
La formule suivante permet aussi de voir la distinction entre une conjonction et une disjonction.
Cette formule indique que si on a réussi les deux cours IFT001 et IFT002, on peut s’inscrire à
IFT003.
On pourrait se poser la question suivante: y a-t-il d’autres conditions qui permettent de s’inscrire
à IFT003? Une formule contenant une implication ne nous le dit pas. La formule peut être vraie,
avec PeutSinscrireIFT003 vraie et IFT001Réussi et IFT002Réussi fausse, comme le montre la table
de vérité suivante, où X1 , X2 et X3 représentent respectivement IFT001Réussi, IFT002Réussi et
PeutSinscrireIFT003.
8
no X1 X2 X3 X1 ∧ X2 (X1 ∧ X2 ) ⇒ X3
1 0 0 0 0 1
2 0 0 1 0 1
3 0 1 0 0 1
4 0 1 1 0 1
5 1 0 0 0 1
6 1 0 1 0 1
7 1 1 0 1 0
8 1 1 1 1 1
On remarque que la formule (1.11) est vraie dans tous les cas, sauf pour la ligne 7, où IFT001Réussi
et IFT002Réussi sont vraies, et PeutSinscrireIFT003 est fausse. Donc, si l’université affirme que la
formule (1.11) est vraie, alors on est dans les cas 1 à 6 et 8. Si un étudiant a réussi IFT001 et
IFT002, alors l’université doit lui permettre de s’inscrire à IFT003, si elle veut respecter sa formule,
car sinon la formule est fausse. On remarque aussi que cette formule indique aussi que l’université
peut permettre à l’étudiant de s’inscrire à IFT003 même s’il n’a pas réussi IFT001 ou IFT002; ce
cas est représenté par les lignes 1 à 6. Si on veut exclure la possibilité d’inscrire un étudiant à
IFT003 sans avoir réussi IFT001 et IFT002, alors on utilisera plutôt une équivalence, au lieu d’une
implication.
9
1.2 Logique du premier ordre
La logique du premier ordre est plus riche que la logique propositionnelle. Elle permet d’utiliser des
variables d’autres types que les variables booléennes, comme par exemple les naturels, les entiers,
les ensembles, les relations, les fonctions, . . . .
1.2.1 Syntaxe
Les formules de la logique du premier ordre sont construites en appliquant des symboles de relation
à des termes pour obtenir des formules atomiques, et en combinant des formules atomiques à l’aide
de connecteurs logiques et de quantificateurs.
Définition 2 Un terme est une suite de symboles construite à partir des règles suivantes:
Remarque 2 Par souci de généralité, certains auteurs classifient les constantes comme des sym-
boles de fonction d’arité 0, c’est-à-dire qu’une constante est une fonction qui ne prend pas de
paramètre et qui retourne toujours la même valeur.
Définition 3 Une formule atomique est une suite de symboles construite à partir des règles suiv-
antes:
2. si r est un relation (i.e., une fonction booléenne, un prédicat) d’arité n > 0 et que t1 , . . . , tn
sont des termes, alors r(t1 , . . . , tn ) est une formule atomique.
Définition 4 Une formule est une suite de symboles construite à partir des règles suivantes:
• A∧B
• A∨B
• A⊕B
• A⇒B
• A⇐B
• A⇔B
10
sont des formules;
• ∀x · A
• ∃x · A
Les symboles ∃, ∀ sont appelés des quantificateurs (existentiel pour ∃ et universel pour ∀). Une
variable en logique du premier ordre représente un objet du monde que l’on désire décrire. Dans le
langage du logiciel Tarski’s World, une variable désigne un objet (c’est-à-dire un cube, un tétraèdre
ou un dodécaèdre). En arithmétique, une variable désigne un nombre. La variable en logique
du premier ordre joue donc un rôle différent de la variable en logique propositionnelle, qui peut
seulement désigner une valeur de vérité (vrai et faux). Nous utilisons le symbole “≡” pour indiquer
une équivalence syntaxique, c’est-à-dire que e1 ≡ e2 signifie que e1 est une abréviation pour e2 . Il
s’agit d’une forme d’égalité.
∃x : T · A ≡ ∃x · x ∈ T ∧ A
∃x : T | A · B ≡ ∃x · x ∈ T ∧ A ∧ B
∀x : T · A ≡ ∀x · x ∈ T ⇒ A
∀x : T | A · B ≡ ∀x · x ∈ T ∧ A ⇒ B
∀x, y · A ≡ ∀x · ∀y · A
∀x, y : T · A ≡ ∀x · ∀y · x ∈ T ∧ y ∈ T ⇒ A
∃x, y · A ≡ ∃x · ∀y · A
∃x, y : T · A ≡ ∃x · ∀y · x ∈ T ∧ y ∈ T ⇒ A
Remarque 4 Dans ces notes de cours, les quantificateurs ∀, ∃ ont la même priorité, et leur priorité
est plus faible que les connecteurs logiques, ce qui donne les priorités suivantes, 1 étant la plus forte
priorité, et les opérateurs sur une même ligne ayant la même priorité:
1. ¬,
2. ∧,
3. ∨, ⊕
4. ⇒, ⇐
5. ⇔
6. ∀, ∃
Définition 5 Dans les formules ∀x · A et ∃x · A, les occurrences de x dans A sont dites liées
aux quantificateurs ∀x et ∃x, respectivement. Si une occurrence est sous la portée de plusieurs
quantificateurs, elle est alors liée au quantificateur le plus près (i.e., le plus imbriqué).
11
Définition 6 Dans une formule A, une occurrences de x est dite libre si elle n’est pas liée à un
quantificateur.
Définition 7 Une formule est dites fermée ssi elle ne contient aucune variable libre.
Dans la formule suivante, la variable x est liée et la variable y est libre. Cette formule n’est pas
fermée, à cause de y.
∀x · x > 0 ∧ y = 1
Dans la formule suivante, la première occurrence de la variable x est liée (i.e., x > 0), mais la
deuxième est libre (i.e., x = 0), car elle est hors de la portée du quantificateur ∀. Donc, la variable
x est à la fois libre et liée dans cette formule. Cette formule n’est pas fermée, à cause de l’occurence
libre de x.
(∀x · x > 0) ∧ x = 1
Les deux occurrences de x ne désigne donc pas la même chose.
Dans l’exemple suivant, les variables x et y sont liées de plusieurs manières, indiquées par un
indice en rouge. Cette formule est fermée, car toutes les variables sont liées.
∀x, y · pere(x, y ) ⇒ parent(x, y ) ∧ ∀x, y · mere(x, y ) ⇒ parent(x, y ) ∧ homme(x) (1.15)
1 1 1 1 1 1 2 2 2 2 2 2 1
On peut considérer les occurrences de x identifiées par x comme distinctes de celles identifiées par
1
x. On verra, avec les lois de la logique et de la substitution, qu’il est plus clair d’utiliser la formule
2
équivalente suivante, où les occurrences de x sont regroupées
1
∀x, y · pere(x, y ) ⇒ parent(x, y ) ∧ homme(x) ∧ ∀x, y · mere(x, y ) ⇒ parent(x, y ) (1.16)
1 1 1 1 1 1 1 2 2 2 2 2 2
Il est très fréquent d’utiliser la même variable plusieurs fois avec des quantificateurs différents. En
pratique, chaque quantificateur définit une “nouvelle” variable.
Définition 8 L’expression A[x := t], appelée la substitution de x par t dans A, où A est une
formule, x est une variable et t est un terme, dénote la substitution de toutes les occurrences libres
de x dans A par t. Le terme t peut contenir la variable x. La substitution est dite valide si t ne
contient pas de variables qui deviennent liées dans le résultat de la substitution.
Si une substitution est invalide, on peut toujours renommer dans A les variables des quantifi-
cateurs en choisissant une variable qui n’apparaît pas dans A. On peut renommer une variable
quantifiée en utilisant la substitution. Soit x0 une variable n’apparaissant pas dans la formule A.
Alors, la formule ∀x · A est équivalente à la formule ∀x0 · (A[x := x0 ]), et la formule ∃x · A est
équivalente à la formule ∃x0 · (A[x := x0 ]).
La substitution a une priorité plus forte que tous les connecteurs logiques. Voici le problème
engendré par une application incorrecte d’une substitution2 .
n ∈ N ⇒ ¬ ∀m · ( m ∈ N ⇒ m = n )
2
Source: Jean-Raymond Abrial, présentation du langage B
12
on donc peut lui appliquer une substitution pour l’utiliser pour n := m
( n ∈ N ⇒ ¬ ∀m · ( m ∈ N ⇒ m = n ) )[n := m]
m ∈ N ⇒ ¬ ∀m · ( m ∈ N ⇒ m = m )
problème !!! l’occurrence libre de n devient liée et la formule résultante est fausse
( n ∈ N ⇒ ¬ ∀z · ( m ∈ N ⇒ m = n )[m := z] )[n := m]
( n ∈ N ⇒ ¬ ∀z · ( z ∈ N ⇒ z = n ) )[n := m]
m ∈ N ⇒ ¬ ∀z · ( z ∈ N ⇒ z = m ) )
Remarque 5 Certains auteurs utilisent les notations alternatives suivantes pour la substitution :
A[x\t], et A[t/x].
Une formule de la forme “∀x · A” signifie que la formule A est vraie pour tous les objets du
monde. Supposons que les objets du monde sont représentés par l’ensemble {o1 , . . . , on }. La valeur
de vérité de ∀x · A est donné par la formule suivante:
A[x := o1 ] ∧ . . . ∧ A[x := on ]
Il peut y avoir une infinité d’objets dans le monde, comme en arithmétique. Par exemple, l’ensemble
des nombres naturels N = {0, 1, 2, . . .} peut être décrit avec des formules quantifiées, et on obtient
alors une conjonction infinie, d’où l’intérêt d’utiliser le symbole ∀ pour désigner une conjonction
infinie.
En mathématiques, il arrive souvent que l’on donne une formule sans utiliser de quantification. Par
exemple, la loi
x+0=x
ne contient aucun quantificateur, mais, par convention, on sait que cela s’applique à tout nombre
x, donc que la formule réelle est plutôt ∀x · x + 0 = x. La convention usuelle en mathématiques
est que les variables libres d’une formule sont quantifiées universellement. Lorsqu’on effectue des
preuves formelles de correction, on doit gérer les quantificateurs avec beaucoup de rigueur. Si une
variable est libre dans plusieurs hypothèses d’une preuve, c’est qu’il s’agit de la même variable.
Une formule de la forme “∃x · A” signifie que la formule A est vrai pour au moins un objet du
monde. La valeur de vérité de ∃x · A est donné par la formule suivante:
A[x := o1 ] ∨ . . . ∨ A[x := on ]
13
Prédicat Signification
Triangle(x) x est un triangle
Square(x) x est un carré
Pentagon(x) x est un pentagone
Small(x) x est petit
Medium(x) x est moyen
Large(x) x est grand
Smaller(x, y) x est plus petit que y
SameSize(x, y) x est de même taille que y
LeftOf(x, y) x est à gauche de y
SameRow(x, y) x est sur la même ligne que y
SameCol(x, y) x est sur la même colonne que y
Between(x, y, z) x est entre y et z sur une même ligne, colonne ou diagonale
x=y x et y représentent le même objet
x <> y x et y représentent des objets distincts
14
Symbole mathématique Tarski’s World de R. Stärk Priorité
∀x · A x 1
∃x · E x 1
¬ ~ 1
∧ /\ 2
∨ \/ 3
⇒ => 4
⇔ <=> 5
La variable x est donc libre dans la sous-formule Square(x). Tarski’s World ne peut pas évaluer
les formules non fermées, c’est-à-dire les formules qui contiennent une variable libre. Il faut la
parenthéser comme suit pour qu’elle soit fermée.
A x (Large(x) /\ Square(x))
On utilise des parenthèses pour déterminer à quelle formule un connecteur s’applique. La figure 1.1
illustre un monde où tous les types d’objets et de tailles sont illustrés. Le bouton Create permet de
créer un objet du type et de la taille sélectionnée. Le bouton Apply permet de modifier l’objet sélec-
tionné selon la taille et le type spécifiés. Le bouton Delete permet de supprimer l’objet sélectionné.
1.2.2.2 Exemples
Voici quelques exemples de phrases représentées par des formules qui sont vraies dans le monde
de la figure 1.1. Pour chaque formule, nous donnons une version écrite en syntaxe mathématique
traditionnelle avec le nombre minimum de parenthèses selon la précédence définie à la remarque 4
page 11, et l’autre en utilisant la syntaxe du langage Tarski, qui ne contient pas de précédence, et
donc les formules doivent y être parenthésées pour imposer un ordre d’évaluation des connecteurs.
1. “L’objet a est un pentagone de grande taille.”
Pentagon(a) ∧ Large(a)
Pentagon(a) /\ Large(a)
Dans cet exemple, la formule porte sur un objet particulier, le pentagone a. Le symbole a est
donc une constante du langage, tel que décrit à la définition 2.
2. “Le carré b est situé entre les objets a et c.”
Square(b) ∧ Between(b, a, c)
Square(b) /\ Between(b,a,c)
Ici aussi, les symboles a, b, c sont des constantes qui dénotent des objets particuliers.
3. “Tous les objets de grande taille sont sur la même ligne.”
15
Figure 1.1: Un exemple de monde dans Tarski
Cette phrase ne vise pas un objet en particulier, mais des objets quelconques du monde. Il faut
donc utiliser des variables, x, y, introduites par un quantificateur. C’est ce qui distingue une
variable d’une constante dans Tarski: une variable doit être introduite par un quantificateur
universel ou existentiel; une constante est déclarée dans le monde en l’associant à une objet lors
de sa création ou modification. Pour formaliser cette phrase, il suffit d’utiliser deux variables.
Ces variables permettront de comparer chaque paire d’objets. Ainsi, la formule quantifiée est
traduite par la formule suivante, qui est une conjonction de tous les cas possibles de valeurs
pour x et y (il y en a 9 ∗ 9 = 81).
Examinons le cas no 9. L’opérande de gauche de l’implication (⇒) est une conjonction dont la
valeur est fausse, car l’objet j n’est pas de grande taille (il est de taille petite). L’implication
est donc vraie. Le cas no 9 traite un objet grand et un objet petit, donc, ces objets n’ont pas
besoin d’être sur la même ligne. Il est très fréquent d’utiliser une implication à l’intérieur d’une
quantification universelle, car une phrase porte généralement sur un sous-ensemble d’objets.
16
On utilise l’opérande de gauche de “⇒” pour indiquer à quels objets on s’intéresse dans la
phrase à formaliser. On note aussi que les cas où x = y sont aussi traités systématiquement.
Par exemple, pour le cas 1, la formule est vraie aussi, car a est grand et sur la même ligne que
lui-même.
Puisque la formule est vraie dans tous les cas, la formule quantifiée originale est donc vraie.
4. “Il y a au moins un objet de grande taille pour chaque type d’objet.”
∃x · (Large(x) ∧ Pentagon(x))
∧ ∃x · (Large(x) ∧ Square(x))
∧ ∃x · (Large(x) ∧ Triangle(x))
E x (Large(x) /\ Pentagon(x))
/\ E x (Large(x) /\ Square(x))
/\ E x (Large(x) /\ Triangle(x))
5. “Tous les carrés sont situés entre un pentagone à gauche et un triangle à droite, de même
taille, sur la même ligne.”
∀x·
(
Square(x)
⇒ ∃y · ∃z·
( Pentagon(y)
∧ Triangle(z)
∧ Between(x, y, z)
∧ LeftOf(y, z)
∧ SameRow(y, z)
∧ SameSize(x, y)
∧ SameSize(y, z)
)
)
17
A x
(
Square(x)
=> E y E z
( Pentagon(y)
/\ Triangle(z)
/\ Between(x,y,z)
/\ SameSize(x,y)
/\ SameSize(y,z)
)
)
Voici sa formalisation.
∃x · (Square(x) ∧ (∀y · (Pentagon(y) ⇒ LeftOf(x, y))))
E x (Square(x) /\ (A y (Pentagon(y) => LeftOf(x,y))))
Et voici sa traduction. Il y a 4 ∗ 4 = 16 cas à considérer.
1 (Square(a) ∧ ( (Pentagon(a) ⇒ LeftOf(a, a)) 1.1
∧ (Pentagon(b) ⇒ LeftOf(a, b)) 1.2
∧ (Pentagon(c) ⇒ LeftOf(a, c)) 1.3
∧ (Pentagon(d) ⇒ LeftOf(a, d)) 1.4
))
2 ∨ (Square(b) ∧ ( (Pentagon(a) ⇒ LeftOf(b, a)) 2.1
∧ (Pentagon(b) ⇒ LeftOf(b, b)) 2.2
∧ (Pentagon(c) ⇒ LeftOf(b, c)) 2.3
∧ (Pentagon(d) ⇒ LeftOf(b, d)) 2.4
))
3 ∨ (Square(c) ∧ ( (Pentagon(a) ⇒ LeftOf(c, a)) 3.1
∧ (Pentagon(b) ⇒ LeftOf(c, b)) 3.2
∧ (Pentagon(c) ⇒ LeftOf(c, c)) 3.3
∧ (Pentagon(d) ⇒ LeftOf(c, d)) 3.4
))
4 ∨ (Square(d) ∧ ( (Pentagon(a) ⇒ LeftOf(d, a)) 4.1
∧ (Pentagon(b) ⇒ LeftOf(d, b)) 4.2
∧ (Pentagon(c) ⇒ LeftOf(d, c)) 4.3
∧ (Pentagon(d) ⇒ LeftOf(d, d)) 4.4
))
18
Figure 1.2: Une erreur de syntaxe dans une formule dans Tarski’s World
Le prédicat Square est vrai seulement dans les cas 1 et 2. Dans le cas 1, toutes les sous-
formules sont vraies. La formule est donc vraie. Dans le cas 2, la sous-fourmule 2.3 est fausse
car Pentagon(c) est vrai mais LeftOf(b, c) est faux, donc la formule Pentagon(c) ⇒ LeftOf(b, c)
est fausse.
1.2.2.3 Erreurs
Tarski’s World très peu d’information quand votre formule est erronée. Il y a deux types d’erreur:
i) erreur de syntaxe, ii) erreur de formule non fermée. Une erreur de syntaxe est simplement notée
par un symbole “?” en marge de la formule, tel qu’illustré dans la figure 1.2, où le mot Squaree
est incorrect. Une erreur de formule non fermée est notée par un symbole “..” sous Mac OSX,
ou bien “U” sous Ubuntu, en marge de la formule, tel qu’illustré dans la figure 1.3: le symbole x
est utilisé dans la formule, mais il n’apparait pas comme une constante dans le monde en-dessous;
Tarski considère donc que le symbole x est une variable, et qu’elle est libre, vu qu’il n’y a pas de
quantificateur sur x, et il ne peut pas évaluer la formule. En effet, pour évaluer cette formule, il
faut savoir si elle doit être vraie pour au moins une valeur de x, ou bien pour toutes les valeurs de
x. La formule suivante est un autre exemple.
A x Large(x) /\ Square(x)
La variable x est libre dans la sous-formule Square(x), à cause de la précédence des opérateurs
dans Tarski’s World, qui fait en sorte que la portée du quantificateur ∀ se termine à la sous-formule
Large(x), donc la formule n’est pas fermée.
Pour vous aider à corriger vos erreurs, vous pouvez utiliser la commande cfml avec le nom du
fichier contenant vos formules de Tarski’s World. Par exemple, la formule suivante contient une
erreur de syntaxe.
Squaree(c) \/ Square(e)
Elle vous affiche vos erreurs de syntaxe (ligne 1 colonne 6) ainsi que l’arbre syntaxique de la formule
(voir figure 1.4). La partie erronée est affichée en rose. Chaque formule du fichier est sur une ligne.
19
Figure 1.3: Une erreur de formule non fermée dans Tarski’s World
Figure 1.4: Arbre syntaxique affiché par la commande cfml pour la formule Squaree(c) ∨
Square(e)
20
1.2.3 Formes typiques des formules quantifiées
On remarque deux formes typiques pour les formules quantifiées. Pour un quantificateur universel,
on a:
∀x · A ⇒ B
Cette forme correspond à des phrases de la forme suivante:
On remarque que le prédicat Small apparait dans les deux exemples, mais pas à la même place dans
la formalisation. Dans le premier exemple, “petit” dénote une propriété des carrés, alors que dans
le deuxième, on a deux propriétés pour les carrés. Être sur la même ligne dépend d’être petit. On
retrouve donc “petit” à gauche plutôt qu’à droite dans le deuxième exemple. Nous verrons la loi
de la logique (LP-37) qui nous permet de conclure que la formule suivante est une formalisation
équivalente du deuxième exemple.
∀x · Square(x) ∧ Small(x)
Elle ne requière pas d’implication, car la propriété “petit carré” s’applique à tous les objets.
Pour un quantificateur existentiel, la forme typique est la suivante
∃x · A ∧ B
21
2. Il existe un petit carré ayant à sa droite un grand triangle.
∃x · Square(x) ∧ Small(x) ∧ ∃y · Triangle(y) ∧ LeftOf(x, y)
La forme
∃x · A ⇒ B
n’est quasiment jamais utilisée, car elle est très facilement satisfaisable. En effet, il suffit de trouver
un objet qui ne satisfait pas A et la formule est satisfaite, car une implication est vraie si son
opérande de gauche est fausse.
Pour simplifier le jargon universitaire, nous utiliserons le terme cours au lieu du terme activité
pédagogique dans la suite.
Pour formaliser ce texte, nous avons besoin de définir des prédicats et d’utiliser des variables.
1. peutSInscrire(e, c) : retourne vrai si, et seulement si, l’étudiant e peut s’inscrire au cours c.
3. suivi(e, c) : retourne vrai si, et seulement si, l’étudiant e a suivi le cours c. Notons que cela ne
signifie pas que l’étudiant a réussi le cours.
4. préalable(c1 , c2 ) : retourne vrai si, et seulement si, le cours c1 est préalable au cours c2 .
5. antérieur(c1 , c2 ) : retourne vrai si, et seulement si, le cours c1 est antérieur au cours c2 .
6. concomitant(c1 , c2 ) : retourne vrai si, et seulement si, le cours c1 est concomitant au cours c2 .
Préalable est une condition nécessaire pour s’inscrire à un cours, mais elle n’est pas une condition
suffisante. Il existe d’autres conditions nécessaires pour pouvoir s’inscrire à un cours, soit d’avoir
payé ses frais de scolarité des sessions antérieures, avoir payés ses amendes à la bibliothèque, etc.
Voici une formalisation d’une propriété de la notion de préalable.
Notons que cette formalisation utilise une implication, au lieu d’une équivalence. Elle indique que
préalable est une condition nécessaire pour s’inscrire, mais elle n’est pas suffisante. Dans le contexte
universitaire, le prédicat préalable est défini par énumération de tous les préalables. Pour connaître
l’impact de ce prédicat sur le reste des règlements universitaire, on donne une formule qui énumère
une propriété de préalable. Donc, avoir réussi les préalables est une condition nécessaire pour
22
pouvoir s’inscrire à un cours, ce qui correspond à la forme suivante, équivalente à la forme (1.18),
grâce aux lois (LP-38) et (LPO-26).
∀e, c1 , c2 · préalable(c1 , c2 ) ⇒ (peutSInscrire(e, c2 ) ⇒ réussi(e, c1 )) (1.18)
Par souci de lisibilité, on peut aussi écrire la formule (1.18) en l’indentant comme suit:
∀e, c1 , c2 ·
préalable(c1 , c2 )
⇒
peutSInscrire(e, c2 )
⇒
réussi(e, c1 )
Voici une formalisation de antérieur
∀e, c1 , c2 · antérieur(c1 , c2 ) ⇒ (peutSInscrire(e, c2 ) ⇒ suivi(e, c1 ))
∀e, c1 , c2 ·
antérieur(c1 , c2 )
⇒
peutSInscrire(e, c2 )
⇒
suivi(e, c1 )
Voici une formalisation de concomittant
∀e, c1 , c2 · concomitant(c1 , c2 ) ⇒ (peutSInscrire(e, c2 ) ⇒ réussi(e, c1 ) ∨ peutSInscrire(e, c1 ))
∀e, c1 , c2 ·
concomitant(c1 , c2 )
⇒
peutSInscrire(e, c2 )
⇒
réussi(e, c1 )
∨
peutSInscrire(e, c1 )
23
no X1 X2 ¬( X1 ∧ X2 ) ⇔ ¬ X1 ∨ ¬ X2
1 0 0 1 0 0 0 1 1 0 1 1 0
2 0 1 1 0 0 1 1 1 0 1 0 1
3 1 0 1 1 0 0 1 0 1 1 1 0
4 1 1 0 1 1 1 1 0 1 0 0 1
Les tautologies sont importantes, car elles sont à la source de lois de la logique propositionnelle.
Entre autres, les tautologies de la forme A ⇔ B nous permettent de remplacer la formule A par
la formule B, et vice-versa, car les deux formules sont équivalentes, au sens où la valeur de vérité
de A est la même que celle de B, peu importe la valeur des variables propositionnelles. On peut
remplacer A par B lorsque A est une sous-formule d’une formule, exactement comme pour l’égalité
entre les nombres. Les tautologies de la forme A ⇒ B nous permettent de déduire la formule B de
la formule A si on sait que A est vrai, car si A est vraie, alors B est vraie, selon la table de vérité
de “⇒”. Les tables 1.3, 1.4, 1.5, 1.6 donnent une liste des principales tautologies.
24
implication comme disjonction A⇒B ⇔ ¬A ∨ B (LP-22)
implication comme tiers exclu A⇒A ⇔ vrai (LP-23)
implication comme négation et A⇒B ⇔ ¬(A ∧ ¬B) (LP-24)
négation implication ¬(A ⇒ B) ⇔ A ∧ ¬B (LP-25)
Contraposée A⇒B ⇔ ¬B ⇒ ¬A (LP-26)
implication divers 1 A ⇒ vrai ⇔ vrai (LP-27)
implication divers 2 vrai ⇒ A ⇔ A (LP-28)
implication divers 3 A ⇒ faux ⇔ ¬A (LP-29)
implication divers 4 faux ⇒ A ⇔ vrai (LP-30)
implication divers 5 A ⇒ ¬A ⇔ ¬A (LP-31)
implication divers 6 ¬A ⇒ A ⇔ A (LP-32)
distributivité implication et gauche C ⇒ (A ∧ B) ⇔ (C ⇒ A) ∧ (C ⇒ B) (LP-33)
distributivité implication ou gauche C ⇒ (A ∨ B) ⇔ (C ⇒ A) ∨ (C ⇒ B) (LP-34)
distributivité implication et droite (A ∧ B) ⇒ C ⇔ (A ⇒ C) ∨ (B ⇒ C) (LP-35)
distributivité implication ou droite (A ∨ B) ⇒ C ⇔ (A ⇒ C) ∧ (B ⇒ C) (LP-36)
implication conjonction A ⇒ (B ⇒ C) ⇔ (A ∧ B) ⇒ C (LP-37)
implication conjonction A ⇒ (B ⇒ C) ⇔ B ⇒ (A ⇒ C) (LP-38)
définition par cas (A ⇒ B) ∧ (¬A ⇒ C) ⇔ (A ∧ B) ∨ (¬A ∧ C) (LP-39)
25
1.3.2 Lois de la logique du premier ordre
On utilise aussi A, B, . . . pour désigner des formules de logique du premier ordre. On utilise N pour
désigner une formule où x n’est pas libre (c’est-à-dire, il n’y a aucune occurrence libre de x dans
N ). Les lois de la logique propositionnelle s’appliquent aussi à la logique du premier ordre.
26
déplacement univ et (∀x · N ∧ A) ⇔ N ∧ ∀x · A (LPO-24)
déplacement univ ou (∀x · N ∨ A) ⇔ N ∨ ∀x · A (LPO-25)
déplacement univ implication 1 (∀x · N ⇒ A) ⇔ N ⇒ ∀x · A (LPO-26)
déplacement univ implication 2 (∀x · A ⇒ N ) ⇔ (∃x · A) ⇒ N (LPO-27)
déplacement exist et (∃x · N ∧ A) ⇔ N ∧ ∃x · A (LPO-28)
déplacement exist ou (∃x · N ∨ A) ⇔ N ∨ ∃x · A (LPO-29)
déplacement exist implication 1 (∃x · N ⇒ A) ⇔ N ⇒ ∃x · A (LPO-30)
déplacement exist implication 2 (∃x · A ⇒ N ) ⇔ (∀x · A) ⇒ N (LPO-31)
absorption exist (∃x · N ) ⇔ N (LPO-32)
absorption univ (∀x · N ) ⇔ N (LPO-33)
C ⇒ (A ∧ B)
⇔ h (LP-22) i
¬C ∨ (A ∧ B)
⇔ h (LP-12) i
(¬C ∨ A) ∧ (¬C ∨ B)
⇔ h (LP-22) i
(C ⇒ A) ∧ (C ⇒ B)
D
⇔ h justification i
E
Le connecteur ⇔ est transitif, c’est-à-dire que si on a les formules A ⇔ B et B ⇔ C que l’on considère
vraies, alors on peut déduire que A ⇔ C est vraie; le connecteur “⇔” est similaire à l’égalité “=”
sur les nombres. On utilisant la transitivité, la preuve ci-dessus permet de conclure que la première
formule est équivalente à la dernière, donc
C ⇒ (A ∧ B) ⇔ (C ⇒ A) ∧ (C ⇒ B)
Dans cette preuve, nous avons utilisé deux lois, (LP-12) et (LP-22), pour déduire (LP-33). Nous
allons exprimer cela de manière formelle en utilisant la notation suivante:
Voici une preuve assez complexe de la loi (LP-39) en utilisant seulement les lois de (LP-1) à
(LP-22).
27
(A ⇒ B) ∧ (¬A ⇒ C)
⇔ h (LP-22) deux fois i
(¬A ∨ B) ∧ (¬¬A ∨ C)
⇔ h (LP-21) i
(¬A ∨ B) ∧ (A ∨ C)
⇔ h (LP-11) deux fois i
(¬A ∧ A) ∨ (¬A ∧ C) ∨ (B ∧ A) ∨ (B ∧ C)
⇔ h (LP-19) i
faux ∨ (¬A ∧ C) ∨ (B ∧ A) ∨ (B ∧ C)
⇔ h (LP-4) i
(¬A ∧ C) ∨ (B ∧ A) ∨ (B ∧ C)
⇔ h (LP-3) i
(¬A ∧ C) ∨ (B ∧ A) ∨ ((B ∧ C) ∧ vrai)
⇔ h (LP-20) i
(¬A ∧ C) ∨ (B ∧ A) ∨ ((B ∧ C) ∧ (A ∨ ¬A))
⇔ h (LP-11) i
(¬A ∧ C) ∨ (B ∧ A) ∨ (B ∧ C ∧ A) ∨ (B ∧ C ∧ ¬A)
⇔ h (LP-7), (LP-8), (LP-14) deux fois i
(A ∧ B) ∨ (¬A ∧ C)
Ce style de preuve basé sur une suite d’équivalences est assez courant. Toutefois, nous allons
maintenant remonter aux racines des mathématiques et définir de manière formelle et générale ce
qu’est une preuve, et définir quelles sont les déductions valides que l’on peut faire dans une preuve
à l’aide de règles d’inférence.
A1 ... Ak
B
où A1 , . . . , Ak sont appelées les prémisses et B la conclusion. Cette règle se lit comme suit: si
les hypothèses A1 , . . . , Ak sont vraies, alors on peut conclure que B est vraie. On peut composer
les règles pour obtenir une preuve. Une preuve est donc une suite de déductions obtenues par
application de règles d’inférence. Par exemple, les déductions suivantes
A1 A2 A3 A4
A5 A6
A7
28
permettent de conclure A1 , A2 , A3 , A4 ` A7 , c’est-à-dire que A7 est vraie si A1 , A2 , A3 , A4 sont
vraies.
La composition des règles forme une preuve, que l’on représente par un arbre. Les feuilles de
l’arbre, soient A1 , A2 , A3 , A4 , sont les hypothèses, alors que la racine est la conclusion, soit A7 . Les
formules A5 et A6 sont des résultats intermédiaires dans la déduction de A7
Certaines preuves utilisent la notion de déchargement d’hypothèse. C’est typiquement le cas
pour la preuve d’une formule de la forme A ⇒ B. Pour faire cette preuve, on procède généralement
comme suit: on suppose que A est vraie et on déduit que B est vraie. Le sequent A ` B résultant
de cette preuve permet de conclure, grâce à la table de vérité de “⇒”, que le séquent ` A ⇒ B est
aussi vrai; ce séquent ne contient aucune hypothèse. L’arbre de preuve final aura la forme suivante.
dAe[i]
..
.
B [i]
A⇒B
On dit que l’hypothèse A est déchargée, et que le séquent représenté par cet arbre de preuve est
` A ⇒ B (c’est-à-dire que A n’apparait pas dans les hypothèses du séquent). Par exemple, dans
l’arbre suivant,
A1 dA2 e[i] A3 A4
A5 A6
[R][i]
A7
la conclusion de la déduction est A1 , A3 , A4 ` A7 , car A2 a été déchargée à la dernière étape à
cause de l’application de la règle d’inférence R. On notera une règle qui décharge une hypothèse de
la manière suivante:
dAe[i]
..
.
B
[i]
C
.
Les “ .. ” indiquent que A apparait comme une feuille de l’arbre (c’est-à-dire une hypothèse).
Pour illustrer ce concept, voici un théorème en algèbre linéaire que nous allons prouver en
utilisant tout d’abord une approche classique, et ensuite une approche très formelle.
Théorème 1 Si une matrice carrée E possède un inverse à gauche F et un inverse à droite G, alors
F = G.
29
La conclusion (le théorème) est que F = G. Lorsque ces trois hypothèses sont vraies, alors la
conclusion est vraie. Ce théorème peut s’énoncer de manière formelle comme suit. Tout d’abord,
il faut rappeler quelques définitions d’algèbre linéaire. Soit I la matrice identité. On dit qu’une
matrice F est un inverse à gauche d’une matrice E ssi F ∗ E = I. De manière duale, on dit qu’une
matrice G est un inverse à droite d’une matrice E ssi E ∗ G = I. Finalement, une matrice M est
dite carrée, notée Carrée(M ), ssi son nombre de lignes est égal à son nombre de colonnes. On peut
formaliser ce théorème de deux manières. Dans la première, on met les hypothèses à gauche du
symbole ` :
A1 , A2 , A3 ` F = G
c’est-à-dire,
Carrée(E), F ∗ E = I, E ∗ G = I ` F =G
Dans la deuxième forme, on met toutes les hypothèses dans la formule à prouver :
` A1 ∧ A2 ∧ A3 ⇒ F = G
c’est-à-dire,
` Carrée(E) ∧ F ∗ E = I ∧ E ∗ G = I ⇒ F = G
Les deux formes sont équivalentes. Dans la deuxième forme, il n’y a aucune hypothèse; tout est
dans la formule à prouver (i.e., le théorème). La preuve de ce théorème est généralement écrite de
manière concise comme suit dans un bouquin d’algèbre linéaire.
F = F ∗ I = F ∗ (E ∗ G) = (F ∗ E) ∗ G = I ∗ G = G
F
= h Loi de l’identité : pour toute matrice carrée M , on a M ∗ I = M i
F ∗I
= h hypothèse A3 i
F ∗ (E ∗ G)
= h Associativité du produit matriciel : M1 ∗ (M2 ∗ M3 ) = (M1 ∗ M2 ) ∗ M3 i
(F ∗ E) ∗ G
= h hypothèse A2 i
I ∗G
= h Loi de l’identité i
G
Certaines lois de l’algèbre linéaire qui sont utilisées dans cette preuve n’ont pas été déclarées dans
le séquent initial. Pour être complètement formel, il faudrait les inclure aussi dans les hypothèses
du séquent. On a aussi utilisé de manière implicite les lois suivantes de l’égalité.
30
Par manque d’espace, nous continuons cette preuve en prenant la conclusion de l’arbre précédent
et en la mettant comme hypothèse de l’arbre ci-dessous (en rouge).
..
. F ∗E =I
(LE-2)
F = (F ∗ E) ∗ G (F ∗ E) ∗ G = I ∗ G ∀M · I ∗ M = M
tr. = E∀ [M := G]
F =I ∗G I ∗G=G
tr. =
F =G
L’hypothèse A1 indiquant que la matrice est carrée a été implicitement utilisée pour s’assurer que
le produit matriciel de chaque étape est bien défini, c’est-à-dire que les dimensions des matrices
sont compatibles pour le produit matriciel. Nous avons aussi utilisé la commutativité de l’égalité
de manière implicite. Dans cette preuve, il n’y a aucune hypothèse déchargée.
On constate que si on veut détailler une preuve a priori très simple et énumérer toutes les
hypothèses requises, il faut énumérer un nombre considérable de lois du domaine en question. Pour
simplifier et illustrer facilement le concept de preuve, nous allons utiliser seulement un ensemble
restreint de règles d’inférence de la logique propositionnelle, appelé la déduction naturelle, et prouver
des tautologies de la logique propositionnelle.
A∧B [E∧1 ]
A∧B [E∧2 ]
A B [I∧ ]
A B A∧B
dAe[i] dBe[i]
.. ..
. .
A∨B C C A B
[E∨ ][i] [I∨1 ] [I∨2 ]
C A∨B A∨B
dAe[i]
..
.
B A A⇒B
[I⇒ ][i] [E⇒ ]
A⇒B B
dAe[i] d¬Ae[i]
.. ..
. .
faux A ¬A faux faux
[I¬ ][i] [E¬ ] [Efaux ][i] [E⊥ ]
¬A faux A A
Nous utiliserons Panda [3] pour construire et vérifier nos preuves. Panda n’utilise pas la règle [Efaux ][i] .
Il utilise à la place la règle suivante.
31
¬¬A [E ][i]
¬¬
A
En combinant les règles [E¬¬ ][i] et [I¬ ][i] , on obtient la règle [Efaux ][i] . Voici quelques exemples de
preuve, où p, q, r dénotent des formules quelconques.
1. ` (p ⇒ (q ⇒ r)) ⇒ ((p ∧ q) ⇒ r)
dp ∧ qe[1]
[E∧1 ]
p dp ⇒ (q ⇒ r)e[2] dp ∧ qe[1]
[E⇒ ] [E∧2 ]
q⇒r q
[E⇒ ]
r [I⇒ ][1]
(p ∧ q) ⇒ r
[I⇒ ][2]
(p ⇒ (q ⇒ r)) ⇒ ((p ∧ q) ⇒ r)
4. ` p ∨ (q ∧ r) ⇒ (p ∨ q) ∧ (p ∨ r)
dq ∧ re[2] dq ∧ re[2]
[E∧1 ]
dpe[2] dpe[2] q r [I∨2[E] ∧2 ]
[I ] [I ] [I∨2 ]
p ∨ q ∨1 p ∨ r ∨1 p∨q p∨r
[I∧ ] [I∧ ]
dp ∨ (q ∧ r)e[1] (p ∨ q) ∧ (p ∨ r) (p ∨ q) ∧ (p ∨ r) [2] [E∨ ]
(p ∨ q) ∧ (p ∨ r)
[I⇒ ][1]
p ∨ (q ∧ r) ⇒ (p ∨ q) ∧ (p ∨ r)
5. ` ¬(p ∨ q) ⇒ ¬p ∧ ¬q
dpe[2] dqe[3]
[I∨1 ] [I∨2 ]
d¬(p ∨ q)e[1] p∨q d¬(p ∨ q)e[1] p∨q
[E¬ ] [E¬ ]
faux [I¬ ][2]
faux [I¬ ][3]
¬p ¬q
[I∧ ]
¬p ∧ ¬q
[I⇒ ][1]
¬(p ∨ q) ⇒ ¬p ∧ ¬q
32
6. ` p ∧ (q ∨ r) ⇒ (p ∧ q) ∨ (p ∧ r)
dp ∧ (q ∨ r)e[1] dp ∧ (q ∨ r)e[1]
[E∧1 ] [E∧1 ]
p dqe[2] p dre[2]
[I∧ ] [I∧ ]
dp ∧ (q ∨ r)e[1] p∧q p∧r
[E∧2 ] [I∨1 ] [I∨2 ]
q∨r (p ∧ q) ∨ (p ∧ r) (p ∧ q) ∨ (p ∧ r)
[E∨ ][2]
(p ∧ q) ∨ (p ∧ r)
[I⇒ ][1]
p ∧ (q ∨ r) ⇒ (p ∧ q) ∨ (p ∧ r)
7. ` (p ⇒ (q ⇒ r)) ⇒ (q ⇒ (p ⇒ r))
dp ⇒ (q ⇒ r)e[1] dpe[2]
[E⇒ ]
q⇒r dqe[3]
[E⇒ ]
r [2]
p ⇒ r [I⇒ ] [3]
[I⇒ ]
q ⇒ (p ⇒ r)
[I⇒ ][1]
(p ⇒ (q ⇒ r)) ⇒ (q ⇒ (p ⇒ r))
8. ` ¬(p ∧ q) ⇒ ¬p ∨ ¬q
d¬pe[1] d¬qe[3]
[I∨1 ] [I∨2 ]
¬p ∨ ¬q d¬(¬p ∨ ¬q)e[2] ¬p ∨ ¬q d¬(¬p ∨ ¬q)e[2]
[E¬ ] [E¬ ]
faux [E ][1] faux [E ][3]
p false q false
[I∧ ]
p∧q d¬(p ∧ q)e[4]
[E¬ ]
faux [E ][2]
¬p ∨ ¬q false
[I⇒ ][4]
¬(p ∧ q) ⇒ ¬p ∨ ¬q
9. ` p ∧ (¬p ∨ q) ⇒ p ∧ q
dp ∧ (¬p ∨ q)e[1]
[E∧1 ]
p d¬pe[2] dp ∧ (¬p ∨ q)e[1]
[E¬ ] [E∧1 ]
dp ∧ (¬p ∨ q)e[1] faux [E ] p dqe[2]
[E∧2 ]
¬p ∨ q p ∧ q false p∧q
[E∨ ][2]
p∧q
[I⇒ ][1]
p ∧ (¬p ∨ q) ⇒ p ∧ q
10. ` p ∨ (¬p ∧ q) ⇒ p ∨ q
d¬p ∧ qe[2]
[E∧2 ]
dpe[2] q
[I ] [I∨2 ]
dp ∨ (¬p ∧ qe[1] p ∨ q ∨1 p∨q [2] [E∨ ]
p∨q
[I⇒ ][1]
p ∨ (¬p ∧ q) ⇒ p ∨ q
33
1.4.3 Cohérence
Définition 10 Une valuation est une affectation de valeurs à des variables propositionnelles; elle
est notée [X1 := v1 , . . . , Xn := vn ], où vi ∈ {0, 1}. Certains auteurs utilisent le terme interprétation
comme synonyme de valuation. La valeur de vérité d’une formule propositionnelle A pour une
valuation V est notée AV . Cette valeur de vérité est calculée en remplaçant les variables de la
formule par leur valeur donnée par la valuation, et en calculant le résultant à l’aide des tables de
vérité.
Exemple 1 Par exemple, la valeur de vérité de la formule X1 ∧ ¬X2 sous la valuation [X1 :=
1, X2 := 0], notée (X1 ∧ ¬X2 )[X1 := 1, X2 := 0], est 1. On peut la calculer ainsi à l’aide des tables
de vérité.
Par exemple, les trois formules suivantes ne sont pas tautologiquement cohérente.
aLaGrippe (1.22)
¬faitDeLaFièvre (1.23)
Si quelqu’un affirme que ces trois formules sont vraies, alors on peut dire qu’il est incohérent, car
il n’existe pas de valuation permettant de satisfaire les trois formules en même temps. La seule
valuation pouvant satisfaire la formule (1.22) contient aLaGrippe := 1. La seule valuation pouvant
satisfaire la formule (1.23) contient faitDeLaFièvre := 0. La valuation
[aLaGrippe := 1, faitDeLaFièvre := 0]
34
ne satisfait pas la formule (1.21). On peut donc systématiquement vérifier si un discours ou un
document de spécification est cohérent en calculant toutes les valuations possibles. Il peut exister
plusieurs valuations satisfaisant l’ensemble des formules considérées; l’important est qu’il en existe
au moins une.
Définition 13 On dit que B est une conséquence logique de Γ, notée Γ ( B, ssi tout modèle de Γ
est aussi un modèle de B.
Exemple 2 Dans le tableau ci-dessous, on montre que la formule X3 est une conséquence logique
des formules X1 ∧ X2 et (X1 ∧ X2 ) ⇒ X3 , c’est-à-dire
{ X1 ∧ X2 , (X1 ∧ X2 ) ⇒ X3 } ( X3
.
no X1 X2 X3 X1 ∧ X2 (X1 ∧ X2 ) ⇒ X3 X3
1 0 0 0 0 1 0
2 0 0 1 0 1 1
3 0 1 0 0 1 0
4 0 1 1 0 1 1
5 1 0 0 0 1 0
6 1 0 1 0 1 1
7 1 1 0 1 0 0
8 1 1 1 1 1 1
Il n’y qu’un seul modèle des formules à gauche du symbole ( , soit la ligne 8. Il faut donc vérifier
que la formule X3 est vraie aussi pour ce modèle, et c’est bien le cas.
Exemple 3 Dans le tableau ci-dessous, on montre que la formule X3 n’est pas une conséquence
logique des formules X1 ∨ X2 et (X1 ∧ X2 ) ⇒ X3 .
{ X1 ∨ X2 , (X1 ∧ X2 ) ⇒ X3 } (
6 X3
.
no X1 X2 X3 X1 ∨ X2 (X1 ∧ X2 ) ⇒ X3 X3
1 0 0 0 0 1 0
2 0 0 1 0 1 1
3 0 1 0 1 1 0
4 0 1 1 1 1 1
5 1 0 0 1 1 0
6 1 0 1 1 1 1
7 1 1 0 1 0 0
8 1 1 1 1 1 1
Les formules à gauche du symbole 6( ont cinq modèles, soit les lignes 3, 4, 5, 6 et 8. Il faut donc
vérifier que la formule X3 est vraie pour chacun de ces modèles, et ce n’est pas le cas pour les lignes
3 et 5.
Une autre façon de définir la cohérence est d’utiliser la relation déduction. On dit qu’un ensemble
de formule A1 , . . . , An est cohérent ssi il n’est pas possible d’obtenir A1 , . . . , An ` B et A1 , . . . , An `
¬B. On peut montrer que les formules (1.21), (1.22), (1.23) sont incohérentes, à l’aide de la déduction
suivante.
35
aLaGrippe aLaGrippe ⇒ faitDeLaFièvre
[E⇒ ]
faitDeLaFièvre
On peut donc déduire la formule faitDeLaFièvre, ce qui contredit la formule (1.23). Cette approche
est moins facile à automatiser. La plupart des approches de vérification de la cohérence utilisent la
recherche d’un modèle à l’aide des formes normales, qui sont l’objet de la prochaine section.
Les règles d’inférence de la déduction naturelle sont dites cohérentes, car si Γ ` B, alors Γ ( B,
c’est-à-dire tout théorème B est aussi une conséquence logique. Ces règles sont aussi dites complètes,
car si Γ ( B, alors Γ ` B, c’est-à-dire toute conséquence logique est aussi un théorème.
Théorème 2 Γ ( B ssi Γ ` B.
Ainsi, on peut calculer si une formule est vraie en utilisant soit les tables de vérité, soit les règles
d’inférences. C’est une propriété fondamentale de la logique. Notons que ` et ( sont deux relations
distinctes sur les formules propositionnelles; la première est calculée avec les règles d’inférence; la
seconde est calculée avec les tables de vérités. Pour calculer Γ ( B en utilisant la définition 13,
il faut évaluer 2n valuations, où n est le nombre de variables propositionnelles apparaissant dans
les formules de Γ et B. Les outils utilisent plutôt le théorème suivant, qui réduit le problème de
conséquence logique au problème de satisfaction d’un ensemble de formules.
Le symbole ∪ est l’opérateur usuel d’union sur les ensembles. Finalement, la satisfaction d’un
ensemble de formules peut être réduit au problème de la satisfaction d’une formule, qui est NP-
complet.
Les logiciels sont généralement spécifiés avec la logique du premier ordre, qui est l’objet de la
prochaine section. Toute formule représentant la correction d’un logiciel peut être traduite en une
formule propositionnelle (souvent gigantesque). Quand on désire faire la preuve de correction d’un
logiciel, on a deux options. Soit on utilise les algorithmes de satisfaction d’une formule proposi-
tionnelle (c’est-à-dire, la relation “|=”) si le nombre de variables est relativement petit (quelques
dizaines de million de variables!). Si le nombre de variables est trop grand, on utilisera les règles
d’inférence et la déduction (donc, la relation “`”), car le calcul d’une preuve est indépendant du
nombre de variables propositionnelles. Malheureusement, la plupart des logiciels nécessitent un
nombre astronomique (très très grand!) de variables propositionnelles et la relation |= n’est pas
calculable en un temps et un espace mémoire acceptables. D’autre part, Gödel a démontré que
l’arithmétique est indécidable, au sens où il existe des formules qui ne peuvent être ni prouvées ni
réfutées (cf, le théorème d’incomplétude de l’arithmétique de 1931). En 1936, Turing et Church ont
montré qu’il existe des problèmes indécidables, c’est-à-dire qu’il n’existe pas d’algorithme pouvant
déterminer s’il existe une preuve d’un séquent Γ ` B pour n’importe quel Γ et B. C’est pour ce
problème que Turing a défini le concept de machine de Turing, le premier modèle mathématique
abstrait d’un ordinateur, afin de définir formellement la notion d’algorithme. Sa preuve montre
qu’il n’existe pas de machine qui peut lire la description d’une machine et déterminer si elle termine
(i.e., communément appelé le problème de l’arrêt). À la même époque, Church a défini le λ-calcul
pour montrer qu’il n’existe pas de fonction récursive permettant de dire si deux λ-expressions sont
équivalentes. Le λ-calcul constitue la deuxième définition de la notion d’algorithme.
Les théorèmes de Gödel, Church et Turing établissent les limites de la déduction en logique. Bien
sûr, cela n’empêche pas de faire de la preuve automatisée. En pratique, les prouveurs automatisés
36
arrivent très souvent à trouver une preuve pour les séquents; ils utilisent des heuristiques pour le
faire, ou bien ils sont guidés par un humain dans la recherche d’une preuve. Si on n’arrive pas
à trouver une preuve d’un séquent Γ ` B, on peut alors essayer de prouver Γ ` ¬B, ou bien de
satisfaire Γ ∪ ¬B. Si on trouve un modèle pour Γ ∪ ¬B, alors on sait que Γ ` B est faux, donc que
Γ ` ¬B est vrai. Bien sûr, il faut aussi s’assurer que Γ est cohérent, car si Γ est incohérent, alors
on peut prouver à la fois Γ ` ¬B et Γ ` B. Si Γ est incohérent, cela signifie que la spécification du
logiciel est mal construite.
dAe[i]
..
.
A[x := t] ∃x · A B où x n’est pas libre dans B ni
[I∃ ] [E∃]
∃x · A B dans les hypothèses de B
Définition 14 Une formule est dite en forme normale conjonctive (FNC) ssi elle est de la forme
(A1 ∨ . . . ∨ Ak ) ∧ . . . ∧ (Ak0 ∨ . . . ∨ An )
où chaque formule constituante Ai est soit une variable propositionnelle (Xi ), soit la négation d’une
variable propositionnelle (¬Xi ).
X1 ∨ ¬X3
X1 ∧ ¬X3
X1
37
¬X1
Les formules suivantes ne sont pas en FNC. Les parties qui font en sorte que la définition est violée
sont en rouge.
(X1 ∨ X4 ) ∧ ¬(X2 ∨ ¬X3 )
X1 ∨ (X2 ∧ ¬X3 )
X1 ∧ (X2 ∨ (X3 ∧ X4 ))
Définition 15 Une formule est dite en forme normale disjonctive (FND) ssi elle est de la forme
(A1 ∧ . . . ∧ Ak ) ∨ . . . ∨ (Ak0 ∧ . . . ∧ An )
où chaque formule constituante Ai est soit une variable propositionnelle (Xi ), soit la négation d’une
variable propositionnelle (¬Xi ).
X1 ∨ ¬X3
X1 ∧ ¬X3
X1
¬X1
Les formules suivantes ne sont pas en FND. Les parties qui font en sorte que la définition est violée
sont en rouge.
(X1 ∧ X4 ) ∨ ¬(X2 ∧ ¬X3 )
X1 ∧ (X2 ∨ ¬X3 )
X1 ∨ (X2 ∧ (X3 ∨ X4 ))
Toute formule propositionnelle peut être transformée en une formule équivalente en FNC à l’aide
des lois (LP-12), (LP-17), (LP-18), (LP-21), (LP-22) et (LP-40), ou en FND, avec les mêmes lois,
mais en utilisant (LP-11) au lieu de (LP-12). Voici un exemple de transformation d’une formule en
FNC.
¬(X1 ∨ ¬X2 ) ∨ X3
⇔ h (LP-18) i
(¬X1 ∧ ¬¬X2 ) ∨ X3
⇔ h (LP-8) i
X3 ∨ (¬X1 ∧ ¬¬X2 )
⇔ h (LP-10) i
(X3 ∨ ¬X1 ) ∧ (X3 ∨ ¬¬X2 )
⇔ h (LP-21) i
(X3 ∨ ¬X1 ) ∧ (X3 ∨ X2 )
38
La FND est calculée de manière similaire.
¬(X1 ∨ ¬X2 ) ∨ X3
⇔ h (LP-18) i
(¬X1 ∧ ¬¬X2 ) ∨ X3
⇔ h (LP-21) i
(¬X1 ∧ X2 ) ∨ X3
39
1.7 Exercices
1. Prouvez les formules suivantes en utilisant seulement les règles d’inférence de la déduction
naturelle. Indiquez pour chaque étape de preuve, la règle utilisée et les hypothèses déchargées
(s’il y a déchargement avec cette règle). Toutes les hypothèses doivent être déchargées, puisque
chaque séquent ci-dessous ne contient aucune hypothèse (c’est-à-dire, chaque séquent est de
la forme ∅ ` A, que nous notons simplement ` A par souci de concision).
(a) ` (p ∨ q) ∧ (p ∨ r) ⇒ p ∨ (q ∧ r)
Solution:
q(3) r(5)
(I∧)
((p∨q)∧(p∨r))(1) p(4) (q∧r)
(E∧) (I∨) (I∨)
((p∨q)∧(p∨r))(1) p(2) (p∨r) (p∨(q∧r)) (p∨(q∧r))
(E∧) (I∨) (E∨)(4)(5)
(p∨q) (p∨(q∧r)) (p∨(q∧r))
(E∨)(2)(3)
(p∨(q∧r))
(((p∨q)∧(p∨r))⇒(p∨(q∧r)))
(I⇒)(1)
(b) ` (p ∧ q) ∨ (p ∧ r) ⇒ p ∧ (q ∨ r)
Solution:
(p∧q)(4) (p∧r)(5)
(E∧)
(p∧q)(2) (p∧r)(3) ((p∧q)∨(p∧r))(1)
q r (E∧)
((p∧q)∨(p∧r))(1) p (E∧) p (E∧) (q∨r)
(I∨)
(q∨r)
(I∨)
p (E∨)(2)(3) (E∨)(4)(5)
(q∨r)
(I∧)
(p∧(q∨r))
(((p∧q)∨(p∧r))⇒(p∧(q∨r)))
(I⇒)(1)
(c) ` p ∧ q ⇒ p ∧ (¬p ∨ q)
Solution:
(p∧q)(1)
(p∧q)(1) q (E∧)
p (E∧) (I∨)
(¬p∨q)
(I∧)
(p∧(¬p∨q))
((p∧q)⇒(p∧(¬p∨q)))
(I⇒)(1)
(d) ` ¬¬p ⇒ p
Solution:
¬¬p(1)
p (E¬)
(¬¬p⇒p)
(I⇒)(1)
(e) ` p ⇒ ¬¬p
Solution:
p(1) ¬p(2)
(I⊥)
⊥ (I¬)(2)
¬¬p
(p⇒¬¬p)
(I⇒)(1)
40
(g) ` (¬q ⇒ ¬p) ⇒ (p ⇒ q)
Solution:
(¬q⇒¬p)(1) ¬q(3)
p(2) ¬p (E⇒)
(I⊥)
⊥ (I¬)(3)
¬¬q
q (E¬)
(I⇒)(2)
(p⇒q)
((¬q⇒¬p)⇒(p⇒q))
(I⇒)(1)
(h) ` ¬p ∧ ¬q ⇒ ¬(p ∨ q)
Solution:
(¬p∧¬q)(1) (¬p∧¬q)(1)
p(3) ¬p (E∧) q(4) ¬q (E∧)
(p∨q)(2) (I⊥) (I⊥)
⊥ ⊥ (E∨)(3)(4)
⊥ (I¬)(2)
¬(p∨q)
((¬p∧¬q)⇒¬(p∨q))
(I⇒)(1)
(i) ` ¬p ∨ ¬q ⇒ ¬(p ∧ q)
Solution:
(p∧q)(2) (p∧q)(2)
p (E∧) ¬p(3) q (E∧) ¬q(4)
(¬p∨¬q)(1) (I⊥) (I⊥)
⊥ ⊥ (E∨)(3)(4)
⊥ (I¬)(2)
¬(p∧q)
((¬p∨¬q)⇒¬(p∧q))
(I⇒)(1)
2. Prouvez les formules suivantes avec les règles d’inférences de la déduction naturelle.
Solution:
a(2) (I∨) ¬(a∨¬a)(1)
(a∨¬a)
(I⊥)
⊥ (I¬)(2)
¬a (I∨) ¬(a∨¬a)(1)
(a∨¬a)
(I⊥)
⊥ (I¬)(1)
¬¬(a∨¬a)
(a∨¬a)
(E¬)
(b) ` a ∨ b ⇒ a ∨ (¬a ∧ b)
Solution:
b(3) ¬a(5)
(I∧)
(¬a∧b)
(I∨) ¬(a∨(¬a∧b))(4)
(a∨(¬a∧b))
(I⊥)
⊥ (I¬)(5)
¬¬a (E¬)
a (I∨) ¬(a∨(¬a∧b))(4)
(a∨(¬a∧b))
(I⊥)
⊥ (I¬)(4)
(a∨b)(1) a(2) (I∨)
¬¬(a∨(¬a∧b))
(E¬)
(a∨(¬a∧b)) (a∨(¬a∧b))
(E∨)(2)(3)
(a∨(¬a∧b))
((a∨b)→(a∨(¬a∧b)))
(I→)(1)
41
(c) ` (a ⇒ b) ⇔ (¬a ∨ b)
Solution:
(a→b)(1) a(3)
(E→)
b (I∨) ¬(¬a∨b)(2)
(¬a∨b)
(I⊥)
⊥ (I¬)(3)
¬a (I∨) ¬(¬a∨b)(2) a(5) ¬a(6)
(¬a∨b) (I⊥)
⊥
(I⊥) (¬a∨b)(4) ⊥ (E⊥) b(7)
(I¬)(2) b (E∨)(6)(7)
¬¬(¬a∨b) b
(E¬) (I→)(5)
(¬a∨b) (a→b)
(I→)(1) (I→)(4)
((a→b)→(¬a∨b)) ((¬a∨b)→(a→b))
((a→b)↔(¬a∨b))
(I∧)
La branche gauche de la preuve est la plus difficile. On se retrouve avec une hypothèse
a ⇒ b. Pour l’utiliser, il faut avoir a en hypothèse. On serait tenté de prouver ¬a ∨ b à
partir de ¬a et monter a en hypothèse à l’aide d’une preuve par contradiction, mais cela
ne suffit pas pour obtenir la contradiction. Il faut plutôt prouver ¬a∨b par contradiction,
et monter ensuite a en hypothèse à l’aide d’une deuxième preuve par contradiction.
3. Prouvez les lois (LP-23) à (LP-43) en utilisant le style équationnel et les lois (LP-1) à (LP-22).
Il n’est pas nécessaire de toutes les prouver pour se préparer à l’examen. Plusieurs ont déjà
été prouvées en exercices ou en devoir.
42
Chapitre 2
Les mathématiques discrètes comprennent un éventail assez large d’objets mathématiques. Dans le
cadre de ce cours, nous nous limiterons aux fondements des mathématiques discrètes, soit la théorie
des ensembles, les relations, les fonctions et les suites. Les structures de données et les bases de
données relationnelles sont inspirées des mathématiques discrètes. Peter Codd se mérita le prix
Alan Turing en 1981 pour sa contribution à la définition des bases de données relationnelles fondées
sur les relations (i.e., l’algèbre des relations).
Nous utilisons le langage de spécification B [1] pour illustrer les mathématiques discrètes, ainsi
que l’outil ProB [7, 8], conçu par Michael Leuschel. Consultez le fichier
http://info.usherbrooke.ca/mfrappier/mat115/ref/resume-ens-rel-fonction-abrial.pdf
pour des exemples des opérateurs du langage B. Ce document a été produit par Jean-Raymond
Abrial1 , auteur de la méthode B.
2.1 Conventions
Nous utilisons les conventions suivantes
1
Jean-Raymond Abrial est docteur honoris causa de l’Université de Sherbrooke, diplômé de l’École Polytechnique
en France et de l’Université de Stanford aux États-Unis. Il a débuté sa carrière d’informaticien dans les années 60, en
concevant l’un des tout premiers systèmes de gestion de bases de données de type réseau, permettant aux développeurs
d’applications de gestion de l’époque de faire abstraction de la complexité de la représentation interne des données. Il
participa aussi à la conception du langage de programmation Ada en 1978-79 au sein de l’équipe CII-Honeywell-Bull
qui remporta le concours international organisé par le Ministère de la défense américain. Il y fut responsable des
aspects concurrentiels et notamment de la notion de rendez-vous, qui est à la base de la programmation concurrente.
Dès le début des années 70, il a amorcé ses travaux sur les modèles sémantiques de données et sur la spécification
formelle des systèmes, avec la méthode Z, la méthode B et finalement Event-B, qui constituent sans aucun doute une
des plus grandes contributions en génie logiciel. Il a réalisé le défi colossal de mener à terme une idée, de son concept
théorique initial jusqu’à son application industrielle à grande échelle, une performance encore plus remarquable qu’il
fut le premier à le faire au niveau des méthodes formelles, plusieurs grands chercheurs s’y étant attaqué sans succès
auparavant.
43
Symbole Description
X variable propositionnelle
A, B, C formule
t terme
x variable (terme)
~x x1 , . . . , xn (liste de variables)
S, T, U ensemble (terme)
f, g, h fonction (terme)
r relation (terme)
i, j, k, m, n nombre (terme)
s suite
Syntaxe
Description Expression ASCII B Notes
négation ¬A not (A)
conjonction A∧B A & B
disjonction A∨B A or B
implication A⇒B A => B
équivalence A⇔B A <=> B
pour tout ∀(~x) · (A ⇒ C) !(~x).(A => B) A doit typer chaque xi
il existe ∃(~x) · (A ∧ B) #(~x) · (A ∧ B) A doit typer chaque xi
égalité t1 = t2 t1 = t2
inégalité t1 6= t2 t1 /= t2
e∈E
44
Par exemple, on a
rouge ∈ CouleurPrimaire
L’appartenance à un ensemble défini par extension est définie comme suit:
y ∈ {e1 , . . . , en } ⇔ y = e1 ∨ . . . ∨ y = en (2.1)
Si un ensemble comprend un grand nombre d’éléments, ou bien une infinité d’éléments, on utilise
parfois les “. . . ” :
N = {0, 1, 2, . . .}
MultipleTrois = {0, 3, 6, 9, . . .}
Toutefois, cela n’est pas formel. Pour obtenir une définition formelle, on utilise alors la deuxième
méthode, c’est-à-dire par compréhension. Soit x une variable et A une formule de logique du premier
ordre; la forme générale d’une définition d’un ensemble par compréhension est la suivante:
{x | A}
La variable x représente un élément quelconque de l’ensemble et la formule A représente le critère
d’appartenance d’un élément x à l’ensemble. L’appartenance d’un élément à un ensemble défini par
compréhension est définie comme suit.
y ∈ {x | A} ⇔ A[x := y] (2.2)
On peut choisir la variable que l’on veut pour définir un ensemble par compréhension. Toutefois,
cette variable devient liée par cette définition, un peu comme la variable x est liée dans une formule
∀x · A. Par exemple, l’ensemble suivant contient tous les multiples de 3:
MultipleTrois = {x | x ∈ N ∧ ∃y · y ∈ N ∧ x = y ∗ 3}
On peut lire cette définition comme suit.
Un multiple de 3, représenté ici par la variable x, est un nombre naturel (x ∈ N) tel
qu’il existe un nombre naturel y tel que x = y ∗ 3.
On suppose ici que la définition des nombres naturels N est déjà donnée. La définition de N n’est pas
si triviale à formuler. Elle n’utilise pas la notion de compréhension; elle est basée sur les axiomes de
Peano, proposés en 1889! Un axiome est une formule que l’on suppose vraie, et qui sert à définir une
structure mathématique. Dans ce cours, nous n’aborderons pas la définition de N; nous supposerons
qu’elle existe.
Pour vérifier qu’un nombre n appartient à MultipleTrois, il suffit de vérifier si n satisfait la formule
définissant MultipleTrois, c’est-à-dire vérifier A[x := n]. Voici le calcul pour n = 6.
6 ∈ MultipleTrois
⇔ h (2.2) i
(x ∈ N ∧ ∃y · y ∈ N ∧ x = y ∗ 3)[x := 6]
⇔ h application de la substitution i
6 ∈ N ∧ ∃y · y ∈ N ∧ 6 = y ∗ 3
⇐ h règle I∃ avec y := 2 i
6 ∈ N ∧ ((y ∈ N ∧ 6 = y ∗ 3)[y := 2])
⇔ h application de la substitution i
6∈N∧2∈N∧6=2∗3
⇔ h arithmétique i
vrai
45
Une définition par compréhension peut mener à une contradiction. Russell2 l’a illustré par la
définition suivante:
y = {x | x 6∈ x}
On peut alors effectuer les déductions suivantes.
y∈y
⇔ h (2.2) i
(x 6∈ x)[x := y]
⇔ h application de la substitution i
y 6∈ y
E = {x | x ∈ S ∧ A}
De cette façon, l’ensemble est E est un sous-ensemble de l’ensemble bien défini S. Ce type de
définition ne peut mener à une contradiction comme celle illustrée par le paradoxe de Russell. Les
mécanismes utilisés pour produire des ensembles bien définis sont hors de la portée de ce cours;
il s’agit, entre autres, de la théorie des types. Par exemple, N est défini avec le nombre 0 et la
fonction succ qui dénote le successeur d’un nombre. Ainsi, 1 est défini comme succ(0), 2 comme
succ(succ(0)), et ainsi de suite.
On dit que qu’un ensemble E1 est un sous-ensemble de E2 , noté E1 ⊆ E2 , ssi tous les éléments
de E1 sont aussi des éléments de E2 . Voici la définition formelle du prédicat ⊆.
E1 ⊆ E2 ⇔ ∀x · x ∈ E1 ⇒ x ∈ E2 (2.3)
Finalement, l’ensemble vide, noté ∅, ne contient aucun élément, et il est donc inclus dans tous
les ensembles. Soit S un ensemble.
x ∈ ∅ ⇔ faux (2.4)
Soit S un ensemble quelconque, on a donc, par (2.3) et (2.4):
∅⊆S (2.5)
2
Bertrand Russell (1872—1970) est un mathématicien, logicien, philosophe, épistémologue, homme politique et
moraliste britannique. Il est considéré, avec Frege, comme l’un des fondateurs de la logique contemporaine (avec son
livre Principia Mathematica). Il s’engage dans de nombreuses polémiques : il défend des idées proches du socialisme
de tendance libertaire et milite également contre toutes les formes de religion, considérant qu’elles sont des systèmes
de cruauté inspirés par la peur et l’ignorance. Il organise le tribunal Sartre-Russell contre les crimes commis pendant
la guerre du Viêt Nam. Son œuvre, qui comprend également des romans et des nouvelles, est couronnée par le prix
Nobel de littérature en 1950.
46
Syntaxe
Description Expression ASCII B Notes
ensemble vide ∅ {} x ∈ ∅ ⇔ faux
x ∈ {t1 , . . . , tn }
extension (énumération) {t1 , . . . , tn } { t1 , . . . , t n } ⇔
x = t1 ∨ . . . ∨ x = tn
compréhension {x | A} {x | A} y ∈ {x | A} ⇔ A[x := y]
A doit donner un type à x
naturels N NATURAL {0, 1, 2, . . .}
naturels non nuls N1 NATURAL1 {1, 2, . . .}
entiers Z INTEGER {. . . , −2, −1, 0, 1, 2, . . .}
intervalle d’entiers i..j i..j {x | x ∈ Z ∧ i ≤ x ∧ x ≤ j},
où i ∈ Z et j ∈ Z
plus petit entier implé- MININT MININT valeur dépend du processeur
mentable
plus grand entier im- MAXINT MAXINT valeur dépend du processeur
plémentable
naturels implémentables NAT NAT 0..MAXINT
nat. impl. non nuls NAT1 NAT1 1..MAXINT
entiers implémentables INT INT MININT..MAXINT
chaîne de caractères STRING STRING
booléens BOOL BOOL {TRUE, FALSE}, pas une formule!!!
Syntaxe
Description Expression ASCII B Définition
appartenance x∈S x : S x est un élément de S
négation appartenance x 6∈ S x /: S ¬(x ∈ S)
inclusion S⊆T S <: T ∀x · x ∈ S ⇒ x ∈ T
négation inclusion S 6⊆ T S /<: T ¬(S ⊆ T )
inclusion stricte S⊂T S <<: T S ⊆ T ∧ S 6= T
négation inclusion stricte S 6⊂ T S /<<: T ¬(S ⊂ T )
fini finite(S) N/A S est fini
47
Syntaxe
Description Expression ASCII B Définition
union S∪T S \/ T {x | x ∈ S ∨ x ∈ T }
intersection S∩T S /\ T {x | x ∈ S ∧ x ∈ T }
différence S−T S−T {x | x ∈ S ∧ x 6∈ T }
ens. des parties
(ens. des sous-ens.) P(S) POW(S) {T | T ⊆ S}
(ens. de puissance)
ens. des parties
P1 (S) POW1(S) P(S) − {∅}
non vides
ens. des parties
F(S) FIN(S) {T | T ⊆ S ∧ finite(T )}
finies
ens. des parties
F1 (S) FIN1(S) F(S) − {∅}
finies non vides
union généralisée union(S) union(S) {x | ∃T · T ∈ S ∧ x ∈ T }
intersection
inter(S) inter(S) {x | ∀T · T ∈ S ⇒ x ∈ T }
généralisée S
union quantifiée (~x).(A | S) UNION(~x).(A | S) {y | ∃(~x) · (A ∧ y ∈ S)}
T
intersection quantifiée (~x).(A | S) INTER(~x).(A | S) {y | ∀(~x) · (A ⇒ y ∈ S)}
cardinalité card(S) card(S) nb. d’éléments de S (si finite(S))
S × T = {x 7→ y | x ∈ S ∧ y ∈ T } (2.6)
Notons que nous utilisons ici une version “abrégée” de la définition par compréhension; en effet, selon
la syntaxe introduite à la section précédente, on devrait retrouver une seule variable à la gauche du
séparateur “|”, alors qu’on retrouve ici un couple de variable x 7→ y. La version non-abrégé, qui est
beaucoup moins lisible, est la suivante:
S × T = {z | ∃x, y · z = x 7→ y ∧ x ∈ S ∧ y ∈ T }
48
Syntaxe
Description Expression ASCII B Définition
couple (élément d’une relation) x 7→ y x |-> y parfois aussi noté (x, y)
couple (notation alternative) (x, y) (x, y) (x, y) = x 7→ y
n-uplet (x1 , . . . , xn ) (x1 , . . . , xn ) (x1 , . . . , xn ) = ((x1 7→ x2 ) 7→ . . . xn )
produit cartésien S×T S * T {x 7→ y | x ∈ S ∧ y ∈ T }
ensemble de relations S↔T S <-> T P(S × T )
identité id(S) id(S) {x 7→ x | x ∈ S}
domaine d’une relation dom(r) dom(r) {x | ∃y · x 7→ y ∈ r}
codomaine d’une relation ran(r) ran(r) {y | ∃x · x 7→ y ∈ r}
composition (produit) (r1 ; r2 ) (r1 ; r2 ) {x 7→ y | ∃z · x 7→ z ∈ r1 ∧ z 7→ y ∈ r2 }
restriction du domaine SCr S <| r {x 7→ y | x ∈ S ∧ x 7→ y ∈ r}
restriction du codomaine rBS r |> S {x 7→ y | y ∈ S ∧ x 7→ y ∈ r}
antirestriction du domaine SC −r S <<| r {x 7→ y | x 6∈ S ∧ x 7→ y ∈ r}
antirestriction du codomaine rB−S r |>> S {x 7→ y | y 6∈ S ∧ x 7→ y ∈ r}
surcharge r1 C− r2 r1 <+ r2 (dom(r2 ) C − r1 ) ∪ r2
inverse r−1 r~ {x 7→ y | y 7→ x ∈ r}
image r[S] r[S] ran(S C r)
itération rn iterate(r, n) r0 = id(S), rn = r ; rn−1 , où r ∈ S × S
r∗ (n).(n ≥ 0 | rn )
S
fermeture réflexive et transitive closure(r)
r+ (n).(n ≥ 1 | rn )
S
fermeture transitive closure1(r)
2.5.1 Fonction
Une fonction f d’un ensemble S vers un ensemble T , notée f ∈ S → 7 T , est une relation telle que
chaque élément de dom(f ) est associé à exactement un élément de T . De manière équivalente,
on peut aussi dire que chaque élément de S est associé via f à au plus un élément de T (i.e., les
éléments de S qui ne sont pas dans le domaine de f ne sont pas associés à un élément de T , bien
entendu). Ce qui donne les définitions suivantes, qui sont toutes équivalentes.
f ∈S→
7 T
⇔
f ∈S↔T
∧ ∀x, y, z · x 7→ y ∈ f ∧ x 7→ z ∈ f ⇒ y = z
⇔
f ∈S↔T
∧ f −1 ; f ⊆ id(T )
49
f ∈S→
7 T
⇒
∀x · x ∈ dom(f ) ⇒ card(f [{x}]) = 1
∧
∀x · x ∈ S ⇒ card(f [{x}]) ≤ 1
∧
∀x · x ∈ S ⇒ card(f [{x}]) ∈ 0..1 ** lien avec diag. UML **
∧
∀y · y ∈ T ⇒ card(f −1 [{y}]) ∈ 0.. card(S) ** lien avec diag. UML **
Ce qui donne ceci comme exemple typique, avec la partie en rouge qui montre la caractéristique
distinctive d’une fonction par rapport aux autres classes de fonctions, c’est-à-dire qu’un élément de
S peut ne pas être relié à un élément de T par la fonction f .
f ∈S→
7 T
50
f ∈S→T
f ∈S
7 T
51
2.5.4 Fonction injective totale
Une fonction injective totale f d’un ensemble S vers un ensemble T est notée f ∈ S T . Ce qui
donne les définitions suivantes, qui sont toutes équivalentes.
f ∈ST
⇔
f ∈S 7 T
∧ dom(f ) = S
⇔
f ; f −1 = id(S)
∧ f −1 ; f ⊆ id(T )
⇔
f ∈S→ 7 T
∧ ∀x · x ∈ S ⇒ card(f [{x}]) ∈ 1..1 ** lien avec diag. UML **
∧ ∀y · y ∈ T ⇒ card(f −1 [{y}]) ∈ 0..1 ** lien avec diag. UML **
Ce qui donne ceci comme exemple typique.
f ∈ST
52
Ce qui donne ceci comme exemple typique.
f ∈S
7 T
f ∈ST
⇔
f ∈S
7 T
∧ f ∈S→T
⇔
f ∈S→T
∧ ran(f ) = T
⇔
f ∈S→ 7 T
∧ f −1 ; f = id(T )
∧ id(S) ⊆ f ; f −1
⇔
f ∈S→ 7 T
∧ ∀x · x ∈ S ⇒ card(f [{x}]) ∈ 1..1 ** lien avec diag. UML **
∧ ∀y · y ∈ T ⇒ card(f −1 [{y}]) ∈ 1.. card(S)
f ∈ST
53
2.5.7 Fonction bijective
Une fonction bijective f d’un ensemble S vers un ensemble T , notée f ∈ S 7 T , est une fonction
injective et surjective. Ce qui donne les définitions suivantes, qui sont toutes équivalentes.
f ∈S
7 T
⇔
f ∈S7 T
∧ f ∈S
7 T
⇔
f ∈S→ 7 T
∧ ∀x · x ∈ S ⇒ card(f [{x}]) ∈ 0..1 ** lien avec diag. UML **
∧ ∀y · y ∈ T ⇒ card(f −1 [{y}]) ∈ 1..1
⇔
f −1 ∈ T S
Ce qui donne ceci comme exemple typique.
f ∈S
7 T
Vu que l’inverse d’une bijection est une injection totale, les bijections ne sont pas utilisées en
pratique; on utilise au lieu les injections totales.
54
f ∈S
T
Dans le langage courant, les bijections totales sont simplement appelées des bijections.
55
Le tableau 2.6 résume les classes de fonctions.
Syntaxe
Description Expression ASCII B Définition
fonctions S→7 T S +-> T {f | f ∈ S ↔ T ∧ f −1 ; f ⊆ id(T )}
fonctions totales S→T S --> T {f | f ∈ S →7 T ∧ dom(f ) = S}
injections S 7 T S >+> T {f | f ∈ S → 7 T ∧ f −1 ∈ T → 7 S}
injections totales ST S >-> T {f | f ∈ S 7 T ∧ dom(f ) = S}
surjections S 7 T S +->> T {f | f ∈ S → 7 T ∧ ran(f ) = T }
surjections totales ST S -->> T {f | f ∈ S 7 T ∧ dom(f ) = S}
bijections S 7 T S >+>> T {f | f ∈ S 7 T ∧f ∈S 7 T}
bijections totales ST S >->> T {f | f ∈ S T ∧ f ∈ S T }
lambda expression λx.(A | t) %x.(A | t) {x 7→ t | A}
Syntaxe
Description Expression ASCII B Exemple
addition m+n m+n 1+1=2
soustraction m−n m−n 2−1=1
multiplication m∗n m∗n 2∗2=4
puissance mn m ** n 32 = 9
division entière m/n m/n 5/2 = 2
modulo m mod n m mod n 5 mod 2 = 1
maximum max(S) max(S) max({1, 2, 3}) = 3
minimum min(S) min(S) min({1, 2, 3}) = 1
somme quantifiée Σ(x).(A | t) SIGMA(x).(A | t) Σ(x).(x ∈ 1..3 | x ∗ 2) =
1 ∗ 2 + 2 ∗ 2 + 3 ∗ 2 = 12
produit quantifié Π(x).(A | t) PI(x).(A | t) Π(x).(x ∈ 1..3 | x + 1) =
(1 + 1) ∗ (2 + 1) ∗ (3 + 1) = 24
plus petit x<y x < y 1<2
plus petit ou égal x≤y x <= y 1≤1
plus grand x>y x > y 2>1
plus grand ou égal x≥y x >= y 2≥2
3
Section rédigée en collaboration avec le professeur D. Ziou.
56
Une suite est une collection ordonnée, possiblement infinie, d’objets indexés par un nombre
naturel. On note souvent une suite comme une liste d’éléments :
e0 , e1 , e2 , . . .
Parfois, la numérotation des objets débute à 1 au lieu de 0; ce choix est arbitraire et n’influence
en rien les principes de base d’une suite. On utilise parfois le terme séquence comme synonyme de
suite, mais il s’agit d’un anglicisme fréquemment utilisé, et généralement toléré.
D’un point de vue formel, une suite est représentée par une fonction f telle que
f ∈N→ 7 S
∧ finite(f ) ⇒ dom(f ) = 0..(card(f ) − 1)
∧ ¬ finite(f ) ⇒ dom(f ) = N
Cette définition semble un peu compliquée, mais elle indique seulement que le domaine de la fonction
est un intervalle commençant à 0; les objets sont donc numérotés séquentiellement en commençant
par 0; la complication vient du fait que si la suite est infinie, la fonction card n’est pas définie; il
faut donc faire deux cas distincts.
Voici quelques exemples de suites sur les naturels :
• les nombres pairs 0, 2, 4, 6, . . .
f = {(x, y) | x ∈ N ∧ y = 2 ∗ x}
f = λx.(x ∈ N | 2 ∗ x)
57
La définition de la suite des nombres premiers est un problème célèbre en mathématiques et en
informatique. Une bonne partie de la cryptographie en informatique repose sur les nombres premiers,
car il est aussi très difficile de calculer les facteurs premiers d’un nombre. On utilise les nombres
premiers pour encrypter les messages dans la plupart des protocoles utilisés pour les communications
et les transactions sur internet.
Ainsi, le ratio de deux éléments consécutifs est constant. On dit aussi que f est une suite géométrique
de raison k. Ce qui donne la forme suivante:
f1 = f0 ∗ k
f2 = f1 ∗ k = (f0 ∗ k) ∗ k = f0 ∗ k 2
f3 = f2 ∗ k = (f0 ∗ k 2 ) ∗ k = f0 ∗ k 3
...
f = λx.(x ∈ N | 2x )
∃k · k ∈ N ∧ ∀x · x > 0 ⇒ f (x) − f (x − 1) = k
La suite des nombres pairs et la suite des nombres impairs sont des suites géométriques, avec k = 2.
∃l · l ∈ R ∧
∀ · ∈ R ∧ > 0 ⇒
∃x1 · x1 ∈ N ∧
∀x2 · x2 ∈ N ∧ x1 ≤ x2 ⇒
|l − f (x2 )| ≤
58
On dit que l est la limite de la suite f , et on note lim f = l. Une suite infinie qui n’est pas
convergente est dite divergente.
Une suite f est dite croissante ssi
∀x · f (x) ≤ b
∀x · f (x) ≥ b
La limite d’une suite croissante convergente est la plus petite borne supérieure de la suite. La limite
d’une suite décroissante convergente est la plus grande borne inférieure de la suite. Par exemple, la
suite f = λx.(x ∈ N | 1/x) converge vers 0, tandis que la suite f = λx.(x ∈ N | x) diverge.
2.7.4 Séries
La somme des éléments d’une suite est appelée une série mathématique. Soit f une suite. La série
de f est définie comme suit dans le langage B :
ou bien, la forme suivante, qui fonctionne pour les séries finies et infinies:
X
f (x)
x∈dom(f )
59
n
X
2x = 2n+1 − 1
x=0
La série d’une suite géométrique f de raison k avec k ∈ R ∧ k 6= 1 est calculée comme suit :
n
1 − k n+1
X
x
f (0) ∗ k = f (0) ∗
1−k
x=0
On remarque que cette suite diverge pour k > 1, c’est-à-dire que la somme n’admet pas de borne
supérieure. Toutefois, cette suite converge pour 0 < k < 1 et donne la limite suivante:
f (0)
lim g =
1−k
Dans ce cas, on voit que la somme d’un nombre arbitrairement grand de termes s’approche d’un
nombre réel (ie, qu’elle est bornée par un nombre réel). Par exemple, soit
n x
!
X 1
g = λn. n ∈ N |
2
x=0
alors on a
1
lim g = 1 =2
1− 2
Notons que la somme n’atteint jamais 2, mais que l’on peut s’approcher aussi près que l’on veut de
2 (i.e., le de la définition (2.7.3)), on choisissant une valeur de n assez grande
60
Syntaxe
Description Expression ASCII B Définition/Exemple
suite vide [] []
suite par extension [t1 , . . . , tn ] [t1 , . . . , tn ]
suite sur S seq(S) seq(S) {f | f ∈ N → 7 S ∧ finite(f )
∧ dom(f ) = 1.. card(f )}
suite non-vide sur S seq1 (S) seq1(S) seq(S) − [ ]
suite injective sur S iseq(S) iseq(S) seq(S) ∩ N 7 S
suite inj. non-vide sur S iseq1 (S) iseq1(S) iseq1 (S) − [ ]
concaténation s1 _ s2 s1 ^s2 [a, b] _[c, d] = [a, b, c, d]
premier élément first(s) first(s) s 6= [ ], first([a, b, c]) = a
sauf premier élément tail(s) tail(s) s 6= [ ], tail([a, b, c]) = [b, c]
dernier élément last(s) last(s) s 6= [ ], last([a, b, c]) = c
sauf dernier élément front(s) front(s) s 6= [ ], front([a, b, c]) = [a, b]
inverse rev(s) rev(s) rev([a, b, c]) = [c, b, a]
61
Propriété Définition en logique Définition Exemples
relationnelle
réflexive ∀x · x ∈ S ⇒ x 7→ x ∈ r id(S) ⊆ r =, ≤, ⊆
irréflexive ∀x · x ∈ S ⇒ x 7→ x 6∈ r id(S) ∩ r = ∅ 6=, <, ⊂
(syn. antiréflexive)
∀(x, y, z) ·
x∈S∧y ∈S∧z ∈S∧
transitive x 7→ y ∈ r ∧ y 7→ z ∈ r r;r ⊆r =, <, ≤, ⊂, ⊆
⇒
x 7→ z ∈ r
∀(x, y) ·
x∈S∧y ∈S∧
symétrique x 7→ y ∈ r r−1 = r =
⇒
y 7→ x ∈ r
∀(x, y) · (x, y)
asymétrique x∈S∧y ∈S∧
(syn. antisymétrique x 7→ y ∈ r r ∩ r−1 = ∅ <, ⊂
forte) ⇒
y 7→ x 6∈ r
∀(x, y) ·
x∈S∧y ∈S∧
antisymétrique x 7→ y ∈ r ∧ y 7→ x ∈ r r ∩ r−1 ⊆ id(S) =, <, ≤, ⊆
⇒
x=y
totale ∀x · x ∈ S ⇒ ∃y · x 7→ y ∈ r dom(r) = S =, <, ≤, ⊆
surjective ∀x · x ∈ S ⇒ ∃y · y 7→ x ∈ r ran(r) = S =, <, ≤, ⊆
pré-ordre réflexive et transitive =, ≤, ⊆
équivalence réflexive, transitive, symétrique =
ordre réflexive, transitive et antisymétrique =, ≤, ⊆
ordre strict irréflexive et transitive (par déduction, <, ⊂
elle est aussi asymétrique)
bien fondée ∀T · T ∈ P1 (S) ⇒ < sur N, ⊂
∃s1 · s1 ∈ T ∧ ∀s2 · s2 7→ s1 6∈ r
i.e., il existe un élément minimal dans
T.
Ou bien, de manière équivalente,
il n’existe pas de suite infinie x0 , x1 , . . .
telle que xn+1 7→ xn ∈ r
i.e., . . . < x2 < x1 < x0
acyclique il n’existe pas de suite x0 , . . . , xn r+ ∩ id(S) = ∅ < sur N, Z, R, ⊂
telle que xn 7→ x0 ∈ r et
∀i · i ∈ 0..(n -1) ⇒ xi 7→ xi+1 ∈ r
62
1. {(a 7→ a), (b 7→ b)}
Pour être réflexive, une relation doit contenir id(T ) = {(a 7→ a), (b 7→ b)}.
1. {}
2. {(a 7→ b)}
4. {(b 7→ a)}
Pour qu’une relation soit irréflexive, elle ne doit contenir aucun couple de l’identité id(T ).
Pour T = {a, b}, il y a 8 relations qui ne sont ni réflexives, ni irréflexives. En voici 4 exemples.
1. {(a 7→ a)}
r = {a 7→ b, b 7→ c, c 7→ d}
1. a 7→ c, puisque a 7→ b ∈ r et b 7→ c ∈ r
3. b 7→ d, puisque b 7→ c ∈ r et c 7→ d ∈ r
Si une relation r est transitive, alors r = r+ = n≥1 rn . Voyons pourquoi. Par définition de
S
r1 ⊆ r2 ⇒ r1 ; r3 ⊆ r2 ; r3
Montrons que r3 ⊆ r.
63
r2 ⊆ r
⇒ h monotonie de ; i
r2 ; r ⊆ r ; r
⇔ h def. de rn i
r3 ⊆ r2
⇒ h r2 ⊆ r et transitivité de ⊆ i
r3 ⊆ r
On pourrait continuer ainsi pour chaque valeur de n > 3. Pour prouver complètement, nous
pourrions effectuer une preuve par induction, ce qui est l’objet du chapitre 3.
64
2.8.8 Exemple de relation d’ordre
Soit T = {a, b, c}. La relation suivante n’est pas une relation d’ordre.
r = {a 7→ a, a 7→ b, b 7→ a, b 7→ c}
On peut la transformer en relation d’ordre en retirant le couple b 7→ a, et en lui ajoutant les couples
suivants.
{b 7→ b, c 7→ c, a 7→ c}
Il y a bien sûr d’autres façons de la transformer en relation d’ordre. Par exemple, en retirant a 7→ b
et en ajoutant
{b 7→ b, c 7→ c}
r = {a 7→ a, a 7→ b, b 7→ a, b 7→ c}
. . . 7→ −3 7→ −2 7→ −1 7→ 0
La relation < sur les naturels (N) est bien fondée, car on s’arrête à 0 quand on remonte les flèches.
0 7→ 1 7→ 2 7→ 3 7→ . . .
La relation < sur N1 est aussi bien fondée. La relation < sur les réels n’est pas bien fondée. La
relation ⊂ est bien fondée sur les ensembles.
65
2.9 Lois des ensembles, fonctions et relations
MACHINE nomMachine
SETS
nomEnsemble = {element, . . . , element}
; ...
; nomEnsemble = {element, . . . , element}
CONSTANTS
nomConstante, . . . , nomConstante
PROPERTIES
A
END
La clause SETS permet de déclarer des ensemble par énumération de leurs éléments. Les décla-
rations des ensembles sont séparées par des “;”. Ces ensembles peuvent ensuite être utilisés pour
définir d’autres ensembles dans la clause CONSTANTS. La clause CONSTANTS permet de dé-
clarer des noms de constante, séparées par des “,”. La valeur de ces constantes est déterminée par
la clause PROPERTIES. La clause PROPERTIES permet de déclarer une (et une seule) formule
qui détermine la valeur des constantes. Il s’agit généralement d’une conjonction, que l’on écrit avec
l’indentation suivante, pour en faciliter la lecture.
A1
66
∧ A2
∧...
∧ An
Voici un exemple de machine qui définit des relations familiales.
MACHINE Exemple
/* Voici un commentaire */
SETS
CONSTANTS
Homme
, Femme
, Parent /* (x,y) : Parent ssi x est un parent de y */
, OncleTante /* (x,y) : OncleTante ssi x est un oncle ou une tante de y */
, OncleTante_alt /* Définition alternative de OncleTante,
utilisant seulement des opérations sur les relations */
, Oncle /* (x,y) : Oncle ssi x est un oncle de y */
, Tante /* (x,y) : Tante ssi x est une tante de y */
, EnsOncle /* ensemble des personnes qui sont des oncles */
PROPERTIES
Homme={p0, p1}
& Femme=Personne-Homme
& Parent={
(p0,p1)
,(p0,p2)
,(p1,p3)
,(p1,p4)
,(p2,p5)
,(p2,p6)
}
& OncleTante =
{(x,y) |
#(z1,z2).
(
z2 /= x
& (z1,x) : Parent
& (z1,z2) : Parent
& (z2,y) : Parent
)
}
& OncleTante_alt = (((Parent~ ; Parent) - id(Personne)) ; Parent)
67
Figure 2.1: L’écran principal de ProB
La figure 2.1 représente l’écran principal de ProB. La partie supérieure est un éditeur de spécification.
La partie inférieure est divisée en trois parties. À droite, sous la section State Properties, on retrouve
la définition des symboles. Au départ, seuls les symboles prédéfinis (ex., MAXINT et MININT) y
apparaissent, ainsi que les ensembles de la clause SETS. Ces informations sont affichées lorsqu’on
ouvre une spécification. Si on modifie une spécification, il faut la ré-ouvrir (menu File→Reopen, ou
bien le raccourci CTRL-R) pour la recompiler. Si la spécification contient des erreurs de syntaxe ou
si elle est insatisfaisable, un message d’erreur approprié (mais pas toujours très intuitif) est affiché.
Pour afficher les constantes de la spécification, il faut double-cliquer sur SETUP_CONSTANTS dans
la partie centrale intitulée Enabled Operations. ProB affiche alors les valeurs des constantes qu’il a
calculées pour satisfaire la formule de la clause PROPERTIES (voir figure 2.2). La figure 2.3 illustre
un message d’erreur quand la spécification est insatisfaisable. On peut aussi appeler l’évaluateur
de ProB, avec le (menu Analyse→Eval. . . , ou bien en double-cliquant n’importe où dans la fenêtre
State Properties. L’évaluateur peut évaluer n’importe quelle formule ou expression du langage en
utilisant la valeur actuelle des constantes (voir figure 2.4).
68
Figure 2.2: Affichage de la valeur des constantes
...
& Parent = {
(p0,p1)
,(p0,p2)
,(p2,p6)
}
& Parent = {}
...
69
2.11 Exercices
1. Soit
• A = {0, 1},
• B = {a, b},
• C = B ∪ {c, d},
• D = {0 7→ a, 1 7→ b, 2 7→ c, 3 7→ d},
• E = {0 7→ c, 1 7→ d},
• F = {c 7→ 0, c 7→ 1, d 7→ 1}
70
{x | x ∈ P(A) ∧ 0 ∈ x} Solution: {0}, {0, 1}
i.
A C D Solution: {0 7→ a, 1 7→ b}
ii.
iii.dom(A C D) Solution: {0, 1}
iv.ran(A C D) Solution: {a, b}
v.AC − D Solution: {(2 7→ c), (3 7→ d)}
vi.DB − B Solution: {0 7→ a, 1 7→ b}
vii.D ; E Solution: ∅
viii.(D ; F ) Solution: {(2 7→ 0), (2 7→ 1), (3 7→ 1)}
ix.((E ; F )−1 ; D) Solution: {0 7→ a, 1 7→ a, 1 7→ b}
x.(id(A) ; D) Solution: {0 7→ a, 1 7→ b}
xi.DC − E Solution: {(0 7→ c), (1 7→ d), (2 7→ c), (3 7→ d)}
xii.F [{c}] Solution: {0, 1}
xiii.{(x, y) | x ∈ 0..3 ∧ y = x + 1}∗
Solution: {(0, 0), (0, 1), (0, 2), (0, 3), (1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)}
xiv. {(x, y) | x ∈ 0..3 ∧ y ∈ 0..3 ∧ y = x + 1}+
Solution: {(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)}
MACHINE ExerciceMathDiscrete_1
SETS
Personne={h1,h2,h3,h4,h5,f1,f2,f3,f4,f5}
CONSTANTS NombrePair,Homme,Femme,Pere,Mere
PROPERTIES
NombrePair = {x | x : 1..12 & x mod 2 = 0} &
Homme={h1,h2,h3,h4,h5} &
Femme={f1,f2,f3,f4,f5} &
Pere={h1|->h2,h1|->f2,h2|->h3} &
Mere={f1|->h2,f1|->f2,f2|->h4}
END
(a) Définissez l’ensemble Facteur qui contient les facteurs du nombre 12 (ie, x est un facteur
de y ssi il existe un nombre z tel que y = x∗z, ou, de manière équivalente, y mod x = 0).
(b) Définissez l’ensemble Premier qui contient l’ensemble des nombres premiers entre 2 et 12
(ie, un nombre x est premier ssi il est supérieur à 1 et ses seuls facteurs sont 1 et x).
(c) Définissez la constante s qui est égale à la somme des éléments de Premier.
(d) Définissez l’ensemble FacteurPremier qui contient seulement les facteurs premiers de 12.
(e) Définissez par compréhension l’ensemble Papa qui contient les personnes qui sont des
pères.
(f) Définissez l’ensemble Papa2 qui contient les mêmes éléments que Papa, mais en utilisant
seulement des opérations sur les relations.
(g) Définissez par compréhension l’ensemble Fils qui contient les personnes qui sont des en-
fants de sexe masculin.
(h) Définissez par compréhension la relation GrandParent qui contient les couples x 7→ y telles
que x est un grand-parent de y.
71
(i) Définissez la relation GrandParent2 qui contient les mêmes éléments que GrandParent,
mais en utilisant seulement des opérations sur les relations.
(j) Définissez par compréhension la relation Conjoint qui contient des couples de personnes
qui sont des conjoints. On dit que x est un conjoint de y ssi x et y ont eu un enfant
ensemble. Donnez seulement les couples x 7→ y tels que x est un homme et y une femme.
(k) Définissez la relation Conjoint2 qui contient les mêmes éléments que Conjoint, mais en
utilisant seulement des opérations sur les relations.
(l) Définissez la relation Fraterie, dont les éléments sont des frères et sœurs (ie, des personnes
qui ont un parent en commun).
(a) Examinez les définitions des propriétés dans prop-relation.mch. Pour chaque propriété,
choisissez des valeurs pour r et vérifiez que votre relation r satisfait la propriété.
(b) Vérifiez avec ProB les questions suivantes
i. Existe-t-il une relation qui n’est ni réflexive, ni irréflexive?
ii. Une relation asymétrique forte est-elle aussi une relation antisymétrique?
iii. Pour un ensemble fini S, est-ce que les propriétés bien fondée et acyclique sont
équivalentes?
iv. Pour un ensemble infini S, est-ce que les propriétés bien fondée et acyclique sont
équivalentes? (Vous ne pouvez tester cette question dans ProB, puisque S est infini;
ProB ne peut traiter "complètement" que des ensembles finis).
v. Existe-t-il une relation r qui est à la fois une relation d’ordre et une relation d’équivalence?
vi. En général, est-ce qu’une relation d’ordre est aussi une relation d’équivalence?
vii. Une relation peut-elle être à la fois symétrique et antisymétrique?
72
Chapitre 3
Types de preuve
Dans ce chapitre, nous abordons différents types de preuves. Nous présentons tout d’abord les
preuves par induction (aussi appelée preuve par récurrence), qui permettent de prouver une formule
de la forme ∀x · x ∈ S ⇒ A, en utilisant une relation bien fondée sur S. Elle sont typiquement
utilisées pour les nombres naturels, mais aussi pour les ensembles et les structures de données
utilisées fréquemment en informatique, comme les arbres, les listes, ou tout autre objet, en utilisant
leur structure syntaxique, qui est naturellement inductive, comme relation bien fondée.
Nous illustrons ensuite le style classique de rédaction d’une preuve en langage naturel, qui est
une abstraction compacte d’un arbre de preuve tel que vu au chapitre 1. Les preuves écrites en
langage naturel sont fréquemment utilisées en mathématiques. Nous présentons ensuite le style de
preuve équationnel, qui consiste à formuler une suite d’équivalences, d’implications, d’égalités ou
d’inclusions, en utilisant à chaque étape des lois ou les définitions des objets manipulés.
Nous utiliserons la convention suivante pour faciliter la lecture de certaines preuves, en identifiant
ce qui change d’une ligne à l’autre à l’aide des symboles x y et p q.
A1 . . . x A2 y . . . A3
⇔ h étape 1 i
A1 . . . pA4 q . . . xA3 y
⇔ h étape 2 i
A1 . . . A4 . . . pA5 q
Une formule entourée des symboles x y est réécrite sur la ligne suivante dans la formule p q. Dans
l’exemple ci-dessus, A2 est réécrit en A4 à l’étape 1, et A3 est réécrite en A5 à l’étape 2. Si les
symboles p q n’apparaissent pas dans la ligne en-dessous, cela veut dire que l’expression entourée de
x y de la ligne au-dessus est supprimée par la réécriture dans l’étape de preuve. Voici un exemple
A1 ∧ xA1 y
⇔ h (LP-5) i
A1
73
x>0
⇒
À prouver A[0] A[x-1] ⇒ A[x]
par induction.
1. Preuve du cas de base. On fait la preuve pour la valeur minimale k de Nk (par exemple,
min(N1 ) = 1). Il faut donc prouver la formule suivante
A[x := k]
A[x := x − 1] (HI)
pour prouver A. Pour ce faire, on cherche à ré-écrire A pour faire apparaître A[x := x − 1] et
utiliser l’hypothèse d’induction.
74
Voici la définition formelle d’une sommation.
n n−1
!
X X
n>m ⇒ t = t + (t[i := n]) (3.1)
i=m i=m
Xm
n=m ⇒ t = (t[i := m]) (3.2)
i=m
Xn
n<m ⇒ t = 0 (3.3)
i=m
Voici un premier exemple de preuve par induction. Nous allons prouver le théorème suivant par
induction.
Théorème 5
x
X x(x + 1)
∀x · x ∈ N ⇒ i=
2
i=0
Puisque S = N, min = 0.
Cas de base x = 0.
Montrons
0
X 0(0 + 1)
A[x := 0] ≡ i=
2
i=0
0
X
i
i=0
= h (3.2) i
0
= h arithmétique i
0(0 + 1)
2
75
Cas x > 0, en utilisant l’hypothèse d’induction
x−1
X (x − 1)((x − 1) + 1) (x − 1)x
A[x := x − 1] ≡ i = = (HI) (3.4)
2 2
i=0
et prouvons A.
x
X
i
i=0
x−1
X
= h (3.1). Cette étape permet de faire apparaitre le terme de gauche de (3.4), soit i i
i=0
x−1
!
X
i +x
i=0
= h Hypothèse d’induction (HI) i
(x − 1)x
+x
2
= h arithmétique: dénominateur commun i
x2 − x 2x
+
2 2
= h arithmétique i
x2 − x + 2x
2
= h arithmétique i
x2 + x
2
= h arithmétique i
x(x + 1)
2
Théorème 6
x
X
∀x · x ∈ N1 ⇒ (2i − 1) = x2
i=1
Cas de base x = 1 (car le nombre 1 est l’élément minimal de N1 ). Il faut donc prouver
1
X
A[x := 1] ≡ (2i − 1) = 12
i=1
76
1
X
(2i − 1)
i=1
= h (3.3) i
2−1
= h arithmétique i
1
= h arithmétique i
2
1
b0 = 1 (3.6)
n n−1
n ∈ N1 ⇒ b = b b (3.7)
Théorème 7
∀x, y · x ∈ N ∧ y ∈ N ⇒ bx+y = bx by
Cette formule contient deux variables quantifiées. On peut réécrire cette formule à l’aide des lois
(LP-37) et (LPO-26), comme suit.
∀x, y · x ∈ N ∧ y ∈ N ⇒ bx+y = bx by
⇔ h (LP-37) i
∀x, y · x ∈ N ⇒ (y ∈ N ⇒ bx+y = bx by )
⇔ h (LPO-26) i
∀x · x ∈ N ⇒ (∀y · y ∈ N ⇒ bx+y = bx by )
77
On peut donc faire une induction sur cette formule pour x. La quantification sur y fera partie de
A.
A ≡ ∀y · y ∈ N ⇒ bx+y = bx by
Cas de base x = 0 (car le nombre 0 est l’élément minimal de N). Il faut donc prouver
A[x := 0] ≡ ∀y · y ∈ N ⇒ b0+y = b0 by
Cette formule contient un quantificateur. On peut la prouver comme suit, avec les règles I∀ (voir
page 37) et I⇒ (voir page 31).
dy ∈ Ne[1]
..
.
b0+y = b0 by [I⇒ ][1]
y ∈ N ⇒ b0+y = b0 by
I∀
∀y · y ∈ N ⇒ b0+y = b0 by
Il reste donc à prouver ce qui est en rouge, que nous prouvons comme suit.
b0 by
= h (3.6) i
1by
= h arithmétique i
by
= h y =0+y i
b0+y
Pour prouver A, qui contient aussi un quantificateur comme dans le cas de base, on utilise les règles
I∀ et I⇒ , on suppose y ∈ N, et il reste à prouver
bx+y = bx by
78
et obtenir la déduction suivante
b(x−1)+(y+1) = bx−1 by+1 (3.9)
de notre hypothèse d’induction, et de poursuivre notre preuve pour le cas x > 0.
b(x−1)+(y+1)
= h (3.9) i
bx−1 by+1
= h puisque y + 1 ∈ N1 , (3.7) avec n := y + 1 donne by+1 = by b i
bx−1 by b
= h commutativité multiplication i
bx−1 bby
= h (3.7) et hypothèse x > 0 i
bx by
Voici un autre exemple avec les nombres de Fibonacci. Soient les définitions suivantes des nombres
de Fibonacci, désignés ici par Fx avec x ∈ N.
F0 = 0 (3.10)
F1 = 1 (3.11)
n > 1 ⇒ Fn = Fn−1 + Fn−2 (3.12)
Théorème 8
∀x, y · x ∈ N ∧ y ∈ N1 ⇒ Fx+y = Fx+1 Fy + Fx Fy−1
Comme pour le théorème précédent, nous avons deux variables quantifiées. On peut réécrire cette
formule à l’aide des lois (LP-37) et (LPO-26), ce qui donne à prouver la formule suivante:
∀x · x ∈ N ⇒ (∀y · y ∈ N1 ⇒ Fx+y = Fx+1 Fy + Fx Fy−1 )
Cas x = 0 (car le nombre 0 est l’élément minimal de N). Il faut donc prouver
A[x := 0] ≡ ∀y · y ∈ N1 ⇒ F0+y = F0+1 Fy + F0 Fy−1
Ce qui se prouve comme suit. Avec les règles I∀ et I⇒ , on suppose y ∈ N1 et on prouve
F0+y = F0+1 Fy + F0 Fy−1 .
Ce qui se prouve comme suit.
F0+1 Fy + F0 Fy−1
= h (3.10) et (3.11) i
1Fy + 0Fy−1
= h arithmétique i
Fy
= h arithmétique: y = 0 + y i
F0+y
79
Cas x > 0. Hypothèse d’induction:
A[x := x − 1] ≡ ∀y · y ∈ N1 ⇒ F(x−1)+y = F(x−1)+1 Fy + F(x−1) Fy−1 (HI) (3.13)
Pour prouver A, on utilise les règles I∀ et I⇒ comme suit:
dy ∈ N1 e[1]
..
.
Fx+y = Fx+1 Fy + Fx Fy−1
[I⇒ ][1]
y ∈ N1 ⇒ Fx+y = Fx+1 Fy + Fx Fy−1
I
∀y · y ∈ N1 ⇒ Fx+y = Fx+1 Fy + Fx Fy−1 ∀
Il reste donc à prouver ce qui est en rouge:
Fx+y = Fx+1 Fy + Fx Fy−1 .
à partir de l’hypothèse y ∈ N1 , ce qui se prouve comme suit. Typiquement, on commence avec
le terme le plus complexe et on essaie de le réécrire jusqu’à obtenir le terme le plus simple. En
suivant cette stratégie, nous devrions commencer avec le terme de droite (i.e., Fx+1 Fy + Fx Fy−1 )
et essayer d’y faire apparaitre l’hypothèse d’induction. Toutefois, cette stratégie ne fonctionne pas
ici (essayez-là pour le constater). Nous allons donc débuter avec le terme de gauche (i.e., Fx+y ) et
essayer d’y faire apparaitre un des termes de l’hypothèse d’induction.
Fx+y
= h arithmétique: x + y = (x − 1) + (y + 1) i
F(x−1)+(y+1)
Remarquons que ce terme apparait presque dans (3.13). Pour l’obtenir, il suffit d’instancier (HI)
(soit (3.13)) avec y := y + 1, grâce à la règle d’inférence E∀ de la page 37. Puisque nous avons
supposé que y ∈ N1 , on a donc y + 1 ∈ N1 . On peut donc utiliser la règle E⇒ comme suit:
y ∈ N1 (HI) : (3.13)
Arith. E∀ avec [y := y + 1]
y + 1 ∈ N1 y + 1 ∈ N1 ⇒ F(x−1)+(y+1) = F(x−1)+1 Fy+1 + F(x−1) F(y+1)−1
[E⇒ ]
F(x−1)+(y+1) = F(x−1)+1 Fy+1 + F(x−1) F(y+1)−1
et obtenir la déduction suivante, après simplification des indices.
F(x−1)+(y+1) = Fx Fy+1 + F(x−1) Fy (3.14)
Poursuivons donc la preuve du cas d’induction, en utilisant (3.14).
xF(x−1)+(y+1) y
= h (3.14) i
pFx Fy+1 + Fx−1 Fy q
x y
= h (3.12) i
p q
xFx (Fy + Fy−1 ) y + Fx−1 Fy
= h distributivité multiplication sur addition i
pFx Fy + Fx Fy−1 q + Fx−1 Fy
x y
= h commutativité addition i
p q
xFx Fy + Fx−1 Fy y + Fx Fy−1
= h distributivité multiplication sur addition i
p (Fx + Fx−1 ) Fy q + Fx Fy−1
x y
= h hyp. x > 0, donc x + 1 > 1, (3.12) avec n := x + 1 donne Fx+1 = Fx + Fx−1 i
pFx+1 qFy + Fx Fy−1
80
(∀x · x ∈ F(S) ⇒ A) ⇔ (∀x · x ∈ F(S) ⇒ ((∀y · y ∈ F(S) ∧ y ⊂ x ⇒ A[x := y]) ⇒ A)) (3.17)
Notons que l’on peut aussi utiliser S ≺ S 0 ⇔ card(S) < card(S 0 ) pour les ensembles. Ce ne change
pas la difficulté de la preuve lorsqu’elle est faite à la main. Toutefois, les prouveurs automatisés,
comme ceux du langage B, travaillent plus facilement avec ⊂ qu’avec card(S) < card(S 0 ).
Soit
B ≡ y ∈N∧y <x
En utilisant la règle I∀ , il reste à prouver
x∈N (3.18)
et on doit prouver
(∀y · B ⇒ A[x := y]) ⇒ A (3.19)
En utilisant la règle d’introduction de l’implication (I⇒ ), on pose comme hypothèse
et on prouve
A
La formule (3.20) est appelée l’hypothèse d’induction générale. Pour pouvoir utiliser cette hypothèse
afin de prouver A, il faut prouver B. Pour x = 0, l’hypothèse d’induction ne peut pas être utilisée,
81
car B[x := 0] ≡ y ∈ N ∧ y < 0 est fausse : il n’y a pas de valeur pour y qui puissent satisfaire
y ∈ N ∧ y < 0, le nombre 0 n’ayant pas de prédécesseur dans N pour la relation “<”. Il faut donc
prouver la formule A pour le cas x = 0, et on peut prouver les autres cas (x > 0) avec l’hypothèse
d’induction. Cela justifie donc les deux cas que l’on retrouve dans une preuve par induction sur les
naturels. Nous utilisons donc une preuve par cas (E∨ ) avec la formule x = 0 ∨ x > 0, qui se déduit
facilement de l’hypothèse (3.18) (x ∈ N).
Voici un arbre de preuve qui illustre ces déductions. Ce qui reste à faire dans cette preuve est
en rouge. Ce sont les deux étapes de la preuve par d’induction, soit le cas de base avec x = 0 en
hypothèse, et le cas d’induction, avec A[x := x − 1] et x > 0 en hypothèse.
Cas x = 0.
Puisque x = 0 , on peut remplacer x par 0 dans notre formule à prouver (i.e., A[x := 0]), il faut
donc prouver
0
X 0(0 + 1)
i= .
2
i=0
Ce qui se prouve comme suit:
0
X
i
i=0 P
= h Définition de i
0
= h arithmétique i
0(0 + 1)
2
82
Puisque que nous avons x > 0, alors x − 1 ∈ N ∧ x − 1 < x est vrai. Avec la règle E⇒ , on peut donc
conclure
x−1
X (x − 1)((x − 1) + 1)
i= (HI) (3.22)
2
i=0
ce qui est notre hypothèse d’induction générale (3.20) instanciée avec y := x−1, que nous identifions
par (HI). Nous avons maintenant ce qu’il faut pour faire la preuve de (3.21).
x
X
i
i=0
= h (3.1) i
x−1
!
X
i +x
i=0
= h Hypothèse d’induction (3.22) i
(x − 1)((x − 1) + 1)
+x
2
= h arithmétique i
...
= h arithmétique i
x(x + 1)
2
Ce qui complète la preuve. La règle de preuve donnée à la section 3.1.1 est donc une application
particulière de la règle générale de preuve par induction.
φ2 = φ + 1 (3.24)
Théorème 9
∀x · x ∈ N1 ⇒ Fx ≤ φx−1
On peut prouver par induction ce théorème, mais on observera une particularité par rapport aux
preuves précédentes : il faudra prouver deux cas de base plutôt qu’un seul.
A[x := 1] ≡ F1 ≤ φ1−1
83
F1
= h (3.11) i
1
= h φ0 = 1 i
φ1−1
Preuve de A
Fx
= h hyp. x > 1, (3.12) i
Fx−1 + Fx−2
≤ h (3.25) i
φx−2 + Fx−2
Nous avons instancié l’hypothèse d’induction avec x := x − 1, ce qui nous permet de l’appliquer
au premier terme Fx−1 . Par contre, nous ne pouvons l’utiliser pour le deuxième terme Fx−2 , car
B[x := x − 2] est fausse pour x = 2 dans (3.20), car nous n’avons que x > 1 en hypothèse. Nous
allons donc faire une sous-preuve par cas, avec x = 2 ∨ x > 2.
F2
= h (3.12) i
F0 + F1
= h (3.10) et (3.11) i
0+1
< h par (3.23), φ = 1, 6180339887499 i
φ
= h arithmétique i
φ2−1
Cas x > 2. On peut instancier l’hypothèse d’induction générale (3.20) avec y := x − 2, car x > 2
entraine que x − 2 ∈ N1 ∧ x − 2 < x, ce qui donne comme deuxième application de l’hypothèse
d’induction
A[x := x − 2] ≡ Fx−2 ≤ φx−3 (HI) (3.26)
On prouve A comme suit.
Fx
= h hyp. x > 2, (3.12) i
Fx−1 + Fx−2
≤ h (3.25) et (3.26) i
x φx−2 y+ φx−3
= h hyp. x > 2, (3.7) entraine φx−2 = φx−3 φ i
84
pφx−3 φq + φx−3
= h distributivité i
φx−3 (φ + 1)
= h (3.24): φ + 1 = φ2 i
φx−3 φ2
= h théorème 7 i
φx−1
2. Prouver les cas de bases, c’est-à-dire les éléments de k..j; c-à-d prouver A[x := i] pour chaque
i ∈ k..j.
A[x := x − 1 − (i − k)]
card(P(∅))
=
card({∅})
=
85
1
=
20
=
2card(∅)
Cas d’induction : x 6= ∅
x0 = x − {z}.
T = {y | y ⊆ x ∧ z 6∈ y} = P(x0 ) (3.28)
U = {y | y ⊆ x ∧ z ∈ y}
Par définition de T et U , on a
P(x) = T ∪ U (3.29)
et
T ∩U =∅ (3.30)
On note que
card(x0 ) = card(x) − 1 (3.31)
Considérons les fonctions f et g suivantes.
f ∈T →U ∧g ∈U →T
(∃f · f ∈ A
B) ⇒ card(A) = card(B) (3.32)
Donc,
card(T ) = card(U ) (3.33)
Finalement, la loi suivante sera utile pour calculer la cardinalité d’une union.
Nous avons maintenant tout ce qu’il faut pour prouver le cas d’induction.
86
card(P(x))
= h (3.29) i
card(T ∪ U )
= h (3.34) i
card(T ) + card(U ) − card(T ∩ U )
= h (3.30) i
card(T ) + card(U ) − card(∅)
= h card(∅) = 0 i
card(T ) + card(U )
= h (3.33) i
card(T ) + card(T )
= h arithmétique i
2 card(T )
= h (3.28) i
2 card(P(x0 ))
= h (HI) i
2 2card(x0 )
= h (3.31) i
2 2card(x)−1
= h Théorème 7 i
2card(x)
h(∅) = 0 (3.35)
Finalement, le nombre de noeuds card(t) d’un arbre t est défini comme suit:
card(∅) = 0 (3.38)
87
Théorème 11
∀x · x ∈ T ⇒ card(x) ≤ 2h(x) − 1
card(he, g, di)
= h (3.39) i
card(g) + card(d) + 1
≤ h (3.41), (3.42) i
2h(g) − 1 + 2h(d) − 1 + 1
≤ h soit i = max({h(d), h(g)}) i
2i −1+ 2i −1+1
= h i = h(x) − 1 i
2h(x)−1 −1+ 2h(x)−1 −1+1
= h Arithmétique i
2(2h(x)−1 ) −1
= h Théorème 7 i
2h(x) −1
Comme pour les ensembles, on peut utiliser la relation bien-fondée x ≺ y ⇔ h(x) < h(y) sur les
arbres. Toutefois, comme indiqué pour les ensembles, la relation x est un sous-arbre propre de y
est plus facile à utiliser avec les prouveurs automatisés.
B ≡ ∀y · y ∈ S ∧ y ≺ x ⇒ A[x := y]
88
C ≡ ∀x · x ∈ S ⇒ A
D ≡ ∀x · x ∈ S ⇒ (B ⇒ A)
La preuve par contradiction a la structure suivante:
dDe[1] d¬Ce[2]
..
.
faux [E ][2]
false
C [I⇒ ][1]
D⇒C
Ré-écrivons ¬C
¬C
⇔ h (LPO-11),(LP-25) i
∃x · x ∈ S ∧ A
De ¬C, on peut déduire qu’il existe des valeurs de x pour lesquelles A est fausse. Soit T l’ensemble
de ces valeurs.
T = {x | x ∈ S ∧ ¬A}
Puisque T est un sous-ensemble non-vide de S et que ≺ est bien fondée, alors, par définition de
relation bien fondée, il existe au moins une valeur minimale x0 dans T et ¬A[x := x0 ]. La preuve
par contradiction se fera avec la formule A[x := x0 ].
89
Arbre de preuve P2
[2]
¬C dy ∈ S ∧ y ≺ x0 e[1] d¬A[x := y]e
déf. C et T [E∧2 ] déf. T
T 6= ∅ y ≺ x0 y∈T
≺ bien fondée déf. T
x0 ∈ min(T ) x0 6∈ min(T )
[E¬ ]
faux [I¬ ][2]
A[x := y]
[I⇒ ][1]
y ∈ S ∧ y ≺ x0 ⇒ A[x := y]
[I∀ ]
∀y · y ∈ S ∧ y ≺ x0 ⇒ A[x := y]
déf. B
B[x := x0 ]
3.2.1 A ⇒ B - Implication
Soit à prouver une formule de la forme
A⇒B
On décrira cette preuve comme suit:
Supposons A et montrons B. . . . (comment prouver B) . . .
Cela découle de la règle de preuve I⇒ .
3.2.2 A ⇔ B - Équivalence
Soit à prouver une formule de la forme
A⇔B
On décrira cette preuve comme suit:
Montrons A ⇒ B et ensuite montrons B ⇒ A. . . .
Cela découle de la règle de preuve I⇔ .
3.2.3 A ∧ B - Conjonction
Soit à prouver une formule de la forme
A∧B
On décrira cette preuve comme suit:
Montrons A et montrons ensuite B.
. . . (comment prouver A) . . . .
. . . (comment prouver B) . . .
Cela découle de la règle de preuve I∧ .
90
3.2.4 Preuve par contradiction
Soit à prouver une formule A. On décrira cette preuve comme suit:
Preuve par contradiction. Supposons ¬A. . . . (comment obtenir une contradiction) . . .
Cela découle de la règle de preuve I¬ et la contradiction se prouve avec la règle E¬ .
On utilise souvent la loi du tiers exclu (LP-20) pour distinguer les cas.
∀x · x ∈ S ⇒ A
∀(x, y, z) · x ∈ S ∧ y ∈ S ∧ z ∈ S ⇒ A
91
3.2.8 ∃ - Quantification existentielle
Soit à prouver une formule de la forme
∃x · A
On décrira cette preuve comme suit:
où t est un terme représentant une valeur de x. Tel qu’indiqué dans la règle de preuve I∃ (voir page
37), la preuve de A[x := t] ne doit rien supposer à propos de x. Aucune hypothèse de la preuve
de A[x := t] ne peut mentionner x; les hypothèses doivent porter sur t. Entre autres, t ne peut
contenir x.
Nous utiliserons les définitions suivantes d’injection et de surjection, pour simplifier les preuves et
pour illustrer différents cas de figure.
P1 P2
f ∈AB f ∈AB
def.
f ∈A
B
C⇒f ∈A B
92
... ...
... ∈ A f (. . .) = x
[I∧ ]
. . . ∈ A ∧ f (. . .) = x
I∃ [y := . . .]
∃y · y ∈ A ∧ f (y) = x
[I⇒ ]
x ∈ B ⇒ ∃y · y ∈ A ∧ f (y) = x
[I∀ ]
∀x · x ∈ B ⇒ ∃y · y ∈ A ∧ f (y) = x
(3.47)
f ∈AB
P2
Cette preuve se décrit en langue naturelle comme suit. Elle sera à compléter en devoir ou en
exercices, d’où la présence de parties à compléter, identifiées par les “. . . ”.
f (x) = f (y)
⇒ h ... i
...
⇒ h ... i
x=y
(3.43)
⇒ h ... i
...
⇒ h ... i
... ∈ A
(3.43)
⇒ h ... i
...
⇒ h ... i
f (. . .) = x
Preuve.
Montrons que la partie de gauche est incluse dans la partie de droite.
93
xr1 ; (r2 ∩ r3 )y
= h Déf. “;” i
p{x 7→ y | ∃z · x 7→ z ∈ r1 ∧ z 7→ y ∈ ( r2 ∩ r3 )}q
x y
Dans cette étape, nous avons simplement appliqué la définition de “;” telle que donnée au tableau 2.5.
La prochaine étape consiste à ré-écrire r2 ∩ r3 en utilisant la définition de “∩” du tableau 2.4.
= h déf. ∩ i
{x 7→ y | ∃z · x 7→ z ∈ r1 ∧ xz 7→ y ∈ p{z → 7 y ∈ r2 ∧ z 7→ y ∈ r3 }qy}
7 y|z→
= h (LE-5) i
7 y ∈ r2 ∧ z 7→ y ∈ r3 q}
{x 7→ y | ∃z · x 7→ z ∈ r1 ∧ pz →
Ces deux étapes survenant fréquemment et étant particulièrement fastidieuses, nous les combinerons
en une seule étape dans les preuves.
= h déf. ∩, (LE-5) i
{x 7→ y | ∃z · xx 7→ z ∈ r1 y ∧ z 7→ y ∈ r2 ∧ z 7→ y ∈ r3 }
Poursuivons.
= h (LP-5) i
{x 7→ y | ∃z · px 7→ z ∈ r1 ∧ xx 7→ z ∈ r1 q ∧ z 7→ y ∈ r2 y ∧ z 7→ y ∈ r3 }
= h (LP-7) i
{x 7→ y | x∃z y · x 7→ z ∈ r1 ∧ pz 7→ y ∈ r2 ∧ x 7→ z ∈ r1 q ∧ z 7→ y ∈ r3 }
⊆ h (LPO-19),(LE-3) i
p q p q
{x 7→ y | x( ∃z · x 7→ z ∈ r1 ∧ z 7→ y ∈ r2 )y ∧ x( ∃z · x 7→ z ∈ r1 ∧ z 7→ y ∈ r3 )y}
= h déf. “;” et (LE-5) i
p q p q
x{x 7→ y | x 7→ y ∈ r1 ; r2 ∧ x 7→ y ∈ r1 ; r3 }y
= h déf. ∩ i
pr1 ; r2 ∩ r1 ; r3 q
S ⊆ T ⇔ ∀x · (x ∈ S ⇒ x ∈ T ) (3.49)
xx 7→ y ∈ r1 ; (r2 ∩ r3 )y
⇔ h Déf. “;” et (LE-5) i
p∃z · x 7→ z ∈ r1 ∧ z 7→ y ∈ (r2 ∩ r3 ) q
x y
⇔ h déf. ∩ et (LE-5) i
∃z · xx 7→ z ∈ r1 y ∧ pz 7→ y ∈ r2 ∧ z 7→ y ∈ r3 q
⇔ h (LP-5) i
∃z · px 7→ z ∈ r1 ∧ xx 7→ z ∈ r1 q ∧ z 7→ y ∈ r2 y ∧ z 7→ y ∈ r3
⇔ h (LP-7) i
p 7 y ∈ r2 ∧ x 7→ z ∈ r1 q ∧ z 7→ y ∈ r3
x∃z y · x 7→ z ∈ r1 ∧ z →
⇒ h (LPO-19) i
94
p q p q
x( ∃z · x 7→ z ∈ r1 ∧ z 7→ y ∈ r2 )y ∧ x( ∃ z · x 7→ z ∈ r1 ∧ z 7→ y ∈ r3 )y
⇔ h déf. “;” et (LE-5) i
px 7→ y ∈ r1 ; r2 q ∧ px 7→ y ∈ r1 ; r3 q
x y
⇔ h déf. ∩ et (LE-5) i
px 7→ y ∈ r1 ; r2 ∩ r1 ; r3 q
Cette preuve comprend le même nombre d’étapes que la preuve précédente, mais les lignes sont plus
courtes, vu qu’on utilise seulement les prédicat définissant les ensembles de la preuve précédente; la
partie {x 7→ y | . . .} est absente.
Voici un autre exemple utilisant l’opérateur ran, qui extrait un ensemble d’une relation. Voici
un premier exemple de théorème à prouver en utilisant les définitions.
Théorème 14 Soit r1 , r2 ∈ S ↔ S des relations sur un ensemble S.
ran(r1 ; r2 ) ⊆ ran(r2 ) (3.50)
Preuve.
Montrons que la partie de gauche est incluse dans la partie de droite.
x ran(r1 ; r2 )y
= h Déf. ran i
p{x | ∃y · y 7→ x ∈ r1 ; r2 }q
x y
= h Déf. “;”, (LE-5) i
{x | ∃y · p∃z · xy 7→ z ∈ r1 y ∧ z 7→ x ∈ r2 q}
⊆ h E∧ , (LE-3) i
{x | x∃y y · ∃z · z 7→ x ∈ r2 }
= h (LPO-32) i
{x | ∃z · z 7→ x ∈ r2 }
= h Déf. ran i
ran(r2 )
Théorème 15 Soit r1 , r2 ∈ S ↔ S des relations sur un ensemble S et T ⊂ S.
(T C r1 ) ; r2 = T C (r1 ; r2 ) (3.51)
Preuve.
Montrons que la partie de gauche est égale à la partie de droite.
(T C r1 ) ; r2
= h Déf. “;” i
{x 7→ y | ∃z · x 7→ z ∈ T C r1 ∧ z 7→ y ∈ r2 }
= h Déf. C, (LE-5) i
{x 7→ y | ∃z · x ∈ T ∧ x 7→ z ∈ r1 ∧ z 7→ y ∈ r2 }
= h (LPO-28) i
{x 7→ y | x ∈ T ∧ ∃z · x 7→ z ∈ r1 ∧ z 7→ y ∈ r2 }
= h Déf. “;”, (LE-5) i
{x 7→ y | x ∈ T ∧ x 7→ y ∈ r1 ; r2 }
= h Déf. C i
T C (r1 ; r2 )
95
3.4 Exercices
1. Prouvez par induction les formules suivantes.
(c) ∀x · x ∈ N3 ⇒ 2x + 1 < 2x
(d) ∀x · x ∈ N1 ⇒ φx−2 ≤ Fx
(e) ∀x · x ∈ N ⇒ Fx < 2x
r∈S→
7 S ⇒ ((x, y) ∈ r ∧ (x, z) ∈ r ⇒ y = z)
(a) (A ∩ B) × (C ∩ D) = (A × C) ∩ (B × D)
(b) (A ∪ B) × (C ∪ D) = (A × C) ∪ (B × D)
96
Chapitre 4
Automate
Les automates sont largement utilisés en informatique. Ils permettent de reconnaitre les mots d’un
langage, et définissent la classe des langages dits réguliers. On les retrouvent dans les compilateurs,
les spécifications de systèmes, la vérification de systèmes, entre autres. Ils constituent le modèle
le plus simple de représentation du calcul dans un ordinateur. En effet, un ordinateur n’est rien
d’autre qu’une machine qui dispose d’une mémoire finie, d’un état (i.e., la valeur courante de sa
mémoire), et qui effectue une opération qui change son état. Les automates sont étroitement reliés
aux expressions régulières et aux grammaires régulières, qui représentent tous la même classe de
langages, soit les langages dits réguliers. Les expressions régulières et les grammaires sont présentées
dans le cours IFT313. Il existe plusieurs variantes d’automates (machine de Mealy et de Moore,
automate à pile, diagramme états-transitions, machine de Turing). Dans MAT115, on s’intéresse
seulement aux automates finis déterministes et non-déterministes, qui sont équivalents. Les autres
formes d’automates sont traitées dans les cours suivants : IFT313 – Introduction aux langages
formels, IFT232 – Méthodes de conception orientée objet, IGL301 – Spécification et vérification
des exigences, IFT580 – Compilation et interprétation des langages, IFT503 – Théorie du calcul et
IGL501 – Méthodes formelles en génie logiciel.
La figure 4.1 illustre deux AFD. L’état initial d’un AFD est identifié par l’un ou l’autre des pic-
togrammes ci-dessous.
0 ou 0
97
b
(i) a c
0 1 2
(ii) a c
0 1 2
a
b,c a,b,c
3
a,b,c
Un état initial peut aussi être final; il est représenté comme suit.
0 ou 0
L’AFD (i) est dit incomplet, car sa fonction de transition n’est pas totale. Pour l’état 0, les
transitions sur b et c ne sont pas définies. Idem pour l’état 1 avec a, et l’état 2 avec a,b,c. On utilise
souvent la convention suivante, par soucis de lisibilité: les transitions non définies sont implicitement
des transitions vers un état appelé puits; ce nom signifie qu’on ne peut plus sortir de cet état après
y être entré. L’AFD (ii) représente l’AFD (i) avec son état 3, qui est un état puits, ajouté afin que
la fonction de transition δ soit totale. Voici la définition formelle de l’automate (ii).
• Q = {0, 1, 2, 3}
• Σ = {a, b, c}
• q0 = 0
• F = {2}
Chaque triplet de δ représente une transition dans l’automate. Voici quelques autres définitions
utiles.
98
• w = [σ1 , . . . , σn ] dénote une suite formée des symboles σ1 , . . . , σn , tel que chaque σi ∈ Σ.
En B, une suite w formée d’éléments de S est une fonction de N →
7 S telle que
On écrit donc w(i) en B pour dénoter σi . Le tableau 2.8 du chapitre 2 présente les opérateurs
du langage B permettant de manipuler des suites.
Plusieurs synonymes du terme suite sont utilisés dans la littérature:
– mot,
– chaîne de caractères (inspiré de l’anglais character string),
– séquence de symboles.
– l’ordre d’énumération des éléments de la suite est important, alors que l’ordre d’énumération
des éléments d’un ensemble n’est pas important;
– un élément peut apparaître plusieurs fois dans une suite, et chaque occurrence compte,
alors qu’un élément peut apparaitre une seule fois dans un ensemble.
6
[a, b] = [b, a] {a, b} = {b, a}
[a, a] = 6 [a] {a, a} = {a}
Nous utiliserons généralement le terme “mot” au lieu de “suite de symboles” dans le reste de
ce chapitre.
[ ] _ w = w _[ ] = w
• Σ+ = Σ∗ − [ ]
Σ+ est noté seq1 (Σ) dans le langage B.
(q1 , σ, q2 ) ∈ δ
on utilise à la place la notation suivante, qui rappelle une transition dans l’automate.
σ
q1 −
→ q2
99
• δb ∈ Q × Σ∗ → Q est l’extension de δ aux mots. Elle est définie comme suit:
δ(q,
b [ ]) = q (4.1)
b w _[σ]) = δ(δ(q,
δ(q, b w), σ) (4.2)
• L(M ) = {w | w ∈ Σ∗ ∧ δ(q
b 0 , w) ∈ F } dénote le langage accepté par l’AFD M .
En termes plus simples, on dit qu’un automate accepte le mot w = σ1 . . . σn si la séquence de
transitions qui lit le mot w termine sur qn ∈ F .
σ1 2 σ n σ
q0 −→ q1 −→ . . . −→ qn et qn ∈ F
Rappelons que q0 dénote l’état initial de l’automate. Voici un exemple d’acceptation du mot
abbc par l’automate de la Figure 4.1(ii)
a b b c
0−
→1→
− 1→
− 1→
− 2∈F
Le mot bb est refusé par le même automate, car l’automate termine dans l’état 3 après avoir
lu tous les symboles, et cet état n’est pas final.
b b
0→
− 3→
− 3 6∈ F
La fonction δb permet de calculer le terme δ(δ((. . .), σn−1 ), σn ). À titre illustratif, appliquons
la définition de δb à l’automate de la Figure 4.1(ii) pour le mot abbc.
xδ(0, abbc)y
b
= h déf. de δb i
pδ( δ(0,
b abb) , c)q
x y
= h déf. de δb i
δ(pδ(xδ(0,
b ab) , b)q, c)
y
= h déf. de δb i
δ(δ(pδ(xδ(0,
b a) , b)q, b), c)
y
= h déf. de δb i
δ(δ(δ(pδ(xδ(0,
b [ ]) , a)q, b), b), c)
y
= h déf. de δb i
δ(δ(δ(xδ(p0q, a)y, b), b), c)
= h déf. de δ i
δ(δ(xδ(p1q, b)y, b), c)
= h déf. de δ i
δ(xδ(p1q, b)y, c)
= h déf. de δ i
p q
xδ( 1 , c)y
= h déf. de δ i
p2q
100
a b
(i) 0 1 2
a,b
l a b
(ii) 0 1 2 3
a,b
b
a
a b
(iii) 0 1 2
b a
Figure 4.2: Les AFND (i) et (ii) acceptent le même langage que l’AFD (iii)
• Les transitions d’un AFND peuvent être étiquetées avec λ, un symbole particulier qui dénote
un changement d’état sans lecture d’un symbole dans la suite à traiter par un automate.
Autrement dit, λ ne fait pas partie de l’alphabet du langage accepté par l’AFND.
• δ est une fonction totale dans un AFD, alors que δ est une relation dans un AFND. Il n’est
donc pas nécessaire de faire un état puits dans un AFND, puisque la relation δ peut être
partielle.
La figure 4.2 illustre deux AFND, soit (i) et (ii), qui acceptent le même langage, ainsi qu’un AFD
(iii) qui accepte le même langage que (i) et (ii). Le non-déterminisme est présent dans (i) pour
l’état 0, car il y a deux transitions possibles pour a. Le non-déterminisme est présent dans (ii) pour
l’état 0, car il y a une transition sur λ.
Les définitions suivantes seront utiles.
λ-filtre([ ]) = [ ] (4.3)
∗ _ _
σ ∈ Σ ∧ w ∈ (Σ ∪ {λ}) ⇒ λ-filtre([σ] w) = [σ] λ-filtre(w) (4.4)
∗ _
w ∈ (Σ ∪ {λ}) ⇒ λ-filtre([λ] w) = λ-filtre(w) (4.5)
101
• Le langage accepté par un AFND M = hQ, Σ, δ, q0 , F i est défini comme suit:
L(M ) = {w1 | w1 ∈ Σ∗ ∧
∃w2 · w2 ∈ (Σ ∪ {λ})∗ ∧ λ-filtre(w2 ) = w1 ∧
∃z · z ∈ Q+ ∧ card(z) = card(w2 ) + 1 ∧
first(z) = q0 ∧ last(z) ∈ F ∧
∀i · i ∈ dom(w2 ) ⇒ (z(i), w2 (i), z(i + 1)) ∈ δ
}
Autrement dit, w1 ∈ L(M ) ssi il existe w2 tel que w1 = λ-filtre(w2 ), et il existe z tel que
q0 = z(1) et last(z) ∈ F et
w2 (1) w2 (2) w2 (n)
z(1) −−−→ z(2) −−−→ . . . −−−→ z(n + 1)
• La relation λ-closure contient les couples d’états (q1 , q2 ) telles qu’il existe, dans M , une suite
(possiblement vide) de transitions λ menant de q1 à q2 , i.e.,
λ λ
q1 −
→ ... −
→ q2
λ-closure = {(0, 0), (0, 1), (1, 1), (2, 2), (3, 3)}
t = λ-closure ; δ ; λ-closure
102
mais la syntaxe du langage B ne le permet pas, à cause d’un problème de typage1 . Elle est
définie formellement comme suit:
t = {(q1 , σ, q2 ) | q1 ∈ Q ∧ σ ∈ Σ ∧ q2 ∈ Q ∧
∃q3 · (q1 , q3 ) ∈ λ-closure ∧ (q3 , σ, q2 ) ∈ δ ; λ-closure}
t = {(0, a, 0), (0, a, 1), (0, a, 2), (0, b, 0), (0, b, 1), (1, a, 2), (2, b, 3)}
• δD ∈ QD × Σ → QD
• q0D ∈ QD
• FD ⊆ QD
Cet algorithme est donné à la figure 4.4. Il utilise le prédicat transitionADef inir(X, σ), défini
comme suit:
transitionADef inir(X, σ) ⇔ X ∈ QD ∧ (X, σ) 6∈ dom(δD )
Cet algorithme utilise également l’opérateur ANY, dont la forme générale est la suivante:
ANY ~x WHERE A THEN p END
Cet opérateur choisit de manière non-déterministe une valeur de ~x satisfaisant A et exécute ensuite
la partie p.
Un état de MD est un sous-ensemble de Q. L’algorithme simule le parcours de tous les chemins
permettant d’accepter un mot. L’état initial de MD est λ-closure[{q0 }], i.e., tous les états de M
accessibles de l’état q0 par une suite (possiblement vide) de transitions λ. L’algorithme utilise t pour
calculer tous les états accessibles en lisant σ en effectuant des transitions λ avant et/ou après σ.
Une transition (X, σ, Y ) ∈ δD signifie qu’il existe, à partir d’un état de X, une suite (possiblement
vide) de transitions λ, suivie d’une transition sur σ et suivie d’une suite (possiblement vide) de
transitions λ, menant à un des états de Y . Ainsi, Y est constitué de tous les états de M accessibles
à partir d’un état de X en lisant σ. La figure 4.3 illustre l’AFD résultant de la déterminisation de
l’AFND (ii) de la figure 4.2.
b
a
a b
0,1 0,1,2 0,1,3
b a
1
Le langage Alloy nous le permettrait, car les relations y sont n-aires au lieu de binaires comme en B, et la
composition relationnelle est généralisée aux relation n-aires.
103
q0D := λ-closure[{q0 }];
QD := {q0D };
δD := {};
WHILE dom(δD ) 6= (QD × Σ) DO
ANY X, σ, Y WHERE
transitionADef
[ inir(X, σ)
∧Y = t[(q2 , σ)]
q2 ∈X
THEN
QD := QD ∪ {Y };
δD := δD ∪ {(X, σ, Y )}
END
END;
FD := {X | X ∈ QD ∧ X ∩ F 6= ∅}
∀w · w ∈ Σ∗ ⇒ (δ(q
b 1 , w) ∈ F ⇔ δ(q
b 2 , w) ∈ F )
Quand deux états sont équivalents, ont dit, de manière équivalente, qu’ils sont indistinguables. S’ils
ne sont pas équivalents, on dit qu’ils sont distinguables, c’est-à-dire,
∃w · w ∈ Σ∗ ∧ ¬(δ(q
b 1 , w) ∈ F ⇔ δ(q
b 2 , w) ∈ F )
Deux états équivalents peuvent être fusionnés, puisque tout mot acceptée par un le sera par l’autre
aussi. On peut déterminer les états équivalents d’un AFD en identifiant les états qui sont distin-
guables, et en propageant cette distinguabilité aux états qui sont reliés aux états distinguables par
une transition de l’AFD sur un même symbole. Après avoir parcouru toutes les paires d’états, ceux
qui ne sont pas distinguables sont alors considérés comme étant équivalents, et ils peuvent être
fusionnés. Au départ, on sait qu’un état final q1 ∈ F se distingue d’un état non final q2 6∈ F , parce
b 1 , []) ∈ F et δ(q
que δ(q b 2 , []) 6∈ F . Ensuite, si δ(x1 , σ) = y1 et δ(x2 , σ) = y2 , et si les états y1 et y2
sont distinguables, alors x1 et x2 sont aussi distinguables, car l’un permet de terminer après avoir
accepté σ, alors que l’autre ne le permet pas. En itérant sur ce principe, on peut trouver tous les
états distinguables, et, par conséquent, les états équivalents. L’algorithme de minimisation applique
ce principe comme suit:
• La variable D contient les paires d’états {q1 , q2 } tels que q1 et q2 sont distinguables. On
utilise un ensemble au lieu d’un couple q1 7→ q2 , car si q1 et q2 sont distinguables, alors q2 et
q1 sont aussi distinguables. Utiliser une paire {q1 , q2 } évite d’utiliser deux couples q1 7→ q2 et
q2 7→ q1 . Il n’est donc pas nécessaire de conserver les deux couples, et un ensemble suffit. La
distinguabilité est une relation d’équivalence, c’est-à-dire qu’elle est symétrique, transitive et
104
réflexive. On utilise le prédicat paire(x, y, Q) pour indiquer que x et y forment une paire de
Q.
paire(x, y, Q) ⇔ x ∈ Q ∧ y ∈ Q ∧ x 6= y
• La variable r est une relation sur les paires d’états. Si on découvre que {x2 , y2 } sont distin-
guables, alors toutes transitions δ(x1 , σ) = x2 et δ(y1 , σ) = y2 entrainent que x1 et y1 sont
distinguables; on ajoute alors le couple {x2 , y2 } 7→ {x1 , y1 } à r. On itère sur r (i.e., r∗ ) pour
propager la distinguabilité lorsqu’on détermine que x2 et y2 sont distinguables.
• La variable V contient les paires d’états {q1 , q2 } pour lesquels la distinguabilité reste à déter-
miner.
• La variable E contient, à la fin de l’algorithme, les paires d’états {q1 , q2 } tels que q1 et q2 sont
équivalents. Il suffit alors de regrouper en un seul état les états qui sont équivalents entre
eux, c’est-à-dire les classes d’équivalences. On note dqe la classe d’équivalence de q. Donc, on
forme les ensembles suivants, en considérant chaque état q1 ∈ Q.
La figure 4.5 illustre le calcul de D et de r. Au départ, on sait que la paire {1, 2} ∈ D, car 1 ∈ F et
2 6∈ F . Ensuite, en traitant la paire {3, 4}, on déduit que {3, 4} ∈ D, car {1, 2} ∈ D et δ(3, a1 ) = 1
et δ(4, a1 ) = 2. La paire {5, 6} est traitée de manière similaire. Pour la paire {7, 8}, on ne trouve
pas de transition menant à une paire d’états {x, y} ∈ D. Toutefois, comme il existe une paire {9, 10}
dont on ne connait encore pas la distinguabilité, et que δ(7, a3 ) = 9 et δ(8, a3 ) = 10, on ajoute alors
le couple {9, 10} 7→ {7, 8} à r, car si on déduit subséquemment que {9, 10} ∈ D, alors on ajoutera
aussi {7, 8} à D. À la fin du traitement de toutes les paires d’états, si on n’a pu distinguer {7, 8},
alors on ajoute {7, 8} à E, et ils seront considérés comme équivalents.
L’algorithme de minimisation est présenté à la figure 4.6. Il est issu des travaux de Edward
F. Moore, un des auteurs de la théorie des automates, qui est centrale en informatique. John E.
Hopcroft a aussi proposé un algorithme, plus performant que celui inspiré des travaux de Moore;
la complexité de l’algorithme de Hopcroft est de O(ns log n), où n = card(Q) et s = card(Σ), alors
que celle de Moore est de l’ordre de O(n2 s). Hopcroft a reçu le prix Alan Turing en 1987 pour
ses travaux en théorie des compilateurs, en architecture des grands systèmes, et pour l’invention
des architectures RISC pour les processeurs. La figure 4.7 illustre un AFD et sa minimisation. La
figure 4.8 illustre le tableau de sa minimisation. Les états équivalents sont ceux qui n’apparaissent
pas dans D, c’est-à-dire {1, 3} et {2, 4}; donc E = {{1, 3}, {2, 4}}. Les états équivalents sont
regroupés dans l’AFD (iii) de la figure 4.7. Donc, étant donné un AFD hQ, Σ, δ, q0 , F i, on calcule
l’automate minimisé
Mmin = hQmin , Σ, δmin , q0min , Fmin i
où
• Qmin ⊆ P(Q)
• Fmin ⊆ P(Q)
comme suit:
105
a3 a2 a1
7 9 5 3 1
? r ? D D D
a3 a2 a1
8 10 6 4 2
• Qmin = {X | ∃x · x ∈ Q ∧ X = dxe}
• q0min = dq0 e
• Fmin = {X | ∃x · x ∈ F ∧ X = dxe}
Donc, les états de l’automate minimal (Qmin ) sont les classes d’equivalence des états de l’automate
d’origine. Les états finaux (Fmin ) sont les classes d’équivalences des états finaux de l’automate
d’origine. Il y a une transition de X sur σ vers Y s’il y a une transition entre un élément de X sur
σ vers un élément de Y dans δ.
106
c
a 1 2
(i) 0
b c
3 4
c
a 1 2
S
0
b c
(ii) a,b 3 4
a,b S
c
5
(iii) a,b c
0 1,3 2,4
Figure 4.7: Minimisation de l’automate incomplet (i), complété en (ii), et minimisé en (iii)
Paire D r E
{0,2} X
{0,4} X
{1,2} X
{1,4} X
{2,3} X
{2,5} X
{3,4} X
{4,5} X
{0,1} X
{0,3} X
{0,5} X2(r[{1,5}])
{1,3} X
{1,5} X {0,5}
{2,4} {1,3} X
{3,5} X {0,5}
107
L’AFD résultant de la déterminisation d’un AFND n’est pas nécessairement minimal. On doit
le minimiser. Considérons l’AFND suivant.
a
a
b
λ b 3 λ
0
a 1
b 2
b
{1,3} a a
b
b b
{0,1,3}
b a
a b
{1,2,3}
a
a {1} {}
{0,1} b
b
a
{{}}
a
b
{{1}}
a b a
{{0,1}} b
{{0,1,3},{1,3},{1,2,3}}
108
4.5 Exercices
1. Définissez un automate déterministe qui accepte une suite de symboles représentant un entier
dans un langage de programmation comme Java ou C++. Le signe (+ ou −) apparait au
début du nombre et il est facultatif. L’entier doit comprendre au moins un chiffre.
Σ = 0..9 ∪ {+, −}.
2. Définissez un automate déterministe qui accepte une suite de symboles représentant un nombre
en point flottant dans un langage de programmation comme Java ou C++. Le nombre peut
débuter par un “.”. L’exposant, introduit par le symbole e ou le symbole E, est optionnel; il
est donné par un entier facultativement signé.
Σ = 0..9 ∪ {+, −, e, E, .}.
3. Définissez un automate déterministe qui décrit le comportement d’une pile de taille maxi-
male 2. L’état final est une pile vide. On peut empiler les éléments de l’ensemble {0, 1}.
Σ = ({push, top} × {0, 1}) ∪ {pop}.
4. Définissez un automate déterministe qui décrit le comportement d’une file de taille maximale 2.
Pour simplifier, on suppose qu’une file ne peut contenir deux fois le même élément. L’état
final est une pile vide. On peut enfiler les éléments de l’ensemble {0, 1}.
Σ = ({enfiler, tête} × {0, 1}) ∪ {défiler}.
5. Définissez un automate déterministe qui décrit le cycle de vie d’un livre dans un système qui
gère une bibliothèque; supposez qu’il n’existe que deux membres, identifiés par l’ensemble
M = {0, 1}. L’état final représente un livre supprimé.
Σ = {créer, supprimer, retourner} ∪ ({emprunter, réserver, annuler} × M ). On suppose qu’il faut
réserver un livre avant de l’emprunter.
109
• L’opération retourner retourne le livre prêté; elle n’a pas de paramètre, car on sait que le
livre est prêté.
6. Définissez un automate déterministe qui accepte le paiement d’un café avec des pièces de 5,
10 et 25 cents (i.e., Σ = {5, 10, 25}. La suite de pièces est acceptée ssi la somme des pièces
donne au moins le coût d’un café, soit 50 cents.
7. Soit Σ = {a, b, c, d}. Définissez un automate déterministe pour chaque sous-question suivante.
L’automate doit accepter seulement les suites décrites, et refuser toutes les autres suites.
8. Est-il possible de définir un automate qui accepte seulement les suites de la forme an bn , c’est-
à-dire que la suite est formée d’une suite de a suivie d’une suite de b, et qu’il y a exactement
le même nombre de a que de b?
(a)
λ
2
0 a a
λ 1
Solution:
a
a
{0,1} {0,1,2}
(b)
3
c
2 b
λ
a
λ 1
0
Solution:
110
b
c
b
a
c
{1}
a a {}
b
b
a {2} a
c c
{0,1,2} b
c
{3}
(c)
b b
a a
0 1 2
b
Solution:
b
a
b
b {}
a
{0} {1} a
a
b
{2}
b
a {1,2}
(d)
b
b
a
b 1
a 2
0 b
Solution:
111
b
a
{}
a
b
b b
{0} {0,1}
a
a
b {2} {1}
a
(e)
a
b b
a 1 3 a
2
0 a
Solution:
b
{0} a b
b a
{1,2}
a {}
a a
b
b {3}
a b
{1,3} {1}
a a
b {2}
b
{2,3}
(f)
a
b
b
a b
0 2
a b
3 1
a
Solution:
b
a
a
{2} {}
a
b
b
{3} b b
b b {1,3}
a a
a {0,1,3}
a {0,2} b a
{0} {1,2} b
a
{0,3} b {0,1,2}
a
112
(g)
a c
c
0 1
λ b
b
Solution:
c
b b
a a
a
{1,2}
b c
c {}
a
{0,2} c
b
{1}
(h)
a
a
b
λ b 3 λ
0
a 1
b 2
b
Solution:
{1,3} a a
b
b b
{0,1,3}
b a
a b
{1,2,3}
a
a {1} {}
{0,1} b
(a)
113
Solution: E = {{0, 3}, {1, 2}, {1, 4}, {2, 4}}
(b)
(c)
114
Solution: E = {{4, 5}, {4, 6}, {5, 6}}
(d)
115
(e)
(f)
116
Solution: E = {{1, 3}, {2, 4}, {5, 6}}
117
Bibliographie
[1] J.-R. Abrial. The B-book: Assigning Programs to Meanings. Cambridge University Press, New
York, NY, USA, 1996. Manuel disponible à la bibliothèque.
[3] Olivier Gasquet, François Schwarzentruber, and Martin Strecker. Panda: A Proof Assistant in
Natural Deduction for All. A Gentzen Style Proof Assistant for Undergraduate Students, pages
85–92. Springer Berlin Heidelberg, Berlin, Heidelberg, 2011.
[4] D. Gries and F. B. Schneider. A Logical Approach to Discrete Math. Springer-Verlag New York,
Inc., New York, NY, USA, 1993. Manuel disponible à la bibliothèque.
[5] Daniel Jackson. Software Abstractions: Logic, Language, and Analysis. The MIT Press, 2012.
Manuel disponible à la bibliothèque.
[6] R. Lalement. Logique, réduction, résolution. Masson, Paris, 1990. Manuel disponible à la
bibliothèque.
[7] Michael Leuschel and Michael J. Butler. ProB: an automated analysis toolset for the B method.
STTT, 10(2):185–203, 2008.
[9] K. H. Rosen. Discrete Mathematics and Its Applications, Fourth Edition. McGraw-Hill, 1999.
Manuel disponible à la bibliothèque.
[11] T. A. Sudkamp. Languages and Machines: An Introduction to the Theory of Computer Science,
Third Edition. Addison Wesley, 2005. Manuel disponible à la bibliothèque.
118