automata de pila

Post on 26-Mar-2015

1.240 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Lenguajes y Compiladores

Profesor: Carlos A. Ruiz De La Cruz Melo

Correo:zorroculto69@hotmail.com

Automata De Pila

AUTOMATA DE PILA(AP)Definición

Autómata que extiende la potencia reconocedora de lenguajes del autómata finito añadiendo una memoria interna tipo pila (“contador de simbolos”).

El funcionamiento del AP se realiza de acuerdo con alguna forma de gramática.

Push(3)

3

Push(5)

53

Push(1)153

Pop

53

Pop

3

Push(2)

23

PILA

AP

Definición formalSeptupla AP={ E, , p, , 0, P0, F }

E : conjunto finito de estados

: alfabeto del sistema

p : alfabeto de la pila

: función de transición

0 E : estado inicial

P0 p : estado inicial de la pila

F E : conjunto de estados finales

APConfiguración de un AP

(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:

w y a pueden ser la secuencia Si w = no hay nada mas por analizar Si a = la pila no tiene nada, esta vacía

APMovimiento en un AP

Transición entre dos configuraciones

(i , aw, pa) (j , w, ua)

Movimiento válido si (j , u) (i , a, p) Donde:

i , j E a {}w * u p

TIPOS DE AP Autómata de Pila determinista (APD) Cuando estando en una configuración se pasa solo a otra

configuración.

Autómata de Pila no determinista (APN) Cuando a partir de una configuración puede pasarse a una o

mas configuraciones

SECUENCIA ACEPTADAConfiguración inicial (0 , w, P0) w

Configuración final (f , , a) f F a p*

Un AP acepta una secuencia w si puede llegarse de la configuración inicial a la configuración final:

(0 , w, P0) * (f , , a)

LENGUAJE ACEPTADO

El lenguaje es aceptado por el AP cuando se llega al estado final que se denota por:

L(AP)={ w */ (0 , w, P0) * (f , , a), f F }

Ejemplo 1

E = { 0 }

= { x, y }

p = { x }

0 E : estado inicial

x p : estado inicial de la pila

F = { 0 }

Construimos un AP :

AP={ E, , p, , 0, P0, F }

0

x, ; x

y, x ;

1.(0 , x, ; 0 , x )

2.(0 , y, x ; 0 , )

push

pop

Ejemplo 1

(0 , xy, )

(0 , y, x)

(0 , , )

1

2

(0 , yxyx, x)

(0 , xyx, )

(0 , yx, x)

(0 , x, )

(0 , , x)

2

1

2

1

(0 , yxx, x)

(0 , xx, )

(0 , x, x)

(0 , , xx)

2

1

1

a) b) c)0

x, ; x

y, x ;

1.(0 , x, ; 0 , x )

2.(0 , y, x ; 0 , )

push

pop

Ejemplo 1

(0 , xyyx, )

(0 , yyx, x)

(0 , yx, )

1

2

Secuencia que no pertenece al lenguaje

Observacion

No existe transición alguna para poder continuar y aceptar la secuencia como parte del lenguaje.

?

0

x, ; x

y, x ;

1.(0 , x, ; 0 , x )

2.(0 , y, x ; 0 , )

push

pop

Ejemplo 1

Observación

El AP es un APD ya que para cada configuración solo existe una transición y nada mas que una hacia otra configuración.

autopila2

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 1

Programa

Ejemplo 2

Construir un AP que reconosca el siguiente lenguaje:

L(G)={ ={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

E = { 0 }

= { x, y }

p = { x, y }

0 E : estado inicial

p : estado inicial de la pila

F = { 2 }

Construimos el AP :

AP={ E, , p, , 0, P0, F }

1.(0 , x, ; 1 , x )

2.(0 , y, ; 1 , y )

3.(1 , , x ; 1 , )

4.(1 , , y ; 1 , )

5.(1 , x, x ; 2 , )

6.(1 , y, y ; 2 , )

2

,x;

01

,y;

x, ;x

y,;y

x,x;

y,y;

push

pop

push

pop

pop

pop

Ejemplo 2

(0 , xx, )

(1 , x, x)

(2 , , )

1

5

a)

En (a) y (b) el AP reconoce las secuencias, sin embargo no ocurre lo mismo en (c).

(0 , yy, )

(1 , y, y)

(2 , , )

2

6

b) (0 , xxyy, )

(1 , xyy, x)

(1 , xyy, )

1

3

c)

?

1.(0 , x, ; 1 , x )

2.(0 , y, ; 1 , y )

3.(1 , , x ; 1 , )

4.(1 , , y ; 1 , )

5.(1 , x, x ; 2 , )

6.(1 , y, y ; 2 , )

2

,x;

01

,y;

x, ;x

y,;y

x,x;

y,y;

Ejemplo 2Observación

El AP es un APN

(0 , xx, )

(1 , x, x)

(2 , , )

1

5

(1 , x, )

3

Se llega a un estado de aceptación

No se puede continuar

2

,x;

01

,y;

x, ;x

y,;y

x,x;

y,y;

1.(0 , x, ; 1 , x )

2.(0 , y, ; 1 , y )

3.(1 , , x ; 1 , )

4.(1 , , y ; 1 , )

5.(1 , x, x ; 2 , )

6.(1 , y, y ; 2 , )

autopila

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 2

Programa

1.(0 , a, Z ; 0 , AZ )

2.(0 , a, A ; 0 , AA )

3.(0 , b, A ; 1 , )

4.(1 , b, A ; 1 , )

5.(1 , , Z ; 2 , )

Sea L = {a nb n : n>=0} sobre Σ= {a, b}.

Construir el automata de pila a partir del siguiente lenguaje

Ejemplo 3

2

b,A;

01

a,A;AA

a, Z;AZ

b,A; ,Z;

autopila3

push

push

pop

pop

pop

2

b,A;

01

a,A;AA

a, Z;AZ

b,A; ,Z;

1.(0 , a, Z ; 0 , AZ )

2.(0 , a, A ; 0 , AA )

3.(0 , b, A ; 1 , )

4.(1 , b, A ; 1 , )

5.(1 , , Z ; 2 , )

push

push

pop

pop

pop

Ejemplo 3

201

a

201

b20

1

cadena pila estado

ab Z 0

cadena pila estado

b AZ 0

Cadena Pila Estado

Z 1

cadena pila estado

2

RECONOCER: ab

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();}

Ejemplo 3

programa

Ejercicios

Escriba el autómata de pila y su programa para los siguientes lenguajes

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}

El programa puede ser en java o C++

top related