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