Professional Documents
Culture Documents
Prnom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Groupe . . .
Exercice 1 : Un automate ( nombre) dtats fini qui reconnat ... (3.5 pt)
Q1. (1 pt)
A1 =
A2 =
?
c
Exercice 2 : Algorithmes
(5 pt)
Indication : On ne demande pas de code mais un description prcise des tapes des algorithmes.
On considre un aef A sur un alphabet possdant un seul tat initial qi et un ensemble Acc dtat
accepteur. Vous supposerez ( votre convenance) que lautomate est dcrit par une liste de transitions
ou par un tableau.
Accessibilit
Q3. (0.5 pt)
initial.
Dessinez un automate qui comporte deux tats qui ne sont pas accessibles depuis ltat
Exercice 3 : Minimisation
(3.5 pt)
A
a
b
c
i1
4
1
5
2a
4
1
6
3
3
3
3
4 5a
4 4
6 6
6 6
6
4
6
2
solution
Minimisation:
* initial partition = { {1,2,3,4,5,6} }
states 1 ~/~ 2 : NOT same accepting status
So, {1,2,3,4,5,6} is splitted into {1,3,4,6} |_| {2,5}
states 1 ~/~ 3 : NOT same behavior on symbol c
So, {1,3,4,6} is splitted into {1,6} |_| {3,4}
states 3 ~/~ 4 : NOT same behavior on symbol b
So, {3,4} is splitted into {3} |_| {4}
* final partition = { {1,6} , {2,5} , {3} , {4} }
Q8. (1 pt)
(4 pt)
{2,5}
a b c
cc
{1,6}
{3}
b a
bc
{4}
Indication : On suppose que la grammaires des noms de variables et celles des valeurs sont dj dfinies
et quelles ont respectivement pour germes les non-terminaux Var et Val.
solution
Prog Seq Ret
Ret "return(" Expr ")" |
Seq | Inst ";" Seq
Inst Aff | If
Aff Var ":=" Expr
If "If" Cond "then" te
te Aff "fi" | "{" Prog "}" "else"
Cond Expr "==" Expr
Expr "(" Expr ")" | vv OpExpr
vv Var | Val
OpExpr | Op Expr
Op "+" | "*"
"{"
Prog
(6 pt)
"}"
(20min)
Soit L le langage form des mots sur lalphabet = {a, b, c} qui ont autant de a que de b (sans tenir
compte de lordre des lettres).
Q10. (0.5 pt)
Donnez trois mots de qui appartiennent au langage L et trois mots de qui
nappartiennent pas L. En particulier, que dire du mot ?
solution
, c, abc L
a, b, abb
/L
a
/ a
/ 2
_h
a
b
/ b
a /
version dterministe
a
b
/
b
a
/
c
/
/ 1
c
/
7 2_
'
a
/
b
/ b
a ,
a
/
a
a
b
b
Lautomate est dterministe car dans chacun des tats de lautomate, il ne peut y avoir plusieurs transitions
possibles. Dans ltat 1, les lettres reconnues par les transitions sont toutes diffrentes. Dans ltat 2, les transitions qui reconnaissent la mme lettre (2 transitions possibles pour a, idem pour b) le sommet des piles est
diffrent ( a pour lune des transitions sur a et b pour lautre transition sur a).
solution
Un mot m est reconnu par un automate une pile A si il existe une excution de A qui commence dans ltat
initial de A avec une pile vide qui consomme toutes les lettres du mot m et atteint un tat accepteur avec une
pile vide.
(10 pt)
(30min)
x
?
T =
/
Q15. (1 pt)
Donnez un automate A non-dterministe et sans -transitions correspondant lexpression rgulire a .b + a.c.
solution
a
/ 1
A=
3
/ 2
/ 4
AD =
{1}
{ 2,3 }
b,c
" |
{2}
{4}
Dfinissez L ![e] en une phrase.
solution
L ![e] est lensemble de tous les mots forms des lettres a, b, c priv des mots reconnus par lexpression
rgulire e.
solution
Pour obtenir lautomate B, on complte lautomate AD et on prend le complmentaire en inversant le statut
des tats (accepteurs non-accepteurs).
a,b,c
puit o
b
<
c
a
c
B=
{1}
a
b
{ 2,3 }
b,c
" |
{2}
a,b,c
{4}
L{ 1 }
L{ 2,3 }
L{ 2 }
{4}
L{ puit }
=
=
=
=
=
a L{ 2,3 } + b L{ 4 } + c L{ puit } +
a L{ 2 } + (b + c) L{ 4 } +
a L{ 2 } + b L{ 4 } + c L{ puit } +
(a + b + c) L{ puit }
(a + b + c) L{ puit } +
(10 pt)
Le but de cet exercice est dcrire un compilateur optimisant qui traduit des squences daffectations
en squence de let...in... Ocaml. Loptimisation consiste effectuer durant la compilation tous les
calculs qui peuvent ltre, cest--dire ceux qui ne dpendent que de constantes et de variables dont la
valeur est calculable. Cette technique classique des compilateurs optimisants est appele propagation de
constantes. Elle amliore de manire significative les performances du code gnr comme le dmontre
les exemples ci-dessous.
Exemples :
- Le programme P1 suivant est compil en une constante 8 ;; puisque tous les calculs peuvent tre
effectus durant la compilation car les valeurs de toutes les variables sont connues au moment de
la compilation.
programme P1
programme gnr par la grammaire attribue
x:= 0 ;
u:= 1 ;
8 ;;
v:= u + u ;
y:= x + 1 ;
z:= y + x + v + 1 ;
return(x+y+z+v+u) ;
- Le programme P2 ci-dessous est compil en un programme Ocaml simplifi qui utilise moins de
mmoire puisque les variables u et v ne sont plus utilises.
programme P2
programme gnr par la grammaire attribue
u:= 1 ;
v:= u + u ;
let y = x+1 in
y:= x + 1 ;
let z = y+x+3 in
z:= y + x + v + 1 ;
x+y+z+3 ;;
return(x+y+z+v+u) ;
Principe Chaque fois que la valeur dune variable est connue (par exemple lors dune affectation
x:=0) on ajoute le couple (variable, valeur) dans la liste V AV des variables ayant une valeur. .
Chaque fois quon rencontre une expression contenant une variable, on regarde dans la liste V AV si la
valeur de la variables est connue
1
Prog "return("
2
Prog Aff
";"
":="
Aff Var
Expr
Expr VarOuVal
") ;"
Prog
Expr
PlusExpr
VarOuVal Var
6
VarOuVal Val
7
PlusExpr
8
PlusExpr "+"
Q21. (1.5 pt)
Expr
x:=0 ; return(x+1) ;
Indiquez chaque drivation le numro de la rgle utilise.
solution
Prog
2
Aff
";"
Var ":=" Expr
";"
x ":=" Expr
";"
":=" Val PlusExpr
";"
x ":=" 0
";"
x ":=" 0
";"
x ":=" 0
";"
x ":=" 0
";"
Prog
"return("
"return("
"return("
"return("
"return("
"return("
"return("
solution
let (compilateur: stream string) = fun stream ->
let (_,o) = Prog stream [ ]
in o ;;
Q25. (6 pt)
Ajoutez des attributs la grammaire des squences dinstructions ci-dessus de manire
obtenir un compilateur optimisant.
Indication : On fournit une grammaire complter avec le calcul des attributs crit en Ocaml avec
des match ... with. Mais si vous prfrez, vous pouvez rpondre la question en crivant des parsers
Ocaml.
solution
{`} Prog {(`0 , o)}
match e with
";;"
`0 := `, o := | S(s) s
| I(i) string-of-int i
2
{`} Aff {(`1 , a)} ";" {`1 } Prog {(`2 , o0 )}
{`0 := `2 , o := a o0 }
3
Var {x} ":=" {`} Expr {e}
match e with
| S(s) `0 := `,
o := "let" x "=" s "in"
|
S(s),
I(i)
S(s
"+"
(string
of
int
i)
0
e :=
| I(i1 ), I(i2 ) I(i1 + i2 )
| e1 , Eps e1
5
Var {s}
{e := find s `}
Val {i}
{`} PlusExpr {e }
{e := I(i)}
{e0 := Eps}
"+" {`} Expr {e}
{e0 := e}