51
Techniques de Réécriture et Transformations Pierre-Etienne Moreau

Techniques de R éé criture et Transformations

  • Upload
    oliver

  • View
    35

  • Download
    0

Embed Size (px)

DESCRIPTION

Techniques de R éé criture et Transformations. Pierre-Etienne Moreau. Manipulation de listes. Repr é sentation des listes. Habituellement, on consid è re une liste vide nil , et un op é rateur de concat é nation cons nil :  L cons : E x L  L - PowerPoint PPT Presentation

Citation preview

Page 1: Techniques de R éé criture et Transformations

Techniques de Réécriture et

TransformationsPierre-Etienne Moreau

Page 2: Techniques de R éé criture et Transformations

Manipulation de listes

Page 3: Techniques de R éé criture et Transformations

Représentation des listes

Habituellement, on considère une liste vide nil, et un opérateur de concaténation consnil : L

cons : E x L L

On représente ainsi la liste a.b.c par

cons(a,cons(b,cons(c,nil)))

Page 4: Techniques de R éé criture et Transformations

Question

Comment retrouver un élément donné ?

appartient(cons(a,cons(b,cons(c,nil))),a) ?

appartient(cons(a,cons(b,cons(c,nil))),b) ?

appartient(cons(a,cons(b,cons(c,nil))),d) ?

Page 5: Techniques de R éé criture et Transformations

Une réponse

appartient(cons(x,l),x) true

appartient(cons(y,l),x) appartient(l,x)

appartient(nil,x) false

Page 6: Techniques de R éé criture et Transformations

Une autre réponse

Dans Tom on peut écrireappartient( (_*,x,_*) , x) true

appartient( l , x) false

Page 7: Techniques de R éé criture et Transformations

Symboles associatifs

f est associatif si :f(x,f(y,z)) = f(f(x,y),z)

Dans ce cas, a-t-on : f(a,f(b,f(c,d))) = f(f(a,b),f(c,d)) ? tel que f(x,f(c,y)) = f(f(a,b),f(c,d)) ? f(x,f(c,y)) << f(f(a,b),f(c,d)) ? f(x,f(c,y)) << f(a,f(b,f(c,d))) ? f(x,f(d,y)) << f(a,f(b,f(c,d))) ?

Page 8: Techniques de R éé criture et Transformations

Associativité avec élément neutre

f(x,f(y,z)) = f(f(x,y),z)f(x,e) = f(e,x) = xDans ce cas, a-t-on :

f(x,f(c,y)) << f(a,f(b,f(c,d))) ? f(x,f(d,y)) << f(a,f(b,f(c,d))) ?

Page 9: Techniques de R éé criture et Transformations

Associativité dans Tom

On considère les formes aplaties : f(a,b,c,d) f(x,c,y)

On peut écrire : f(x,c,y) << f(a,b,c,d) f(x,d,y) << f(a,b,c,d)

Page 10: Techniques de R éé criture et Transformations

Questions

Comment savoir s’il y a un ‘a’ suivi d’un ‘b’ ? f(x,a,y,b,z) << f(a,b,c,d)

Avec exactement un terme entre les deux ? On ne peut pas l’exprimer

Page 11: Techniques de R éé criture et Transformations

Signature

f est d’arité variable et a pour profil : f : E x … x E -> L

On le note : f( E* ) -> L

Cela permet d’écrire : f(a(),b(),c(),d()) f(x,a(),y,b(),z)

Page 12: Techniques de R éé criture et Transformations

Questions

Quel est le type de x,y et z dans f(x,a(),y,b(),z) ? réponse : E

Comment exprimer f(x,c(),y) tel que cela filtre vers f(a(),b(),c(),d()) ? Il faut des variables de type L On les note f(x*,c(),y*)

Page 13: Techniques de R éé criture et Transformations

Exercice

Exprimer la fonction d’appartenance sur des listes associativesappatient(f(_*,x,_*),x) -> True

appatient(f(_*),x) -> False

Page 14: Techniques de R éé criture et Transformations

Exercice

Comment éliminer les doublons ? f(X*,e,e,Z*) -> f(X*,e,Z*) élimine les doublons consécutifs

Comment éliminer les doublons distants f(X*,e,Y*,e,Z*) -> f(X*,e,Y*,Z*)

Page 15: Techniques de R éé criture et Transformations

Exercice

Etant donné un ordre sur les élémentsExprimer un algorithme de tri

f(X*,e1,e2,Y*) -> f(X*,e2,e1,Y*) if e2<e1

Implanter le en Tom

Page 16: Techniques de R éé criture et Transformations

Demo

Page 17: Techniques de R éé criture et Transformations

Implantation d’un algorithme de filtrage

syntaxiqueUtiliser des symboles associatifsQuelle signature choisir ?Variable(name:String) -> TermAppl(name:String, args:TermList) -> Termconc( Term* ) -> TermListTrue -> Term False -> TermMatch(pattern:Term, subject:Term) -> TermAnd( l:TermList ) -> Term

Page 18: Techniques de R éé criture et Transformations

Codage des règles et des termes

%rule {

// PropagateClash

And(conc(X*,True(),Y*)) -> And(conc(X*,Y*))And(conc(X*,True(),Y*)) -> And(conc(X*,Y*))And(conc(X*,c,Y*,c,Z*)) -> And(conc(X*,c,Y*,Z*))And(conc()) -> True()

}

Term p2 = `Appl("f",conc(Variable("x"),Appl("g",conc(Variable("y")))));Term s2 = `Appl("f",conc(Appl("a",conc()),Appl("g",conc(Appl("b",conc())))));

// PropagateSuccess And(conc(_*,False(),_*)) -> False()

Page 19: Techniques de R éé criture et Transformations

Stratégies

Page 20: Techniques de R éé criture et Transformations

Programmation par réécriture

Avantages le filtrage est un mécanisme expressif les règles expriment des transformations

élémentairesLimitations

les systèmes de règles sont souvent non-terminant et/ou non confluent

en général, on ne veut pas appliquer toutes les règles en même temps

Page 21: Techniques de R éé criture et Transformations

Exemple de système non terminant

And(Or(x,y),z) Or(And(x,z),And(y,z))And(z,Or(x,y)) Or(And(z,x),And(z,y))

Or(And(x,y),z) And(Or(x,z),Or(y,z)) Or(z,And(x,y)) And(Or(z,x),Or(z,y))

And(Or(a,b),c) Or(And(a,c),And(b,c)) And(Or(a, And(b,c)),Or(c, And(b,c))) …

Page 22: Techniques de R éé criture et Transformations

Codage du contrôle dans les règles

Solution classique introduire un nouvel opérateur f pour

restreindre l’ensemble de règles permettant de normaliser

l r devient eval(l) r’ on normalise un terme eval(t) l’opérateur f permet de contrôler les règles

à appliquer

Page 23: Techniques de R éé criture et Transformations

Encodage du contrôle

eval(And(x,y)) and(x,y)eval(Or(x,y)) Or(eval(x),eval(y)) and(Or(x,y),z) Or(and(x,z),and(y,z))and(z,Or(x,y)) Or(and(z,x),and(z,y))and(x,y) And(x,y)

eval(And(Or(a,b),c)) and(Or(a,b),c)) Or(and(a,c),and(b,c)) Or(And(a,c),And(b,c))

Page 24: Techniques de R éé criture et Transformations

Conséquences

Il faut définir la congruence explicitement, pour chaque règle et chaque constructeur

Il n’y a plus de séparation entre transformation et contrôle cela rend la compréhension plus difficile les règles sont moins réutilisables

Page 25: Techniques de R éé criture et Transformations

Ce qu’on voudrait

pouvoir contrôler l’application des règlespouvoir spécifier simplement la

« traversée » d’un terme (i.e. appliquer une règles dans les sous-termes)

tout en séparant règle et contrôle

Page 26: Techniques de R éé criture et Transformations

Solution

Utiliser des stratégies Combiner des transformations élémentaires Exemples

disjunctive normal form

dnf = innermost(DAOL <+ DAOR <+ …)

DAOL : And(Or(x,y),z) Or(And(x,z),And(y,z))

DAOR : And(z,Or(x,y)) Or(And(z,x),And(z,y)) conjunctive normal form

cnf = innermost(DOAL <+ DOAR <+ …)

Page 27: Techniques de R éé criture et Transformations

Stratégies élémentaires

Page 28: Techniques de R éé criture et Transformations

Règle de réécriture

Une règle R : g d est une stratégie élémentaire

Exemples : R = a b (R)[a] = b (R)[b] = fail (R)[f(a)] = fail

Page 29: Techniques de R éé criture et Transformations

Identité et échec

id : ne fait rien, mais n’échoue pasfail : échoue tout le tempsExemples

(id)[a] = a (id)[b] = b (fail)[a] = fail

Page 30: Techniques de R éé criture et Transformations

Composition

S1 ; S2Applique S1, puis S2Echoue si S1 ou S2 échoueExemples

(a b ; b c)[a] = c (a b ; c d)[a] = fail (b c ; a b)[a] = fail

Page 31: Techniques de R éé criture et Transformations

Choix

S1 <+ S2Applique S1. Si cela échoue, applique S2Exemples

(a b <+ b c)[a] = b (b c <+ a b)[a] = b (b c <+ c d)[a] = fail (b c <+ id)[a] = a

Page 32: Techniques de R éé criture et Transformations

Quelques lois

id ; s = s s ; id = s id <+ s = s s <+ id ≠s fail <+ s = s s <+ fail = s fail ; s = fail s ; fail ≠fail (pourquoi ?)

Page 33: Techniques de R éé criture et Transformations

Exercice

Définir les opérateurs Try(s) Repeat(s)

Page 34: Techniques de R éé criture et Transformations

Stratégies paramétrées

try(s) = s <+ idrepeat(s) = try(s ; repeat(s))Exemples

(try(b c))[a] = a (repeat(a b))[a] = b (repeat(b c <+ a b))[a] = c (repeat(b c))[a] = a

Page 35: Techniques de R éé criture et Transformations

Primitives pour traverser

applique une stratégie à un ou plusieurs fils directes

Congruence applique une stratégie différente à chaque fils d’un

constructeurall

applique une stratégie à tous les filsone

applique une stratégie à un fils

Page 36: Techniques de R éé criture et Transformations

Congruence

c(S1,…,Sn) pour chaque constructeur c

Exemples (f(a b))[a] = fail (f(a b))[f(a)] = f(b) (f(a b))[f(b)] = fail (g(try(b c) <+ try(a b)))[g(a,a)] = g(a,b)

Exercice définir la stratégie map sur les liste (cons,nil)

Page 37: Techniques de R éé criture et Transformations

Congruence générique

all(S), échoue si S échoue sur un des fils Exemples

(all(a b))[f(a)] = f(b) (all(a b))[g(a,a)] = g(b,b) (all(a b))[g(a,b)] = fail (all(a b))[a] = a (all(try(a b)))[g(a,c)] = g(b,c)

Page 38: Techniques de R éé criture et Transformations

Congruence générique

one(S), échoue si S ne peut pas s’appliquer sur un des fils

Exemples (one(a b))[f(a)] = f(b) (one(a b))[g(a,a)] = g(a,b) (one(a b))[g(b,a)] = g(b,b) (one(a b))[a] = fail

Page 39: Techniques de R éé criture et Transformations

Stratégies de parcours

bottomup(S) = all(bottomup(S)) ; S topdown(S) = S ; all(topdown(S)) innermost(S) = bottomup(try(S ; innermost(S))) oncebu(S) = one(oncebu(S)) <+ S oncetd(S) = S <+ one(oncetd(S)) innermost(S) = repeat(oncebu(innermost(S))) outermost(S) = repeat(oncetd(outermost(S)))

Page 40: Techniques de R éé criture et Transformations

Stratégies en Tom

Page 41: Techniques de R éé criture et Transformations

Constructeurs élémentaires

Identity Fail Sequence Choice All One mu

Page 42: Techniques de R éé criture et Transformations

Utilisation

Une stratégie est de type Strategy Strategy s = `Identity();

Un terme est de type Visitable Visitable t = `a();

Une stratégie peut s’appliquer sur un terme Visitable result = s.visit(t);

Une stratégie préserve le type Term t = `a(); Term result = (Term) s.visit(t);

Page 43: Techniques de R éé criture et Transformations

Définition de stratégiesStrategy Try(Strategy S) {

return `Choice(S,Identity());}

Strategy Repeat(Strategy S) {return `mu(MuVar("x"),Choice(Sequence(S,MuVar("x")),Identity()));

}

Strategy OnceBottomUp(Strategy S) {return `mu(MuVar("x"),Choice(One(MuVar("x")),S)) }

} Exercice

implanter innermost(a b)

Page 44: Techniques de R éé criture et Transformations

Stratégie élémentaire en Tom

%strategy RewriteSystem extends `Fails() {

visit Term {

a() -> { return `b(); }

}

}

Strategy S = `Repeat(OnceBottomUp(RewriteSystem()))

Term result = S.visit(`f(a(),g(b(),a())));

Page 45: Techniques de R éé criture et Transformations

Utilisations

Strategy rule = new RewriteSystem();

Term subject = `f(g(g(a,b),g(a,a)));

`OnceBottomUp(rule).visit(subject);

`Innermost(rule).visit(subject);

`Repeat(OnceBottomUp(rule)).visit(subject);

Page 46: Techniques de R éé criture et Transformations

(mode paranoïaque)Strategy rule = new RewriteSystem();Term subject = `f(g(g(a,b),g(a,a)));Strategy onceBottomUp =

`mu(MuVar("x"),Choice(One(MuVar("x")),rule));onceBottomUp.visit(subject));

Strategy innermostSlow = `mu(MuVar("y"),Choice(Sequence(onceBottomUp,MuVar("y")),Identity()));innermostSlow.visit(subject));

Strategy innermost = `mu(MuVar("x"),Sequence(All(MuVar("x")),Choice(Sequence(rule,MuVar("x")),Identity)));

innermost.visit(subject));

Page 47: Techniques de R éé criture et Transformations

Questions

Comment calculer des ensembles de résultats

Exemples f(g(g(a,b),g(a,b))) trouver les x tels que g(x,b) filtre un sous

terme

Page 48: Techniques de R éé criture et Transformations

Solution

considerer s(col) : g(x,b) col.add(x)

appliquer Try(BottomUp(s(col)))

énumérer col

Page 49: Techniques de R éé criture et Transformations

Codage %strategy RewriteSystem(c:Collection) extends Identity() {

visit Term { g(x,b()) -> { collection.add(`x); } }}

Collection collection = new HashSet();Strategy rule = `RewriteSystem(collection);Term subject = `f(g(g(a,b),g(c,b)));`Try(BottomUp(rule)).visit(subject);System.out.println("collect : " + collection);

Page 50: Techniques de R éé criture et Transformations

Stratégie Oméga

OmégaPosition

Page 51: Techniques de R éé criture et Transformations

Replace et Subterm

Etant donnée une position p getReplace(t’) retourne une stratégie qui, appliquée

sur un terme donné, remplace le sous-terme à la position p donnée par le terme t’

getSubterm() retourne une stratégie qui retourne le sous-terme à la position p

ces stratégies encodent les l’accès à un sous-terme et l’opération de remplacement

cela permet d’encoder de l’exploration traversée + non-déterministe