20052006 AAC- Cours UFR IEEA Master1 d'Informatique S.Tison Calculabilité, Décidabilité: quelques notions élémentaires Une question fondamentale se pose naturellement, surtout quand on est informaticien (non?): Que peuton calculer par ordinateur"? ou encore quels sont les problèmes qu'on peut résoudre par algorithme? Cette question a été étudiée bien avant l'existence de l'informatique, comme par exemple par Hilbert et son célèbre "Entscheidungsproblem" (début du 20ème siècle). En fait, cette question soulève une question préliminaire: Qu'est-ce qu'un algorithme? 1 La notion d'algorithme Algorithme(dictionnaire): procédé de calcul mis en ÷uvre pour obtenir un résultat par un nombre ni d'applications de règles. Algorithme(étymologie supposée): tiré de Al-Khowarizmi (mathématicien du 9eme siécle après JC) Algorithme(D. Knuth, The art of computer programming, vol. 1): ensemble ni de règles qui donne une suite d'opérations pour résoudre un certain type de problèmes; un algorithme a cinq particularités importantes: • Finitude: un algorithme doit toujours terminer en un nombre ni d'étapes. • Il est déni: chaque pas d'algorithme doit être déni précisément. • Entrée: un algo a 0 ou plusieurs entrées, "prises" dans des ensembles spéciés d'objets. • Sortie: un algo a 0 ou plusieurs sorties, i.e. quantités qui sont en relation de façon spéciée avec les entrées. • Eectivité: chaque opération doit être susamment basique pour pouvoir être exécutée en un temps ni par un homme utilisant... un crayon et un papier. De nombreux chercheurs, mathématiciens, logiciens, informaticiens ont proposé des modèles de la notion d'algorithme ou de calcul: machines à registres, machines de Turing, λ-calcul, systèmes de Post, fonctions récursives, ... Il a été prouvé que tous ces modèles sont équivalents du point de vue de leur expressivité: ce qu'on peut "calculer" dans un modèle, peut l'être dans un autre. De plus Church a émis la thèse généralement acceptée ( thèse de Church-Turing) , selon laquelle il existe une notion intrinsèque d'algorithme qui correspond à la notion intuitive d'algorithme ( tout du moins pour les algorithmes séquentiels). On peut prendre, par exemple, comme modèle d'algorithme un programme C, JAVA, HASKELL, ou un algorithme écrit en pseudo-langage... qui s'arrête pour toute donnée du domaine (mais attention, sans limitation de mémoire de la machine utilisée) ou pour toute instnace du problème et calcule la réponse attendue. 2 Un exemple fondamental: l'impossible quête de la terminaison des programmes Prenons donc pour modèle d'algorithme les programmes écrits dans un pseudo-langage (ou prenez votre langage de programmation préféré!). Supposons qu'il existe un programme qui s'arrête pour la donnée Do, ARRET(Pr,Do: mot) qui sort "vrai" si qui sort "faux" sinon. On pourrait alors écrire: procedure PARADOXE(Pr: mot) is debut si ARRET(Pr,Pr) alors boucle; --while true do null; end while; sinon null; fin PARADOXE; Pr est un programme correct Que donne l'exécution de PARADOXE sur le texte de PARADOXE?: si elle s'arrête, alors elle boucle et réciproquement: il y a contradiction! L'hypothèse d'existence du programme ARRET est donc fausse: il n'existe pas de programme qui permette de tester l'arrêt d'un programme sur une donnée: l'arrêt d'un programme est dit indécidable. Quelques remarques: . Le raisonnement utilisé qui aboutit à une contradiction est un raisonnement diagonal classique et est basé sur le fait d'autoréférence: un programme peut être appliqué à lui-même. (Ici, tout est mot). On peut rapprocher ce raisonnement du paradoxe du menteur: "Ceci est un mensonge" ou du barbier de Russel: le barbier ne rase que ceux qui ne se rasent pas eux-mêmes; se rase-t-il?( Russel a aussi émis un célèbre paradoxe en théorie des ensembles: Soit est-ce que A appartient à A? A = {x/x 6∈ x}, l'ensemble des ensembles x tels que x n'appartient pas à x: ) . On peut bien sûr lancer le programme sur la donnée: si ça s'arrête, on le vériera ...au bout d'un certain temps. Si ça ne s'arrête pas, on ne sait pas si le calcul est en cours et va s'arrêter ou si il boucle indéniment! Le problème estsemi-décidable. . Le résultat est fondamental. On peut montrer aussi que l'arrêt uniforme d'un programme (i.e. le programme s'arrête pour toute donnée) est indécidable. . Attention, cela ne veut bien sûr pas dire qu'on ne peut pas prouver l'arrêt d'un programme donné: cela siginie juste qu'il n'y a pas de méthode "automatique" uniforme qui marche à tous les coups: cela justie d'une certaine façon la diculté éprouvée à prouver l'arrêt d'un programme... 3 Un modèle de calcul: Les machines de Turing Le modèle des machines de Turing a été introduit par Alan Turing en 1936 et a de nombreuses variantes. Le modèle de base a un contrôle ni, une bande innie à droite, une tête de lecture/écriture. Le contenu de la bande est limité par un symbole spécial, le blanc: le dernier symbole du contneu de la bande est le symbole non-blanc le plus à droite. A chaque pas de calcul, la lettre pointée par la tête de lecture est lue: en fonction de celle-ci et de l'état de contrôle, la lettre peut être modiée et la tête de lecture peut se décaler d'un caractère à gauche ou à droite ou rester stationnaire. L'état de contrôle peut aussi être modié. Si il est nal, l'entrée initiale est acceptée. Cela conduit à la dénition: Dénition 1 Une machine de Turing M est la donnée de: .Q un ensemble (ni) d'états .Γ un alphabet ni de bande .B , un symbole de Γ, le "blanc" .Σ, un sous-ensemble de Γ − {B}: .δ une fonction de Q×Γ .q0 , un état de l'état initial Q, .F , un sous-ensemble de Une dans Q l'alphabet d'entrée Q × Γ × {L, S, R}, la fonction de transition. , les états "naux" description instantanée d'une machine est un triplet contenu de la bande à gauche de la tête de lecture est la tête de lecture) est Un si si si u, (u, q, v): l'état courant de la machine est q, le le contenu à droite (y compris le symbole pointé par v. pas de calcul, noté (u, q, xv) ` (u0 , q, v0 ), est déni par: δ(q, x) = (q 0 , x0 , L), u = u0 y, v 0 = yx0 v δ(q, x) = (q 0 , x0 , S), u = u0 , v 0 = x0 v δ(q, x) = (q 0 , x0 , R), u = ux0 , v 0 = v calcul (u, q, xv)`∗ (u0 , q, v0 ) est une suite de pas de calculs. ∗ 0 0 Un calcul réussi pour l'entrée u est un calcul (, q0 , u)` (u , q, v ) avec q un état nal. Le langage accepté par une machine M est l'ensemble L(M ) des mots u pour lesquels il existe un calcul Un réussi. 2 Remarque: on peut supposer que la machine est accepté, la machine s'arrête sur l'entrée Si la machine 4 M u. M s'arrête dès qu'elle atteint un état nal. Donc, si un mot Par contre, si un mot n'est pas accepté, le calcul peut être inni. s'arrête pour toute entrée, on dit qu'elle décide le langage L(M ). Vocabulaire 4.1 Langages récursivement énumérables, langages récursifs Dénition 2 Un langage est dit récursivement énumérable (r.e.) si il est accepté par une machine de Turing. Il est dit récursif, si il est décidé par une machine de Turing, i.e. reconnu par une machine de Turing qui s'arrête pour toute entrée. On peut réécrire cette dénition en utilisant un modèle d'algorithme quelconque: Un langage est dit récursivement énumérable (r.e.) si il existe un semi-algorithme qui prend en entrée un mot u et s'arrête et sort oui si le mot est dans L, boucle ou sort Non si Il est dit récursif, si il existe un algorithme qui prend en entrée un mot est dans L, s'arrête et sort Non si u n'est pas dans u n'est pas dans L. u et s'arrête et sort oui si le mot L. Remarque: Le modèle de machine de Turing -d'algorithme- présenté ici est déterministe; on peut dénir une notion de machine de Turing non déterministe et montrer que les deux modèles ont la même puissance de reconnaissance. 4.2 La notion de décidabilité A une propriété P, on peut associer le langage (des représentations pour un codage donné) des objets vériant la propriété. Une propriété est dite décidable si le langage associé est récursif; elle est dite indécidable sinon. On peut parler de propriété semi-décidable si le langage associé est récursivement énumérable. 4.3 La notion de calculabilité On peut voir une machine de Turing -ou tout modèle de calcul- non seulement comme un reconnaisseur mais aussi comme un "calculateur", en considérant la sortie comme le contenu de la bande à la n du calcul. Une fonction est dite ("Turing-")calculable si elle peut être calculée par une machine de Turing ou un algorithme, i.e. il existe une machine -un algorithme- qui pour toute valeur de son domaine, s'arrête et la valeur calculée correspond bien à la valeur de la fonction, et pour toute valeur hors du domaine soit s'arrête dans un état "erreur", soit ne s'arrête pas. Exercice: Comparez le e cardinal de l'ensemble des programmes dans un langage donné et celui de l'ensemble des fonctions de 5 N dans N? Qu'en déduire? La machine Universelle et un exemple de langage r.e. non récursif On peut coder la dénition d'une machine de Turing comme un mot. Une machine universelle de Turing est une machine qui accepte en entrée le code d'une machine de Turing M et une donnée d et qui simule (interprète) cette machine M sur la donnée d. Le langage accepté par cette Machine est donc récursivement énumérable mais non récursif par l'indécidabilité du problème de l'arrêt. 6 D'un modèle à l'autre Il existe de nombreux autres modèles de calcul. Par exemple, la RAM est un modèle des machines séquentielles de Von Neumann qui "correspond assez bien à la réalité". Une RAM dispose d'un nombre ni xé de registres et d'un nombre non borné de mots de mémoire, chacun pouvant contenir un entier quelconque. La donnée de la machine peut être vue comme un programme en langage machine: on dispose des instructions élémentaires sur les entiers, du test, et le contrôle se fait via des états ou des "étiquettes". La RAM, contrairement à la machine de Turing qui est à accès séquentiel, est une machine à accès direct. 3 On peut simuler une RAM par une Machine de Turing et vice-versa; de plus, cette simulation peut se faire de façon relativement ecace, puisqu'elle peut se faire polynomialement: i.e. une RAM de complexité temporelle t(n) et spatiale s(n) ≤ t(n) peut être simulée par une machine de Turing de complexité t4 (n). Remarque: si les modèles sont équivalents au niveau de l'expressivité -un modèle peut en simuler un autre et vice-versa-, ils ne le sont pas forcément au niveau de la complexité. En eet, si les modèles classiques de machines séquentielles sont polynômialement équivalents: - donc par exemple, un algorithme peut être dit polynômial sans que l'on précise trop le modèle (classique) de calcul-, le modèle récent des ordinateurs quantiques est peut-être d'une certaine façon plus rapide. 7 Comment prouver qu'une propriété est indécidable? Il y a de nombreux exemples de problèmes qu'on ne peut résoudre par algorithme; les preuves sont souvent de deux types: soit "directes" en supposant la décidabilité et en conduisant à un paradoxe en utilisant des techniques de diagonalisation (cf ci-dessus), soit, -plus fréquemment- par réduction: on sait déjà qu'on ne peut pas trouver d'algorithme pour Truc; on montre que si on en avait un pour Machin, on en aurait un pour Truc; donc on ne peut pas trouver d'algorithme pour Machin! Un peu plus formellement, soient deux propriétés Σ2 ). On dit que P1 se réduit L1 Ssi red(u) est dans L2 . L2 On peut alors vérier que si décide si dans L2 , u est dans i.e. si u Remarque: si L2 : P1 et P2 et les langages si il existe une fonction calculable est récursif, mais comme est dans P1 P2 en red L1 est récursif: Si L2 red de L1 Σ∗1 et L2 dans associés (resp. sur Σ∗2 telle que u Σ1 , est dans A qui red(u) est est récursif, il existe un algorithme est calulable, il existe donc un algorithme qui décide si L1 . se réduit en P2 , il existe un algorithme pour décider en a pas non plus pour décider cela veut donc dire d'une certaine façon que P2 , il y en a un pour décider P1 , P1 est plus "facile" que si il n'y en a pas pour décider P1 , P2 : si il n'y P2 . Voici quelques exemples classiques de propriétés indécidables; il n'existe pas d'algorithme pour "décider": . si, étant donnés k , u1 , ..., uk et v1 , ..., vk , il existe n > 0, i1 , ..., in tels que ui1 ...uin = vi1 ...vin . C'est le célèbre problème de POST. . si une grammaire algébrique engendre tous les mots (sur un alphabet donné). .si deux grammaires algébriques engendrent le même langage. (Q? Si ce problème était décidable, que dire du précédent?) . si deux programmes sont équivalents. . si une équation diophantienne ( une équation de la forme P (x1 , ..., xn ) = 0 avec P polynôme à plusieurs variables à coecients entiers) a une solution entière (c'est le célèbre 10ème problème de Hilbert; la réponse a été apportée par Yuri Matiyasevich en 1970 ). Exercice: .La fonction de Rado(la compétition des castors aairés (busy heavers)): le but de la compétition des castors aairés est de sortir le plus grand nombre (écrit en décimal par exemple), avec un programme sans entrée de taille donnée. Rado(n) est donc le plus grand nombre qu'un programme -dans un langage xé- de taille au plus n (taille=nombre de caractères) peut sortir en décimal. Montrer qu'il n'existe pas de programme qui calcule Rado. Cet exemple est à rapprocher du paradoxe classique: "le plus petit nombre qu'on ne peut pas dénir en moins de vingt-trois syllables". .La fonction de Kolmogorov -qui est en quelque sorte la "duale" de la précédente. Kolmo(n) est la taille du plus petit programme qui permet de sortir n en décimal (une espèce de compression idéale). Kolmo est -à quelques détails près- ce qu'on appelle la complexité de Kolmogorov: elle mesure intuitivement la complexité intrinsèque d'un objet. Intuitivement 1010 5 est très grand mais peu compliqué! Montrer qu'il n'existe pas de programme qui calcule Kolmo. 4