Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Automata de Pila
Automata de Pila
Automata De Pila
AUTOMATA DE PILA(AP)
Definicin
Autmata que extiende la potencia reconocedora de lenguajes del autmata finito aadiendo una memoria interna tipo pila (contador de simbolos). El funcionamiento del AP se realiza de acuerdo con alguna forma de gramtica.
PILA
Push(3) 3 Push(5) 5 3 Push(1) 1 5 3 Pop 5 3 Pop 3 Push(2) 2 3
AP
Definicin formal Septupla AP={ E, 7, 7p, H, I0, P0, F }
E
7 7p H I 0 E
: : : : :
conjunto finito de estados alfabeto del sistema alfabeto de la pila funcin de transicin estado inicial estado inicial de la pila conjunto de estados finales
P0 7 p : F E :
AP
Configuracin de un AP
(Ii , w, a) Donde: Ii : estado actual del AP w :Subcadena por analizar en el instante T a :Contenido de la pila en el instante T
Observacin:
w y a pueden ser la secuencia P Si w = P no hay nada mas por analizar Si a = P la pila no tiene nada, esta vaca
AP
Movimiento en un AP Transicin entre dos configuraciones (Ii , aw, pa) (Ij , w, ua)
TIPOS DE AP
Autmata de Pila determinista (APD) Cuando estando en una configuracin se pasa solo a otra configuracin. Autmata de Pila no determinista (APN) Cuando a partir de una configuracin puede pasarse a una o mas configuraciones
SECUENCIA ACEPTADA
Configuracin inicial (I0 , w, P0) w7 Configuracin final (If , P, a) If F a 7p* Un AP acepta una secuencia w si puede llegarse de la configuracin inicial a la configuracin final: (I0 , w, P0) * (If , P, a)
LENGUAJE ACEPTADO
El lenguaje es aceptado por el AP cuando se llega al estado final que se denota por:
Ejemplo 1
Construimos un AP : AP={ E, 7, 7p, H, I0, P0, F } E
7 7p
x, P; x
= = =
I0
y, x ; P
I0 E :
x 7p : F =
1.(I0 , x, P ; I0 , x ) 2.(I0 , y, x ; I0 , P )
push pop
Ejemplo 1
1.(I0 , x, P ; I0 , x ) 2.(I0 , y, x ; I0 , P )
x, P; x push pop
I0
y, x ; P
b)
c)
Ejemplo 1
Secuencia que no pertenece al lenguaje (I0 , xyyx, P) 1 (I0 , yyx, x) 2 (I0 , yx, P) ?
push
x, P; x
I0
pop y, x ; P
1.(I0 , x, P ; I0 , x ) 2.(I0 , y, x ; I0 , P )
Observacion
No existe transicin alguna para poder continuar y aceptar la secuencia como parte del lenguaje.
Ejemplo 1
Observacin El AP es un APD ya que para cada configuracin solo existe una transicin y nada mas que una hacia otra configuracin.
autopila2
Ejemplo 1
Programa
class ARREGLO{ char vector[100]; char pila[100]; int i,tope; public: ARREGLO(char m[]){ tope=100;strcpy(pila,m);i=strlen(pila);} bool OCUPADO(){ if (i>=tope) return true; else return false; } bool VACIO(){ if(i<=0) return true; else return false; } void METER(char a){ char t[2]; t[0]=a;t[1]='\0'; strcat(pila,t); i=strlen(pila); } char SACAR(){ char a; int k=strlen(pila); a=pila[k-1]; pila[k-1]='\0'; i=strlen(pila); return a; }
bool reconocedor(char x[]){ strcpy(vector,x); int e=0; int j=0; char temp; while(j<strlen(vector)){ switch(e){ case 0: if(vector[j]=='x'){ METER('x'); } else { if(!VACIO()){ temp=SACAR(); if(vector[j]=='y' && temp=='x'){ ;} else e=3; } else e=3; } break; } j++; }//fin de while if(e==0) return true; else return false; } }; int main(){ char cadena[100]; char pila[100]; cout<<"\n INGRESE CADENA A RECONOCER: ";cin>>cadena; cout<<"\n INGRESE PILA : ";cin>>pila; if(!strcmp(pila,"v")) strcpy(pila,""); ARREGLO tira(pila); if(tira.reconocedor(cadena)) cout<<"\n verdadero"; else cout<<"\n falso"; getch(); }
Ejemplo 2
Construir un AP que reconosca el siguiente lenguaje:
L(G)={7 ={x, y} / w=xn w=yn donde n=2 } Secuencias reconocidas por el lenguaje: yy, xx Secuencias no reconocidas: x, y, yyxx, xyyx , xyyxx
Ejemplo 2
Construimos el AP : AP={ E, 7, 7p, H, I0, P0, F }
E
7 7p
P,x;P
x, P;x
x,x;P
= = =
I0
y,P;y
I1
P,y;P
I2
y,y;P
I 0 E : P 7p :
Ejemplo 2
En (a) y (b) el AP reconoce las secuencias, sin embargo no ocurre lo mismo en (c). 1.(I0 , x, P ; I1 , x ) 2.(I0 , y, P ; I1 , y ) 3.(I1 , P, x ; I1 , P ) 4.(I1 , P, y ; I1 , P ) 5.(I1 , x, x ; I2 , P ) 6.(I1 , y, y ; I2 , P ) a) (I0 , xx, P) 1 (I1 , x, x) 5 (I2 , P, P) b) (I0 , yy, P) 2 (I1 , y, y) 6 (I2 , P, P) x, P;x
P,x;P
x,x;P
I0
y,P;y
I1
P,y;P
I2
y,y;P
Ejemplo 2
Observacin El AP es un APN x, P;x
P,x;P
x,x;P
I0
y,P;y
I1
P,y;P
I2
y,y;P
autopila
Ejemplo 2
Programa
class ARREGLO{ char vector[100]; char pila[100]; int i,tope; public: ARREGLO(char m[]){ tope=100;strcpy(pila,m); i=strlen(pila);} bool OCUPADO(){ if (i>=tope) return true; else return false; } bool VACIO(){ if(i<=0) return true; else return false; } void METER(char a){ char t[2]; t[0]=a;t[1]='\0'; strcat(pila,t); i=strlen(pila); } char SACAR(){ char a; int k=strlen(pila); a=pila[k-1]; pila[k-1]='\0'; i=strlen(pila); return a; }
bool reconocedor(char x[]){ strcpy(vector,x); int e=0; int j=0; char temp; while(j<strlen(vector) && e!=2){ switch(e){ case 0: if(vector[j]=='x' ){ e=1; METER('x'); } else if(vector[j]=='y' ){ e=1; METER('y'); } else e=3; break; case 1:if(!VACIO()){ temp=SACAR(); if( temp=='x'){ if(vector[j]=='x') e=2; else {e=1; j--;} } else if( temp=='y'){ if(vector[j]=='y')e=2; else {e=1; j--;} } else e=3; }else e=3; break; } j++; }//fin de while if(e==2 && (j==strlen(vector)) ) return true; else return false; } }; int main(){ char cadena[100]; char pila[100]; cout<<"\n INGRESE CADENA A RECONOCER: ";cin>>cadena; cout<<"\n INGRESE PILA : ";cin>>pila; if(!strcmp(pila,"v")) strcpy(pila,""); ARREGLO tira(pila); if(tira.reconocedor(cadena)) cout<<"\n verdadero"; else cout<<"\n falso"; getch(); }
Ejemplo 3
Construir el automata de pila a partir del siguiente lenguaje
= {a, b}.
push push pop pop pop
a, Z;AZ b,A; P
b,A;P
P,Z;P
I0
a,A;AA
I1
I2
autopila3
Ejemplo 3
a, Z;AZ 1.(I0 , a, Z ; I0 , AZ ) 2.(I0 , a, A ; I0 , AA ) 3.(I0 , b, A ; I1 , P ) 4.(I1 , b, A ; I1 , P ) 5.(I1 , P, Z ; I2 , P )
push push pop pop pop
b,A;P b,A; P
P,Z;P
I0
a,A;AA
I1
I2
ab
estado Estado estado 0 1 2
a b I0 I1
P I2
Ejemplo 3
programa
class ARREGLO{ char vector[100]; char pila[100]; int i,tope; public: ARREGLO(char m[]){ tope=100;strcpy(pila,m); i=strlen(pila);} bool OCUPADO(){ if (i>=tope) return true; else return false; } bool VACIO(){ if(i<=0) return true; else return false; } void METER(char a){ char t[2]; t[0]=a;t[1]='\0'; strcat(pila,t); i=strlen(pila); } char SACAR(){ char a; int k=strlen(pila); a=pila[k-1]; pila[k-1]='\0'; i=strlen(pila); return a; } bool reconocedor(char x[]){ strcpy(vector,x); int e=0; int j=0; char temp; while(j<=strlen(vector)){ switch(e){ case 0:if(!VACIO()){ temp=SACAR(); if(vector[j]=='a' && temp=='Z'){ e=0; METER('Z'); METER('A'); } else if(vector[j]=='a' && temp=='A' ){ e=0; METER('A');METER('A'); else if(vector[j]=='b' && temp=='A' ) e=1; else e=3; }else e=3; break; case 1:if(!VACIO()){ temp=SACAR(); if( vector[j]=='b' && temp=='A') e=1; else if( vector[j]=='\0' && temp=='Z' ){ e=2;METER('Z'); } else e=3; }else e=3; break; } j++; }//fin de while if(e==2 ) return true; else return false; } }; int main(){ char cadena[100]; cout<<"\n INGRESE CADENA A RECONOCER: ";cin>>cadena; ARREGLO tira("Z"); if(tira.reconocedor(cadena)) cout<<"\n verdadero"; else cout<<"\n falso"; getch(); }
Ejercicios
Escriba el autmata de pila y su programa para los siguientes lenguajes
1. 2. 3. 4.