Professional Documents
Culture Documents
TEORIA DE LENGUAJES
TEORICO 2004
LENGUAJES REGULARES____________________________________________________ 4
Def. Lenguaje Regular _____________________________________________________ 4
Expresión Regular ________________________________________________________ 4
Autómatas Finitos ________________________________________________________ 5
Autómatas Finitos Deterministas ____________________________________________ 5
Lenguaje Regular (2da. Definición): __________________________________________ 6
Autómata Finito NO Determinista____________________________________________ 8
Def.: Lenguaje L aceptado por un AFND ______________________________________ 9
Lenguaje Regular (3ra. Definición): __________________________________________ 9
Algoritmo AFND → AFD. __________________________________________________ 9
AFND - ε : Autómata Finito No Determinista con Transición Epsilon. _______________ 11
Def.: ε - Clausura (q) donde q es un estado ___________________________________ 12
ε - Clausura (P) donde P es un conjunto de estados ____________________________ 12
Lenguaje Regular (4ta. Definición): _________________________________________ 13
Def.: Lenguaje L aceptado por un AFND - ε___________________________________ 13
AFND ↔ AFND - ε ______________________________________________________ 14
Algoritmo AFND - ε → AFND. _____________________________________________ 14
Algoritmo ER → AFND- ε. ________________________________________________ 17
Algoritmo AFD → ER.____________________________________________________ 20
Máquinas secuenciales _____________________________________________________ 21
Autómatas con salida_____________________________________________________ 21
Máquina de MEALY ______________________________________________________ 22
Máquina de MOORE ______________________________________________________ 23
Equivalencia MOORE → MEALY ____________________________________________ 24
Equivalencia MEALY → MOORE ____________________________________________ 24
TEOREMA DE MYHILL – NERODE __________________________________________ 27
COROLARIO DEL TEOREMA _____________________________________________ 28
ALGORITMO DE MINIMIZACIÓN ____________________________________________ 29
Algoritmo de minimización de máquinas secuenciales _________________________ 32
PROPIEDADES DE LOS LENGUAJES REGULARES ______________________________ 34
PUMPING LEMMA________________________________________________________ 34
Contra recíproco del Pumping Lemma: ______________________________________ 35
Propiedad UNION ________________________________________________________ 38
Propiedad CONCATENACIÓN ______________________________________________ 38
Propiedad CLAUSURA DE KLEENE _________________________________________ 38
Propiedad COMPLEMENTO ________________________________________________ 39
Propiedad INTERSECCIÓN ________________________________________________ 39
Propiedad REVERSO _____________________________________________________ 40
Propiedad COCIENTE_____________________________________________________ 40
Propiedad SUSTITUCIÓN __________________________________________________ 41
Propiedades de la Sustitución _____________________________________________ 41
Propiedad HOMOMORFISMO ______________________________________________ 41
Propiedad HOMOMORFISMO INVERSO ______________________________________ 41
GRAMÁTICAS _____________________________________________________________ 43
LENGUAJES REGULARES
Σ denota el alfabeto
Σ* (Clausura sobre Σ) es el conjunto de strings (tiras de caracteres) que se
pueden formar con el alfabeto
L es el lenguaje, que es el conjunto de símbolos de Σ sobre los que se
aplican determinadas reglas
L ⊆ Σ*
Ej.
Σ = {0,1} L = tiras de largo par
a) 0RL11 no pertenece a L ya que tenemos 0z y 11z, donde si z es par 0z
no, pero 11z si; y si z es impar, 0z es par pero 11z no, por lo cual no se
cumple la definición anterior.
b) 1RL11100 si pertenece a L.
Expresión Regular
i) 0 es una expresión regular que denota a 0
a es una expresión regular que denota a {ε}
a es una expresión regular que denota a {a}∀a ∈Σ
ii) Sea r1 una expresión regular que describe a L1 y r2 la que describe
a L2,
(r1|r2) es una ER (expresión regular) que describe a L1 ∪ L2
(r1.r2) es una ER que describe a L1.L2
(r1)* es una ER que describe a L1*
iii) Estas son todas las ER sobre Σ (clausura de Kleene)
ER = (b|ε)(a|ab)*
Autómatas Finitos
Dado un lenguaje, quiero saber si una tira pertenece a ese lenguaje. Los AF
son herramientas para determinar esto, contestan la pregunta ¿ x ∈ L ?
δ:QxΣ→Q
lo que se quiere hacer es δ (q0, x), es decir que partiendo del estado inicial q0
se analice la tira x. El tema acá es que x ∈ Σ*, no a Σ como se define en
δ = Q x Σ → Q,
∧ ∧
⇒ definimos δ = Q x Σ* → Q, y la función a evaluar sería δ (q0, x)
recordemos que
i) ε ∈ Σ*
ii) si a ∈ Σ*, x ∈ Σ* ⇒ xa ∈ Σ*
iii) Estas son todas las ER
∧
δ (q, ε) = q
∧ ∧
δ (q, xa) = δ ( δ (q, x), a) ∀ q ∈ Q, a ∈ Σ, x ∈ Σ*
(+ | - | ε ) ( 1 | 2 | ... | 9 ) ( 0 | 1 | ... | 9 )* | 0
el autómata sería
1,2,...,9
+ 1,2,...,9
q0 q1 q2
-
0
0,1,2,...,9
q3
qp
= q0
q0 q1 q2 q3 0,1
1 1
donde cada estado significa algo distinto, por ejemplo q0 es el estado en que
faltan 3 ceros consecutivos, q1 es el estado en que ya recibí un cero y faltan 2,
q2 es el estado en que ya recibí dos ceros y falta uno y finalmente q3 es el
estado solución.
Una alternativa para esto sería que no fuera determinista y que se pudiera “ir” a
más de un estado. Sería como si se “partiera” el autómata en ejecuciones en
paralelo.
Ej.:
0 0 0 0
0
q0 q1 q2 q3 qp 0, 1
1
1 1 1
q0 1 q0 1 q0 1 q0
1 0
q0 q0
0
q1 q2 q3 qp
1 1 1
δ : Q x Σ → 2Q
lo que se quiere hacer es δ (q0, x), es decir que partiendo del estado inicial q0
se analice la tira x. El tema acá es que x ∈ Σ*, no a Σ como se define en δ : Q x
Σ → 2Q,
∧ ∧
⇒ definimos δ : Q x Σ* → 2Q , y la función a evaluar sería δ (q0, x)
∧
δ (q, ε) = {q} que es el conjunto formado por q
∧ ∧
δ (q, wa) = {p/ ∃ r ∈ δ (q, w) ∧ p ∈ δ (r, a)}, siendo p ⊆ Q y r ⊆ Q (p y r son
estados)
Los AFD se pueden considerar como un caso particular de los AFND, cuyo
resultado es un conjunto de estados de largo 1 (o sea que tienen un solo
estado).
AFD δ (q0, a) = q1
AFND δ (q0, a) = {q1 } (es un conjunto con un solo elemento)
Lo que tenemos que probar ahora es que todo AFND tiene un AFD equivalente.
NOTACIÓN : Para este caso, el conjunto {q0} lo vamos a escribir como [q0].
q0’ = { q0 } :: [q0]
o sea que el estado final del AFD que construimos pertenece a los estados
solución si y solo si el estado pertenece a los estados solución del AFND.
∧ ∧
por Hi) se tiene que δ’(q0’, w) = [pl, ... , pt] ⇔ δ (q0, w) = {pl, ... , pt}
∧ ∼
⇒ δ’([pl, ... , pt], a) = [rj, ... , rs] ⇔ δ({pl, ... , pt}, a) = {rj, ... , rs} , por la
definición de δ’ (según se detalla en ©)
Ej.: AFND
δ’ 0 1
[q0] [q0, q1] [q0]
[q0, q1] [q0, q1, q2] [q0, q2]
[q0, q1, q2] [q0, q1, q2, q3] [q0, q2, q3]
[q0, q2] [q0, q1, q3] [q0, q3]
... ... ...
∼
δ’([q0, q1], 0) = [q0, q1, q2] porque δ({q0, q1}, 0) = {q0, q1, q2}
∼
δ’([q0, q1], 1) = [q0, q2] porque δ({q0, q1}, 1) = {q0, q2}
y así sucesivamente.
ε r
a u
q0 p
ε
ε ε
r
s ε
t
δ : Q x (Σ U {ε}) → 2Q
ε
q0 q1
a
b
ε q3
q2
a
δ : Q x (Σ U {ε}) → 2Q
∧
δ : Q x Σ* → 2Q , ya que el Σ* ya incluye a ε.
∧
δ (q, ε) = ε - clausura (q)
∧ ∼ ∧
δ (q, wa) = ε - clausura ( δ ( δ ( q, w), a)
Veamos ahora que los lenguajes reconocidos por un AFND coinciden con los
reconocidos por un AFND - ε. O sea que ambos AF reconocen al mismo
lenguaje.
AFND ↔ AFND - ε
Q’ = Q
q0’ = q0
F’ = F
F U { q0} si ε - clausura (q0) ∩ F ≠ vacío
Esto quiere decir que si la ε - clausura (q0) tiene un estado final, lo cual implica
que el AFND - ε reconoce la tira vacía como válida ya que desde el estado
inicial mediante una transición ε se llega a un estado final, se agrega q0 como
estado final a F’, de forma que el AFND que estamos construyendo reconozca
a la tira vacía como válida.
Al eliminar los caminos ε, puede ser que queden estados a los que no se llega
nunca. Si a un estado solo se puede llegar mediante arcos ε, al eliminarlos
quedan inaccesibles. Se podrían eliminar estos estados del conjunto Q’ en un
proceso posterior de depuración, pero por simplicidad del algoritmo se dejan
(Q’ = Q).
a
b
q0 q1
ε a
q2 ε
∧ ∧
δ’ (q0’, x) = δ (q0, x)
Esto se demostrará por I. C., pero esto no se cumple para la tira x = ε (tira
vacía), se cumple a partir del |x| ≥ 1 (largo de x mayor o igual a 1). Esto pasa
porque
∧
δ’ (q0’, ε) = {q0’} mientras que
∧
δ (q0, ε) = ε - clausura (q0), que no necesariamente es igual a {q0’}
Paso inductivo
∧ ∧
Hi) δ’ (q0’, x) = δ (q0, x) , con |x | ≤ h (lo llamamos P’ y P respectivamente)
∧ ∧
Ti) δ’ (q0’, x) = δ (q0, x) , con |x | = h + 1
ε
q0 q1
a
b
ε q3
q2
a
δ’ a b
q0 { q0, q1} { q2, q3}
q1
...
luego se haría
∼ ∼
δ’ (q0, a) = ε - clausura (δ (ε - clausura (q0 ), a ) = ε - clausura (δ ( {q0, q1 }, a ) =
= ε - clausura (δ (q0, a) ∪ δ (q1, a) ) = ε - clausura ({q0 } ) = {q0, q1} ya que
δ (q0, a) es el conjunto vacío o el pozo, y δ (q1, a) = {q0 }
a
a
q0 q1
∼
δ’ (q0, b) = ε - clausura (δ ({q0, q1 }, b ) = ε - clausura (δ (q0, b) ∪ δ (q1, b) ) =
= ε - clausura ({q2 } ) = {q2, q3} ya que δ (q0, b) es el conjunto {q2 }, y δ (q1, b) =
vacío
a a
q0 q1
b
b q3
q2
ε e n d
ε i f
ε e l s e
ER
Algoritmo ER → AFND- ε.
Dado un ER r / L = L(r), ∃ M : AFND - ε / L = L(M)
Este algoritmo construye, a partir de una ER, un AFND - ε con un único estado
final del cual NO salen transiciones, o sea que M : (Q , Σ, δ , q0 , {qf }) donde δ
(qf, x) = {vacío}
(en el ejemplo se sustituyen los estados finales por uno solo final al que se
llega mediante transiciones ε )
ε → {ε }
∅ → {∅ }
a → {a }
r1|r2
r1.r2
r1*
PASO INDUCTIVO :
Hi)
r1 (con cantidad de operadores < k) ⇒ ∃ AFND - ε M1: (Q1 , Σ, δ1 , q01 , {qf1 }) /
L(M1) = L(r1), donde δ1 (qf1, a) = {vacío}, ∀ a ∈ Σ (o sea que desde el estado
final no salen transiciones)
r2 (con cantidad de operadores < k) ⇒ ∃ AFND - ε M2: (Q2 , Σ, δ2 , q02 , {qf2 }) /
L(M2) = L(r2), donde δ2 (qf2, a) = {vacío}, ∀ a ∈ Σ (o sea que desde el estado
final no salen transiciones)
Q1 ∩ Q2 = {vacío } (o sea que no tienen estados en común)
M1
ε q01 qf1 ε
q03 qf3
ε ε
q02 qf2
M2
M3
M1 q03
q01 qf1
ε
q02 qf2
M2 qf3
M3
M1
q01 qf1
ε ε
q03 ε qf3
ε
M3
Q3 = Q1 ∪ { q03 , qf3 }
δ3 (qi , a) = δ1 (qi , a) si qi ∈ Q1
δ3 (q03, ε) = { q01 , qf3 } = δ3 (qf3, ε)
ER = (01|1)*
Haciéndolo a “mano” : 0
0 1 1
0 ε 1
3) AFND - ε para 1
1
Rkij conjunto de tiras que van de qi al qj sin pasar por un estado mayor que k, con i, j
entre 1 y n y k entre 0 y n.
Q = { q1, q2, ..., qn } |Q| = n (autómata numerado con “n” estados)
0
1
q1 q3
1
0
1
q2 0
{U Rn1j } es el conjunto de estados finales. Puedo asociar estas tiras a unas ER.
qi∈F
k>0
Rkij = Rk-1ij U Rk-1ik .( Rk-1kk )* Rk-1kj
i≠j a1 | a2 | …. | at | ε
q1 q2
1
1 0
q3
1
Máquinas secuenciales
Los AF son un tipo de máquina secuencial. Veremos otro tipo de estas que son
los autómatas con salida.
M : (Q , Σ , ∆ , δ , λ , q0 ), donde
Q = conjunto de estados
Σ = alfabeto
∆ = alfabeto de salida
δ = transición
λ = función de salida. Es la que indica que es lo que se imprime, cual es la
salida
q0= estado inicial
Máquina de MEALY
δ : Q x Σ → Q dada una pareja estado símbolo me dice a que estado voy
λ : Q x Σ → ∆ dada una pareja estado símbolo me dice que símbolo se
imprime
Ej. Construir un autómata que cuando tenga una cantidad par de 1 imprima “p”,
y cuando sea impar imprima “i”
Σ = { 0 , 1}, ∆ = { p , i }
δ 0 1 λ 0 1
q0 q0 q1 q0 p i
q1 q1 q0 q1 i p
1/ i
0/ p 0/ i
q0 q1
1/ p
Ej.:
∧ ∧ ∧
λ (q0 , 01) = λ (q0 , 0) . λ ( δ (q0 , 0), 1) = λ (q0 , 0) . λ (q0 , 1) . λ ( δ (q0 , 1), ε) =
= p . i . ε ⇒ se imprimiría “pi”
Máquina de MOORE
δ : Q x Σ → Q dada una pareja estado símbolo me dice a que estado voy
λ : Q → ∆ dado un estado me dice que símbolo se imprime
Ej. Construir un autómata que cuando tenga una cantidad par de 1 imprima “p”,
y cuando sea impar imprima “i”
Σ = { 0 , 1}, ∆ = { p , i }
δ 0 1 λ 0 1
q0 q0 q1 q0 p i
q1 q1 q0 q1 i p
0
0 q0/p q1/i
∧
λ = Q → ∆* ∧
Como no podemos trabajar directamente con λ se define un λ’ = Q x Σ* → ∆*
1 1/ i
0 0/ p 0/ i
0 q0/p q1/i q0 q1
1 1/ p
δ (q0 , 0 ) = q0 ⇒ λ’ (q0 , 0) = p
λ (q0 ) = p
δ (q0 , 1 ) = q1 ⇒ λ’ (q0 , 1) = i
λ (q1 ) = i
δ (q1 , 0 ) = q1 ⇒ λ’ (q1 , 0) = i
λ (q1 ) = i
δ (q1 , 1 ) = q0 ⇒ λ’ (q1 , 1) = p
λ (q0 ) = p
Ej. Σ = { 0 , 1}, ∆ = { a , b }
1/ b
0/ a
q0 q2
0/ b
0/ a 1/ a
q1
1/ b
A partir de esta máquina de MEALY construyamos la correspondiente de
MOORE.
Tomemos primero δ (q0 , 0 ) = q0
λ (q0 , 0) = a
λ’ (q0a ) = a
Se hace entonces δ’ (q0a , 0 ) = q0a
δ’ (q0b , 0 ) = q0a
0
q0b/b
Si tomamos a δ (q2 , 1 ) = q1
λ (q2 , 1) = a
λ’ (q1a ) = a
Se hace δ’ (q2a , 1 ) = q1a
δ’ (q2b , 1 ) = q1a
y la máquina estaría quedando como
q0a/a q1a/a
0
1 q2b/b
0 1
q0b/b q2a/a
Esta forma de construcción puede generar estados a los que nunca se puede
llegar, por lo cual luego de obtenida se puede hacer una depuración de estos
en varios ciclos, de forma de eliminar los estados “basura” que se generan en
el proceso.
M: un AFD M : (Q , Σ , δ , q0 , F )
o sea que partiendo del estado inicial, ambas tiras terminan en el mismo
estado. Rm es una relación de equivalencia.
Para un AFD, cada uno de los estados está definiendo una clase de
equivalencia.
0 0 0,1
1
0 q0 q1 1 q2 1 q
3
Cada clase de equivalencia tiene una ER asociada, y por lo tanto cada estado
tiene una ER asociada. En el ejemplo anterior,
para q0 la ER =0*
para q1 la ER =0*10*
para q2 la ER =0*10*10*
para q3 la ER =0*10*10*10*1(0|1)*
Si tenemos el AF 0 0 0,1
1
q0 q1 1 q2 1 q
3
q0 q1
0
1
0, 1
q2
q0 1 q2 0 q4 0
1 0
0 0 1
q1 1 q3 1 q5 0, 1
Lo primero que hacemos es hallar las clases de RM, lo que es lo mismo que
hallar el conjunto de tiras que llegan a cada estado del AF. Tenemos que
construir una ER para cada uno de estos.
C0 - δ (q0, x) = q0
C1 - δ (q0, x) = q1
C2 - δ (q0, x) = q2
C3 - δ (q0, x) = q3
C4 - δ (q0, x) = q4
C5 - δ (q0, x) = q5
C0 – (00)*
C1 – 0(00)*
C2 – (00)*1
C3 – 0(00)*1 = (00)*01
C4 – (C2 | C3 )00* = ((00)*1 | 0(00)*1)00* = 0*100*
C5 – (C2 | C3 | C4 )1(0|1)*
ALGORITMO DE MINIMIZACIÓN
Entrada: AFD M : (Q , Σ, δ , q0 , F ) / L = L(M)
Salida : AFDmin M’: (Q’, Σ, δ’, q0’, F’) / L = L(M’)
q0 1 q2 0 q4 0
1 0
0 0 1
q1 1 q3 1 q5 0, 1
1) Π0 : Q - F
q2 ,q3 y q4 como son estados finales, en algún sentido son indistinguibles,
y por otro lado tengo al resto de los estados. O sea que la partición
inicial va a estar formada por 2 conjuntos, {Q – F} y {F}
Π0 Q–F F
C1 C2
El algoritmo sigue analizando en cada uno de esos 2 conjuntos el
comportamiento de los estados según las tiras que vienen.
Πcorriente Πcorriente + 1
q0 1 q2 0 q4 0
1 0
0 0 1
q1 1 q3 1 q5 0, 1
obtenemos
q0 q1 1 q2 q3 q4 0
0 1
0, 1 q5
λ’ (q, x)
O sea que unificamos en una única función “respuesta” la función lambda (λ)
q2 1/a q1
1/b
λ1 (q3, 0) = a λ1 (q3, 1) = b
δ1 (q0, 0) = q3 δ1 (q0, 1) = q2
δ1 (q1, 0) = q3 δ1 (q1, 1) = q1
δ1 (q2, 0) = q0 δ1 (q2, 1) = q1
δ1 (q3, 0) = q0 δ1 (q3, 1) = q2
hay que repetir para cada par p, q ∈ Ci δ1 (p, a) = p’ δ1 (q, a) = q’ (es igual que
para AFD)
Π0 { q2 } { q0, q1, q3 }
Π1 { q2 } { q0, q3 } { q1 }
Π2 { q2 } { q0, q3 } { q1 }
H) L regular
T) ∃ n / ∀ z ∈ L, |z| ≥ n, ∃ al menos una descomposición z = u.v.w tal que :
i) |uv|≤n
ii) |v| ≥ 1
iii) ∀ i ≥ 0 u vi w ∈ L
Demostración:
L es regular, por lo tanto existe un AFD M : (Q , Σ, δ , q0 , F ) / L = L(M)
La cantidad de estados del autómata es n |Q| = n
Consideramos arbitrariamente una tira z cualquiera de L cuya cantidad de
símbolos es mayor o igual a “n”
z = a1, a2, ..., am con ai ∈ Σ
|z| = m con m ≥ n
δ (q0, ε) = q0
δ (q0, a1, a2, ..., at) = qt
δ (q0, a1, a2, ..., am) = qm
Para reconocer la tira a1, a2, ..., am paso por m + 1 estados, que pueden
repetirse.
|{ q1, q2, ..., qm }| = m + 1 > n son los estados por lo que pasa cuando
consume la tira, pueden haber estados repetidos.
Asumimos que j y k es el estado que se repite, j < k (qj = qk es el estado que se
repite)
a1 aj ak+1 am
q0 qj=qk qm
aj+1 ak
3) ∀ i ≥ 0 u vi w ∈ L
∧ ∧
δ (q0, u) = δ (q0, a1, a2, ..., aj ) = qj
∧ ∧ ∧
δ (qj, v) = δ (qj, aj+1, aj+2, ..., ak ) = qk = qj o sea que δ (qj, v i) = qj
∧ ∧ ∧
δ (qk, w) = δ (qj, w) = δ (qj, ak+1, ak+2, ..., am ) = qm
∧ ∧ ∧
δ (q0, uviw) = δ (qj, viw) = δ (qj, w) = qm ∀i≥0
T) entonces L no es regular.
Otra posibilidad es
u = ε, v = 0 y w = 0 n-11n
donde | u v | = 1 < n, | v | = 1 ≥ 1 ⇒ se verifican las condiciones 1) y 2).
Como fin de la demostración hay que poner una cláusula que diga:
Estas son todas las descomposiciones que cumplen con las condiciones 1 y 2 y
que cualquier otra descomposición no cumple con alguna de estas, y por lo
tanto L no es regular.
u v w
1) u = 0p pq ≤ n
v = 0q q ≥ 1
w = 0[n/2] - p - q 1[n/2]
zi = uviw = 0p (0q)i 0[n/2] - p - q 1[n/2] = 0p 0iq 0[n/2] - p - q 1[n/2]
= 0p + iq + n/2 - p - q 1[n/2] = 0 n/2 + q ( i – 1) 1[n/2]
Para i = 2 ⇒ z2 = 0 n/2 + q 1[n/2] , con q ≥ 1 ⇒ la cantidad de 0 es mayor
que la de 1 ⇒ z2 no pertenece a L
Todavía no puedo afirmar que L no es regular, porque primero hay que probar
que esto se cumple para toda descomposición.
00000....00111.....1
u v w
1) u = 0[n/2] - q n/2 + r ≤ n
v = 0q 1r q+r≥1
w = 1[n/2] - r
zi = uviw = 0[n/2] - q (0q 1r ) i 1[n/2] - r
OJO: (0q 1r ) i NO ES = 0qi 1ri , es 0q1r 0q1r ... 0q1r i veces
Para i = 2 ⇒ z2 = 0 n/2 - q 0q1r 0q1r 1n/2 - r
00000....00111.....1
u v w
Ejemplo : L = {(ab) k c k , k ≥ 1}
ababababababab..... ababccccccc.....ccc
u v w
ababababababab..... ababccccccc.....ccc
u v w
o sea que hay varias descomposiciones para plantear
z = (ab) n c n
u = (ab) n - j v = (ab) j w = c n El problema es que esta descomposición no
cumple con | u v | ≤ n ya que en z = (ab) n c n |z| = 3n
Lo correcto es tomar
u = (ab) p v = (ab) q w = (ab) n – p - q c n con q ≥ 1 y 2(p+q) ≤ n Con estas
restricciones se cumple 1 y 2. O sea que recién tengo una familia de
descomposiciones posibles que cumplen las condiciones 1 y 2, y tengo que
seguir
u = (ab) p v = (ab) q a w = b (ab) n – p – q – 1 c n
Propiedad UNION
Tenemos L1, L2 lenguajes regulares.
La unión de dos lenguajes regulares es un lenguaje regular. L1 U L2 es regular.
Como L1 y L2 son regulares, tienen un ER que los define, ⇒ L1 U L2 tiene una
ER que lo define que es r1|r2.
Si tengo AF en lugar de ER, igualmente puedo construir un AF para L1UL2
L1
ε
q0
ε
L2
Propiedad CONCATENACIÓN
La concatenación de dos LR es un LR
L1.L2 se hace r1.r2
L1 L2
ε
Y se definen los estados iniciales de L1.L2 como los iniciales de L1, y los
finales son los de L2.
Propiedad COMPLEMENTO
Si L1 es regular, el complemento es regular.
L1 ⊆ Σ*
M : (Q , Σ, δ , q0 , F ) / L1 = L(M) Σ*
M’: (Q’, Σ, δ’, q0’, F’) / L1c = L(M’)
L1
Q’ = Q L1 c
F’ = Q - F
δ’ = δ
q0’ = q0
Ej. q0
Propiedad INTERSECCIÓN
La intersección de dos lenguajes regulares es un lenguaje regular.
L3 = L1 ∩ L2 L1 Σ*
L2
Propiedad REVERSO
El reverso de una tira es la tira leída al revés. Si el lenguaje L1 es regular, el
lenguaje reverso (que reconoce las tiras leídas al revés) también es regular.
x = a1 a2 .... am
xr = am am-1 …. a1
Lr = { xr / x ∈ L }
L Lr
q0 q0 ε q0’
Propiedad COCIENTE
El cociente de L1 y L2 es el conjunto de los x tal que ∃ y ∈ L2 y xy ∈ L1.
L3 = L1|L2 = { x / ∃ y ∈ L2, xy ∈ L1 }
L1
x y
L1/L2 L2
Si ε ∈ L2, ⇒ L1 ⊆ L1 / L2
Ej.: 1*|1* = 1*
1*01*|0 = 1* porque 0 concatenado con 1* es 1*0, que pertenece a L1
1*01*|00 = { }
Si L1 es un lenguaje regular, L2 es un lenguaje cualquiera (no necesita ser
regular), entonces L3 = L1 | L2 es regular.
Propiedad SUSTITUCIÓN
Es una función que va de símbolos de un cierto alfabeto a lenguajes (lo
denotamos como ∆*)
f : Σ → ∆*
f(0) = {a} al 0 se le asocia el lenguaje a.
f(1) = b* le asocia las tiras formadas por b.
f(ε) = ε
f(xa) = f(x) . f(a)
Propiedades de la Sustitución
f(L1 U L2) = f(L1) U f(L2)
f(L1.L2) = f(L1).f(L2)
f(L1*) = (f(L1))*
Propiedad HOMOMORFISMO
Es un caso particular de sustitución. La diferencia con esta es que la función no
da como resultado un lenguaje sino que es una cadena de caracteres.
Este lenguaje reconoce las tiras que tienen igual cantidad de 0 que de 1 y 2.
Supongamos que L es un lenguaje regular.
h:{0, 1, 2} → {a, b}
Si tomamos el homomorfismo definido por h(0) = a, h(1) = b, h(2) = b
⇒ h(L) = {a k b k, k ≥ 0 } que como vimos anteriormente NO ES REGULAR,
⇒ por la propiedad de homomorfismo inverso podemos afirmar que L no es
regular.
GRAMÁTICAS
LENGUAJES : Están compuesto por símbolos (alfabeto) y reglas.
Ejemplo : Function frutaid (n:integer):integer;
begin
-----
-----
end
Reglas : Fun → function IDENT (LPARAM):TIPO; cuerpo
LPARAM → IDENT : IDENT, LPARAM
LPARAM → ε
DERIVACIÓN :
En una gramática llamaremos derivar a pasar de una determinada
configuración a otra, en base a las reglas de producción.
∃ A → β ∈ P, A ∈ V, α, γ ∈ (V ∪ T)*
αΑγ ⇒ αβγ donde ⇒ es el símbolo que representa a la derivación.
α Α γ
α β γ
Si seguimos así, podemos hacer Fun ⇒* x, que significa que derivando “n”
veces a partir de Fun obtengo un x, que es una frase de mi lenguaje y debe
estar compuesto únicamente por símbolos terminales. Si no llego, entonces no
pertenece al lenguaje.
Ej: Σ* , Σ = {0, 1}
Def. recursiva de Σ* 1) ε ∈ Σ*
2) ax ∈ Σ*, si a ∈ Σ y x ∈ Σ*
3) Estas son todas las tiras del lenguaje.
Las reglas de producción serían :
S→ε
S → 0S
S → 1S
y para derivar aplicamos cualquier regla, según lo que se quiera obtener.
Si aplico S → ε, obtengo la tira vacía : S ⇒ ε
Si aplico S → 0S, y luego S → ε, obtengo la tira 0 : S ⇒ 0S ⇒ 0
Si aplico S → 1S, luego S → 0S y luego S → ε, obtengo la tira 10 :
S⇒1S⇒10S⇒10
Def.: Sea una GLC (gramática libre de contexto) G:(V, T, P, S), el conjunto de
tiras generado es el conjunto de las tiras pertenecientes a los símbolos
terminales que pueden ser derivados a partir del símbolo inicial.
L = L(G) = {x, x ∈ T* / S ⇒* x }
Con el 2) me aseguro que por más que aplique cualquier regla de la gramática,
la tira generada pertenece al lenguaje.
1) IC en el largo de x
PB) k=1, 01 ∈ L, ∃ S → 01 » se cumple
Hi) |x| = 2k, x ∈ L » x ∈ L(G). Se toma |x| = 2k porque las tiras son
de largo par.
Ti) |x| = 2k + 2, x ∈ L » x ∈ L(G).
x ∈ L » x = 0k+11k+1 = 00k1k1. Haremos y = 0k1k » x = 0y1 con y ∈
L,
» |y| = 2k, » por Hi) y ∈ L(G) , lo que significa que S ⇒* y. Poniendo
0 y 1 a ambos lados tenemos 0S1 ⇒* 0y1 » como x = 0y1, 0S1 ⇒*
x. Como ∃ una regla S → 0S1, S ⇒ 0S1 ⇒* x » S ⇒* x » x ∈ L(G)
LQQD
ARBOL DE DERIVACIÓN :
Es una estructura de árbol donde los nodos (o vértices) interiores son siempre
variables, mientras que las hojas son siempre terminales o ε. La raíz del árbol
es el símbolo inicial.
Raiz
Interiores
Hojas
Que un nodo A tenga “hijos” (x1, x2, .., xn) significa que ∃ la regla A → (x1, x2, ..,
xn) con A ∈ P
S
A
x1 x2
Ejemplo: Supongamos que tenemos una gramática con las siguientes reglas
(representaría el álgebra de Boole).
S→S∧S
S→S∨S
S → (S)
S → true
S → false
S ∧ S
true S ∨ S
false true
S ∨ S
S ∧ S true
true false
Gramática Ambigua
Se dice que una gramática es ambigua si se puede construir por lo menos uno
de los siguientes casos :
1) Se pueden construir 2 árboles de derivación diferentes.
2) Se pueden construir 2 derivaciones de más a la izquierda distintas.
3) Se pueden construir 2 derivaciones de más a la derecha distintas.
Paso BASE
ER GLC : (V, T, P, S) con V={S}, T={a}
φ P = {}
ε P={S→ε}
a∈Σ P={S→a}
Paso INDUCTIVO
Hi) L1 = L(r1) ⇒ ∃ G1 : (V1, T1, P1, S1) / L1 = L(G1)
L2 = L(r2) ⇒ ∃ G2 : (V2, T2, P2, S2) / L2 = L(G2)
Demostración Ti1) r1|r2 , L3 = L(r1 | r2) ⇒ ∃ G3 : (V3, T3, P3, S3) / L3 = L(G3)
V3 = V1 ∪ V2 ∪ {S3 }
T3 = T1 ∪ T2
P3 = P1 ∪ P2 ∪ {S3 → S1 , S3 → S2 }
Si se empieza a ejecutar la derivación por S3 → S1 entonces a partir de ahí
aplico las reglas de P1 (que está incluido en P3). Si empiezo a aplicar las reglas
por S3 → S2 entonces a partir de ahí aplico las reglas de P2 (que también está
incluido en P3).
S3 ⇒ S1 ⇒* x , x ∈ L1
S3 ⇒ S2 ⇒* x , x ∈ L2
Como S3 solo genera tiras de L1 o de L2, entonces L3 genera tiras de r1 | r2 , por
lo tanto L3 = L(G3)
Gramáticas regulares
Ejemplo : ( 0 | 1 )*
Una gramática lineal derecha para este LR sería:
A → 0A | 1A | ε
Ejemplo : 001*0
Una gramática lineal izquierda sería
A → B0
B → C | B1
C → 00
NOTA : Lo que tenemos que asegurar en estos casos es tener una regla que
haga que pare la recursión.
S → 0S1 | 0D | BC
A → 11A | 1
B → B0 | 0
C → 00C
D → D0 | E | ε
E→0
A menos que el lenguaje acepte las tiras vacías como válidas, buscaremos que
no hayan reglas anulables. Esto significa no tener Producciones-ε. Si el
lenguaje acepta la tira vacía, la única regla que tendremos será S → ε.
Simplificación de producciones - ε
Lo que hacemos es construir una gramática nueva sin producciones - ε. Se
debería probar (no se hará en el curso) es que el lenguaje que genera esta
nueva gramática es el mismo que la original, sin las tiras vacías. Esto es probar
que L(G) – { ε } = L(G’). La nueva gramática G’ no reconoce las tiras vacías, y si
es necesario (ya que el lenguaje original si las reconoce), entonces se debe
agregar la regla S → ε.
ALGORITMO :
1) Eliminar la producción - ε : Mi → ε
2) Para toda regla que sea del tipo A → M1 M2 ... Mi ... Mn con Mi anulable
agregar la regla A → M1 M2 ... Mi-1 Mi+1 ... Mn
3) Si hay más producciones - ε (o sea anulables) ir al paso 1)
4) Si no hay mas ⇒ FIN
ALGORITMO :
1) Eliminar la producción unitaria : A → B
2) Para toda regla que sea del tipo B → α agregar la regla A → α. Si se
llega a una regla del tipo A → A, estas se eliminan.
3) Si hay más producciones unitarias ir al paso 1)
4) Si no hay mas ⇒ FIN
ALGORITMO :
1) Construir {POSITIVAS} = { A / A ∈ V, ∃ una regla A → w ∈ P, w ∈ T*}
2) Para toda variable A que no pertenezca {POSITIVAS}
Si existe una regla A → α ∈ P / α ∈ ( {POSITIVAS} ∪ T)*
Entonces {POSITIVAS} = {POSITIVAS} ∪ { A } (agregar A al
conjunto {POSITIVAS}).
3) Si cambió en conjunto {POSITIVAS} ir al paso 2)
4) Si no cambió, entonces hacer P’ = {reglas ∈ P / todas las variables que
intervienen ∈ {POSITIVAS} )
5) FIN
En el ejemplo anterior:
P = { S → 0S1 | 0D | BC , A → 11A | 1 , B → B0 | 0 , C → 00C , D → D0 | E | ε ,
E → 0}
Se haría :
Paso 1) {POSITIVAS}1 = {A, B, D, E}
Paso 2) {POSITIVAS}2 = {A, B, D, E, S}
Paso 4) P’ = { S → 0S1 | 0D , A → 11A | 1 , B → B0 | 0 , D → D0 | E | ε , E → 0}
ALGORITMO :
1) Construir {ALCANZABLES} = { S }
2) Para toda regla
Si existe una regla A → αBβ ∈ P / A ∈ {ALCANZABLES} , α y β∈T* y
B ∉ {ALCANZABLES}
Entonces {ALCANZABLES} = {ALCANZABLES} ∪ { B } (agregar B
al conjunto {ALCANZABLES}).
3) Si cambió en conjunto {ALCANZABLES} ir al paso 2)
4) Si no cambió, entonces hacer P’ = {reglas ∈ P / todas las variables que
intervienen ∈ {ALCANZABLES} )
5) FIN
En el ejemplo anterior:
P = { S → 0S1 | 0D | BC , A → 11A | 1 , B → B0 | 0 , C → 00C , D → D0 | E | ε ,
E → 0}
Se haría :
Paso 1) {ALCANZABLES}1 = { S }
Paso 2) {ALCANZABLES}2 = { S, D }
Paso 2) {ALCANZABLES}3 = { S, D, B }
Paso 2) {ALCANZABLES}4 = { S, D, B, C }
Paso 2) {ALCANZABLES}5 = { S, D, B, C, E }
Paso 4) P’ = { S → 0S1 | 0D | BC, B → B0 | 0 , C → 00C , D → D0 | E | ε , E →
0}
V’ quedaría = {ALCANZABLES} = { B, C, D, E, S}
Normalización
Una gramática se dice que está normalizada cuando está en alguna de las
siguientes formas normales:
La idea para normalizar una gramática como la del ejemplo anterior y llevarlas
a una FNC sería :
1) Para cada regla que no esté en FNC sustituir cada terminal por una
variable y una regla desde la variable al terminal. Sustituir i por Ti y
agregar la regla Ti → i.
S → 0S1 | 0D | 0
D → D0 | 0
Lo hacemos
S → T0ST1 | T0D | 0
D → D T0 | 0
T0 → 0
T1 → 1
2) Para las reglas que tengan del lado derecho más de 2 variables hacer
un nuevo cambio de variable agrupando de a 2 y generando nuevas
reglas.
Aplicando a las anteriores se haría
S → AT1 | T0D | 0
D → D T0 | 0
T0 → 0
T1 → 1
A → T0 S
δ : Q x Σ ∪ {ε} x Γ → 2Q x Γ*
(a, x, α)
p q
Un arco de un estado q a uno p lo vamos a rotular con una terna (a, x, α),
donde p y q ∈ Q, a ∈ Σ, x ∈ Γ, α ∈ Γ*.
q0
Descripción Instantánea
Es como si se sacara una fotografía del APD en un momento dado. Es una
terna (q, w, α), con q ∈ Q es el estado corriente, w ∈ Σ* es lo que queda por
consumir de la tira de entrada y α ∈ Γ* es el stack propiamente dicho. El
símbolo de más a la derecha de α (si no está vacío) es Z0.
(2, z0, ε)
(1, 0, ε) (2, z0, z0)
Se puede borrar el stack
q0 q1 q2 Cuando empiezo a recibir
2, se marcan en rojo.
(0, z0, 0z0) (1, 0, ε) (2, z0, z0)
(0, 0, 00) (2, ε, ε)
q0 q1 q2
Q’ = Q ∪ {( qs’, q0’)}
Γ’ = Γ ∪ {( Z0’)}
Q’ = Q ∪ {( qs’, q0’)}
Γ’ = Γ ∪ {( Z0’)}
M’
Como la gramática está en FNG, todas las reglas de producción son del tipo :
A → aα a ∈ T, α ∈ V*
(q, α) ∈ δ(q, a, A)
S ⇒* x si y solo si (q0, x, S) ├ (q0, ε, ε) x ∈ T*
Ejemplo : S → aSB | aB
B→b
Según el teorema anterior haríamos:
δ(q, a, S) = {(q, SB), (q, B)}
δ(q, b, B) = {(q, ε)}
Veamos la tira x = aaabbb
Para la gramática sería :
S ⇒1 aSB ⇒1 aaSBB ⇒2 aaaBBB ⇒3 aaabBB ⇒3 aaabbB ⇒3 aaabbb
Para el APD sería :
Inicia con el stack = SZ0
Leo “a”, aplico la 1° regla agrego B al stack = SBZ0
Leo “a”, aplico la 1° regla agrego B al stack = SBBZ0
Leo “a”, aplico la 2° regla quito S del stack = BBZ0
Leo “b”, aplico la 3° regla quito B del stack = BZ0
Leo “b”, aplico la 3° regla quito B del stack = Z0
Leo “b”, aplico la 3° regla quito Z0 del stack = ∅
Por lo tanto se llega al final de la tira y está el stack vacío, por lo que el APD la
reconoce como válida.
(1, 0, ε)
q0 q1
Pumping Lemma
Si L es un lenguaje libre de contexto que no contiene ε entonces existe un n
natural donde para toda tira perteneciente a L de largo mayor o igual a n, existe
al menos una descomposición de esa tira en 5 sub-tiras uvwxy que cumplen:
|uv| ≥ 1
|vwx| ≤ n
∀ i ≥ 0, u vi w xi y ∈ L
A
n1
y
A
n2
x
u
v
w
Notese que la concatenación de uvwxy es el z, no queda ningún nodo afuera
La derivación sería : S ⇒* uAy
A ⇒* vAx
A ⇒* w
ii) |vwx| ≤ n
Tomemos el nodo “n1” que estamos considerando. Desde ahí para
abajo, a lo sumo la altura será ≤ k+1, ya que como elegimos de todas
las variables que se repitieran la que estuvieran más cerca de las
hojas, no se repetirá otra variable, y si estuvieran todas las k, la
altura sería a lo sumo k+1.
⇒ altura (n1) ≤ k + 1, ⇒ cant.hojas(n1) ≤ 2k+1 = n, ⇒ |n1| ≤ n, y
como n1 = vwx, ⇒ |vwx| ≤ n
iii) ∀ i ≥ 0, u vi w xi y ∈ L
S ⇒* uAy ⇒* uvAxy ⇒* uvvAxxy ⇒* uviAxiy ⇒* uviwxiy,
⇒ ∀ i > 0, u vi w xi y ∈ L ya que hay una secuencia de derivación que
lo construye. Si i = 0 , S ⇒* uAy ⇒* uwy, que también ∈ L,
⇒ se cumple.
Lema de OGDEN
Es una propiedad más fuerte que el Pumping Lemma.
Si L es un Lenguaje Libre de Contexto, existe un “n” natural tal que para todo
“z” que pertenezca a L se cumple que dist(z) ≥ n, y existe una descomposición
z = uvwxy tal que cumple con las condiciones mencionadas más abajo.
“dist” es una función que permite “contar” las posiciones distinguidas en la tira
Z. Lo que hacemos es “distinguir” (se puede ver como elegir o marcar) n
símbolos de Z. dist : T → N
H) L es LLC
T) ∃ n ∈ N / ∀ z ∈ L y dist(z) ≥ n, ∃ z = uvwxy tal que:
i) dist(vx) ≥ 1
ii) dist(vwx) ≤ n
iii) ∀ i ≥ 0, zi = u vi w xi y ∈ L
zi = at br+ip+l+iq+n-r-p-l-q cn dn
zi = at bn+(i-1)(p+q) cn dn
tomando i=0 z0 = at bn-p-q cn dn ∉ L, porque cantb(z0) < cantc(z0)
h) v ∈ ap bn cn dn, x ∈ dn
….
Cada uno de estos casos habría que demostrarlos, de la misma forma en que
se hizo el primer caso. Al igual que con el Pumping Lema, se podría agrupar
aquellos que se demuestran en forma similar.
Se pueden presentar algunos casos en forma más genérica, que resume varios
casos :
h') v ∈ ap bn cr, x ∈ cp dq con r, p y q cumpliendo determinadas condiciones.
El cuidado que hay que tener con esta aplicación es elegir apropiadamente los
símbolos distinguidos. Si en este ejemplo hubiéramos elegido como
distinguidos a bn cn dn, la cantidad de casos que debemos plantear es mucho
menor.
Ej.: f(a b) = 0n 1m # w s # w r
S → aSb | ab
S → S0 S S1 | S0 S1 Esta es la gramática de la sustitución.
S0 → 0 S0 1 | 0 S0 | 01 | 0
S1 → # T
T → 0 T0 | 1 T1 | #
L1 ∩ L2 = { ak bk ck } NO es un LLC
Proposición :
L es LLC, R es regular ⇒ L ∩ R es LLC
Jerarquía de Chomsky
Lenguajes recursivamente numerables : Son aquellos que pueden ser definidos
por las gramáticas irrestrictas.
Gramáticas Irrestrictas
La diferencia con las gramáticas anteriores (lo que las caracteriza) son las
reglas de producción. Del lado izquierdo o derecho puedo tener cualquier
combinación de símbolos o variables. Del lado izquierdo no puedo tener ε.
Tipo 3
Tipo 2
Tipo 1
Tipo 0
Teorema de jerarquía:
Los lenguajes tipo i+1 están contenidos en los tipo i, i = 0 .. 2
y aplicando sucesivamente las reglas se llegaría a tener para cada “p” la misma
cantidad de “B” que de “a”. Lo que se hace es introducir un símbolo “B” por
cada “p” y mediante las reglas lleva junto al “#”, para luego convertirlo en “#b”.
Máquina de Turing
Está asociada a las gramáticas irrestrictas. En este tipo de máquinas se
maneja memoria infinita.
M : (Q, Σ, Γ, δ, q0, b , F)
w ∈ Σ* es la tira a chequear
El resto de la cinta está con
b b .... b w b b .... b
blancos. b ∉ Σ. El símbolo que
q0
denota el blanco no puede pertenecer
al alfabeto de entrada.
b ∈Γ
Σ ⊂ Γ - {b }
δ : Q x Γ → Q x Γ x {I, D}
Ejemplo : Máquina de Turing para an # bm, con m = p*n (o sea que la cantidad
de b es múltiplo de la cantidad de a)
La idea sería marcar para cada “a” una “b” correspondiente. Si marqué todas
las “a” y no me quedan “b” sin marcar, entonces desmarco las “a” y vuelvo a
empezar (deja las “b” marcadas). Si llego a que quedan “a” sin marcar pero no
quedan “b”, entonces no es válida. Si marqué todas las “a” y llego a b (marqué
todas las “b”) entonces es válida.
(X, Y, Z)
q0 q1
(a, a, D) (B, B, D)
(#, #, D) (X, X, D)
(b, b , D)
(B, B, D) q4 (B, B, I)
q5 (#, #, I)
(b, b , I) (X, a, I)
qf