Disenar un PDA para el lenguaje {a^n b^m c^k | k = |n - m|}
Fuente: Parcial 2 — ST0270-1587 (2024-2)
Enunciado
Disenar un automata de pila (no deterministico) que acepte el lenguaje:
L={anbmck∣k=∣n−m∣∧n≥0∧m≥0}
La operacion ∣⋅∣ representa el valor absoluto y se define, para todo numero real x, como: ∣x∣=x si x≥0, y ∣x∣=−x si x<0.
La intuicion: la pila lleva la cuenta del desbalance
El lenguaje pide cadenas anbmck donde k es la diferencia absoluta entre n y m. Es decir, las c‘s compensan lo que sobre de a‘s o de b‘s. Como hay valor absoluto, hay dos casos: que haya mas a‘s que b‘s, o al reves. Eso nos obliga a usar no determinismo porque el PDA tiene que “adivinar” al inicio cual caso aplica.
La idea central es usar la pila como contador. En el caso n≥m: apilamos una marca por cada a, desapilamos una por cada b, y lo que quede en la pila lo desapilamos con las c‘s. En el caso n<m: tambien apilamos por cada a, desapilamos con las b‘s, pero cuando se acaban las marcas de a‘s empezamos a apilar por cada b sobrante, y luego las c‘s desapilan esas marcas.
El truco es que el PDA elige no deterministicamente que rama seguir al leer la primera b. Si adivina correctamente, la pila queda vacia justo al terminar las c‘s y el automata acepta. Si adivina mal, esa rama se atora. Como es no deterministico, con que una rama acepte, la cadena es aceptada.
NPDA
M=({q0,q1,q2,q3,q4,qf},{a,b,c},{X,Z0},δ,q0,Z0,{qf})
Acepta por estado final.
Transiciones
δ(q0,a,Z0)δ(q0,a,X)δ(q0,b,X)δ(q0,b,Z0)δ(q0,ε,Z0)δ(q0,ε,X)δ(q1,b,X)δ(q1,ε,X)δ(q1,ε,Z0)δ(q2,c,X)δ(q2,ε,Z0)δ(q3,b,X)δ(q3,b,Z0)δ(q4,b,X)δ(q4,ε,X)={(q0,XZ0)}={(q0,XX)}={(q1,ε),(q3,ε)}={(q3,XZ0)}={(qf,ε)}={(q2,X)}={(q1,ε)}={(q2,X)}={(qf,ε)}={(q2,ε)}={(qf,ε)}={(q3,ε)}={(q4,XZ0)}={(q4,XX)}={(q2,X)}Traza: aabc (n=2,m=1,k=1)
(q0,aabc,Z0)⊢(q0,abc,XZ0)⊢(q0,bc,XXZ0)⊢(q1,c,XZ0)⊢(q2,c,XZ0)⊢(q2,ε,Z0)⊢(qf,ε,ε)✓Automata
Solucion
Analisis del lenguaje
El lenguaje es L={anbmck∣k=∣n−m∣∧n≥0∧m≥0}.
Hay dos casos:
- n≥m: entonces k=n−m, es decir, k+m=n. Las c‘s compensan el exceso de a‘s sobre b‘s.
- n<m: entonces k=m−n, es decir, k+n=m. Las c‘s compensan el exceso de b‘s sobre a‘s.
Idea del PDA
Usamos un NPDA que de forma no determinista elige entre los dos casos:
- Caso n≥m: Apilamos una marca por cada a. Luego, por cada b, desapilamos una marca. Si sobran marcas en la pila despues de las b‘s, las desapilamos con las c‘s.
- Caso n<m: Apilamos una marca por cada a. Luego, por cada b, primero desapilamos las marcas de las a‘s, y cuando se acaban, apilamos marcas por las b‘s sobrantes. Las c‘s desapilan estas marcas.
Definicion formal
M=({q0,q1,q2,q3,q4,qf},{a,b,c},{X,Z0},δ,q0,Z0,{qf})
El automata acepta por estado final.
Transiciones
Estado q0 (leyendo a‘s):
δ(q0,a,Z0)δ(q0,a,X)={(q0,XZ0)}={(q0,XX)}Transicion no determinista al empezar a leer b‘s:
δ(q0,b,X)δ(q0,b,X)δ(q0,b,Z0)δ(q0,ε,Z0)δ(q0,ε,X)={(q1,ε)}∋(q3,ε)={(q3,XZ0)}={(qf,ε)}={(q2,X)}(caso n≥m)(caso n<m, mismo origen)(caso n=0)(caso n=m=k=0)(caso m=0, saltar a leer c’s)Estado q1 (caso n≥m, desapilando a‘s con b‘s):
δ(q1,b,X)δ(q1,ε,X)δ(q1,ε,Z0)={(q1,ε)}={(q2,X)}={(qf,ε)}(quedan a’s, pasar a leer c’s)(n=m,k=0)Estado q2 (leyendo c‘s, desapilando exceso):
δ(q2,c,X)δ(q2,ε,Z0)={(q2,ε)}={(qf,ε)}Estado q3 (caso n<m, b‘s exceden las a‘s apiladas):
δ(q3,b,X)δ(q3,b,Z0)={(q3,ε)}={(q4,XZ0)}(aun desapilando a’s)(a’s agotadas, apilar exceso de b’s)Estado q4 (apilando exceso de b‘s):
δ(q4,b,X)δ(q4,ε,X)={(q4,XX)}={(q2,X)}(pasar a leer c’s)Ejemplos de aceptacion
| Cadena | n | m | k=∣n−m∣ | Caso | |--------|-----|-----|------|------| | ε | 0 | 0 | 0 | n=m | | aabcc | 2 | 1 | 1 | n>m | | abbbcc | 1 | 3 | 2 | n<m | | ab | 1 | 1 | 0 | n=m | | aacc | 2 | 0 | 2 | n>m | | bbcc | 0 | 2 | 2 | n<m |
Verificacion interactiva
Traza para aabc (caso n>m, k=1):
Traza para ab (caso n=m, k=0):
Verificacion de aabc
- (q0,aabc,Z0)⊢(q0,abc,XZ0) — leer a, apilar X
- (q0,abc,XZ0)⊢(q0,bc,XXZ0) — leer a, apilar X
- (q0,bc,XXZ0)⊢(q1,c,XZ0) — leer b, desapilar X (caso n≥m)
- (q1,c,XZ0)⊢(q2,c,XZ0) — ε-transicion a q2
- (q2,c,XZ0)⊢(q2,ε,Z0) — leer c, desapilar X
- (q2,ε,Z0)⊢(qf,ε,ε) — acepta ✓