Logique, mathématiques, informatique

publicité
Logique, mathématiques, informatique
1
Logique, mathématiques, informatique
Objectifs
Ce document, inachevé, présente le plan du cours d’approfondissement et quelques compléments sur les différentes parties du cours. Il ne vient donc qu’en complément des documents
distribués.
Table des matières
1
2
3
La syntaxe des mathématiques : la logique des prédicats
1.1 Usage mathématique et théorie des ensembles . . . . . . . . . . . . . . . .
1.2 Les formules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4 La logique des propositions . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5 Passage syntaxique/sémantique : l’interprétation de la logique des prédicats
1.6 Notion de vérité sémantique . . . . . . . . . . . . . . . . . . . . . . . . .
Qu’est-ce qu’une démonstration
2.1 Notion de théorie . . . . . . . . . . . . . . . . . . . . . .
2.2 Le “tout sémantique” . . . . . . . . . . . . . . . . . . . .
2.3 Le tout syntaxique : la déduction formelle . . . . . . . . .
2.4 Exemples de systèmes de déduction formelle . . . . . . .
2.4.1 Formes de la déduction . . . . . . . . . . . . . . .
2.4.2 Un exemple de système hilbertien . . . . . . . . .
2.4.3 Un exemple de système de “déduction naturelle” .
2.5 Formes normalisées des formules dans la logique classique
2.5.1 Cas du calcul des propositions . . . . . . . . . . .
2.5.2 Cas général . . . . . . . . . . . . . . . . . . . . .
Théories et modèles
3.1 Liens entre la syntaxe des axiomes et les modèles
3.2 Quelques exemples . . . . . . . . . . . . . . . .
3.2.1 Théorie de l’ordre total . . . . . . . . . .
3.2.2 Théorie des groupes . . . . . . . . . . .
3.2.3 Théorie des corps ordonnés . . . . . . .
3.3 L’arithmétique . . . . . . . . . . . . . . . . . . .
3.4 La théorie des ensembles . . . . . . . . . . . . .
ECP 2005-2006
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
4
6
7
8
8
.
.
.
.
.
.
.
.
.
.
9
9
9
9
10
10
10
10
10
10
11
.
.
.
.
.
.
.
12
12
12
12
12
12
12
12
Cours d’approfondissement
Logique, mathématiques, informatique
2
4
Complétude et décidabilité
4.1 Le passage syntaxique/sémantique . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Théorie complète . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 Décidabilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
12
12
12
5
Fonction calculable et programme
5.1 Les différents styles de programmation . . . . . . . . . . . . . . . . .
5.1.1 Les langages usuels . . . . . . . . . . . . . . . . . . . . . . .
5.2 Les machines de Turing . . . . . . . . . . . . . . . . . . . . . . . . .
5.3 La programmation fonctionnelle . . . . . . . . . . . . . . . . . . . .
5.4 Le λ-calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5 Les algorithmes de Markov ou systèmes de réécritures . . . . . . . .
5.6 Les fonctions récursives . . . . . . . . . . . . . . . . . . . . . . . . .
5.7 La “thèse” de Church . . . . . . . . . . . . . . . . . . . . . . . . . .
5.8 Qu’est-ce qu’un ordinateur : le programme universel, i.e. l’interpréteur
.
.
.
.
.
.
.
.
.
12
12
12
13
13
14
15
15
16
16
.
.
.
.
.
16
16
17
18
18
18
.
.
.
.
.
.
.
.
.
.
18
18
18
20
21
21
21
21
22
24
24
.
.
.
.
.
24
24
24
24
24
24
Applications
9.1 Démonstration automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2 L’analyse non standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
24
24
6
7
8
9
Les limites absolues de la calculabilité
6.1 Peut-on se passer des boucles “While” ? . .
6.2 Le problème de l’arrêt . . . . . . . . . . .
6.3 Commentaires de l’argument précédent . .
6.3.1 La diagonale de Cantor . . . . . . .
6.3.2 Quelle est la portée de l’argument ?
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Le problème des fondements de l’arithmétique
7.1 Le codage des fonctions, formules et programmes dans l’arithmétique
7.1.1 Le codage des arbres . . . . . . . . . . . . . . . . . . . . . .
7.1.2 Le codage des formules . . . . . . . . . . . . . . . . . . . .
7.1.3 Le codage des programmes . . . . . . . . . . . . . . . . . . .
7.1.4 Le codage des fonctions récursives . . . . . . . . . . . . . . .
7.1.5 Le codage des démonstrations . . . . . . . . . . . . . . . . .
7.2 La représentation des fonctions récursives dans l’arithmétique . . . .
7.3 L’incomplétude de l’arithmétique . . . . . . . . . . . . . . . . . . . .
7.4 L’indécidabilité de l’arithmétique . . . . . . . . . . . . . . . . . . . .
7.5 La consistance de l’arithmétique . . . . . . . . . . . . . . . . . . . .
Les limites relatives de la calculabilité
8.1 Propriétés arithmétiques des fonctions non calculables
8.2 Les limites relatives de la calculabilité . . . . . . . . .
8.3 La complexité en temps . . . . . . . . . . . . . . . . .
8.4 La conjecture P 6= NP . . . . . . . . . . . . . . . . . .
8.5 La complexité algorithmique . . . . . . . . . . . . . .
ECP 2005-2006
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Cours d’approfondissement
Logique, mathématiques, informatique
3
Bibliographie
–
–
–
–
–
–
Logique, informatique et paradoxes, J. P. Delahaye, Pour la science, Belin.
Outils logiques pour l’intelligence artificielle, J. P. Delahaye, Eyrolles.
A. Arnold, I. Guessarian, Mathématiques pour l’informatique, Masson.
P. Gochet, P. Gribomont, Logique, Vol. 1, Hermes.
Information, complexité et hazard, J. P. Delahaye, Hermes.
Complexité et décidabilité, P. Dehornoy, Springer France.
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
1
4
La syntaxe des mathématiques : la logique des prédicats
1.1
Usage mathématique et théorie des ensembles
Le langage des mathématiques de nos jours fait un grand usage des notions ensemblistes : il y
a peu d’énoncés mathématiques qui ne commencent par “soit l’ensembles des...”. L’énoncé d’une
proposition de la théorie des groupes est par exemple de la forme
∀x ∈ G ∃y x ∗ y = e
faisant référence à un groupe G quelconque. De même la définition de l’uniforme continuité d’une
fonction
∀ > 0 ∈ R ∃δ > 0 ∈ R (∀x, y ∈ R (|x − y| ≤ δ) ⇒ (|f (x) − f (y)| ≤ ))
semble nécessiter l’usage de la notion ensembliste d’appartenance ∈. Cet usage est relativement récent , l’usage “classique” consiste à dire en français “pour tout réel” ou “il existe un entier” faisant
appel à une qualité du nombre (être entier) sans référence à un “ensemble de tous les entiers”. Dans
l’usage classique “être entier” ou “être réel” c’est s’écrire sous la forme d’une suite finie ou infinie
de chiffres (en caricaturant un peu) tandis que dans l’usage moderne “être entier” c’est appartenir à
un ensemble dont la définition renvoie à des constructions ensemblistes : un entier c’est une classe
d’équivalence d’ensembles finis, un réel c’est une classe d’équivalence de suites de Cauchy de rationnels...
Cet usage est très commode mais il a de gros inconvénients :
− il dissimule la complexité logique des énoncés : dire qu’une certaine équation du second degré a
une racine se démontre à partir de considérations purement algébriques (tout nombre positif a une
racine carrée), ce n’est pas du même ordre que de dire que tan x = x a une racine non nulle, ce qui,
dans sa définition comme dans sa démonstration, fera appel à l’existence de certaines suites convergentes, c’est à dire à des notions ensemblistes de haut niveau car une suite est un sous-ensemble de
N × R... ;
− il s’appuie sur une théorie, la théorie des ensembles, dont les fondements sont problématiques1 .
Nous allons donc écrire les énoncés des mathématiques en évitant toutes références à la notion
d’ensemble sauf si cela paraît absolument nécessaire auquel cas ce sera un énoncé de la théorie des
ensembles. Un énoncé dans lequel apparaissent des objets x, y sans référence à l’ensemble auxquels
ils appartiennent est un énoncé contextuel : le contexte est la théorie dans laquelle cet énoncé prend
un sens, c’est à dire les axiomes qui définissent l’usage des objets.
1.2
Les formules
Nous présentons ici informellement le vocabulaire et les éléments de la syntaxe de la logique des
prédicats, pour définir avec précision les formules qui traduisent les énoncés plus ou moins vague du
langage usuel des mathématiques :
1
On ne fait souvent qu’un usage “naïf” de la théorie des ensembles, sans référence à un système axiomatique. Parfois
cet usage naïf est très élémentaire et il peut être évité, d’autre fois, comme dans la théorie de la mesure, il peut conduire à
des paradoxes.
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
5
• Les propositions :
Autrement dit les “formules booléennes” (A ⇒ (B ou C)). Elles sont construites à partir de symboles
de propositions pouvant avoir des significations concrètes (“la pomme est rouge”, “4 est un carré”) et
de connecteurs , on plus précisément on définit les :
− symboles de proposition : P1 , ..., Pi , usage courant : P , Q, R...
− connecteurs ¬ (“négation”), ∧ (“et”), ∨ (“ou”), ⊃ (“implique” , préféré en logique à l’usage mathématique ⇒), ⇔. Noter que, selon les variantes de présentation de la logique des prédicats, certains
des connecteurs sont primitifs, tandis que les autres sont définis par les premiers, c’est à dire qu’ils
ne servent qu’à alléger l’écriture d’expressions complexes, par exemple A ∨ B pourra dans certaines
présentations être défini par ¬(¬A ∧ ¬B) et A ⊃ B être défini par ¬A ∨ B.
− les parenthèses : certaines conventions d’écriture permettent de s’en passer (la notation polonaise
inverse), la règle voudrait qu’elles soient utilisées systématiquement pour lever les ambiguïtés, l’usage
est de ne les mettre que pour éviter les expressions ambiguës.
−Une proposition est une expression construite à partir de symboles de proposition, des parenthèses
et des connecteurs : ¬P ⇒ (Q ∨ R)
• Les termes, ou expressions fonctionnelles, expressions construites par composition de fonctions primitives, plus précisément, on définit les :
− constantes : a0 ,...,ai
usage courant : a, b, c... ;
Exemples : dans le langage des corps : 0 et 1
− lvariables : x0 ,...,xi
usage courant : x, y, z....
− symboles de fonctions à k arguments : fi (x1 , x2 , ..., xk )
√
usage courant : notation conventionnelle (sin(x), x, x2 et surtout notation opératorielle (plus(x, y) →
x + y), le passage de la forme opératorielle à la forme fonctionnelle conduit à la notation polonaise
inverse.
Exemples : dans le langage des corps +, −, /, . (mais noter les ambiguïtés du langage ordinaire :
le signe − est utilisé pour désigner une fonction à un argument(le signe −x) ou à deux arguments
(l’opérateur x − y), la multiplication est remplacée par un blanc, voire la simple juxtaposition...).
− Un terme est une expression construite à l’aide des constantes, variables et fonctions : f (x, g(f (x, y), y))),
Exemples : dans le langage des corps un terme est une fraction rationnelle.
• Les prédicats ce sont les expressions logiques usuelles avec des variables et des quantificateurs (accompagnés d’exemples pris dans la théorie des corps ordonnés), on définit plus précisément les :
− Symboles de prédicats à k variables, ce sont les symboles de proposition avec des variables :
Pi (x1 , x2 , ..., xk )
usage courant : la notation conventionnelle >, = ... n’est pas préfixée, on écrit x > y et non pas
> (x, y) ; dans le langage des corps ordonnés =, ≥
− Formule atomique : application d’un prédicat à des termes :
P1 (f (x, y), g(f (x, y), y)
c’est donc une proposition. Dans le langage des corps ordonnés
x2 + 1 > 0
x
1
=
x2 + y 2
y
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
6
− Quantificateurs : ∀, ∃
− Formule ou expression bien formée : Une formule est une expression construite à partir des formules atomiques, des connecteurs et des quantificateurs.
• Langage : Un langage est un ensemble particulier de symboles de prédicats, de constantes et de
fonctions.
Le langage de la théorie des corps ordonnés est 0, 1, +, ., −, /, ≥.
Le langage de l’arithmétique est formé de la constante 0, des fonctions “successeurs” S(x) et des
opérateurs + et ×, le prédicat ≤.
Pour des raisons de commodité d’écriture un langage peut être étendu par des “définitions”, i.e. des
entités définis par des formules du langage. Avant d’utiliser le langage étendu il suffit donc de remplacer les nouvelles entités par leur définition. Ainsi on pourra introduire dans la théorie des corps
l’ordre strict < défini par
(x < y) ⇔ ¬(x = y) ∧ (x ≤ y)
ou encore ajouter au langage de l’arithmétique les constantes 1 = S(0), 2 = S(S(0)) !
1.3
Exemples
• En français : tout nombre réel positif admet une racine carrée.
traduction usuelle en math (non unique, le français est ambigu) :
∀x ∈ R, x ≥ 0 ⇒ ∃y / y 2 = x
une écriture formelle (non unique, le langage mathématique est aussi ambigu !)
∀x((x ∈ R) ∧ (x ≥ 0)) ⇒ (∃y(y ∈ R ∧ (y = x2 ))))
C’est donc un énoncé de la théorie des ensembles utilisant le symbole de prédicat ∈ et la constante R
ainsi que les symboles de fonctions de la théorie des corps, la relation ≥ et la constante 0. Mais on
peut aussi écrire
∀x((x > 0) ⇒ ∃y(y = x2 ))
qui sera considéré comme un énoncé de la théorie des corps ordonnés, sans référence à des notions
ensemblistes. Noter que l’expression “tel que” est formellement inutile.
• En français : la fonction f (x) est continue au point x0 , tous les objets étant supposés être dans R.
usage mathématique :
∀ > 0 ∃α > 0 tel que ∀x |x − x0 | ≤ α ⇒ |f (x) − f (x0 )| ≤ formellement
∀( > 0) ⇒ (∃α((α > 0) ∧ (∀x(|x − x0 | ≤ α) ⇒ (|f (x) − f (x0 )| ≤ )))
Noter encore que l’expression “tel que” n’est pas traduite formellement. Ici la valeur absolue est une
fonction à un argument. On peut aussi l’éliminer (|x| ≤ y ⇔ (x ≤ y) ∧ (−x ≤ y)) et écrire une
formule n’utilisant que l’inégalité au sens large et la négation ((x < y) ⇔ ((x ≤ y) ∧ ¬(x = y))).
• Noter que l’expression qui traduit l’existence d’un système générateur dans un espace vectoriel
∃x1 , ..., xn / ∀x, ∃λ1 , ..., λn tel que x = λ1 x1 + ... + λn xn
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
7
comporte un élément de syntaxe que nous n’admettons pas, les points de suspension .... Pour le
traduire il faudrait utiliser le langage de la théorie des ensembles et traduire l’existence d’un entier n
et d’une application de l’ensemble des entiers plus petits que n dans l’ensemble des vecteurs et dans
l’ensemble des réels qui ait la propriété voulue.
En revanche on peut écrire directement qu’il existe un système générateur de dimension 3
∃x1 ∃x2 ∃x3 (∀x∃λ1 ∃λ2 ∃λ3 (x = λ1 x1 + λ2 x2 + λ3 x3 ))
De même notons que dans le langage de l’arithmétique on ne peut pas définir la multiplication à l’aide
de l’addition par une formule qui serait du type
n × x = x + ... + x....x(n fois)
Cette formule n’est pas dans le langage de la logique des prédicats (on montre qu’une telle formule
ne peut pas exister).
1.4
La logique des propositions
La logique des propositions est ce qui reste de la logique des prédicats quand on retire les variables, les fonctions et les quantificateurs. Un exemple de proposition est donc
(¬P3 ∧ P2 ) ⊃ (¬P1 ∨ P3 )
On parle souvent aussi du “calcul des propositions” au lieu de la logique des propositions, c’est que
en anticipant un peu sur les paragraphes suivants, la notion de vérité dans la logique des propositions
se ramène en théorie à un calcul : si on donne aux symboles de proposition des valeurs V rai ou
F aux et si on calcule la valeur d’une proposition en suivant les tables de vérité (i.e. ¬A est V rai si
et seulement si A est F aux, A ∨ B est V rai si A ou B est V rai...) une proposition sera V rai (on dit
aussi aussi que c’est une tautologie) si elle est V rai pour toutes les valeurs possibles des symboles de
proposition. En pratique ce calcul exige un nombre exponentiel d’opération, il faudrait donc trouver
mieux !
La logique des propositions paraît souvent être un petit jeu puéril, se limitant à des applications
triviales. Il n’en est rien car des problèmes réels très complexes de mathématiques discrètes sont
équivalents à montrer la satisfiabilité (i.e. il existe des valeurs des symboles de proposition qui rendent
toutes les formules V rai) d’un grand ensemble de formules. Par exemple la possibilité de colorier
les sommets d’un graphe avec trois couleurs de façon que deux noeuds adjacents n’aient pas la même
couleur : on introduit trois symboles Vi , Bi , Ri pour signifier qu’un noeud i a une couleurs (vert, bleu,
rouge) et on pose les conditions
Vi ∨ Bi ∨ Ri ,
, ¬Vi ∨ ¬Bi ,
, ¬Bi ∨ ¬Ri ,
, ¬Ri ∨ ¬Vi
pour chacun des noeuds i (un noeud a une et une seule couleur), et
¬Vi ∨ ¬Vj ,
¬Vi ∨ ¬Vj ,
, ¬Vi ∨ ¬Vj
pour chaque couple i, j correspondant à une arête du graphe (deux noeuds adjacents n’ont pas la
même couleur).
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
1.5
8
Passage syntaxique/sémantique : l’interprétation de la logique des prédicats
Une formule telle que nous l’avons définie ci-dessus est une simple chaîne de caractères construite
à partir de certaines règles dans un langage donné. Les “fonctions” ne sont pas des applications d’un
ensemble dans lui-même2 , les quantificateurs n’ont pas le sens ensembliste : ∀... ne signifie pas a
priori “pour tout....” et nous n’avons même pas défini de valeurs “Vrai”, “Faux” pour une formule. En
particulier nous n’avons pas défini le sens des connecteurs ∧, ∨... par les “tables de vérité”.
L’usage que nous ferons de ces formules pourra être purement syntaxique si nous définissons “formellement” (i.e. syntaxiquement) la notion de preuve ou de démonstration (la preuve d’une formule
consistera à faire des transformations sur des chaînes de caractères). Mais bien sûr il sera aussi possible de donner aux formules un “sens” en les interprétant dans la théorie des ensembles, dans ce cas
les fonctions prendront leur signification ensembliste de même que les quantificateurs.
Plus précisément :
Définition 1 Une interprétation d’un langage est la donnée :
− d’une valeur V rai ou F aux pour chaque symbole de proposition,
− d’un ensemble E,
− d’un élément de E pour chaque constante,
− d’une fonction de E × ... × ... × E dans E pour chaque symbole de fonction f (x1 , ..., xk ),
− d’un sous ensemble de E × ... × ... × E pour chaque prédicat à k arguments, qui sera l’ensemble
des éléments qui vérifient la propriété.
Inutile d’entrer dans les détails, une interprétation d’un langage est le sens qui est usuellement donné
à ce langage : en particulier les connecteurs prennent le sens qui leur est donné par les tables de
vérité. Ainsi le langage de la théorie des groupes c’est un ensemble G où l’on distingue une constante
e et où on a définit une opération binaire ∗ et l’égalité a son sens usuel d’identité.
1.6
Notion de vérité sémantique
Dans une interprétation d’un langage dans un ensemble E nous avons défini la valeur V rai ou
F aux d’une formule atomique (Ex : x > 0), on en déduit, par les tables de vérité, la valeur d’une
proposition sans quantificateur puis la valeur des propositions avec quantificateur en donnant à ceuxci leur sens usuel (i.e. “pour tout”, “il existe”). Notons que si l’ensemble E est infini nous ne disons
rien sur la manière dont nous avons acquis la conviction qu’une propriété ∀x P (x) est V rai pour tout
x, or la vérification directe est manifestement impossible. Nous supposons (mais est-ce sûr ?) qu’une
opération de l’esprit permet d’avoir une vision claire de l’ensemble E (par exemple l’ensemble des
entiers “naturels”) et d’une fonction (par exemple l’addition et la multiplication des entiers) de façon
à ce que une proposition ∀n ∃p∃q∃r∃t n = p.p + q.q + r.r + t.t soit V rai ou F aux.
2
On peut les considérer comme des noms d’objet dont l’existence dépend de d’autres objets, ainsi, si on affirme en
géométrie l’existence d’un point mileu de deux points A et B, on peut le désigner soit par un nouveau nom M , soit par une
fonction m(A, B) ; dans le premier cas il faudra introduire un nouveau nom pour chaque couple de points (P milieu de B
et C, Q milieu de C et de A...), dans le second cas les noms de tous les milieux seront construits m(B, C)...
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
2
2.1
9
Qu’est-ce qu’une démonstration
Notion de théorie
Nous désignons par le mot “théorie” la donnée d’un langage et de formules, les axiomes, que
par définition nous supposons “V rai”. Un “modèle” de la théorie est une interprétation dans laquelle
les axiomes prennent la valeur V rai au sens défini ci-dessus. Par exemple la théorie des groupes est
définie par le langage de la théorie des groupes (e, ∗, =) et les axiomes
∀x∀y∀z (x ∗ y) ∗ z = x ∗ (y ∗ z)
∀x (x ∗ e = x) ∧ (e ∗ x = x)
∀x∃y (x ∗ y = e) ∧ (y ∗ x) = e
Un modèle de la théorie des groupes n’est alors autre chose qu’un groupe.
2.2
Le “tout sémantique”
Usuellement en mathématiques, démontrer un théorème, c’est à dire une formule A à partir d’hypothèses, i.e. de formules A1 , ..., An toute écrites dans un certain langage, cela signifie montrer que
A est V rai dans toutes les interprétations du langage où les formules A1 , ..., An sont V rai. En particulier démontrer un théorème dans une théorie donnée c’est montrer qu’une formule est V rai dans
tous les modèles de la théorie.
Pour faire cela on peut parfois vérifier tous les cas possibles, par exemple, s’il n’y a pas de variables,
il suffit de donner toutes les valeurs possibles aux propositions et vérifier la formule par l’usage des
tables de vérité ; de même si tous les modèles sont des ensembles ayant au plus n éléments, on peut
remplacer toutes les variables par toutes leurs valeurs possibles, les formules avec variables sont alors
ramenées à des propositions que l’on vérifie par les tables de vérité. Mais en général cette vérification n’est pas possible (ensemble infini) ou trop longue (en fait on montre que c’est en général,
hors d’atteinte pour tout calculateur), on fera alors des “déductions” qui sont des suites de déductions
élémentaires “si A et B sont vraies alors C est évidemment vraie” qui paraissent “évidentes”, évidemment justes, c’est à dire justes dans toutes les interprétations possibles.
Noter que le premier objectif d’une formation mathématique élémentaire consiste pour une bonne
part à apprendre à distinguer certaines déductions “évidentes” (si x = y alors x ∗ z = y ∗ z) de celles
qui ne le sont pas (si x ∗ z = y ∗ z alors x = y). Cette distinction n’est pas toujours très claire, disons
que les règles de déduction sont plus ou moins universelles...
2.3
Le tout syntaxique : la déduction formelle
On peut essayer de répertorier les déductions élémentaires, on trouvera par exemple la déduction
élémentaire :
“x est positif, or, si x est positif il a une racine carrée, donc x a une racine carrée”, déduction qui est
de la forme “si A est V rai et si A ⊃ B est V rai alors B est V rai”
qu’on appelle le “Modus Ponens”. On peut également répertorier des formules “évidemment” vraies
par exemple
A⊃A
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
10
ou
A ∨ ¬A
Ce faisant on s’aperçoit que toutes ces déductions élémentaires ne sont pas indépendantes (certaines
se ramènent à quelques applications de d’autres dérivations) et que certaines formules “évidemment
vraies” peuvent être déduites d’autres formules. Ce travail conduit à privilégier un petit nombre de
règles de déductions élémentaires que nous appellerons règles de dérivation et un petit nombre de
propositions évidemment vraies nous appellerons axiomes logiques.
Toutes ces règles de dérivation et tous ces axiomes ont un point commun : leur application est purement syntaxique, i.e. leur validité ne dépend que de la forme de certaines chaînes de caractères. Une
démonstration (ou preuve) apparaît comme un arbre dont la racine est la formule démontrée et les
feuilles sont des axiomes logiques ou de la théorie ou les hypothèses de la démonstration. Les noeuds
de l’arbre sont des applications des dérivation. On remarque que les notions de V rai et F aux ne
sont plus utilisées. Pour des raisons que nous comprendrons ultérieurement nous préférons ne pas les
utiliser dans ce contexte et considérer que les formules qui est à la racine d’une démonstration est
“prouvée” (on aurait pu dire aussi “démontrée”). Les axiomes sont donc considérés comme prouvés
par définition. Une preuve est donc une production de formules prouvées, par application de règles
de dérivations à des formules déjà prouvées.
2.4
Exemples de systèmes de déduction formelle
2.4.1
Formes de la déduction
La définition des règles de dérivations et des axiomes logiques laisse une certaine liberté, il y a
deux “styles” principaux : mettre peu de règles (au minimum une !) et beaucoup d’axiomes (système
hilbertien) ou peu d’axiomes et beaucoup de règles (système dit de déduction naturelle). Le premier
style simplifie les raisonnements des logiciens sur les démonstrations (qui se font souvent par récurrence sur le nombre d’application de règles...), le deuxième style permet de mieux exprimer le
lien entre les définitions des concepts logiques (connecteurs, quantificateurs, V rai, F aux...) et les
propriétés des démonstrations.
2.4.2
Un exemple de système hilbertien
Voir document de S. Bilanuk.
2.4.3
2.5
2.5.1
Un exemple de système de “déduction naturelle”
Formes normalisées des formules dans la logique classique
Cas du calcul des propositions
On retrouve, à l’aide des règles de déduction, les formules classiques suivantes qui sont donc des
tautologies du calcul des propositions : − Règle de De Morgan :
¬(P ∨ Q) ⇔ ¬P ∧ ¬Q
¬(P ∧ Q) ⇔ ¬P ∨ ¬Q
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
11
− Distributivité :
(P ∨ Q) ∧ R ⇔ (P ∧ R) ∨ (Q ∧ R)
(P ∧ Q) ∨ R ⇔ (P ∨ R) ∧ (Q ∨ R)
− Forme normale :
En utilisant ces règles on montre que toute formule peut être mise sous une forme dite “normale
conjonctive” :
(P1 ∨ ¬P2 ∨ ... ∨ Pk ) ∧ ... ∧ (¬Pi ∨ Pj ∨ ... ∨ Pn )
ou “normale disjonctive” :
(P1 ∧ ¬P2 ∧ ... ∧ Pk ) ∨ ... ∨ (∧Pi ∧ Pj ∧ ... ∧ Pn )
Noter cependant que la normalisation peut allonger une formule d’une manière exponentielle du fait
de l’application de la distributivité.
2.5.2
Cas général
Forme normale prénexe.
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
3
12
Théories et modèles
3.1
Liens entre la syntaxe des axiomes et les modèles
3.2
Quelques exemples
3.2.1
Théorie de l’ordre total
3.2.2
Théorie des groupes
3.2.3
Théorie des corps ordonnés
3.3
L’arithmétique
3.4
La théorie des ensembles
4
Complétude et décidabilité
4.1
Le passage syntaxique/sémantique
4.2
Théorie complète
4.3
Décidabilité
5
Fonction calculable et programme
5.1
5.1.1
Les différents styles de programmation
Les langages usuels
Nous allons dans cette partie nous appuyer sur les notions bien connues de programme et d’ordinateur pour en dégager les notions théoriques de programme. Tous les langages “usuels” de programmation, comme le “C”, utilisent les mêmes principes et les mêmes opérations élémentaires sous des
syntaxes variés :
1. Les programmes effectuent (en apparence) des opérations sur des objets externes (booléens,
entiers, chaîne de caractères, “réels”...) définis par des adresses (pointeurs ou nom de variables,
sachant qu’un nom de variable n’est pas autre chose que la désignation d’une adresse)·
2. Une unité de programme est un bloc d’instructions exécutées séquentiellement.
3. Les opérations arithmétiques élémentaires font partie du langage.
4. Les ruptures inconditionnelles “Go to label” (peu recommandées en “bonne programmation) et
conditionnelles “If Cond, then Bloc1, else Bloc2”.
5. Les boucles “For i = 1 to n, Bloc” et “While Cond, Bloc” font partie du langage.
6. On peut définir des fonctions et les composer.
7. On peut définir des fonctions par récursivité.
Sur un ordinateur les objets externes sur lesquels opèrent les programmes occupent toujours une place
finie en mémoire (en pratique une suite finie de 0 et 1), on peut les considérer soit comme des chaînes
de caractères soit comme des entiers. La mémoire des ordinateurs est finie mais nous la considérerons
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
13
comme illimitée, sans que l’on ne manipule jamais d’objets infinis. Ce ce qui revient à dire qu’un
programme opère sur des chaînes de caractères ou des entiers sans limitation de taille.
Les différentes opérations d’un langage que nous avons décrites sont redondantes et pas vraiment
élémentaires. Nous allons de plusieurs manière réduire ces opérations à des opérations élémentaires
ce qui nous conduira à plusieurs définition équivalente de la notion de programme.
5.2
Les machines de Turing
Historiquement les machines imaginées par A. Turing, pour définir la notion de processus mécanisable utilisée dans les fondements de la logique, sont à l’origine de l’invention des ordinateurs ;
nous allons effectuer le processus inverse de déconstruction d’un langage évolué pour retourner aux
machines de Turing. Considérons que les objets du programme sont des chaînes des caractères 0 et 1.
Les “Go to” permettent sans difficulté de simuler les ruptures conditionnelles“If” ainsi que les boucles
“For” et “While”. De même la récursivité des fonctions peut être éliminée à l’aide de boucles “While” (ce n’est tout à fait évident) et elle est donc ramenée à des “Go to”. L’appel à des fonctions peut
être remplacé par l’insertion du programme de la fonction partout où elle est appelée. Les opérations
arithmétiques se ramènent à des manipulation de chaînes de caractères. Finalement un programme se
décompose en opérations élémentaires sur des entiers définis par leur adresse en mémoire, les différentes opérations s’enchaînant selon un ordre défini par les “Go to” : c’est en gros le langage qu’on
appelle “l’assembleur”, i.e. le langage de base des microprocesseurs.
Les “machines de Turing” représentent l’achèvement du processus de décomposition des programmes
que nous avons esquissé : l’adressage y est éliminé et remplacé par la simple juxtaposition des entiers
sur un “ruban” qui représente la mémoire et enfin les entiers sont décomposés en 0 ou 1. On obtient
donc un concept de calculateur ramené à :
− une mémoire définie par un ruban formé de cases sur lesquels on écrit des “blancs’, des 0 ou des 1,
ces cases sont lues par une tête de lecture
− des instructions (nommées états) limitées à la modification du contenu de la case sur laquelle la tête
de lecture est positionnée, au déplacement à gauche et à droite de la tête de lecture et à la transition
vers un autre état (i.e. le “Go to”).
Voir le document de S. Bilanuk et les nombreux sites WEB consacrées aux machines de Turing.
5.3
La programmation fonctionnelle
Il est bien connu en “bonne programmation” que les “Go to” peuvent être éliminés d’un programme à l’aide des “If”, “For”, “While”. Les opérations arithmétiques sont des compositions de
fonctions élémentaires. Quant à l’affectation à une variable, dans un bloc sans boucle, elle peut être
remplacée par une définition de fonction. Enfin le déroulement séquentiel d’un bloc peut être remplacé
par la substitution d’une variable affectée x = f (x, y) par la fonction f (x, y) dans les instructions
suivantes, après avoir renommé les variables ; par exemple
ECP 2005-2006
x := f (x, y)
(1)
y := g(x, z)
(2)
z := h(x, y)
(3)
Cours d’approfondissement
Logique, mathématiques, informatique
14
équivaut à
x1 := f (x, y)
(4)
y1 := g(x1 , z)
(5)
z := h(x1 , y1 )
(6)
puis
z := h(f (x, y), g(f (x, y), z))
On peut remplacer les boucles “For” par des définitions de fonctions par récurrence. Supposons que
le corps de la boucle fasse appel à des paramètres représentés par le vecteur d’entiers y et modifie des
variables représentées par le vecteur x. La boucle peut s’écrire
For i = 1 to n x=f(i,x,y) end
où f (i, x, y) représente les différentes affectations effectuées dans le corps de la boucle dans un
vecteur x. Elle équivaut à la définition de la fonction g(i, x, y), qui définit l’état x à l’étape i de la
boucle, par la récurrence
g(i+1,x,y) = f(g(i,x,y),y))
qui n’est pas autre chose qu’une définition récursive de g considérée comme une fonction de i.
De même les boucles “While” peuvent être ramenée à une définition récursive de fonction. Supposons
que le corps de la boucle fasse appel à des paramètres représentés par le vecteur d’entiers y et modifie
des variables représentées par le vecteur x. La boucle peut s’écrire
While Cond(x,y), x=f(x,y) end
où f (x, y) représente les différentes affectations effectuées dans le corps de la boucle dans un vecteur
x. Elle équivaut à la définition de la fonction g(x, y), qui définit l’état x à l’étape courante de la
boucle, par la définition récursive
g(x,y) = If Cond(x,y) alors g(x,y) = g(f(x,y),y) else g(x,y) = x
En conclusion, un programme peut s’écrire uniquement à l’aide de la composition de fonctions élémentaires et de la définition récursive de fonctions. Ce qui revient à dire qu’un programme n’est
pas autre chose que des définitions successives de fonctions par composition ou récursivité : c’est la
“programmation fonctionnelle”. L’exécution d’un programme se ramène à l’application de fonctions
élémentaires sur les résultats du calcul de d’autres fonctions ( en pratique cela se ramène à une gestion
d’adresses, le pointeur de la fonction, et la gestion des “piles” de résultats intermédiaires).
5.4
Le λ-calcul
Le λ-calcul est une forme syntaxique de la programmation fonctionnelle dans laquelle on ne fait
pas de différence entre les fonctions et les arguments des fonctions. Ainsi une expression qui s’écrirait
mathématiquement f (x+y) pourra être considérée comme une fonction de x, y, aussi bien que de f et
+ ! On n’utilise donc pas de parenthèses pour l’expression f (x) que l’on notera f x. Pour s’avoir si une
expression telle que xy est considérée comme une fonction de x et non pas y on utilise l’abstraction
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
15
λx xy (certains langages préfèrent être moins mystérieux et écrivent f unc(x, xy)). L’application
d’une fonction f considérée comme fonction de x à un argument y est un élément du langage , elle est
notée (f, y). Noter que la syntaxe ainsi introduite n’admet pas toujours d’interprétation fonctionnelle
au sens de la théorie des ensembles.
L’exécution du programme s’appelle la β-conversion : c’est l’application de toutes les fonctions à
leur argument dans des expressions comme (f, y) (a priori cela dépend de l’ordre dans lequel on fait
ces applications). Ainsi l’expression
(λx (x, λz z), λy (y, z))
donne par β-conversion (appliquée dans l’ordre de gauche à droite des parenthèses)
(λx (x, λz z), λy (y, z)) → (λy (y, z), λz z) → (λz z, z) → z
Dans un autre ordre
(λx (x, λz z), λy (y, z)) → (λz z, λy (y, z)) → (λy (y, z) → z
Le résultat est identique : c’est général, on montre que si la β-conversion se termine le résultat ne
dépend pas de l’ordre des conversions.
Noter que la β-conversion ne termine pas toujours
(λx (x, x), λx (x, x))
redonne indéfiniment la même expression.
Inachevé.
5.5
Les algorithmes de Markov ou systèmes de réécritures
5.6
Les fonctions récursives
Les fonctions de Nk dans Nl qui sont calculables par un programme écrit dans un langage usuel
peuvent être définies directement à partir des opérations élémentaires de l’arithmétiques, par combinaison de trois opérations :
− la composition des fonctions,
− la définition par récurrence (équivalent des boucles “For”)
f (x, i + 1) = h(f (x, i), x, i) et f (x, 0) = g(x)
− la minimisation (qui jointe aux boucles “For” équivaut aux boucles “While”)
f (x, k) = µ(i) / g(x, i) = 0
où le symbole µ(i) signifie “le plus petit entier i” et où la fonction g(x, k) est récursive. La minimisation peut ne pas avoir de sens si ∀i g(x, i) 6= 0. C’est pour les fonctions récursives l’équivalent du
non arrêt des boucles “While” dans un programme.
Voir la définition dans le document de S. Bilanuk ainsi que la preuve que ces fonctions sont les fonctions calculable par programme.
Le domaine de définition d’une fonction récursive est l’ensemble des valeurs des variables pour lesquelles toutes les minimisations ont un sens.
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
16
Définition 2 Une fonction récursive à k variables est récursive totale si son domaine de définition
est Nk .
En d’autres termes ce sont les fonctions calculables par programme pour lesquelles l’exécution du
programme s’arrête toujours.
5.7
La “thèse” de Church
Toutes les notions de programmes que nous avons définies précédemment sont équivalentes en
ce sens que toute fonction calculable par un programme écrit sous une de ces formes est calculable
par un programme écrit sous les autres formes. Plus précisément on peut réaliser un interpréteur d’un
de ces langages dans un autre langage (par exemple simuler une machine de Turing par des règles
réécritures). En pratique aujourd’hui toutes les définitions de la calculabilité d’une fonction que l’on
a pu donner sont ou bien plus faible que celle de Turing, ou bien équivalente, ou bien contiennent une
opération non déterministe ou non finie. C’est la “thèse” énoncée par Church dans les années 30.
5.8
Qu’est-ce qu’un ordinateur : le programme universel, i.e. l’interpréteur
Dans un langage de programmation particulier, il existe un programme capable d’exécuter tous
les autres programmes : on peut par exemple, écrire en C un interpréteur des programmes écrits
en C ; l’interpréteur a comme données un fichier de chaînes de caractères, qui est un programme
quelconque en C, et un fichier qui contient les données de ce programme ; l’interpréteur lit et exécute
le programme. Nous notons U (A, α) un tel programme qui exécute le programme A pour des données
α et renvoie A(α). Donc, par définition du programme universel,
U (A, α) = A(α)
6
6.1
(7)
Les limites absolues de la calculabilité
Peut-on se passer des boucles “While” ?
Considérons que les programmes traitent des chaînes de caractères. Supposons que l’on puisse
toujours supprimer les boucles “while” dans un langage de programmation usuel, c’est à dire réécrire
tous les programmes en n’utilisant que les boucles “for”. On peut donc supposer que le programme
universel U (A, α) qui exécute le programme A pour des données α est écrit sans boucle “while”.
Comme on ne simule que des programmes écrit sans boucle “while” l’exécution de U (A, α) s’arrête
toujours et renvoie une chaîne de caractères. Par définition du programme universel
U (A, α) = A(α)
(8)
Ici A et α sont des chaînes de caractères (toute chaîne de caractères ASCII). Il n’est donc pas absurde
de considérer le programme
θ(A) = U (A, A) = A(A)
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
17
Ce programme est une petite modification du programme universel3 . Soit θ0 une modification du
programme θ(A) qui renvoie une modification quelconque de la chaîne θ(A) (par exemple en ajoutant
un “0 ” à la fin de la chaîne θ(A) !) :
θ0 (A) = θ(A)0 = A(A)0
(9)
le résultat de θ0 (A) est donc, par construction, toujours différent de A(A),
θ0 (A) 6= A(A)
d’où puisque θ0 (A) est lui même un programme
θ0 (θ0 ) 6= θ0 (θ0 )
et donc une contradiction.
Théorème 1 Il existe des programmes écrit dans un langage comprenant les boucles “For” et “While” qui ne peuvent s’écrire sans boucle “While”.
Nous allons obtenir un résultat plus fort dans le paragraphe suivant .
6.2
Le problème de l’arrêt
Nous reprenons les notations du paragraphe précédent, mais nous considérons des programmes
quelconques, écrits donc avec des boucles “while”, et nous posons la question :
Existe-t-il un programme T estArret(A, α) qui s’arrête toujours et qui renvoie 1 si un programme A
appliqué à des données α s’arrête et 0 sinon ?
On pose encore
θ(A) = U (A, A) = A(A)
Supposons qu’un programme T estArret existe, on peut définir à l’aide de T estArret un programme
θ0 (A) qui boucle quand A(A) s’arrête et qui s’arrête quand A(A) boucle : il suffit, en appelant B une
boucle infinie quelconque (while 1, end !), de poser
θ0 (A) = If T estArret(θ, A) then B else “stop00
Le résultat de θ0 (A) est donc, par construction, toujours différent de celui de θ(A) = A(A)
θ0 (A) 6= A(A)
d’où puisque θ0 (A) est lui même un programme
θ0 (θ0 ) 6= θ0 (θ0 )
ou autrement dit le programme θ0 (θ0 ) s’arrête quand il ne s’arrête pas et vice-versa !
3
On objectera qu’un “vrai” programme n’acceptera pas une chaîne de caractères absolument quelconque, en fait si : un
programme bien écrit teste toujours ses données et renvoie un message d’erreur si le “type” des données est convenable ;
un programme mal écrit “plante”, mais alors c’est le compilateur ou le système d’exploitation qui renvoie un message
d’erreur. Dans tous les cas le programme renvoie un message, i.e. une chaîne de caractères ! Et de nombreux programmes
ont pour entrée naturelle les chaînes de caractères qui définissent un programme, par exemple les programmes qui vérifient
les types des variables (précompilation) ou encore les programmes qui lisent les en commentaires de tête pour trouver les
programmes qui exécutent une tâche donnée...
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
18
Théorème 2 Il n’existe pas de programme qui, si on lui entre comme données un programme quelconque contenant des boucles “While” et une donnée du programme, détermine si le programme
s’arrête ou non pour ces données.
Nous reviendrons sur ces résultats négatifs à propos des fonctions récursives en donnant une interprétation en termes de croissance (de la longueur de la chaîne de caractères produite) des programmes
qui ne peuvent s’écrire sans boucle “while”.
6.3
Commentaires de l’argument précédent
6.3.1
La diagonale de Cantor
L’argument que nous avons utilisé est identique à l’argument de “la diagonale de Cantor”. Prenons l’exemple des programmes écrit sans “While”. Imaginons un tableau infini dans lequel on range
dans la première ligne et dans la première colonne tous les programmes. On met ensuite à l’intersection d’une ligne et d’une colonne le résultat de l’application du programme associé à la ligne au
programme associé à la colonne. Le programme θ n’est autre que le programme défini par la diagonale de ce tableau. Le programme θ0 est construit pour être différent de la diagonale. Il ne peut donc
figurer dans la liste des programmes. La contradiction est obtenue si θ est bien du même type que les
programmes considérés, c’est à dire ici un programme écrit sans boucle “While”. C’est ce qui découle
de l’hypothèse que le programme universel U (A, A) s’écrit sans boucle “While”.
6.3.2
Quelle est la portée de l’argument ?
Ce qui choque souvent dans cet argument c’est le fait qu’on applique un programme à un programme. Remarquons d’abord que de tels programmes sont très communs : tous les programmes de
traitement de fichier, comme le calcul du nombre de caractères d’un fichier, entrent dans cette catégorie. C’est aussi le cas des compilateurs, vérificateurs de types etc..
On objectera : et si on se limite aux programmes qui traitent des chaînes particulières, par exemple
les nombres entiers ? Nous verrons plus loin que cela ne change rien, car un entier peut “coder” un
programme. Mais, bien sûr, il y a des conditions particulières qui permettent de deviner que le programme va s’arrêter : par exemple si la chaîne de caractères que traite le programme voit sa longueur
décroitre strictement dans les passages par une boucle.
7
Le problème des fondements de l’arithmétique
7.1
7.1.1
Le codage des fonctions, formules et programmes dans l’arithmétique
Le codage des arbres
Résumé
On se propose de réaliser des bijections entre des arbres et R. Il y a plusieurs manières de faire, nous
en présentons une.
− Codage de N × N
La fonction
(n + m + 1)(n + m)
f (n, m) =
+m
2
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
19
réalise une bijection de N × N dans N.
Si on pose p = m + n on a
p(p + 1) ≤ 2f (n, m) ≤ (p + 1)(p + 2)
Le décodage s’effectue en cherchant le plus grand nombre p tel que
p(p + 1) ≤ 2f (n, m)
ce qui peut se faire par un programme avec une boucle “For”, on en déduit
m = f (n, m) −
(p + 1)p
2
et n = p − m
−Codage des suites finies
On définit par récurrence un premier code g((n1 , n2 , ..., nk )) d’un k − uple (n1 , n2 , ..., nk ) par la
récurrence
g(n1 ) = n1
si k = 1
(10)
g((n1 , n2 , ..., nk+1 )) = f (g((n1 , n2 , ..., nk+1 )), , nk+1 )
(11)
mais ce code peut donner la même valeur pour deux suites finies de longueur différente, on définit
donc le code h(n1 , n2 , ..., nk )i d’un k − uple (n1 , n2 , ..., nk ) en codant sa longueur, soit
h(n1 , n2 , ..., nk )i = f (k − 1, g(n1 , n2 , ..., nk )
ou dit plus clairement sur un exemple
h(n1 , n2 , n3 )i = f (3, f (f (n1 , n2 ), n3 ))
Ce codage réalise une bijection entre les suites finies d’entiers et N.
− Codage des arbres valués
On suppose que chaque noeud et chaque feuille ont un numéro num(noeud) et num(f euille), on
définit le codage de l’arbre récursivement par
hAi = f (0, num(f euille))
si l’arbre est réduit à une feuille (dont le numéro est considéré comme une suite de longueur 1 ce qui
permet de savoir que c’est une feuille), et par
hAi = h(h(hA1 i, ..., hAk i)i, num(noeud)i
si la racine est un noeud à k branches qui définissent les sous-arbres A1 , ..., Ak .
Ce codage est bijectif.
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
7.1.2
20
Le codage des formules
On fait en sorte de réaliser une bijection entre les expressions bien formées et N. Il y a des
variantes possibles dans la méthode de codage.
− Codage des termes
Un terme est un arbre avec un symbole de fonction fi,k à k arguments pour chaque noeud et pour
feuilles des symboles de variables xi ou constantes ci . Pour coder le terme on donne une valeur à
chaque symbole (par exemple 2i à xi et 2(i + 1) à ci et h(i, k)i pour chaque symbole de fonctions) et
on code l’arbre valué correspondant.
− Codage des formules atomiques
Une formule atomique résulte de l’application d’un prédicat Pi,k à k arguments à des termes tj , j =
1, ..., k. On code le symbole Pi,k (pour k = 0 c’est un symbole de proposition) par
hPi,k i = f (i, k)
On code la formule atomique, pour k ≥ 1, en utilisant la fonction (11) qui code les suites de longueur
k, par
hPi,k (t1 , ..., tk )i = h(hPi,k i, g(ht1 i, ..., htk i)
(On n’utilise pas le codage des suites car la longueur k de la suite est déjà définie par le code de la
fonction).
− Codage des formules
Une formule est un arbre avec des noeuds binaires qui ont pour symbole
∧, ∨, ⇒, ⇔
des noeuds unaires, avec pour symboles
¬, ∀xi , ∃xi
et pour feuilles des formules atomiques. On considère que les quantificateurs attachés à une variable
forment des symboles unaires et on introduit autant de symboles unaires que de variables : ∀xi devient
ainsi un symbole unaire. On définit comme on veut une bijection entre les symboles attachés à un
noeud et N, 0 désignant une feuille.
Il suffirait ensuite de coder l’arbre valué correspondant. Mais on ne définit pas ainsi une bijection car
le nombre de branches passant par un noeud est fixé par le symbole du noeud. Une légère modification
permet de réaliser une bijection : si le symbole est celui d’un connecteur binaire, on code par l’arbre
par
f (f (hA1 i, hA2 i), num(noeud))
où A1 et A2 sont les deux sous-formules et si le symbole est celui d’un connecteur unaire on code la
formule par
f (hA1 i, num(noeud))
Pour décoder un entier p, on l’écrit sous la forme f (n, m) :
si m est le symbole d’un connecteur unaire alors n est le code d’une sous-formule,
si m est le code d’un symbole binaire on écrit n = f (n1 , n2 ) , n1 ,n2 sont les codes de deux sousformules,
si m = 0 alors n est le code d’un terme.
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
7.1.3
21
Le codage des programmes
La définition syntaxique d’un programme écrit de façon fonctionnelle (cf. paragraphe (5.3) n’est
pas autre chose que la définition d’un terme construit sur les symboles arithmétiques, les fonctions
classiques sur les entiers et les symboles de fonctions If (Cond, x, y), F or(i, n, m, x), W hile(Cond, x).
On peut donc coder les programmes comme les termes.
7.1.4
Le codage des fonctions récursives
La définition syntaxique d’une fonction récursive n’est pas autre chose que la définition d’un
programme écrit dans un langage particulier. On peut donc coder les fonctions récursives comme les
programmes.
7.1.5
Le codage des démonstrations
Considérons un système particulier de déduction formelle, celui décrit dans le document de S.
Bilanuk. Une démonstration est un arbre dont les feuilles sont des axiomes ou une des hypothèses de
la démonstration et les noeuds des applications du Modus Ponens. Mais cette structure n’a pas une
grande importance pour la suite. On peut donc l’oublier et considérer qu’une démonstration est une
suite de formules (toutes les formules apparaissant dans l’arbre) Fk et que
1. ou bien Fk est un axiome ou une hypothèse.
2. ou bien Fk est obtenue à partir de deux formules Fi et Fj , telle que i, j < k, par application du
Modus Ponens ce qui signifie que Fj est Fi ⊃ Fk .
Si d est le code d’une suite de formules on peut facilement définir un programme, et donc une fonction
récursive, qui teste si cette suite est une démonstration et si la dernière formule a pour code n. Il existe
donc une fonction récursive totale dem(d, n) qui vaut 1 si d est le code d’une démonstration de la
formule de code n et 0 sinon.
7.2
La représentation des fonctions récursives dans l’arithmétique
Nous allons montrer qu’une fonction récursive quelconque est représentable dans l’arithmétique :
Théorème 3 Si fi (n1 , ..., nk ), i = 1, ..., l est une fonction récursive de Nk dans Nl il existe une
formule F (n1 , ..., nk , p1 , ..., pl ) du langage de l’arithmétique (0, Succ, +, .) telle que
N 7−→ F (n1 , ..., nk , p1 , ..., pl ) si et seulement si pi = fi (n1 , ..., nk ), i = 1, ..., l
La preuve se fait par récurrence sur les symboles de fonctions apparaissant dans la fonction, pour
alléger l’écriture limitons nous aux fonction d’une variable.
Nous aurons besoin du lemme
Lemme 1 (Gödel) Il existe une fonction β(n, i) représentable dans l’arithmétique telle que, pour
toute suite finie (n1 , ..., nk ), il existe un entier n tel que
∀1 ≤ i ≤ n β(n, i) = ni
Cette fonction réalise un codage des suites qui est représentable dans l’arithmétique.
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
22
Noter que si on prend n = pn1 1 pn2 2 ...pnk k où les pk sont les k premiers nombres premiers on obtient une
fonction β qui est représentable dans l’arithmétique étendue par l’exponentiation, le lemme de Gôdel
permet de se passer de l’exponentiation. Nous admettons ce lemme, plus technique que difficile.
Preuve du théorème (3)
− Cas de la composition : si h(n) = f (g(n)) et si f et g sont représentables par les formules F (m, p)
et G(n, q), alors h l’est aussi. En effet on a
p = h(n) ssi ∃m F (m, p) ∧ G(n, m)
− Cas de la minimisation : si g(n, p) est représentable par la formule G(n, p, q) et si
h(n) = µ m/g(n, m) = 0
alors
p = h(n) ssi ∃m G(n, m, 0) ∧ ∀q (q < m) ⊃ (¬G(n, q, 0))
− Cas de la définition par récurrence : si g(n, p) est représentable par la formule G(n, p, q) et si par
exemple
f (i + 1) = g(f (i), i), f (0) = 1
alors, en utilisant la fonction β(n, i) (cf. lemme ??),
p = f (n) ssi ∃m(∀i (1 ≤ i ≤ n) ⊃ G(β(m, i), i, β(m, i + 1))) ∧ β(m, 0) = 1 ∧ β(m, n) = p
dans cette expression on peut éliminer la fonction β à l’aide de la formule qui la représente.
7.3
L’incomplétude de l’arithmétique
Nous allons démontrer le
Théorème 4 (Gödel) On peut construire une proposition A du langage de l’arithmétique telle qu’il
n’est pas possible que
N 7−→ A
ni que
N 7−→ ¬A
La première étape de la démonstration consiste à coder les formules et les démonstrations puis à
montrer que, pour une formule, le fait d’être démontrable ou non est une propriété arithmétique de
son code.
1. On code les formules de l’arithmétique (7.1.2).
2. On code les démonstrations de l’arithmétique (7.1.5).
3. Connaissant le code n d’une formule P et le code d d’une démonstration on peut écrire un
programme, dans un des langages usuels de programmation, qui décode la formule et la démonstration et vérifie que cette démonstration est valide et démontre bien la proposition P .
4. Ce programme peut être transformé en une fonction récursive totale, que nous notons Dem(n, d)
qui vaut 1 si d démontre n, 0 sinon.
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
23
5. Les fonctions récursives totales étant représentable dans l’arithmétique, il existe une formule
de l’arithmétique, que nous notons DEM (n, d) telle que
N 7−→ DEM (n, p) si et seulement si Dem(n, d) = 1
6. La proposition θ(n) définie par
θ(n) ↔ ∀d¬DEM (n, d)
s’interprète donc en français sous la forme “La formule de code n n’est pas démontrable dans
l’arithmétique”.
Dans une deuxième étape nous construisons par l’argument diagonal une formule qui ne peut pas être
démontrable. On note hφi le code d’une formule φ de l’arithmétique. Considérons toutes les formules
à une variable libre. La fonction définie par
n → hφn (n)i
si l’entier n est le code d’une telle formule φn (x), et 0 sinon, est calculable par programme, elle est
donc récursive totale et peut être représentée par une formule c(n, m) de l’arithmétique. Appelons
P (n) la formule θ(hφn (n)i), où φn (x) est la formule à une variable libre dont le code est n ; c’est
une formule de l’arithmétique (elle est représentée par θ(m) ∧ c(n, m)) à une variable libre n qui
exprime que φn (n) n’est pas démontrable dans l’arithmétique. Appelons A la formule P (hP i), c’est
une formule de l’arithmétique (même argument que ci-dessus). Si
N 7−→ A
alors par définition de A cela implique
θ(hP (hP i)i)
et par définition de θ cela implique que P (hP i) n’est pas démontrable dans l’arithmétique. Donc A
n’est pas démontrable, d’où une contradiction.
Réciproquement, si
N 7−→ ¬A
alors
N 7−→ ¬θ(hP (hP i)i)
ou
∃d DEM (hP (hpi)i, d)
Ce qui signifie “ P (hpi) est démontrable” et donc que A est démontrable.
En conclusion, si l’arithmétique est consistante aucune des deux formules A ou ¬A n’est démontrable.
ECP 2005-2006
Cours d’approfondissement
Logique, mathématiques, informatique
7.4
L’indécidabilité de l’arithmétique
7.5
La consistance de l’arithmétique
8
24
Les limites relatives de la calculabilité
8.1
Propriétés arithmétiques des fonctions non calculables
8.2
Les limites relatives de la calculabilité
8.3
La complexité en temps
Voir dans le cours de mathématiques 2, Graphes et optimisation discrète, la séance sur la complexité.
8.4
La conjecture P 6= NP
Idem
8.5
9
La complexité algorithmique
Applications
9.1
Démonstration automatique
9.2
L’analyse non standard
ECP 2005-2006
Cours d’approfondissement
Téléchargement
Study collections