Modéliser la notion d`algorithme

publicité
Modéliser la notion d’algorithme
S ERGE G RIGORIEFF
(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, parallè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ésupposé 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émentaires" 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 programme 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
matrices ce sont les opérations arithmétiques sur les scalaires qui sont élémentaires et constituent des
oracles tandis que, dans les algorithmes de multiplication d’entiers, ce sont les opérations arithmétiques sur les digits qui sont les oracles.
Les “Abstract State Machines" (aka “Evolving Algebras") de Gurevich. Quand on parle de fonction calculable c’est, bien sûr, relativement à des structures de données, entiers, mots, arbres finis,
etc. Comme ces structures de données se codent de façon calculable les unes dans les autres, on peut
se restreindre à l’une d’entre elles sans perte de généralité pour ce qui concerne la calculabilité. En
revanche, quand on s’intéresse aux algorithmes, ces codages pervertissent singulièrement leur expression. De plus, un algorithme de calcul d’une fonction entre deux structures de données fixées peut
utiliser un environnement mettant en jeu bien d’autres structures de données. Ceci (et les considérations précédentes) amène Gurevich au modèle de calcul suivant. Une ASM (Abstract State Machine)
est la donnée de :
1. (Structure statique.) Une famille finie de structures et d’opérations entre elles (ces opérations
sont les oracles utilisés par l’algorithme).
2. (Vocabulaire dynamique.) Une famille finie de symboles de fonctions entre ces structures
(afin de représenter l’environnement). Leurs interprétations varient au cours du calcul. Initialement,
certains de ces symboles sont interprétés par des inputs, d’autres le sont par des valeurs par défaut.
3. (Programme.) Un programme pour faire évoluer les interprétations des symboles dynamiques.
Il est constitué uniquement d’instructions conditionnelles et d’affectations de la forme f (t1 , . . . ,tn ) :=
u où f est un symbole dynamique et t1 , . . . ,tn , u des termes construits avec les symboles dynamiques
et des symboles représentant les fonctions statiques. Un pas de calcul correspond à l’exécution de ce
programme (et donc à la mise à jour des fonctions dynamiques). Il n’y a pas d’instruction de boucle
dans le programme, mais le calcul de l’ASM est une boucle qui répète l’exécution du programme.
Pour chaque algorithme des modèles de calcul existant (en temps séquentiel et à pas bornés), il a
été montré qu’il y a une ASM dont les calculs en expriment exactement le pas à pas. D’où, en pendant
de la Thèse de Church-Turing, la Thèse de Gurevich : tout algorithme (en temps séquentiel et à pas
bornés) est exprimé par une ASM.
Textes d’introduction.
• Yuri Gurevich. Evolving Algebras: An Introductory Tutorial. Bulletin EATCS 43:264–284, February 1991.
(cf. article 92 sur la page web de YG)
• Serge Grigorieff & Pierre Valarcher. Classes of Algorithms: Formalization and Comparison. Bulletin EATCS
107:95–127, June 2012.
(cf. la page web de SG)
Bibliographie succincte.
• Page web des ASM : http://www.eecs.umich.edu/gasm/
• Articles 141, 209, 210 sur la page web de Yuri Gurevich :
http://research.microsoft.com/en-us/um/people/gurevich/annotated.htm
• Robin O. Gandy. Church’s thesis and principles for mechanisms. Kleene Symposium (eds. J. Barwise et al.),
123–148, North-Holland, 1980.
• Alan Mathison Turing. On Computable Numbers, with an application to the Entscheidungsproblem. Proceedings London Math. Soc., series 2, 42:230–265, 1936.
Téléchargement