Title: Rcriture pour la programmation et la preuve
1Réécriture pour la programmation et la preuve
- Claude Kirchner
- Pierre-Etienne Moreau
2Application à XML
3Document XML
- XML permet de décrire des documents structurés
- lt?xml version"1.0" encoding"UTF-8"?gt
- ltPersonsgt
- ltPerson Age"30"gt ltFirstNamegt Paul lt/FirstNamegt
lt/Persongt - ltPerson Age"42"gt ltFirstNamegt Mark lt/FirstNamegt
lt/Persongt - ltPerson Age"21"gt ltFirstNamegt
Jurgen lt/FirstNamegt lt/Persongt - ltPerson Age"21"gt ltFirstNamegt
Julien lt/FirstNamegt lt/Persongt - ltPerson Age"24"gt ltFirstNamegt
Pierre lt/FirstNamegt lt/Persongt - lt/Personsgt
- On peut voir un document XML comme un arbre
4Transformation de documents XML
- On a envie de pouvoir manipuler ces données
- pour y rechercher de linformation
- 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
5Exemple
- On veut savoir sil existe un noeud de la forme
ltPersongtltFirstNamegt Julien lt/FirstNamegtlt/Persongt - lt?xml version"1.0" encoding"UTF-8"?gt
- ltPersonsgt
- ltPerson Age"30"gt ltFirstNamegt Paul lt/FirstNamegt
lt/Persongt - ltPerson Age"42"gt ltFirstNamegt Mark lt/FirstNamegt
lt/Persongt - ltPerson Age"21"gt ltFirstNamegt
Jurgen lt/FirstNamegt lt/Persongt - ltPerson Age"21"gt ltFirstNamegt
Julien lt/FirstNamegt lt/Persongt - ltPerson Age"24"gt ltFirstNamegt
Pierre lt/FirstNamegt lt/Persongt - lt/Personsgt
6Filtrage
- Il faut savoir si un pattern XML filtre vers un
noeud de document XML - On aimerait pouvoir écrire
- match(t)
- ltPersongtltFirstNamegt Julien lt/FirstNamegtlt/Persongt
-gt - // Noeud trouvé
-
-
- Ou plus généralement
- ltPersongtltFirstNamegt X lt/FirstNamegtlt/Persongt -gt
7Modèle de donnée (simplifié)
- ElementNode(namestr, attrListTNodeList,
- childListTNodeList) -gt TNode
- AttributeNode(namestr, valuestr) -gt TNode
- TextNode(datastr) -gt TNode
- conc(TNode) -gt TNodeList
8XML vs. Term
- Un document XML peut se voir comme un arbre
- ltA a"at1"gtltB/gtlt/Agt
- est représenté par
- ElementNode("A",
- conc(AttributeNode("a", "at1")),
- conc(ElementNode("B",conc(),conc()))
- )
9Pattern XML
- On veut pouvoir écrire un pattern de la forme
- ltA a"at1"gtXlt/Agt
- qui sera encodé par
- ElementNode("A",
- conc(AttributeNode("a", "at1")),
- conc(X)
- )
10Questions
- A-t-on
- ltA a"at1"gtXlt/Agt ltlt ltA a"at1"gtltB/gtlt/Agt ?
- ltA a"at1"gtXlt/Agt ltlt ltA a"at1"gtltB/gtltC/gtlt/Agt ?
- Quel est le type de X ?
- TNode ?
- TNodeList ?
- On voudrait pouvoir écrire
- ltA a"at1"gtXlt/Agt ltlt ltA a"at1"gtltB/gtltC/gtlt/Agt
- Quelles sont les solutions ?
11Questions
- En fonction du parseur, ltA a"at1"gtltB/gtlt/Agt peut
être reconnu comme ltA a"at1"gt?ltB/gt?lt/Agt - A-t-on
- ltA a"at1"gtXlt/Agt ltlt ltA a"at1"gt?ltB/gt?lt/Agt ?
- ltA a"at1"gtXlt/Agt ltlt ltA a"at1"gt?ltB/gt?lt/Agt ?
- Comment est encodé ltA a"at1"gt?ltB/gt?lt/Agt ?
- ElementNode("A",
- conc(AttributeNode("a", "at1")),
- conc(
- TextNode("?"),
- ElementNode("B",conc(),conc()),
- TextNode("?"))
- )
- Est-ce que cela filtre ?
12Notation explicite
- ltA a"at1"gt(_,X,_)lt/Agt
- qui correspond à
- ltA a"at1"gtconc(_,X,_)lt/Agt
- A-t-on ltA a"at1"gt(_,X,_)lt/Agt ltlt ltA
a"at1"gt?ltB/gt?lt/Agt ? - Oui, il y a 3 solutions
13Notation implicite
- ltA a"at1"gt(_,X,_)lt/Agt
- qui correspond à
- ltA a"at1"gtXlt/Agt
- qui correspond également à
- ltA a"at1"gtXlt/Agt
- A-t-on ltA a"at1"gtXlt/Agt ltlt ltA a"at1"gt?ltB/gt?lt/Agt
? - Oui, il y a 3 solutions
14Attributs
- Les attributs sont représentés par une liste de
couples (nom,valeur) - Il existe également des notations implicites et
explicites - Ainsi
- ltA a"at1"gt correspond à ltA a"at1"gt
- qui correspond à ltA (_,a"at1",_)gt
15Questions
- A-t-on
- ltA a"at1"gtlt/Agt ltlt ltA a"at1"gtlt/Agt ?
- ltA a"at1"gtlt/Agt ltlt ltA a"at1" b"at2"gtlt/Agt ?
- Pourquoi ?
- car ltA (_,a"at1",_)gtlt/Agt ltlt ltA (a"at1"
b"at2 )gtlt/Agt ? - A-t-on
- ltA a"at1" b"at2"gtlt/Agt ltlt ltA a"at1"
b"at2"gtlt/Agt ? - ltA a"at1" b"at2"gtlt/Agt ltlt ltA b"at2"
a"at1"gtlt/Agt ? - Non, car
- (_, a"at1", _, b"at2", _) !ltlt (b"at2",
a"at1") - Il faudrait du filtrage AC avec élément neutre!
16Attributs dans Tom
- On considère un ordre sur les noms dattributs
- et les formes canoniques où les attributs sont
triés - Ainsi, ltA b"at2" a"at1"gtlt/Agt est représenté par
- ElementNode("A",
- conc( AttributeNode("a", "at1"),
- AttributeNode("b", "at2")),
- conc())
- De même, pour les motifs
17Utilisation dans Tom
- Node sort(Node subject)
- match(subject)
- ltPersonsgt(X1,p1,X2,p2,X3)lt/Personsgt -gt
- if(compare(p1,p2) gt 0)
- return sort(xml(ltPersonsgt
- X1 p2 X2 p1 X3
- lt/Personsgt))
-
-
-
- return subject
-
18Comparaison dattributs
- int compare(Node t1, Node t2)
- match(t1, t2)
- ltPerson Agea1gtltFirstNamegt n1
lt/FirstNamegtlt/Persongt, - ltPerson Agea2gtltFirstNamegt n2
lt/FirstNamegtlt/Persongt - -gt return a1.compareTo(a2)
-
- return 0
-
19Ancrage formel
20Problématique
- Comment faciliter lutilisation 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
21Solution 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é - daccéder à un sous terme donné
22Plus 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
23Contraintes à respecter
- ?t1,t2?T(F),
- eq(t1,t2) t1t2
- ?f?F, ?t?T(F),
- is_fsym(t,f) Symb(t)f
- ?f?F, ?i?1..ar(f), ?t?T(F)
- subtermf(t,i) ti
24Structure de données
- struct term
- int symb
- struct term subterm
-
- On représente les symboles par des entiers
(zero,3), (suc,5), (plus,7),
25Mapping de Nat vers une structure C
- typeterm Nat
- implement
- equals(t1,t2)
-
- op Nat zero
- is_fsym(t)
-
- op Nat suc(pNat)
- is_fsym(t)
- get_slot(p,t)
struct term term_equals(t1,t2)
t!null t-gtsymb3 t!null t-gtsymb5
t-gtsubterm0
26Mapping
- Permet de voir une structure arborescente comme
un terme - Plus généralement, permet de voir nimporte
quelle structure de donnée comme un terme - Permet de filtrer vers des objets en mémoire
27Exercice
- Peut-on voir les entiers machine comme des
entiers de Peano ? - typeterm Nat
- implement int
-
- op Nat zero
- is_fsym(t) t0
-
- op Nat suc(pNat)
- is_fsym(t) tgt0
- get_slot(p,t) t-1
28Peut-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)
-
29Mapping objet
- op A A(aint)
- is_fsym(t) t instanceof A
- get_slot(a,t) t.a
-
- op A B(aint,bint)
- is_fsym(t) t instanceof B
- get_slot(a,t) t.a
- get_slot(b,t) t.b
-
- Aax ltlt new A(3)
- Bbx ltlt new B(2,3)
- Aax ltlt new B(2,3)
30Demo
31Questions
- Doit-on écrire des mappings ?
- Que fait vas au juste ?
32Outils autour de Tom
33Bibliothèque ATerm
- Aterm
- AFun
- ATermAppl
- ATermList
- ATermInt
- ATermReal
- ATermPlaceholder
- ATermBlob
- ATermFactory
34ATerms
35Bibliothèque ATerm
- Aterm
- AFun
- ATermAppl
- ATermList
- ATermInt
- ATermReal
- ATermPlaceholder
- ATermBlob
- ATermFactory
- getAnnotation
- setAnnotation
- toString
- etc.
36Bibliothèque ATerm
- Aterm
- AFun
- ATermAppl
- ATermList
- ATermInt
- ATermReal
- ATermPlaceholder
- ATermBlob
- ATermFactory
37Bibliothèque ATerm
- Aterm
- AFun
- ATermAppl
- ATermList
- ATermInt
- ATermReal
- ATermPlaceholder
- ATermBlob
- ATermFactory
- getAFun
- getArgument
- setArgument
- etc.
38Bibliothèque ATerm
- Aterm
- AFun
- ATermAppl
- ATermList
- ATermInt
- ATermReal
- ATermPlaceholder
- ATermBlob
- ATermFactory
- getFirst
- getNext
- elementAt
- insert
- append
- concat
- etc.
39Bibliothèque ATerm
- Aterm
- AFun
- ATermAppl
- ATermList
- ATermInt
- ATermReal
- ATermPlaceholder
- ATermBlob
- ATermFactory
- makeAFun
- makeAppl
-
- parse
- readFromFile
- etc.
40Utilisation des ATerms
- Aterm t1 factory.parse("a")
- Aterm t2 factory.parse("f(a,b)")
- t2.getArgument(1) t1 ?
- gt true
- Aterm t3 t2.setArgument(t1,2)
- gt t3 f(a,a)
- Aterm t4 factory.parse("f(a,f(b))")
- gt f na pas de signature particulière
- Les Aterms permettent de construire des termes,
mais il ny a pas de sécurité (signature, types)
41ApiGen / Vas
- A partir dune signature multi-sortée
- Gé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
42Exemple
- Module Expressions
- true -gt Bool
- false -gt Bool
- eq(lhsExpr, rhsExpr) -gt Bool
- id(valuestr) -gt Expr
- nat(valueint) -gt Expr
- add(lhsExpr, rhsExpr) -gt Expr
- mul(lhsExpr, rhsExpr) -gt Expr
43Classes générées
44Classes générées
45Stratégies
46Programmation par réécriture
- Avantages
- le filtrage est un mécanisme expressif
- les règles expriment des transformations
élémentaires - Limitations
- 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
47Exemple 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))
48Codage du contrôle dans les règles
- Solution classique
- introduire un nouvel opérateur f pour restreindre
lensemble de règles permettant de normaliser - l ? r devient f(l) ? r
- on normalise un terme f(t)
- lopérateur f permet de contrôler les règles à
appliquer
49Encodage 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)
50Conséquences
- Il faut définir la congruence explicitement, pour
chaque règle et chaque constructeur - Il ny a plus de séparation entre transformation
et contrôle - cela rend la compréhension plus difficile
- les règles sont moins réutilisables
51Ce quon voudrait
- pouvoir contrôle lapplication des règles
- pouvoir spécifier simplement le traversée
dune terme (I.e. appliquer une règles dans les
sous-termes) - tout en séparant règle et contrôle
52Solution
- Utiliser des stratégies
- Combiner des transformations élémentaires
- Exemples
- disjunctive normal form
- dnf innermost(DAOL lt DAOR lt DN lt)
- 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 lt DOAR lt DN lt)
53Autres stratégies de traverse
- simplify bottomup(repeat(R1 lt ))
- simplify topdown(repeat(R1 lt ))
- Slide 14
54(No Transcript)
55Stratégies en Tom
56Constructeurs élémentaires
- Identity
- Fail
- Not
- Sequence
- Choice
- All
- One
- Some
- IfThenElse
- Omega
- mu
57Définition de stratégies
- op VisitableVisitor Try(s1VisitableVisitor)
- make(v) Choice(v,Identity)
-
- op VisitableVisitor Repeat(s1VisitableVisitor)
- make(v) mu(MuVar("x"),Choice(Sequence(v,MuVar(
"x")),Identity()))
-
- op VisitableVisitor TopDown(s1VisitableVisitor)
- make(v) mu(MuVar("x"),Sequence(v,All(MuVar("x
")))) -
- op VisitableVisitor OnceBottomUp(s1VisitableVisi
tor)
- make(v) mu(MuVar("x"),Choice(One(MuVar("x")),v
))
-
- op VisitableVisitor Innermost(s1VisitableVisitor
)
- make(v) mu(MuVar("x"), Sequence(All(MuVar("x"
)), - Try(Sequence(v,MuVar("x")))))
-
58Stratégie élémentaire en Tom
- class RewriteSystem extends strategy.term.termVisi
tableFwd - public RewriteSystem()
- super(Fail())
-
- public Term visit_Term(Term arg) throws
VisitFailure - match(Term arg)
- a() -gt return b()
- b() -gt return c()
- g(c(),c()) -gt return c()
-
- throw new VisitFailure()
-
59Utilisations
- 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)
60(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(Seq
uence(rule,MuVar("x")),Identity)))
- innermost.visit(subject))
61Questions
- 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
62Solution
- considerer
- s(col) g(x,b) ? col.add(x)
- appliquer
- Try(BottomUp(s(col)))
- énumérer col
63Codage
- class RewriteSystem extends strategy.term.termVis
itableFwd
- Collection collection
- public RewriteSystem(Collection c)
- super(Fail())
- this.collection c
-
- public Term visit_Term(Term arg) throws
VisitFailure
match(Term arg) - g(x,b()) -gt collection.add(x)
-
- return arg
-
64Codage
- Collection collection new HashSet()
- VisitableVisitor rule new RewriteSystem(collecti
on)
- Term subject f(g(g(a,b),g(c,b)))
- Try(BottomUp(rule)).visit(subject)
- System.out.println("collect " collection)
65Stratégie Oméga
66Replace 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 laccès à un
sous-terme et lopération de remplacement - cela permet dencoder de lexploration traversée
non-déterministe
67Exemple complexe
68(No Transcript)
69Principales applications