Vous êtes sur la page 1sur 10

Cours:

a) Soit G = {N,T,S,P} une grammaire non contextuelle, comment définit-on formellement le


langage qu'elle engendre, noté L(G)

Le langage engendré par G est :


L(G) = {α ∈ T* | S=(G)=>*α}

b) Quand dit-on que deux grammaires non contextuelles G1 et G2 sont équivalentes?

Soit G1 une GNC, G = (N1,T1,S,P1) et α ∈ T1*


Soit G2 une GNC, G = (N2,T2,S,P2) et α ∈ T2*
Ainsi, G1 et G2 sont équivalentes si L(G1) = L(G2)

En gros cest si elles engendrent le meme langage

c) Quand dit-on qu'une grammaire non contextuelle G est en Forme Normale de Chomsky ?
Quelle est la propriété fondamentale d'une telle grammaire ?

Une grammaire non contextuelle est en forme normale de Chomsky si et seulement toutes
ses règles de production sont de la forme:

1. X --> YZ
2. ou X --> a
3. ou S --> ε

Où X,Y,Z sont des symboles non terminaux, a un symbole terminal, S l'axiome de la


grammaire (symbole start) et ε est le mot vide.

De plus, toute grammaire non contextuelle peut etre transformé grammaire equivalente en
forme de chomsky
Et, regle importante, la derivation d'un mot de longueur n > 0 se fait toujours en 2n-1
étapes

d) En lambda-calcul, quand dit-on qu'une substitution est valide?

Soit M[x := N] le résultat du remplacement dans M de toutes les occurences libres de x par N (où
M,N ∈ Λ)
La subsitution est dite valide si aucune des occurrences libres de N ne devient liée dans
M[x =: N]

e) Enoncer le théoreme du point fixe pour le lambda-calcul

Tout terme de F du lambda-calcul possède un point fixe que l'on peut calculer
∀F ∈ Λ, ∃X ∈ Λ tel que F.X=X

Note : Λ = L(F)

f) Démontrer le théoreme du point fixe pour le lambda-calcul

Soit W = λx.F(xx) et X = WW,

alors :
X ≡ WW ≡ ( λx.F(xx))W -(beta)-> F(xx)[x := W] ≡ F(WW) ≡ FX
donc : X = FX

Exercice 1:
Soit G1 = {N1,T1,S,P1} la grammaire non contextuelle déinie par
N1 = {S,A,B,C,D,E},
T1 = {a,b,c}
P1 = {S->AA | BB | D,
A->Aa | ε,
B->bBc | ε,
C->c,
D->E}

a) Le mot vide appartient-il à L(G1)?

Rappel : A ∈ N est dite annuable si A=(G)>*ε

Calculons l'ensemble Z des variables annulables:


Principe: Si (A->ε) ∈ P alors A∈Z
Si (B->a) ∈ P et tous les symboles de a sont des variables de Z alors B ∈ Z

Z1 = {A,B}
Z2 = {A,B,S}
Z3 = {A,B,S} = Z2

Donc {A,B,S} est l'ensemble des variables annulables


Cet ensemble contient S donc le mot vide appartient à L(G1)

b) Trouver une grammaire G2 = {N2,T2,S,P2} sans ε-productions et engendrant L(G1)\{ε}.


Pourquoi G2 ne peut-elle pas être équivalente à G1?
Exercice 2:
Soit G = {N,T,S,P} la grammaire non contextuelle définie par
N ={S,V}
T = {+,*,(,),a,b}
P = { S -> SV | a | b
V -> +S | *S}

a) Montrer que G est LL(1)

Soit G un une GNC reduite et sans ε-réduction.


G est LL(1) si et seulement si pour toute variable A ∈ N et couple de productions
A-> a1 | a2 , on a : PREM[a1] ⋂ PREM[a2] = ∅

Ainsi ici:

PREM[SV] = PREM[S]
PREM[a] = {a}
PREM[b] = {b}

b) Trouver un arbre syntaxique pour le mot : (((a+b)*(a+b))*(b+b))


c) Ecrire en langage C un programme d'analyse syntaxique par descente récursive pour le
langage engendré par G.

http://www.fil.univ-lille1.fr/~mailliet/portail/AS/documents/g1/slides_analyse_descendante.pdf

Exercice 3:
Soit le mot: ((λx((λx(xy))y))((λx(xx))(λx(xx))))

a) Montrer que c'est un terme du lamba-calcul après avoir rappelé la grammaire utilisée

On appelle temres du λ-calcul les éléments du langage engendré par la grammaire non
contextuelle G = (N,T,S,P) tel que:
T = {λ , ( , ) , v1, v2 , ...}
N = {S, V}
P = {S->V | (λVS) | (SS)}
{V->v1 | v2 ...}

Verifions ((λx((λx(xy))y))((λx(xx))(λx(xx)))) ∈ Λ:
Le mot est donc vérifié à l'aide d'un arbre.

Aide : Pour construire l'arbre, commencer par decouper le mot en fonction des poids des
paranthèses, on part ensuite d'un S et on descend l'arbre en partant du poids le plus petit
jusqu'au plus grand
b) Quelles sont ses occurrences libres, ses occurences liées, ses variables libres, ses variables
liées?

Rappel :
- Une occurrence est une variable qui n'est pas directement liée à un λ
- Une occurrence est liée si elle est englobé pas un λ(occurence)
- Une occurrence est libre si elle n'est pas liée
- Une variable est libre si dans le mot, au moins une occurrence de cette variable est
libre sinon elle est liée

Ainsi dans le mot :


((λx((λx(xy))y))((λx(xx))(λx(xx))))

vert : occurrence liée


jaune : occurrence libre

On a donc:
x : 5 occurrences liées et 0 libre ==> x est une variable liée
y : 0 occurence liée et 2 libres ==> y est une variable libre

c) Combien de β-rédex contient-il (indiquer où ils se trouvent et les numéroter)?

Rappel : un β-rédex peut etre défini par une abstraction (λVS) qui a été dérivé à partir du
membre gauche d'une application (SS)

Exemple:

Ainsi pour notre mot :


Nous avons donc 3 β-rédex

d) Montrer qu'il est normalisable en explicitant une suite adéquate de réductions (en
précisant les β-rédex utilisés) et en montrant que les substitutions utilisées sont valides

Rappel : - https://www.youtube.com/watch?v=GYCYq0lEFhE regarder à 9min20 pour les


réductions
-Le mot est normalisable si après réduction il n'y a plus de redex

Réduction : Prennons le β-rédex n°2

((λx((λx(xy))y))((λx(xx))(λx(xx))))

On a donc, ((λx(xy))y) -(β)-> (xy)[x := y] ≡ yy , qui est valide car aucune occurrence libre n'est
devenue liée
On remarque aussi que la "yy" est bien une forme normalisée
Ainsi, le mot est bien normalisable si on utilise le β-rédex n°2 par exemple
e) Est-il fortement normalisable?

Rappel : Un mot est fortement normalisable si pour chaque β-rédex réduit , le mot est une forme
normalisée

Réduction : Prennons le β-rédex n°3

On a donc, ((λx(xx))(λx(xx))) -(β)-> (xx)[x := (λx(xx))] ≡ (x [x := (λx(xx))]) (x[x := (λx(xx))])


≡ ((λx(xx))(λx(xx))) Valide car aucune occurrence libre n'est devenue liée mais de forme non
normalisée

Or, on remarque que la β-réduction à donnée strictement le même mot, ainsi, le même si l'on
faisait autant de fois que nécessaire le processus de réduction, cela ne se terminerait jamais.
Ainsi, Le mot ((λx((λx(xy))y))((λx(xx))(λx(xx)))) n'est pas fortement normalisable

Exercice 4:
a) Trouver le résultat de l'évalutation de l'expression Scheme suivante :

(let ((x 3)(y 2))


(let ((x y) (y x))
(* (+ x x) y)
)
)

Réponse:

Commentons chaque lignes:

-Le let sur la première ligne correspond à un define multiple, et donc, la variable x sera égal à 3
et y sera égal à 2
-Le let de la seconde ligne va inverser les valeurs de x et y, ainsi x sera égal à 2 et y à 3
-La derniere ligne fait l'addition entre x et x pour ensuite prendre le resultat et faire le produit
entre celui-ci et y
Ce qui peut etre traduit par : y*(x + x) = 3*(2+2) = 3*4 = 12

b) Trouver le résultat de l'évalutation de l'expression Scheme suivante :

(let ((f (lambda(x) (+ x x))))


(let ((f (lambda(x) (* x x))) (g f))
(+ (f 3)(g 5))
)
)

Réponse:
Commentons chaque lignes:

-Let set sur la premiere ligne permet de dire que la fonction f(x)= x+x va etre créé (meme si dans
la deuxieme ligne, on peut voir que f devient g
-Le let de la deuxieme ligne defini la fonction f pour que f(x) = x*x et g(x) = x+x
-la troisieme ligne fait le calcul, ce qui donne :
(f(3) + g(5)) = [(3*3)+(5+5)] = [9+10] = 19

c) Ecrire en Scheme une fonction appelée comp qui, à deux fonctions associe la composée de ces
deux fonctions

(define compose // On defini la fonction compose


(lambda (f g) // La fonction possède deux paramètres f g
(lambda (x) (f ( g x))) // x est un parametre
) // et compose est defini par (f(g(x))
)

(define carre (lambda (x)(* x x)))// On defini la fonction carre


(define plus1 (lambda (x) (+ 1 x))) // On defini la fonction plus 1
((compose carre plus1)4)

// Soit compose(4) = carre(plus1(4)) = carre(5) = 25

Vous aimerez peut-être aussi