Gramáticas libres de contexto en su habitat
A veces te vas por las ramas para no tener que ir directo a la raíz. Sobre todo si la raíz es dolorosa y puede derribar el árbol— Albert Espinosa
Ivan Meza
Diferencia entre AF y GLC
AFs y ERs
Podemos construir casi todo
Pero no somos sobre una instancia
Número de instancias infinitas
Otro ejemplo
Pero entonces qué hacen GLC
Estructura
Elaboremos
... recordemos
Gramáticas libres de contexto
Son una tupla $G=(V,\Sigma,P,S)$, donde:
- $V$ es otro alfabeto que denominamos símbolos no terminales (generalmente en mayúsculas)
- $\Sigma$ es un alfabeto que denominamos símbolos terminales
- $P$ es conjunto de reglas con la forma $V\rightarrow \alpha$ donde $\alpha \in (\Sigma\cup V)^*$
- $S\in V$ que denominamos símbolo inicial
GLC para el lenguaje de ER
$G=(\{R,B\},\{a,b,\epsilon,\emptyset\},P,R,+,*,(,) )$ donde $P$
- $R\rightarrow B$
- $R\rightarrow R+R$
- $R\rightarrow R*$
- $R\rightarrow RR$
- $R\rightarrow (R)$
- $B\rightarrow a$
- $B\rightarrow b$
- $B\rightarrow \epsilon$
- $B\rightarrow \emptyset$
Derivaciones para: $a+(ab)$
Derivación a la izquierda
$a+(ab)$
- $R$
- $\Rightarrow R+R $
- $\Rightarrow B+R $
- $\Rightarrow a+R $
- $\Rightarrow a+(R) $
- $\Rightarrow a+(RR) $
- $\Rightarrow a+(BR) $
- $\Rightarrow a+(aR) $
- $\Rightarrow a+(aB) $
- $\Rightarrow a+(ab) $
Derivación a la derecha
$a+(ab)$
- $R$
- $\Rightarrow R+R $
- $\Rightarrow R+(R) $
- $\Rightarrow R+(RR) $
- $\Rightarrow R+(RB) $
- $\Rightarrow R+(Rb) $
- $\Rightarrow R+(Bb) $
- $\Rightarrow R+(ab) $
- $\Rightarrow B+(ab) $
- $\Rightarrow a+(ab) $
Derivaciones diferentes
¿Árboles?
Árbol primera derivación
Árbol segunda derivación
Dos derivaciones diferentes producen el mismo árbol
Derivaciones para: $a+ab$
Derivación a la izquierda
$a+ab$
- $R$
- $\Rightarrow R+R $
- $\Rightarrow B+R $
- $\Rightarrow a+R $
- $\Rightarrow a+RR $
- $\Rightarrow a+BR $
- $\Rightarrow a+aR $
- $\Rightarrow a+aB $
- $\Rightarrow a+ab $
¡¡Segunda derivación a la izquierda!!
$a+ab$
- $R$
- $\Rightarrow RR $
- $\Rightarrow R+RR $
- $\Rightarrow B+RR $
- $\Rightarrow a+RR $
- $\Rightarrow a+BR $
- $\Rightarrow a+aR $
- $\Rightarrow a+aB $
- $\Rightarrow a+ab $
Derivaciones diferentes
¿Árboles?
Árbol primera derivación
Árbol segunda derivación
Dos derivaciones diferentes producen dos árboles diferentes
¡¡Dos derivaciones diferentes producen dos árboles diferentes!!
A esta propiedad de que una cadena tiene dos "significados" diferentes le llamamos
Ambigüedad
veo al gato con el telescopio
¿quien tiene el telescopio?
Ambigüedad
Los humanos encontramos la ambigüedad muy divertida
- Hola, ¿cómo te llamas?
- Maria de los Ángeles ¿y tú?
- Daniel de Nueva York
- Oye, pues mi hijo en su nuevo trabajo se siente como pez en el agua.
- ¿Qué hace?
- Nada
Definiciones
Una gramática es ambigua si para cuando menos una cadena tiene más de un árbol de derivación
Si todas las cadenas de una gramática tienen cuando menos un árbol de derivación no es ambigua
Reducción de gramáticas ambiguas
Malas noticias: no existe un algoritmo para reducir gramáticas
Pero hay algunas estrategias
Elegir un agrupamiento para mismo operador: izquierda o derecha
$a+a+a$
Forzar preferencia: introducir nuevas variables
$G=(\{E,T,F,B\},\{a,b,\epsilon,\emptyset,P,R,+,*,(,)\},E )$ donde $P$
- $E\rightarrow T | E + T$
- $T\rightarrow F | TF $
- $F\rightarrow B | F* | (E) $
- $B\rightarrow a$
- $B\rightarrow b$
- $B\rightarrow \epsilon$
- $B\rightarrow \emptyset$
Derivación por la izquierda
$a+ab$
- $E$
- $\Rightarrow E+T $
- $\Rightarrow T+T $
- $\Rightarrow F+T $
- $\Rightarrow B+T $
- $\Rightarrow a+T $
- $\Rightarrow a+TF $
- $\Rightarrow a+FF $
- $\Rightarrow a+BF $
- $\Rightarrow a+aF $
- $\Rightarrow a+aB $
- $\Rightarrow a+ab $
Árbol primera derivación
Derivación por la derecha
$a+ab$
- $E$
- $\Rightarrow E+T $
- $\Rightarrow E+TF $
- $\Rightarrow E+TB $
- $\Rightarrow E+Tb $
- $\Rightarrow E+Fb $
- $\Rightarrow E+Bb $
- $\Rightarrow E+ab $
- $\Rightarrow T+ab $
- $\Rightarrow F+ab $
- $\Rightarrow B+ab $
- $\Rightarrow a+ab $
Árbol segunda derivación
Intentar con: $a^nb^nc^md^m \cup a^nb^mc^md^n$
Por un lado...$a^nb^n$ y $c^nd^n$
- $A\rightarrow aAb | ab$
- $B\rightarrow cBd | cd$
Por otro lado $a^nb^mc^md^n$
- $C\rightarrow aCd | aDd$
- $D\rightarrow bDc | bc$
$E\rightarrow AB | C$
¿Qué pasa cuando $n=m$?
Ojo
Hay lenguajes inherentemente ambiguos
Regresando a operaciones con
Además podemos definir
$G_1=(V_1,\Sigma,P_1,S_1)$ y $G_2=(V_2,\Sigma,P_2,S_2 )$
$G_U=(V_1\cup V_2,\Sigma,P_1\cup P_2\cup \{S_U \rightarrow S_1 + S_2\},S_U )$
$G_C=(V_1\cup V_2,\Sigma,P_1\cup P_2\cup \{S_C \rightarrow S_1 S_2\},S_C )$
$G_*=(V_1,\Sigma,P_1\cup \{S_* \rightarrow S_1S_*|\epsilon \},S_* )$
¿A qué lenguajes corresponden?
$G=(V,\Sigma,\emptyset,S )$
$G=(V,\Sigma,\{S \rightarrow \epsilon\},S )$
$G=(V,\Sigma,\{S \rightarrow a\},S )$
Entonces
Tenemos las operaciones de composición para cualquier GLC
Tenemos lenguajes básicos como GLC
Podemos usar las operaciones sobre las GLR
¡Podemos generar todos los lenguajes regulares con gramáticas!
Convertir de AF a GLC
$Q$ | a | b |
$q_0$ |
$q_0$ |
$q_1$ |
$q_1$ |
$q_1$ |
$q_0$ |
$q_0$ se transforma en $A$, $q_1$ se transforma en $B$
$V$ | a | b |
$A$ |
$A$ |
$B$ |
$B$ |
$B$ |
$A$ |
con $G=(\{A,B\},\{a,b\},P,A)$, reescribir las transiciones a reglas
- $A\rightarrow aA$
- $A\rightarrow bB$
- $B\rightarrow aB$
- $B\rightarrow bA$
Incluir las finales, que lleguen a un estado final
- $A\rightarrow b$
- $B\rightarrow a$
Derivación por la izquierda y derecha
$ababa$
- $A$
- $\Rightarrow aA $
- $\Rightarrow abB $
- $\Rightarrow abaB $
- $\Rightarrow ababA $
- $\Rightarrow ababa $
Entonces
Dado un AF podemos encontrar una GLC
¿Dada una GLC podemos encontrar un AF?
Cuidado... mucho cuidado
Sí y Solo sí tienen la misma forma $A\rightarrow cB | a$
con $G=(\{A,B\},\{a,b\},P,A)$, reescribir las reglas a transiciones
$A\rightarrow aA$ | $\delta(A,a)=A$ |
$A\rightarrow bB$ | $\delta(A,b)=B$ |
$B\rightarrow aB$ | $\delta(B,a)=B$ |
$B\rightarrow bA$ | $\delta(B,b)=A$ |
$A\rightarrow b$ | $\delta(A,b)=F$ |
$B\rightarrow a$ | $\delta(A,a)=F$ |
Gramáticas regulares
Son una tupla $G=(V,\Sigma,P,S)$, donde:
- $V$ es otro alfabeto que denominamos símbolos no terminales (generalmente en mayúsculas)
- $\Sigma$ es un alfabeto que denominamos símbolos terminales
- $P$ es conjunto de reglas con la forma $A\rightarrow aB | a$ donde $a\in\Sigma$ y $A,B \in V$
- $S\in V$ que denominamos símbolo inicial
Jerarquía de Chomsky
Lenguaje |
Gramática |
Máquina |
Independiente de contexto |
Tipo 2, $V\rightarrow \alpha$ |
?? |
Regular |
Tipo 3, $V \rightarrow aA$ |
Autómata finito |
Autómata de pila
Un AFND-$\epsilon$ + una pila
No confundir
Autómata de pila
Es una tupla $(Q,\Sigma,\Gamma,q_0,Z_0,A,\delta)$
- $Q$ conjunto finito de estados
- $\Sigma$ alfabeto de cadenas reconocidas
- $\Gamma$ alfabeto de pila
- $q_0$ estado inicial
- $Z_0$ símbolo inicial de la pila
- $A$ estados finales
- $\delta$ función de transición $Q \times (\Sigma \cup \{\epsilon\}) \times \Gamma \rightarrow Q\times\Gamma^*$
Un AFND-$\epsilon$ + una pila
AF vs AFND vs AFND-$\epsilon$ vs AP
AF | AFND | AFND-$\epsilon$ | AP |
$Q$ |
$Q$ |
$Q$ |
$Q$ |
$\Sigma$ |
$\Sigma$ |
$\Sigma$ |
$\Sigma$ |
|
|
|
$\Gamma$ |
$q_0 \in Q$ |
$q_0 \in Q$ |
$q_0 \in Q$ |
$q_0 \in Q$ |
|
|
|
$Z_0 \in \Gamma$ |
$A \subseteq Q$ |
$A \subseteq Q$ |
$A \subseteq Q$ |
$A \subseteq Q$ |
$Q \times \Sigma \rightarrow Q$ |
$Q \times \Sigma \rightarrow 2^Q$ |
$Q \times (\Sigma \cup \{\epsilon\}) \rightarrow 2^Q$ |
$Q \times (\Sigma \cup \{\epsilon\}) \times \Gamma \rightarrow Q\times\Gamma^*$ |
Posición inicial
- Estado: $q_0$
- Pila: $Z_0$
Operaciones
- Push: $A/BA$
- Pop: $A/\epsilon$
- Sin operación: $A/A$