Cours - LIFL

publicité
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
Téléchargement