Académique Documents
Professionnel Documents
Culture Documents
Automata De Pila
PILA
Push(3) Push(5) Push(1) Pop Pop Push(2)
1
5 5 5 2
3 3 3 3 3 3
AP
Definición formal
Septupla AP={ E, , p, , 0, P0, F }
p : alfabeto de la pila
: función de transición
0 E : estado inicial
(i , w, a)
Donde:
i : estado actual del AP
w :Subcadena por analizar en el instante T
a :Contenido de la pila en el instante T
Observación:
Construimos un AP :
AP={ E, , p, , 0, P0, F }
E = { 0 }
0
= { x, y }
p = {x}
0 E : estado inicial y, x ;
x p : estado inicial de la pila
F = { 0 }
1.(0 , x, ; 0 , x ) push
2.(0 , y, x ; 0 , ) pop
Ejemplo 1
1.(0 , x, ; 0 , x ) push
pop
2.(0 , y, x ; 0 , )
x, ; x
?
1.(0 , x, ; 0 , x )
Observacion 2.(0 , y, x ; 0 , )
No existe transición alguna para poder
continuar y aceptar la secuencia como
parte del lenguaje.
Ejemplo 1
Observación
autopila2
Ejemplo 1 bool reconocedor(char x[]){
strcpy(vector,x);
int e=0;
int j=0;
char temp;
Programa
while(j<strlen(vector)){
switch(e){
case 0:
if(vector[j]=='x'){
METER('x');
class ARREGLO{ }
char vector[100]; else {
char pila[100]; if(!VACIO()){
int i,tope; temp=SACAR();
public: if(vector[j]=='y' && temp=='x'){ ;}
ARREGLO(char m[]){ tope=100;strcpy(pila,m);i=strlen(pila);} else e=3;
bool OCUPADO(){ }
if (i>=tope) else e=3;
return true; }
else return false; break;
} }
bool VACIO(){ j++;
if(i<=0) return true; }//fin de while
else return false; if(e==0) return true;
} else return false;
}
void METER(char a){ };
char t[2]; int main(){
t[0]=a;t[1]='\0'; char cadena[100];
strcat(pila,t); char pila[100];
i=strlen(pila); cout<<"\n INGRESE CADENA A RECONOCER: ";cin>>cadena;
} cout<<"\n INGRESE PILA : ";cin>>pila;
char SACAR(){ if(!strcmp(pila,"v")) strcpy(pila,"");
char a; ARREGLO tira(pila);
int k=strlen(pila); if(tira.reconocedor(cadena))
a=pila[k-1]; cout<<"\n verdadero";
pila[k-1]='\0'; else cout<<"\n falso";
i=strlen(pila); getch();
return a; }
}
Ejemplo 2
Secuencias no reconocidas:
x, y, yyxx, xyyx , xyyxx
Ejemplo 2 ,x;
Construimos el AP : x,x;
x, ;x
AP={ E, , p, , 0, P0, F }
1 2
E = { 0 } 0
= { x, y } y,;y y,y;
p = { x, y } ,y;
0 E : estado inicial
p : estado inicial de la pila
F = { 2 }
1.(0 , x, ; 1 , x ) push
2.(0 , y, ; 1 , y ) push
3.(1 , , x ; 1 , ) pop
4.(1 , , y ; 1 , ) pop
pop
5.(1 , x, x ; 2 , )
pop
6.(1 , y, y ; 2 , )
Ejemplo 2
,x;
x, ;x x,x;
2
En (a) y (b) el AP reconoce las
secuencias, sin embargo no
ocurre lo mismo en (c). 0 1
y,;y y,y;
1.(0 , x, ; 1 , x )
,y;
2.(0 , y, ; 1 , y )
3.(1 , , x ; 1 , )
4.(1 , , y ; 1 , )
5.(1 , x, x ; 2 , )
6.(1 , y, y ; 2 , )
a) (0 , xx, ) b) (0 , yy, ) c) (0 , xxyy, )
1 2 1
(1 , x, x) (1 , y, y) (1 , xyy, x)
5 6 3
(2 , , ) (2 , , ) (1 , xyy, )
?
Ejemplo 2 ,x;
x, ;x x,x;
Observación
1 2
El AP es un APN 0
y,;y y,y;
,y;
1.(0 , x, ; 1 , x )
2.(0 , y, ; 1 , y )
(0 , xx, )
3.(1 , , x ; 1 , )
1
4.(1 , , y ; 1 , )
Se llega a un (1 , x, x)
estado de 5.(1 , x, x ; 2 , )
5 3
aceptación 6.(1 , y, y ; 2 , )
(2 , , ) (1 , x, )
No se puede continuar
autopila
Ejemplo 2 bool reconocedor(char x[]){
strcpy(vector,x);
char temp;
int e=0; int j=0;
4.(1 , b, A ; 1 , ) pop
0 1
5.(1 , , Z ; 2 , ) pop
a,A;AA
autopila3
Ejemplo 3
b,A;
a, Z;AZ
,Z;
b,A;
1.(0 , a, Z ; 0 , AZ ) push
1 2
2.(0 , a, A ; 0 , AA ) push
pop
0
3.(0 , b, A ; 1 , )
4.(1 , b, A ; 1 , ) pop
pop a,A;AA
5.(1 , , Z ; 2 , )
RECONOCER: ab
a
cadena
Cadena
cadena pila
Pila
pila estado
Estado
estado b
1 2
b
ab
Z
Z
AZ 012 0
Ejemplo 3 bool reconocedor(char x[]){
strcpy(vector,x);
int e=0;
int j=0;
programa char temp;
while(j<=strlen(vector)){
switch(e){
case 0:if(!VACIO()){
temp=SACAR();
class ARREGLO{
if(vector[j]=='a' && temp=='Z'){ e=0; METER('Z'); METER('A'); }
char vector[100];
else if(vector[j]=='a' && temp=='A' ){ e=0; METER('A');METER('A'); }
char pila[100];
else if(vector[j]=='b' && temp=='A' ) e=1;
int i,tope;
else e=3;
public:
}else e=3;
ARREGLO(char m[]){ tope=100;strcpy(pila,m); i=strlen(pila);}
break;
bool OCUPADO(){
case 1:if(!VACIO()){
if (i>=tope)
temp=SACAR();
return true;
if( vector[j]=='b' && temp=='A') e=1;
else return false;
else if( vector[j]=='\0' && temp=='Z' ){ e=2;METER('Z'); }
}
else e=3;
bool VACIO(){
}else e=3;
if(i<=0) return true;
break;
else return false;
}
}
j++;
}//fin de while
void METER(char a){
if(e==2 ) return true;
char t[2];
else return false;
t[0]=a;t[1]='\0';
}
strcat(pila,t);
};
i=strlen(pila);
int main(){
}
char cadena[100];
char SACAR(){
cout<<"\n INGRESE CADENA A RECONOCER: ";cin>>cadena;
char a;
ARREGLO tira("Z");
int k=strlen(pila);
if(tira.reconocedor(cadena)) cout<<"\n verdadero";
a=pila[k-1];
else cout<<"\n falso";
pila[k-1]='\0';
getch();
i=strlen(pila);
}
return a;
}
Ejercicios
1.L={ancbm | n,m>0}.
2.L={anbm | n m, n,m>0}.
3.L={anbm | n m, n,m≥0}.
4.L = {aibjck | i, j>0 y k=i+j}