Skip to content

Apuntes

El llenguatge L1=wΣw=wt{L}_{1}={w\in\Sigma^{*}\mid w=w^{t}} és el llenguatge de les cadenes que són palíndroms sobre l’alfabet Σ={a,b,c}\Sigma=\{a,b,c\}.

Aquí teniu una CFG que genera aquest llenguatge:

SaSbbSacScλS \rightarrow aSb \mid bSa \mid cSc \mid \lambda

Aquesta CFG utilitza una regla recursiva per generar les cadenes palíndromes.
La regla SλS \rightarrow \lambda permet generar la cadena buida, que és un palíndrom.
Les regles SaSbS \rightarrow aSb i SbSaS \rightarrow bSa permeten afegir dos caràcters a la cadena.
Les regles ScScS \rightarrow cSc permeten afegegir dos caràcters iguals a la cadena.

Així, la CFG generarà les cadenes de l’alfabet Σ\Sigma que formen paraules de L1{L}_{1}.

Exercici 1.6 Determinau el llenguatge generat per la gramàtica

SAbcabCAaCc\begin{array}{l}{{S\to A b c\mid a b C}}\\ {{A\to a}}\\ {{C\to c}}\end{array}

És aquesta gramàtica ambigua? En cas que ho sigui, cercau una gramàtica inambigua que generi el mateix llenguatge.

Aquesta gramàtica genera el següent llenguatge:

L=abc,abcL={abc, abc}

Sí, aquesta gramàtica és ambigua, ja que hi ha més d’una forma de generar una paraula en el llenguatge. Per exemple, la paraula “abc” es pot generar a través de la producció SAbcS\to A b c o a través de la producció SabCS\to a b C.

Per fer la gramàtica inambigua, es pot utilitzar una gramàtica factorial:

SAbc Aa Cc\begin{array}{l}{{S\to A b c}}\ {{A\to a}}\ {{C\to c}}\end{array}

Aquesta gramàtica genera el mateix llenguatge que la gramàtica original, però ara és inambigua, ja que només hi ha una forma de generar una paraula en el llenguatge.

Exercici 1.7 Considerau la gramàtica GG donada per les produccions següents

SaSaSbλS\,\longrightarrow\,a S\,\mid\,a S b\,\mid\,\lambda

Demostrau que L(G)={w{a,b}w=aibj amb ij parell no negatiu}\mathcal{L}(G)=\{w\in\{a,b\}^{*}\mid w=a^{i}b^{j}{\mathrm{~amb~}}i{\mathrm{-j~parell~no~negatiu}}\}

Podem demostrar que L(G)={w{a,b}w=aibj amb ij parell no negatiu}\mathcal{L}(G)=\{w\in\{a,b\}^{*}\mid w=a^{i}b^{j}{\mathrm{~amb~}}i{\mathrm{-j~parell~no~negatiu}}\} mitjançant una construcció inductiva.

Base de l’inducció:

Si i=0i = 0, llavors w=bjw = b^{j}, on jj és un nombre no negatiu, i això està en L(G)\mathcal{L}(G), ja que SλS \longrightarrow \lambda és una producció en GG. Passos inductius:

Suposeu que per a tot k<ik < i, on ii és un nombre parell no negatiu, tenim que akbjL(G)a^{k}b^{j} \in \mathcal{L}(G) per a tot jj amb kjk - j parell no negatiu.
Llavors, per a ii, podem demostrar que aibjL(G)a^{i}b^{j} \in \mathcal{L}(G) per a tot jj amb iji - j parell no negatiu, ja que tenim la producció SaSbS \longrightarrow a S b en GG.
Això demostra que L(G)={w{a,b}w=aibj amb ij parell no negatiu}\mathcal{L}(G)=\{w\in\{a,b\}^{*}\mid w=a^{i}b^{j}{\mathrm{~amb~}}i{\mathrm{-j~parell~no~negatiu}}\}.

Taller

Per resoldre aquesta exercici de gramàtiques, cal seguir els següents passos:

  1. Trobar la gramàtica per al llenguatge L1L_1

El llenguatge L1L_1 és el conjunt de totes les cadenes que comencen amb una o més aa seguides de nn parelles abab. Això significa que per a qualsevol n1n\geq 1, el llenguatge L1L_1 conté les següents paraules:

a(ab)na(a b)^{n}

Per a generar aquestes paraules, podem definir una gramàtica G1G_1 amb el següent conjunt de regles:

SaAS\rightarrow aA

AaBA\rightarrow aB

BabB  εB\rightarrow abB\ |\ \varepsilon

Aquesta gramàtica comença amb l’axioma SS, que es pot transformar en una aa i una variable AA. La variable AA també es pot transformar en una aa i la variable BB, que a la seva vegada pot generar parelles abab de manera recursiva fins que s’arriba a l’èpsilon. Així, la gramàtica G1G_1 genera exactament el llenguatge L1L_1.

  1. Trobar la gramàtica per al llenguatge L2L_2

El llenguatge L2L_2 és el conjunt de totes les cadenes que comencen amb una o més aa, seguides de zero o més cc, seguides de zero o més bb, on el nombre de aa i el nombre de bb són iguals. Això significa que per a qualsevol n0n\geq 0 i m0m\geq 0, el llenguatge L2L_2 conté les següents paraules:

ancmbn+ma^{n}c^{m}b^{n+m}

Per a generar aquestes paraules, podem definir una gramàtica G2G_2 amb el següent conjunt de regles:

SaSb  TS\rightarrow aSb\ |\ T

Tε  cTT\rightarrow \varepsilon\ |\ cT

Aquesta gramàtica comença amb l’axioma SS, que pot generar parelles abab de manera recursiva fins que s’arriba a la mateixa quantitat de aa i bb, o bé es transforma en la variable TT. La variable TT pot generar qualsevol nombre de cc, seguit de l’èpsilon. Així, la gramàtica G2G_2 genera exactament el llenguatge L2L_2.

  1. Trobar la gramàtica per al llenguatge L3L_3

El llenguatge L3L_3 és el conjunt de totes les cadenes que comencen amb una o més aa, seguides de zero o més cc, seguides de zero o més bb. Això significa que per a qualsevol i1i\geq 1, j0j\geq 0 i k0k\geq 0, el llenguatge L3L_3 conté les següents paraules:

aicjbka^{i}c^{j}b^{k}

Per a generar aquestes paraules, podem definir una gramàtica G3G_3 amb el següent conjunt de regles:

SaSb  TS\rightarrow aSb\ |\ T

TaT  cT  bT  εT\rightarrow aT\ |\ cT\ |\ bT\ |\ \varepsilon

Aquesta gramàtica és similar a la gramàtica G2G_2, però en aquest cas la variable TT pot generar qualsevol combinació de aa, cc i bb, fins que s’arriba a


Per a generar les paraules del llenguatge L2L_2, podem seguir aquests passos:

  1. Començar amb nn aa‘s.
  2. Afegir mm cc‘s.
  3. Afegir n+mn+m bb‘s.

Podem usar aquesta idea per a construir una gramàtica que generi el llenguatge L2L_2. Definim l’axioma SS i les següents regles:

SABS\rightarrow AB AaA  εA\rightarrow aA\ |\ \varepsilon BcBb  εB\rightarrow cBb\ |\ \varepsilon

La regla inicial SABS\rightarrow AB permet que la gramàtica generi una cadena amb una part d’AA i una part de BB. La variable AA genera zero o més aa‘s, i la variable BB genera zero o més cc‘s seguits d’un nombre igual de bb‘s. Això assegura que la quantitat d'aa's i bb‘s sigui la mateixa.

Per exemple, la paraula a2c1b3a^2c^1b^3 es pot generar amb les següents derivacions:

SABaAcbBaaAcbbBaa c bbbS\Rightarrow AB\Rightarrow aAcbB\Rightarrow aaAcbbB\Rightarrow aa\ c\ bbb

D’aquesta manera, la gramàtica generada és capaç de generar totes les paraules del llenguatge L2L_2.