Modéliser la notion d’algorithme
SERGE GRIGORIEFF
(LIAFA, Univ Paris 7)
Qu’est-ce qu’un algorithme ? Qu’est-ce qu’une fonction calculable ?
S’il est bien connu que la seconde question est celle résolue par Turing dans son article fondateur
de 1936, la première s’y trouve également en filigrane (page 249, §9, lignes 5-6) : The real question
at issue is “What are the possible processes which can be carried out in computing a [real] number?"
Où en est-on de ces deux questions ?
La thèse de Church-Turing. Pendant longtemps la première question de Turing a été éclipsée,
complètement ignorée même, suite au succès de la réponse à la seconde question. Aujourd’hui, la
formalisation mathématique de la notion de fonction calculable est considérée comme pleinement
réalisée. Pour tous les modèles de calcul (suffisamment riches) imaginés au fil des ans, on a des
preuves mathématiques qu’ils calculent tous la même famille de fonctions. Ce qui a consolidé la
célèbre thèse de Church-Turing (énoncée par Kleene en 1943) selon laquelle ces modèles de calcul
sont des modélisations d’une même notion intuitive : celle de fonction calculable.
Emulation. Mais si tous ces modèles de calcul permettent de calculer les mêmes choses, les façons
dont ils les calculent, c’est-à-dire les algorithmes qui leur sont associés, ne sont pas les mêmes. Bien
sûr, on peut émuler les algorithmes d’un modèle par ceux d’un autre, et cette émulation se fait même
en temps polynomial (quadratique souvent) dans le cas de modèles sans parallélisme massif. Mais
l’émulation peut noyer les étapes de calcul de l’algorithme émulé dans une masse d’autres étapes de
calcul qui lui sont étrangères et leur faire ainsi perdre toute identité. La complexité algorithmique
témoigne d’ailleurs de différences incontournables. Par exemple, avec les machines de Turing à un
ruban la reconnaissance des palindromes exige un temps quadratique en la taille de l’entrée (Hennie,
1965), tandis qu’avec deux rubans cette reconnaissance se fait de façon évidente en temps linéaire.
Le style de programmation, fonctionnel ou impératif par exemple, conduit aussi à des algorithmes,
qui même s’ils peuvent être globalement assez proches, ne le sont plus du tout lorsqu’on regarde
leur déroulement “pas à pas". Une question vient alors : Existe-t-il un modèle de calcul permettant
d’exprimer chaque algorithme en respectant son “pas à pas" ?
Une reformulation plus modeste de la question. Yuri Gurevich observe que la notion d’algorithme
s’avère très/trop diverse et est aussi une notion en devenir : algorithmes séquentiels traditionnels, par-
allèles, interactifs, analogiques, quantiques. . . Reformulons alors la question initiale : Est-il possible
d’exprimer, avec respect de son pas à pas, chaque algorithme travaillant en temps séquentiel et à pas
de calcul bornés ?
Algorithmes et oracles. Gurevich observe encore que la question précédente comporte un présup-
posé erroné, à savoir qu’il y aurait une notion absolue d’algorithme. En fait, La notion d’algorithme
est intrinsèquement oraculaire ! En effet, un algorithme est la décomposition d’un processus de calcul
en actions de moins en moins complexes. Bien sûr, on arrête de décomposer à un certain degré de
finesse qui est choisi de façon conventionnelle, certaines actions étant considérées comme “élémen-
taires" ou atomiques. De ces actions atomiques, l’algorithme précise ce qu’elles font (c’est-à-dire ce
qu’elles modifient ou non de l’environnement) mais ne dit rien du comment elles le font, elles jouent
par conséquent le rôle d’oracles. Regardons par exemple le cas des machines de Turing. Un pas d’un
calcul consiste en des actions de lecture et écriture de la cellule pointée, de changement d’état et de
mouvement de la tête de lecture. Comment se font ces actions ? Si vous cherchez à écrire un pro-
gramme dans votre langage de programmation préféré pour simuler une machine de Turing, la façon
de faire ces actions occupera un bon nombre de lignes de votre programme. Mais dans le cadre d’une
machine de Turing, rien n’est dit sur le comment de ces actions, ce sont des actions atomiques que
le programme utilise comme des oracles. Autres exemples, dans les algorithmes de multiplication de