1 La notion d`algorithme 2 Un exemple introductif mais fondamental

publicité
AAC- Cours
2011–2012
Master1 d’Informatique
S.Tison
UFR IEEA
Calculabilité, Décidabilité: quelques notions élémentaires
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:
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). Cette question soulève une question préliminaire: Qu’est-ce
qu’un algorithme?
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 A = {x/x 6∈ x}, l’ensemble des ensembles x tels que x n’appartient
pas à x: est-ce que A appartient à A? )
1
On peut bien sûr lancer le programme sur la donnée: si ça s’arrête, on le vérifiera ...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éfiniment! Le
problème est semi-décidable.
La notion d’algorithme
Algorithme(dictionnaire): procédé de calcul mis en œuvre pour obtenir un résultat par un nombre fini 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 fini 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 fini d’étapes.
• Il est défini: chaque pas d’algorithme doit être défini précisément.
• Entrée: un algorithme a 0 ou plusieurs entrées, "prises" dans des ensembles spécifiés d’objets.
• Sortie: un algorithme a 0 ou plusieurs sorties, i.e. quantités qui sont en relation de façon spécifiée avec
les entrées.
• Effectivité: chaque opération doit être suffisamment basique pour pouvoir être exécutée en un temps fini
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 instance du problème et calcule la réponse attendue.
Le résultat est important! 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. On peut en déduire facilement qu’on ne peut décider
l’équivalence de deux programmes et donc qu’on ne peut décider en général si un programme vérifie
une spécification donnée; ou encore qu’on ne peut décider si le programme ne provoquera pas d’erreur à
l’exécution. Plus généralement le théorème de Rice dit en quelque sorte qu’il n’existe pour aucune propriété intéressante (non triviale) portant sur le résultat final d’un programme, un algorithme permettant,
au vu du code source d’un programme, de décider s’il satisfait cette propriété.
Attention, cela ne veut bien sûr pas dire qu’on ne peut pas prouver l’arrêt d’un programme donné: cela signifie
juste qu’il n’y a pas de méthode "automatique" uniforme qui marche à tous les coups: cela justifie d’une
certaine façon la difficulté é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 fini, une bande infinie à 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 contenu 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 modifié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 modifié. Si il est final, l’entrée
initiale est acceptée. Cela conduit à la définition:
Définition 1 Une machine de Turing M est la donnée de:
.Q un ensemble (fini) d’états
2
Un exemple introductif mais fondamental: l’impossible quête de la terminaison des programmes
.Γ un alphabet fini de bande
.B, un symbole de Γ, le "blanc"
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 ARRET(Pr,Do: mot) qui sort "vrai" si Pr
est un programme correct qui s’arrête pour la donnée Do, 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;
.Σ, un sous-ensemble de Γ − {B}: l’alphabet d’entrée
.δ une fonction de Q × Γ dans Q × Γ × {L, S, R}, la fonction de transition.
.q0 , un état de Q, l’état initial
.F , un sous-ensemble de Q , – les états "finaux"
Une description instantanée d’une machine est un triplet (u, q, v): l’état courant de la machine est q, le
contenu de la bande à gauche de la tête de lecture est u, le contenu à droite (y compris le symbole pointé par
la tête de lecture) est v.
2
Un pas de calcul, noté (u, q, xv) ` (u0 , q, v 0 ), est défini par:
si δ(q, x) = (q 0 , x0 , L), u = u0 y, v 0 = yx0 v
si δ(q, x) = (q 0 , x0 , S), u = u0 , v 0 = x0 v
si δ(q, x) = (q 0 , x0 , R), u = ux0 , v 0 = v
Un calcul (u, q, xv)`∗ (u0 , q, v 0 ) est une suite de pas de calculs.
Un calcul réussi pour l’entrée u est un calcul (, q0 , u)`∗ (u0 , q, v 0 ) avec q un état final.
Le langage accepté par la machine M est l’ensemble L(M ) des mots pour lesquels il existe un calcul réussi.
Remarque: on peut supposer que la machine M s’arrête dès qu’elle atteint un état final. Donc, si un mot
est accepté, la machine s’arrête sur l’entrée u. Par contre, si un mot n’est pas accepté, le calcul peut être infini.
Si la machine M s’arrête pour toute entrée, on dit qu’elle décide le langage L(M ).
4
Vocabulaire
Définition 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éfinition en utilisant un modèle d’algorithme quelconque:
Définition 3 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 u n’est pas dans L. Il est
dit récursif, si il existe un algorithme qui prend en entrée un mot u et s’arrête et sort “oui” si le mot est dans
L, s’arrête et sort “Non” si u n’est pas dans L.
Remarque: Le modèle de machine de Turing -d’algorithme- présenté ici est déterministe; on peut définir
une notion de machine de Turing non déterministe: on aura alors un ensemble d’états initiaux et la fonction de
transition associera à un (q, x) un sous-ensemble de QXΓX{L, S, R}. On peut montrer que les deux modèles
ont la même puissance de reconnaissance.
Rappel: A une propriété P , on peut associer le langage (des représentations pour un codage donné) des
objets vérifiant la propriété.
Définition 4 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.
Exercice: Comparez le cardinal de l’ensemble des programmes dans un langage donné et celui de l’ensemble
des langages sur un alphabet donné? Qu’en déduire?
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 fin du calcul.
Définition 5 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.
5
La machine Universelle et un exemple de langage r.e. non récursif
On peut coder la définition 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.
3
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 fini fixé 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. On peut simuler une RAM par une Machine
de Turing et vice-versa; de plus, cette simulation peut se faire de façon relativement efficace, 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 effet, si les modèles classiques de
machines séquentielles sont polynomialement équivalents: - donc par exemple, un algorithme peut être dit
polynomial sans que l’on précise 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:
Définition 6 Soient deux propriétés P1 et P2 et les langages L1 et L2 associés (resp. sur Σ1 , Σ2 ). On dit que
P1 se réduit en P2 si il existe une fonction totale calculable red de Σ∗1 dans Σ∗2 telle que u est dans L1 Ssi red(u)
est dans L2 .
Donc si P1 se réduit en P2 et si L2 est récursif, L1 est récursif: en effet, si L2 est récursif, il existe un
algorithme A qui décide si u est dans L2 : comme red est calculable, il existe un algorithme qui décide si red(u)
est dans L2 , i.e. si u est dans L1 .
C’est la notion de réduction vue dans le cadre de N P mais sans contrainte sur sa complexité! Si P1 se réduit
en P2 , d’une certaine façon P1 est plus "facile" que P2 : si il existe un algorithme pour décider P2 , il y en a
un pour P1 ; si il n’y en a pas pour décider P1 , il n’y en a pas pour 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.
. si deux programmes sont équivalents.
. si une équation diophantienne ( une équation de la forme P (x1 , ..., xn ) = 0 avec P polynôme à plusieurs
variables à coefficients entiers) a une solution entière (c’est le célèbre 10ème problème de Hilbert auquel
a répondu Yuri Matiyasevich en 1970 ).
2012, année Turing
Alan Turing, mathématicien britannique né le 23 juin 2012, a eu un rôle essentiel
dans la formalisation de la notion d’algorithme et de calculabilité. Son article "On
computable numbers, with an application to the Entscheidungsproblem", paru en
1936, formalise la notion de calculabilité en définissant les "computing machines"
est considéré comme fondateur de la science informatique. Alan Turing, mort en
1954, s’est illustré par de nombreux autres travaux: durant la seconde guerre pour
décoder les codes Enigma, sur les premiers ordinateurs avec son fameux test de
Turing, sur la morphogenèse...
4
Téléchargement