Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Automato de Pilha
2
Algoritmos Recursivos e Pilhas
Princípio Geral em Computação: Qualquer algoritmo recursivo pode ser transformado em um não-recursivo usando-se uma pilha e um while-loop, que termina apenas quando a pilha está vazia. EX: Considere: long factorial(int n){ if (n<=0) return 1; return n*factorial(n-1); } Como JVM executa factorial(5)?
3
Algoritmos Recursivos e Pilhas
long factorial(int n){ if (n<=0) return 1; return n*factorial(n-1); } Compute 5!
4
Algoritmos Recursivos e Pilhas
long factorial(int n){ if (n<=0) return 1; return n*factorial(n-1); } 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(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(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(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(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); } 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)
10
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)
11
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)
12
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)
13
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)
14
Algoritmos Recursivos e Pilhas
long factorial(int n){ if (n<=0) return 1; return n*factorial(n-1); } 5·24= 120
15
Algoritmos Recursivos e Pilhas
long factorial(int n){ if (n<=0) return 1; return n*factorial(n-1); } Return 5! = 120
16
De CFG’s para Máquinas de Pilha
CFG’s definem procedimentos recursivos: boolean derives(strings x, y) 1. if (x==y) return true 2. for(all uy) if derives(x,u) return true 3. return false EX: S # | aSa | bSb In general, the program is non-deterministic! Okay, it’s even worse as it doesn’t return false ever.
17
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 ?
18
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?
19
De CFG’s para Máquinas de Pilha
A: Usamos um processo com três fases: modo Push : Antes de ler “#”, emplihe qualquer símbolo lido. Ao ler “#” troque de modo de operação. 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.
20
De CFG’s para Máquinas de Pilha
read == top ? Pop else: CRASH! read ==a ou b ? Push it (2) read == # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP
21
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baa
22
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baa a
23
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baa a
24
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baa a
25
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baa b a
26
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baa b a
27
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baa a
28
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baa a
29
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baa REJECT (nonempty stack) a
30
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baaa a
31
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baaa a
32
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baaa Pause input
33
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baaa ACCEPT
34
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baaaa a
35
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baaaa a
36
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baaaa Pause input
37
De CFG’s para Máquinas de Pilha
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT (1) PUSH (3) POP Input: aaab#baaaa CRASH
38
PDA’s à la Sipser Para facilitar a análise, máquinas de pilha teóricas têm um conjunto restrito de operações. Cada livro-author tem sua própria versão. PDAs descritos em Sipser são assim: Push/Pop agrupados em única operação: substituir o símbolo no topo da pilha Nenhum teste intrínsico de pilha vazia Epsilon é usado para aumentar a funcionalidade: máquinas não deterministas.
39
Versão Sipser Torna-se: a , ea b , eb a , ae b , be e , e$ #, ee
read == peek ? Pop Else: CRASH! read a or b ? Push it (2) read # ? (ignore stack) empty stack? ACCEPT Torna-se: (1) PUSH (3) POP a , ea b , eb a , ae b , be e , e$ #, ee e , $e
40
Versão Sipser’s p q x = e: ignore a entrada, não leia
x, y z p q Significado da convenção do rótulo: Se está no estado p e o próximo símbolo é x e o topo da pilha é y, então vá para q e substitua y por z na pilha. x = e: ignore a entrada, não leia y = e: ignore o topo da pilha e empilhe z z = e: desempilhe y
41
para detectar pilha vazia
Versão Sipser’s a , ea b , eb a , ae b , be e , e$ #, ee e , $e push $ para detectar pilha vazia
42
Versão Sipser’s Input: aaab#baaa a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa
43
Versão Sipser’s $ Input: aaab#baaa a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa $
44
Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $
45
Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $
46
Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $
47
Versão Sipser’s Input: aaab#baaa b a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa b a $
48
Versão Sipser’s Input: aaab#baaa b a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa b a $
49
Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $
50
Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $
51
Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $
52
Versão Sipser’s $ Input: aaab#baaa a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa $
53
Versão Sipser’s Input: aaab#baaa ACCEPT! a , ea b , eb a , ae
b , be e , e$ #, ee e , $e Input: aaab#baaa ACCEPT!
54
PDA Definição Formal DEF: Um autômato de pilha (PDA) é uma 6-tupla M = (Q, S, G, d, q0, F ) onde Q, S e q0, são como para um FA. G é o alfabeto da pilha. d é uma função: Portanto, dado um estado p, uma símbolo lido x e um símbolo de pilha y, d(p,x,y) retorna todo (q,z) tal que q é um estado alvo e z é um símbolo que deve substituir y.
55
PDA Definição Formal Q: O que é d(p,x,y) em cada caso? d(0,a,b)
d(0,e,e) d(1,a,e) d(3,e,e) a , ea b , eb a , ae b , be a , e e 1 2 3 e , e$ b, e$ e , $e
56
PDA Definição Formal R: d(0,a,b) = d(0,e,e) = {(1,$)}
d(1,a,e) = {(0,e),(1,a)} d(3,e,e) = a , ea b , eb a , ae b , be a , e e 1 2 3 e , e$ b, e$ e , $e
57
PDA: Exercício (Sipser 2.6.a) Desenhe um PDA que aceite a linguagem
L = { x {a,b}* | na(x) = 2nb(x) } NOTA: O string vazio está em L.
58
PDA Exercício A idéia é usar a pilha para "contar” o número de a’ s e/ou b’ s necessários para obter um string válido. Se forem lidos b’s em excesso, a pilha deverá ter um número correspondente de a’s (dois para cada b). Por outro lado, para cada a lido em excesso não podemos ½ b… Ao invés disso, para cada a em excesso, empilhamos 2 “a-negativo”, sendo um a-negativo representado pelo símbolo A. Vejamos como isso funciona:
59
PDA Ex. b-excesso a’s cancela a-excesso push A a-excesso read b:
pop 2 A’s se possivel PDA Ex. a, $ $ a, AA e, eA a , ae e, Ae e, $$ b, Ae e , e$ e , $e e, ea b, $ $ b, a a e, ea aceita se pilha vazia push $ para detectar pilha vazia b-excesso adiciona 2 a’s por b
60
PDA Exemplo. Sem bolhas a, $ $ e, eA a, AA a , ae e, Ae e, $$
b, Ae e , e$ e , $e e, ea Exercícios Sipser, pag. 119: 2.5, 2.7, 2.10 b, $ $ b, a a e, ea
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.