de sélectionner les règles appliquées, en donnant une priorité, mais les règles sont
appli-quées à toutes les positions dans le terme. D’autres stratégies permettent de spécifier les
positions où appliquer les règles.
1.2.3. Réécriture modulo une théorie
Les termes sont utilisés pour représenter les objets du calcul. Certaines théories
asso-ciées à ces termes, comme l’associativité, la commutativité ou les éléments neutres sont
communément utilisées lors de la description du problème à modéliser à l’aide de règles
de réécriture.
Ces théories équationnelles définissent des classes d’équivalence entre les termes, et
afin de faciliter la définition des règles de réécriture, on s’intéresse à la définition des
opérations sur les termes modulo cette théorie équationnelle.
Pour introduire cette notion, nous allons nous baser sur un exemple : le filtrage
associatif-commutatif. Cela permet de modéliser le calcul dans les groupes ou sur d’autres
structures algébriques dotées d’opérateurs commutatifs et associatifs. Typiquement, cela
permet quand on calcule sur les entiers, de ne pas avoir à spécifier les cas des différentes
permutations.
Exemple 3. Le symbole d’arité2 «add» est associatif-commutatif (AC). Les axiomes
d’associativité et commutativité sont les suivants :
∀x, y; add(x, y) =add(y, x)
∀x, y; add(x, add(y, z)) =add(add(x, y), z).
– Le problème de filtrageadd(x, y)add(a, b)possède alors deux solutions distinctes
modulo AC : σ
1={x7→a, y7→b} etσ
2={x7→b, y7→a}.
– Le problème de filtrageadd(x, y)add(add(a, b), c)possède quant à lui6solutions
modulo AC :
σ
1={x7→a, y7→add(b, c)} σ
2={x7→add(b, c), y7→a}
σ
3={x7→b, y7→add(a, c)} σ
4={x7→add(a, c), y 7→b}
σ
5={x7→c, y7→add(a, b)} σ
6={x7→add(a, b), y 7→c}
Dans cet exemple, on voit informellement ce qu’est un axiome. Une théorie équationelle
est l’ensemble des classes d’équivalence sur une structure modulo un ensemble d’axiomes.
1.3. Langages basés sur la réécriture
Les systèmes d’équations et les systèmes de réécriture permettent de spécifier des
problèmes et offrent la puissance des machines de Turing [Dau89]. Ces spécifications
doivent ensuite être rendues exécutables.
1.3.1. La réécriture comme paradigme de calcul
La logique de réécriture offre par exemple un cadre adéquat pour la définition d’un
langage de programmation.
Étant donnée une théorie dans la logique de réécriture représentée par un système de
réécritureR et un termet clos, nous cherchons tous les termest
0vérifiant
t→
∗ Rt
0.
On doit pour cela explorer toutes les dérivations obtenues à partir det en appliquant
les règles deR. Cette recherche de solutions peut être considérée comme une procédure
algorithmique, ou comme une sémantique opérationnelle d’un langage de programmation
basé sur la logique de réécriture. Un programme d’un tel langage est constitué d’un
ensemble de règles de réécriture et d’un terme de départ.
Dans le cas où le système R n’est pas confluent, il est possible d’obtenir suivant
l’ordre d’application des règles plusieurs résultats. Ceci permet de modéliser l’évolution
de systèmes non-déterministes comme c’est le cas des simulations de protocoles réseau
ou la recherche de preuves.
1.3.2. Des langages basés sur la réécriture
De nombreux langages de programmation ont été conçus pour exploiter les concepts
de la réécriture.OBJ[GWM
+93] peut être considéré comme l’aïeul de cette lignée.
OBJ Ce projet initié par Joseph Goguen [Gog78], puis développé en collaboration avec
Kokichi Futatsugi, Jean-Pierre Jouannaud et José Meseguer [GWM
+93] met l’accent
sur le formalisme de spécification et l’expressivité du langage. Il propose de définir des
signatures avec inclusion de sortes, des systèmes de réécriture modulo toutes les
com-binaisons de l’associativité et la commutativité ainsi que des modules paramétrés et la
notion de vue.
Maude Directement inspiré d’OBJ et introduit en 1996 [CM00], Maude enrichit le
formalisme d’OBJ en intégrant la notion de réflexivité, la programmation objet ainsi
qu’en permettant d’effectuer la réécriture modulo des axiomes plus variés, comme les
éléments neutres.
ASF+SDF Jan Heering et Paul Klint ont mis en route le projet ASF+SDF dans les
années1980, avec pour objectif de définir un environnement de programmation générique
permettant d’éditer, exécuter et déboguer des programmes écrits dans un langage spécifié
par une grammaire [BHKO02b]. Le premier interpréteur vit le jour en1989, et le premier
compilateur en 1993. Il est utilisé par exemple pour effectuer automatiquement de la
rénovation d’applications critiques en COBOL.
1.3. Langages basés sur la réécriture
Elan Le langage Elana été élaboré au sein du projet Protheo à Nancy au début des
années 90 [Vit94]. Elan à été conçu comme cadre logique pour le prototypage de
sys-tèmes de calcul. Une de ses contributions fondamentales est l’introduction d’un langage
de stratégies permettant à l’utilisateur de définir finement comment l’espace de recherche
doit être exploré. Le système Elana beaucoup évolué au cours du temps. Un premier
compilateur à été écrit par Marian Vittek [Vit96], puis un second compilateur du langage
permettant d’utiliser des symboles associatifs-commutatifs à été développé [MK98] ; le
langage de stratégies a été rendu plus expressif par Peter Borovanský [Bor98].
Stratego Eelco Visser, s’inspirant du langageASF+SDF ainsi que du langage de
stra-tégies d’Elan a défini le langage de transformations de programmes Stratego à partir
de 1998 [VBT98]. Dans ce cadre, il est possible de simplifier le langage de stratégies
(supprimant la gestion du non-déterminisme par exemple) pour obtenir un langage de
transformation efficace et simple. Ce projet repose aussi sur l’héritage d’ASF+SDF en
reprenant les techniques d’analyse syntaxique et grammaires.
Les langages à base de réécriture ont permis de traiter des problèmes variés, montrant
la généralité du paradigme de réécriture, ainsi que l’expressivité et la puissance de celle-ci
comme outil de programmation.
Parmi ces applications, on peut citer dans divers domaines :
– Les prouveurs de théorèmes
Il existe une implantation du prouveur de prédicatsBen Elan[CK97] ;
– Vérification de protocoles
Vérification du protocole d’authentification de Needham-Schroeder [Cir01] ;
– Transformation de programmes
La définition d’optimiseurs de programmes en Stratego [VBT98],
Définition d’afficheurs de programmes avec ASF+SDF [BV96], restructuration de
code COBOL [BSV97, BSV98] ;
– Compilation
Le compilateur Stratego est lui-même écrit avec Stratego et bootstrappé. Le
compi-lateur d’ASF+SDF est quand à lui décrit avecASF+SDF [BHKO02a] ;
– Résolution de contraintes
La combinaison d’algorithmes d’unification [Rin97], la résolution de problèmes de
satisfaction de contraintes [Cas98] ainsi qu’un un algorithme d’unification d’ordre
supérieur [Bor95].
– Complétion de systèmes équationnels
Dans le document
Réécriture et compilation de confiance
(Page 29-33)