1 automato de pilha. 2 algoritmos recursivos e pilhas princípio geral em computação: qualquer...

44
1 Automato de Pilha

Upload: internet

Post on 17-Apr-2015

111 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 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

1

Automato de Pilha

Page 2: 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

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

Page 3: 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

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 ?

Page 4: 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

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?

Page 5: 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

19

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.

Page 6: 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

20

De CFG’s 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?

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

21

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

Input:aaab#baa

Page 8: 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

22

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

aInput:aaab#baa

Page 9: 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

23

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

a aInput:aaab#baa

Page 10: 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

24

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

a a aInput:aaab#baa

Page 11: 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

25

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

b a a aInput:aaab#baa

Page 12: 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

26

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

b a a aInput:aaab#baa

Page 13: 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

27

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

a a aInput:aaab#baa

Page 14: 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

28

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

a aInput:aaab#baa

Page 15: 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

29

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

aInput:aaab#baa

REJECT (nonempty stack)

Page 16: 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

30

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

a aInput:aaab#baaa

Page 17: 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

31

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

aInput:aaab#baaa

Page 18: 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

32

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

Input:aaab#baaa

Pause input

Page 19: 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

33

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

Input:aaab#baaa

ACCEPT

Page 20: 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

34

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

a aInput:aaab#baaaa

Page 21: 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

35

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

aInput:aaab#baaaa

Page 22: 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

36

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

Input:aaab#baaaa

Pause input

Page 23: 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

37

De CFG’s para Máquinas de Pilha

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?(ignore stack)

read == peek ?

PopElse: CRASH!

empty stack?

Input:aaab#baaaa

CRASH

Page 24: 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

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.

Page 25: 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

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?

$

aabb

#

$

aabb

Page 26: 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

40

Versão Sipser’s

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 qx, y z

Page 27: 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

41

Versão Sipser’s

$

aabb

#

$

aabb

push $ para

detectar pilha vazia

Page 28: 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

42

Versão Sipser’s

$

aabb

#

$

aabb

Input:aaab#baaa

Page 29: 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

43

Versão Sipser’s

$

aabb

#

$

aabb

$Input:aaab#baaa

Page 30: 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

44

Versão Sipser’s

$

aabb

#

$

aabb

a $Input:aaab#baaa

Page 31: 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

45

Versão Sipser’s

$

aabb

#

$

aabb

a a $Input:aaab#baaa

Page 32: 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

46

Versão Sipser’s

$

aabb

#

$

aabb

a a a $Input:aaab#baaa

Page 33: 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

47

Versão Sipser’s

$

aabb

#

$

aabb

b a a a $Input:aaab#baaa

Page 34: 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

48

Versão Sipser’s

$

aabb

#

$

aabb

b a a a $Input:aaab#baaa

Page 35: 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

49

Versão Sipser’s

$

aabb

#

$

aabb

a a a $Input:aaab#baaa

Page 36: 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

50

Versão Sipser’s

$

aabb

#

$

aabb

a a $Input:aaab#baaa

Page 37: 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

51

Versão Sipser’s

$

aabb

#

$

aabb

a $Input:aaab#baaa

Page 38: 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

52

Versão Sipser’s

$

aabb

#

$

aabb

$Input:aaab#baaa

Page 39: 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

53

Versão Sipser’s

$

aabb

#

$

aabb

Input:aaab#baaa

ACCEPT!

Page 40: 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

54

PDA Definição Formal

DEF: Um autômato de pilha (PDA) é uma 6-tupla M = (Q, , , , q0, F ) onde Q, e q0, 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,yretorna todo (q,z) tal que q é um estado alvo e z é um símbolo que deve substituir y.

)(Σ:δ εεε QPQ

Page 41: 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

55

PDA Definição Formal

Q: O que é p,x,y em cada caso?1. 0,a,b2. 0,,3. 1,a,4. 3,,

0 1 2$

3

aabb

b$

$

aabb

a

Page 42: 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

56

PDA Definição Formal

R: 1. 0,a,b2. 0,,= {(1,$)}3. 1,a,= {(0,),(1,a)}4. 3,,=

0 1 2$

3

aabb

b$

$

aabb

a

Page 43: 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

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.

Page 44: 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

60

PDA Exemplo.Sem bolhas

$

a$ $aAA

$

Aaa

b$ $ba a

a

a

bAA

$$