A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Automato de Pilha.

Apresentações semelhantes


Apresentação em tema: "Automato de Pilha."— Transcrição da apresentação:

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 uy) 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 , ea b , eb a , ae b , be e , e$ #, ee
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 , ea b , eb a , ae b , be e , e$ #, ee 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 , ea b , eb a , ae b , be e , e$ #, ee e , $e push $ para detectar pilha vazia

42 Versão Sipser’s Input: aaab#baaa a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa

43 Versão Sipser’s $ Input: aaab#baaa a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa $

44 Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $

45 Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $

46 Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $

47 Versão Sipser’s Input: aaab#baaa b a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa b a $

48 Versão Sipser’s Input: aaab#baaa b a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa b a $

49 Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $

50 Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $

51 Versão Sipser’s Input: aaab#baaa a $ a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa a $

52 Versão Sipser’s $ Input: aaab#baaa a , ea b , eb a , ae b , be
e , e$ #, ee e , $e Input: aaab#baaa $

53 Versão Sipser’s Input: aaab#baaa ACCEPT! a , ea b , eb a , ae
b , be e , e$ #, ee 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 , ea b , eb a , ae b , be 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 , ea b , eb a , ae b , be 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, AA e, eA a , ae e, Ae e, $$ b, Ae e , e$ e , $e e, ea b, $ $ b, a a e, ea aceita se pilha vazia push $ para detectar pilha vazia b-excesso adiciona 2 a’s por b

60 PDA Exemplo. Sem bolhas a, $ $ e, eA a, AA a , ae e, Ae e, $$
b, Ae e , e$ e , $e e, ea Exercícios Sipser, pag. 119: 2.5, 2.7, 2.10 b, $ $ b, a a e, ea


Carregar ppt "Automato de Pilha."

Apresentações semelhantes


Anúncios Google