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

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.

Apresentações semelhantes


Apresentação em tema: "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."— Transcrição da apresentação:

1 1 Automato de Pilha

2 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 3 Algoritmos Recursivos e Pilhas long factorial(int n){ if (n<=0) return 1; return n*factorial(n-1); } Compute 5!

4 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 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 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 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 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 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 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 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 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 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 14 Algoritmos Recursivos e Pilhas long factorial(int n){ if (n<=0) return 1; return n*factorial(n-1); } 5·24= 120

15 15 Algoritmos Recursivos e Pilhas long factorial(int n){ if (n<=0) return 1; return n*factorial(n-1); } Return 5! = 120

16 16 De CFGs para Máquinas de Pilha CFGs 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

17 17 De CFGs 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 18 De CFGs 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 19 De CFGs 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.

20 20 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read ==a ou b ? Push it ACCEPT (2) read == # ? (ignore stack) read == top ? Pop else: CRASH! empty stack?

21 21 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? Input: aaab#baa

22 22 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? a Input: aaab#baa

23 23 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? aa Input: aaab#baa

24 24 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? aaa Input: aaab#baa

25 25 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? baaa Input: aaab#baa

26 26 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? baaa Input: aaab#baa

27 27 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? aaa Input: aaab#baa

28 28 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? aa Input: aaab#baa

29 29 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? a Input: aaab#baa REJECT (nonempty stack)

30 30 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? aa Input: aaab#baaa

31 31 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? a Input: aaab#baaa

32 32 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? Input: aaab#baaa Pause input

33 33 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? Input: aaab#baaa ACCEPT

34 34 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? aa Input: aaab#baaaa

35 35 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? a Input: aaab#baaaa

36 36 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? Input: aaab#baaaa Pause input

37 37 De CFGs para Máquinas de Pilha (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? Input: aaab#baaaa CRASH

38 38 PDAs à 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 39 Versão Sipser Torna-se: (1) PUSH (3) POP read a or b ? Push it ACCEPT (2) read # ? (ignore stack) read == peek ? Pop Else: CRASH! empty stack? $ a b #$ a a b b

40 40 Versão Sipsers 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 = : ignore a entrada, não leia y = : ignore o topo da pilha e empilhe z z = : desempilhe y p q x, y z

41 41 Versão Sipsers $ a b #$ a a b b push $ para detectar pilha vazia

42 42 Versão Sipsers $ a b #$ a a b b Input: aaab#baaa

43 43 Versão Sipsers $ a b #$ a a b b $ Input: aaab#baaa

44 44 Versão Sipsers $ a b #$ a a b b a$ Input: aaab#baaa

45 45 Versão Sipsers $ a b #$ a a b b aa$ Input: aaab#baaa

46 46 Versão Sipsers $ a b #$ a a b b aaa$ Input: aaab#baaa

47 47 Versão Sipsers $ a b #$ a a b b baaa$ Input: aaab#baaa

48 48 Versão Sipsers $ a b #$ a a b b baaa$ Input: aaab#baaa

49 49 Versão Sipsers $ a b #$ a a b b aaa$ Input: aaab#baaa

50 50 Versão Sipsers $ a b #$ a a b b aa$ Input: aaab#baaa

51 51 Versão Sipsers $ a b #$ a a b b a$ Input: aaab#baaa

52 52 Versão Sipsers $ a b #$ a a b b $ Input: aaab#baaa

53 53 Versão Sipsers $ a b #$ a a b b Input: aaab#baaa ACCEPT!

54 54 PDA Definição Formal DEF: Um autômato de pilha (PDA) é uma 6-tupla M = (Q,,,, q 0, F ) onde Q, e q 0, são como para um FA. é o alfabeto da pilha. é uma função: Portanto, dado um estado p, uma símbolo lido x e um símbolo de pilha y, p,x,y retorna todo (q,z) tal que q é um estado alvo e z é um símbolo que deve substituir y.

55 55 PDA Definição Formal Q: O que é p,x,y em cada caso? 0,a,b 0,, 1,a, 3,, 01 2 $ 3 a b b $ $ a a b b a

56 56 PDA Definição Formal R: 0,a,b 0,, = {(1,$)} 1,a, = {(0, ),(1,a)} 3,, = 01 2 $ 3 a b b $ $ a a b b a

57 57 PDA: Exercício (Sipser 2.6.a) Desenhe um PDA que aceite a linguagem L = { x {a,b}* | n a (x) = 2n b (x) } NOTA: O string vazio está em L.

58 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 bs em excesso, a pilha deverá ter um número correspondente de as (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 59 PDA Ex. $ a $ $ a A A $ push $ para detectar pilha vazia aceita se pilha vazia a-excesso push A A a a b-excesso as cancela b $ $ b a a b-excesso adiciona 2 as por b a a a-excesso read b: pop 2 As se possivel b A A $

60 60 PDA Exemplo. Sem bolhas $ a $ $ a A A $ A a a b $ $ b a a a a b A A $


Carregar ppt "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."

Apresentações semelhantes


Anúncios Google