Automatocom Pilha Pushdown Automaton 1
Algoritmos Recursivos e Pilhas Princípio Geral em Computação: Qualquer algoritmo recursivo pode ser transformado em um não-recursivousando-se umapilhae um while-loop, que termina apenas quando a pilha está vazia. EX: JVM mantémosregistrosde ativaçãode cada chamada de método. Considere: long factorial(int n){ if (n<=0) return 1; return n*factorial(n-1); } Como JVM executa factorial(5)? 2
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); Compute 5! 3
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); f(5)= 5 f(4) 4
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); f(4)= 4 f(3) f(5)= 5 f(4) 5
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); f(3)= 3 f(2) f(4)= 4 f(3) f(5)= 5 f(4) 6
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); f(2)= 2 f(1) f(3)= 3 f(2) f(4)= 4 f(3) f(5)= 5 f(4) 7
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); f(1)= 1 f(0) f(2)= 2 f(1) f(3)= 3 f(2) f(4)= 4 f(3) f(5)= 5 f(4) 8
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); f(0)= 1 f(1)= 1 f(0) f(2)= 2 f(1) f(3)= 3 f(2) f(4)= 4 f(3) f(5)= 5 f(4) 9
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); 1 1= 1 f(2)= 2 f(1) f(3)= 3 f(2) f(4)= 4 f(3) f(5)= 5 f(4) 10
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); 2 1= 2 f(3)= 3 f(2) f(4)= 4 f(3) f(5)= 5 f(4) 11
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); 3 2= 6 f(4)= 4 f(3) f(5)= 5 f(4) 12
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); 4 6= 24 f(5)= 5 f(4) 13
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); 5 24= 120 14
Algoritmos Recursivos e Pilhas long factorial(int n){ } if (n<=0) return 1; return n*factorial(n-1); Return 5! = 120 15
De CFG s paraautômatoscom Pilha CFG s definem procedimentos recursivos: boolean derives(strings x, y) 1. if (x==y) return true 2. for(all u y) if derives(x,u) return true 3. return false EX: S # asa bsb 16
De CFG s para Máquinas de Pilha Por princípios gerais, qualquer computação recursiva pode ser executada usando-se uma pilha. Isso pode ser feito em uma versão simplificada de máquina com pilha de registro de ativação, chamada Autômato de Pilha ( Pushdown Automaton PDA) Q: Qual é a linguagem gerada por S # asa bsb? 17
De CFG s para Máquinas de Pilha R: Palíndromos em {a,b,#}* contendo exatamente um símbolo #. Q: Usando uma pilha, como podemos reconhecer tais strings? 18
De CFG s para Máquinas de Pilha A: Usamos um processo com três fases: 1. modo Push : Antes de ler #, emplihe qualquer símbolo lido. 2. Ao ler # troque de modo de operação. 3. modo Pop : Leia os símbolos restantes garantindo que cada novo símbolo lido é idêntico ao símbolo desempilhado. Aceite se for capaz de concluir com a pilha vazia. Caso contrário, rejeite; e rejeite se não for possível desempilhar em algum caso. 19
De CFG s para Máquinas de Pilha read ==a ou b? Push it read == top? Pop else: CRASH! (1) PUSH (2) read == #? (ignore stack) (3) POP empty stack? ACCEPT 20
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baa 21
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baa a 22
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baa a a 23
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baa a a a 24
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baa b a a a 25
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baa b a a a 26
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baa a a a 27
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baa a a 28
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baa a REJECT (nonempty stack) 29
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baaa a a 30
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baaa a 31
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baaa Pause input 32
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baaa ACCEPT 33
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baaaa a a 34
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baaaa a 35
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baaaa Pause input 36
De CFG s para Máquinas de Pilha read a or b? Push it read == peek? Pop Else: CRASH! (1) PUSH (2) read #? (ignore stack) (3) POP empty stack? ACCEPT aaab#baaaa CRASH 37
PDA s àla Sipser Para facilitar a análise, máquinas de pilha teóricas têm um conjuntorestritode operações. Cadalivro-author tem sua própria versão. PDAs descritos em Sipser são assim: Push/Pop agrupadosemúnicaoperação: substituiro símbolono topoda pilha Nenhum teste intrínsico de pilha vazia Epsilon é usadoparaaumentara funcionalidade: máquinas não deterministas. 38
Torna-se: read a or b? Push it Versão Sipser s (1) PUSH (2) read #? (ignore stack) a, ε a b, ε b read == peek? Pop Else: CRASH! (3) POP a, a ε b, b ε empty stack? ACCEPT ε, ε $ #, ε ε ε, $ ε 39
Versão Sipser s p x, y z q Significado da convenção do rótulo: Se está no estado p eo próximo símbolo é x e o topo da pilha é y, então vá para q e substitua ypor z na pilha. x = ε: ignore a entrada, não leia y = ε: ignore o topo da pilha e empilhe z z = ε: desempilhe y 40
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ #, ε ε ε, $ ε push $ para detectar pilha vazia 41
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ #, ε ε ε, $ ε aaab#baaa 42
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ aaab#baaa #, ε ε ε, $ ε $ 43
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ aaab#baaa #, ε ε ε, $ ε a $ 44
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ aaab#baaa #, ε ε ε, $ ε a a $ 45
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ aaab#baaa #, ε ε ε, $ ε a a a $ 46
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ aaab#baaa #, ε ε ε, $ ε b a a a $ 47
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ aaab#baaa #, ε ε ε, $ ε b a a a $ 48
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ aaab#baaa #, ε ε ε, $ ε a a a $ 49
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ aaab#baaa #, ε ε ε, $ ε a a $ 50
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ aaab#baaa #, ε ε ε, $ ε a $ 51
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ aaab#baaa #, ε ε ε, $ ε $ 52
Versão Sipser s a, ε a b, ε b a, a ε b, b ε ε, ε $ aaab#baaa #, ε ε ε, $ ε ACCEPT! 53
PDA Definição Formal DEF: Um autômatode pilha(pda) é uma6- tupla M = (Q, Σ, Γ, δ, q 0, F ) ondeq, Σe q 0, são comoparaum AF. Γ é o alpfabetoda pilha. δé uma função: δ : Q Σ Γ P ( Q Γ ε ε Portanto, dado um estadop,umasímbololido x e um símbolode pilhay, δ(p,x,y) retornatodo (q,z) talqueq é um estadoalvoe z é um símboloque deve substituir y. ε ) 54
PDA Definição Formal a, ε ε a, ε a b, ε b 0 1 2 a, a ε b, b ε ε, ε $ b, ε $ ε, $ ε Q: O que é δ(p,x,y) em cada caso? 1. δ(0,a,b) 2. δ(0,ε,ε) 3. δ(1,a,ε) 4. δ(3,ε,ε) 3 55
PDA Definição Formal a, ε ε a, ε a b, ε b 0 1 2 a, a ε b, b ε ε, ε $ b, ε $ ε, $ ε R: 1. δ(0,a,b) = 2. δ(0,ε,ε) = {(1,$)} 3. δ(1,a,ε) = {(0,ε),(1,a)} 4. δ(3,ε,ε) = 3 56
PDA -Exercício Forneça PDA spara reconhecer as seguintes linguagens: {a n b n n ℵ} {a n b 2n n ℵ} {a 2n b n n ℵ} {a i b j c k i = j ou i=k} {w w R w {0,1}* } {w {0,1} * o número de 0 s é igual ao de 1 s }