r éé criture pour la programmation et la preuve claude kirchner pierre-etienne moreau
TRANSCRIPT
![Page 1: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/1.jpg)
Réécriture pour la programmation et la
preuveClaude Kirchner
Pierre-Etienne Moreau
![Page 2: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/2.jpg)
Application à XML
![Page 3: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/3.jpg)
Document XML
XML permet de décrire des documents structurés
<?xml version="1.0" encoding="UTF-8"?>
<Persons>
<Person Age="30"> <FirstName> Paul </FirstName> </Person>
<Person Age="42"> <FirstName> Mark </FirstName> </Person>
<Person Age="21"> <FirstName> Jurgen </FirstName> </Person>
<Person Age="21"> <FirstName> Julien </FirstName> </Person>
<Person Age="24"> <FirstName> Pierre </FirstName> </Person>
</Persons>
On peut voir un document XML comme un arbre
![Page 4: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/4.jpg)
Transformation de documents XML
On a envie de pouvoir manipuler ces données pour y rechercher de l’information pour générer de nouveaux documents (HTML, LaTeX, PDF, XML, etc.)
Quels sont les outils permettant de le faire XSLT / XPath Xquery Xduce / Cduce DOM …
Peu permettent de manipuler un document XML en Java Les manipulations se font souvent en utilisant DOM directement
![Page 5: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/5.jpg)
Exemple
On veut savoir s’il existe un noeud de la forme <Person><FirstName> Julien </FirstName></Person>
<?xml version="1.0" encoding="UTF-8"?>
<Persons>
<Person Age="30"> <FirstName> Paul </FirstName> </Person>
<Person Age="42"> <FirstName> Mark </FirstName> </Person>
<Person Age="21"> <FirstName> Jurgen </FirstName> </Person>
<Person Age="21"> <FirstName> Julien </FirstName> </Person>
<Person Age="24"> <FirstName> Pierre </FirstName> </Person>
</Persons>
![Page 6: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/6.jpg)
Filtrage
Il faut savoir si un pattern XML filtre vers un noeud de document XML
On aimerait pouvoir écrire%match(t) {
<Person><FirstName> Julien </FirstName></Person> -> {
// Noeud trouvé
}
}
Ou plus généralement :<Person><FirstName> X </FirstName></Person> -> { … }
![Page 7: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/7.jpg)
Modèle de donnée (simplifié)
ElementNode(name:str, attrList:TNodeList,
childList:TNodeList) -> TNode
AttributeNode(name:str, value:str) -> TNode
TextNode(data:str) -> TNode
conc(TNode*) -> TNodeList
![Page 8: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/8.jpg)
XML vs. Term
Un document XML peut se voir comme un arbre<A a="at1"><B/></A>
est représenté par :
ElementNode("A",
conc(AttributeNode("a", "at1")),
conc(ElementNode("B",conc(),conc()))
)
![Page 9: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/9.jpg)
Pattern XML
On veut pouvoir écrire un pattern de la forme<A a="at1">X</A>
qui sera encodé par :
ElementNode("A",
conc(AttributeNode("a", "at1")),
conc(X)
)
![Page 10: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/10.jpg)
Questions
A-t-on : <A a="at1">X</A> << <A a="at1"><B/></A> ? <A a="at1">X</A> << <A a="at1"><B/><C/></A> ?
Quel est le type de X ? TNode ? TNodeList ? On voudrait pouvoir écrire
<A a="at1">X*</A> << <A a="at1"><B/><C/></A>
Quelles sont les solutions ?
![Page 11: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/11.jpg)
Questions
En fonction du parseur, <A a="at1"><B/></A> peut être reconnu comme <A a="at1"><B/></A>
A-t-on : <A a="at1">X</A> << <A a="at1"><B/></A> ? <A a="at1">X*</A> << <A a="at1"><B/></A> ?
Comment est encodé <A a="at1"><B/></A> ?ElementNode("A",
conc(AttributeNode("a", "at1")),conc(
TextNode(""),ElementNode("B",conc(),conc()),TextNode(""))
) Est-ce que cela filtre ?
![Page 12: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/12.jpg)
Notation explicite
<A a="at1">(_*,X,_*)</A>
qui correspond à :
<A a="at1">conc(_*,X,_*)</A>
A-t-on <A a="at1">(_*,X,_*)</A> << <A a="at1"><B/></A> ?
Oui, il y a 3 solutions
![Page 13: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/13.jpg)
Notation implicite
<A a="at1">(_*,X,_*)</A>
qui correspond à :
<A a="at1">[X]</A>
qui correspond également à
<A a="at1">X</A>
A-t-on <A a="at1">X</A> << <A a="at1"><B/></A> ?
Oui, il y a 3 solutions
![Page 14: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/14.jpg)
Attributs
Les attributs sont représentés par une liste de couples (nom,valeur)
Il existe également des notations implicites et explicites
Ainsi : <A a="at1"> correspond à <A [a="at1"]> qui correspond à <A (_*,a="at1",_*)>
![Page 15: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/15.jpg)
Questions
A-t-on : <A a="at1"></A> << <A a="at1"></A> ? <A a="at1"></A> << <A a="at1" b="at2"></A> ?
Pourquoi ? car <A (_*,a="at1",_*)></A> << <A (a="at1" b="at2 »)></A> ?
A-t-on : <A a="at1" b="at2"></A> << <A a="at1" b="at2"></A> ? <A a="at1" b="at2"></A> << <A b="at2" a="at1"></A> ?
Non, car : (_*, a="at1", _*, b="at2", _*) !<< (b="at2", a="at1") Il faudrait du filtrage AC avec élément neutre!
![Page 16: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/16.jpg)
Attributs dans Tom
On considère un ordre sur les noms d’attributs et les formes canoniques où les attributs sont triés Ainsi, <A b="at2" a="at1"></A> est représenté par
ElementNode("A",
conc( AttributeNode("a", "at1"),
AttributeNode("b", "at2")),
conc()) De même, pour les motifs
![Page 17: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/17.jpg)
Utilisation dans Tom
Node sort(Node subject) { %match(subject) { <Persons>(X1*,p1,X2*,p2,X3*)</Persons> -> { if(`compare(p1,p2) > 0) { return sort(`xml(<Persons>
X1* p2 X2* p1 X3*</Persons>));
} } } return subject; }
![Page 18: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/18.jpg)
Comparaison d’attributs
int compare(Node t1, Node t2) { %match(t1, t2) { <Person Age=a1><FirstName> n1 </FirstName></Person>, <Person Age=a2><FirstName> n2 </FirstName></Person> -> { return `a1.compareTo(`a2); } } return 0; }
![Page 19: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/19.jpg)
Ancrage formel
Mapping
![Page 20: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/20.jpg)
Problématique
Comment faciliter l’utilisation du filtrage dans les programmes existants ? en permettant un mélange des syntaxes en permettant de filtrer vers des structures
du langage hôte
Nous avons donc besoin de filtrer « modulo des vues »
![Page 21: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/21.jpg)
Solution adoptée
Tom permet de « voir » les objets en mémoire comme des termes algébrique
Il faut pour cela définir un « ancrage formel » permettant de savoir si un terme commence par un
symbole donné d’accéder à un sous terme donné
![Page 22: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/22.jpg)
Plus formellement
On considère les ensembles : [N], la représentation des entiers naturels [B], la représentation des booléens [F], la représentation des symboles [T(F)], la représentation des termes clos [X], la représentation des variables
![Page 23: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/23.jpg)
Contraintes à respecter
t1,t2T(F),
eq([t1],[t2]) = [t1=t2]
fF, tT(F), is_fsym(t,f) = [Symb(t)=f]
fF, i[1..ar(f)], tT(F) subtermf(t,i) = [t|i]
![Page 24: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/24.jpg)
Structure de données
struct term {int symb;
struct term **subterm;
}
On représente les symboles par des entiers (zero,3), (suc,5), (plus,7), …
![Page 25: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/25.jpg)
Mapping de Nat vers une structure C
%typeterm Nat {
implement
equals(t1,t2)
}
%op Nat zero {
is_fsym(t)
}
%op Nat suc(p:Nat) {
is_fsym(t)
get_slot(p,t)
}
{ struct term* }
{ term_equals(t1,t2) }
{ t!=null && t->symb==3 }
{ t!=null && t->symb==5 }
{ t->subterm[0] }
![Page 26: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/26.jpg)
Mapping
Permet de voir une structure arborescente comme un terme
Plus généralement, permet de voir n’importe quelle structure de donnée comme un terme
Permet de filtrer vers des objets en mémoire
![Page 27: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/27.jpg)
Exercice
Peut-on voir les entiers machine comme des entiers de Peano ?
%typeterm Nat { implement { int }}%op Nat zero { is_fsym(t) { t==0 }}%op Nat suc(p:Nat) { is_fsym(t) { t>0 } get_slot(p,t) { t-1 }}
![Page 28: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/28.jpg)
Peut-on filtrer vers des objets ?
class A { int a; }
class B extends A { int b; }
%typeterm A {
implement { A }
equals(t1,t2) {t1.equals(t2)}
}
%typeterm B {
implement { B }
equals(t1,t2) {t1.equals(t2)}
}
![Page 29: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/29.jpg)
Mapping objet
%op A A(a:int) {
is_fsym(t) { t instanceof A } get_slot(a,t) { t.a } } %op A B(a:int,b:int) { is_fsym(t) { t instanceof B } get_slot(a,t) { t.a }
get_slot(b,t) { t.b } } A[a=x] << new A(3) B[b=x] << new B(2,3) A[a=x] << new B(2,3)
![Page 30: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/30.jpg)
Demo
![Page 31: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/31.jpg)
Questions
Doit-on écrire des mappings ?Que fait %vas au juste ?
![Page 32: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/32.jpg)
Outils autour de Tom
Aterm, SDF, ApiGen, Vas
![Page 33: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/33.jpg)
Bibliothèque ATerm
Aterm AFun ATermAppl ATermList ATermInt ATermReal ATermPlaceholder ATermBlob
ATermFactory
![Page 34: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/34.jpg)
ATerms
![Page 35: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/35.jpg)
Bibliothèque ATerm
Aterm AFun ATermAppl ATermList ATermInt ATermReal ATermPlaceholder ATermBlob
ATermFactory
getAnnotationsetAnnotationtoStringetc.
![Page 36: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/36.jpg)
Bibliothèque ATerm
Aterm AFun ATermAppl ATermList ATermInt ATermReal ATermPlaceholder ATermBlob
ATermFactory
getNamegetArity
![Page 37: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/37.jpg)
Bibliothèque ATerm
Aterm AFun ATermAppl ATermList ATermInt ATermReal ATermPlaceholder ATermBlob
ATermFactory
getAFungetArgumentsetArgumentetc.
![Page 38: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/38.jpg)
Bibliothèque ATerm
Aterm AFun ATermAppl ATermList ATermInt ATermReal ATermPlaceholder ATermBlob
ATermFactory
getFirstgetNextelementAt insertappendconcatetc.
![Page 39: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/39.jpg)
Bibliothèque ATerm
Aterm AFun ATermAppl ATermList ATermInt ATermReal ATermPlaceholder ATermBlob
ATermFactory
makeAFunmakeAppl…parsereadFromFile
etc.
![Page 40: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/40.jpg)
Utilisation des ATerms
Aterm t1 = factory.parse("a")
Aterm t2 = factory.parse("f(a,b)")
t2.getArgument(1) == t1 ?
> true
Aterm t3 = t2.setArgument(t1,2)
> t3 = f(a,a)
Aterm t4 = factory.parse("f(a,f(b))")
> ‘f’ n’a pas de signature particulière
Les Aterms permettent de construire des termes, mais il n’y a pas de sécurité (signature, types)
![Page 41: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/41.jpg)
ApiGen / Vas
A partir d’une signature multi-sortéeGénère des classes, reposant sur les
Aterms, permettant de représenter les termes partage maximal typage fort des termes tout terme typé est un ATerm
![Page 42: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/42.jpg)
Exemple
Module Expressions
true -> Bool
false -> Bool
eq(lhs:Expr, rhs:Expr) -> Bool
id(value:str) -> Expr
nat(value:int) -> Expr
add(lhs:Expr, rhs:Expr) -> Expr
mul(lhs:Expr, rhs:Expr) -> Expr
![Page 43: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/43.jpg)
Classes générées
![Page 44: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/44.jpg)
Classes générées
![Page 45: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/45.jpg)
Stratégies
![Page 46: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/46.jpg)
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 47: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/47.jpg)
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))
Not(Not(x)) x
Not(And(x,y)) Or(Not(x),Not(y))
Not(Or(x,y)) And(Not(x),Not(y))
![Page 48: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/48.jpg)
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 f(l) r’ on normalise un terme f(t) l’opérateur f permet de contrôler les règles
à appliquer
![Page 49: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/49.jpg)
Encodage du contrôle
f(And(x,y)) and(x,y)f(Not(x)) not(x)f(Or(x,y)) Or(f(x),f(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) not(Not(x)) x not(And(x,y)) Or(not(x),not(y)) not(Or(x,y)) and(not(x),not(y))not(x) Not(x)
![Page 50: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/50.jpg)
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 51: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/51.jpg)
Ce qu’on voudrait
pouvoir contrôle l’application des règlespouvoir spécifier simplement le
« traversée » d’une terme (I.e. appliquer une règles dans les sous-termes)
tout en séparant règle et contrôle
![Page 52: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/52.jpg)
Solution
Utiliser des stratégiesCombiner des transformations élémentairesExemples
disjunctive normal formdnf = innermost(DAOL <+ DAOR <+ DN <+…)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)) DN : Not(Not(x)) x conjunctive normal form cnf = innermost(DOAL <+ DOAR <+ DN <+…)
![Page 53: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/53.jpg)
Autres stratégies de traverse
simplify = bottomup(repeat(R1 <+ …))simplify = topdown(repeat(R1 <+ …))
… Slide 14
![Page 54: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/54.jpg)
![Page 55: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/55.jpg)
Stratégies en Tom
![Page 56: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/56.jpg)
Constructeurs élémentaires
Identity Fail Not Sequence Choice All One Some IfThenElse Omega mu
![Page 57: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/57.jpg)
Définition de stratégies%op VisitableVisitor Try(s1:VisitableVisitor) {
make(v) { `Choice(v,Identity) }}%op VisitableVisitor Repeat(s1:VisitableVisitor) {
make(v) { `mu(MuVar("x"),Choice(Sequence(v,MuVar("x")),Identity())) }}%op VisitableVisitor TopDown(s1:VisitableVisitor) { make(v) { `mu(MuVar("x"),Sequence(v,All(MuVar("x")))) }
%op VisitableVisitor OnceBottomUp(s1:VisitableVisitor) {make(v) { `mu(MuVar("x"),Choice(One(MuVar("x")),v)) }
}%op VisitableVisitor Innermost(s1:VisitableVisitor) { make(v) { `mu(MuVar("x"), Sequence(All(MuVar("x")),
Try(Sequence(v,MuVar("x"))))) }}
}
![Page 58: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/58.jpg)
Stratégie élémentaire en Tom
class RewriteSystem extends strategy.term.termVisitableFwd {public RewriteSystem() {
}public Term visit_Term(Term arg) throws VisitFailure {
%match(Term arg) { a() -> { return `b(); }
b() -> { return `c(); } g(c(),c()) -> { return `c(); } }
}}
throw new VisitFailure();
super(`Fail());
![Page 59: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/59.jpg)
Utilisations
VisitableVisitor 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 60: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/60.jpg)
(mode paranoïaque)VisitableVisitor rule = new RewriteSystem();Term subject = `f(g(g(a,b),g(a,a)));VisitableVisitor onceBottomUp =
`mu(MuVar("x"),Choice(One(MuVar("x")),rule));onceBottomUp.visit(subject));
VisitableVisitor innermostSlow = `mu(MuVar("y"),Choice(Sequence(onceBottomUp,MuVar("y")),Identity()));innermostSlow.visit(subject));
VisitableVisitor innermost = `mu(MuVar("x"),Sequence(All(MuVar("x")),Choice(Sequence(rule,MuVar("x")),Identity)));
innermost.visit(subject));
![Page 61: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/61.jpg)
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 62: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/62.jpg)
Solution
considerer s(col) : g(x,b) col.add(x)
appliquer Try(BottomUp(s(col)))
énumérer col
![Page 63: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/63.jpg)
Codage class RewriteSystem extends strategy.term.termVisitableFwd {
Collection collection; public RewriteSystem(Collection c) { super(`Fail()); this.collection = c; } public Term visit_Term(Term arg) throws VisitFailure { g(x,b()) -> { collection.add(`x); } }
return arg;}
}
%match(Term arg) {
![Page 64: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/64.jpg)
Codage
Collection collection = new HashSet();
VisitableVisitor rule = new RewriteSystem(collection);
Term subject = `f(g(g(a,b),g(c,b)));
`Try(BottomUp(rule)).visit(subject);
System.out.println("collect : " + collection);
![Page 65: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/65.jpg)
Stratégie Oméga
OmégaPosition
![Page 66: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/66.jpg)
Replace et Subterm
Etant donnée une position pgetReplace(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
![Page 67: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/67.jpg)
Exemple complexe
Xmas
![Page 68: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/68.jpg)
![Page 69: R éé criture pour la programmation et la preuve Claude Kirchner Pierre-Etienne Moreau](https://reader036.vdocument.in/reader036/viewer/2022070309/551d9d84497959293b8bfed6/html5/thumbnails/69.jpg)
Principales applications