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

Post on 17-Apr-2015

111 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

Automato de Pilha

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

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

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?

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

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

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

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

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

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

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

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

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)

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

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

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

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

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

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

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

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

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:

(1)PUSH

(3)POP

read a or b ?Push it

ACCEPT

(2)read # ?

(ignore stack)

read == peek ?Pop

Else: CRASH!

empty stack?

$

aabb

#

$

aabb

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

41

Versão Sipser’s

$

aabb

#

$

aabb

push $ para

detectar pilha vazia

42

Versão Sipser’s

$

aabb

#

$

aabb

Input:aaab#baaa

43

Versão Sipser’s

$

aabb

#

$

aabb

$Input:aaab#baaa

44

Versão Sipser’s

$

aabb

#

$

aabb

a $Input:aaab#baaa

45

Versão Sipser’s

$

aabb

#

$

aabb

a a $Input:aaab#baaa

46

Versão Sipser’s

$

aabb

#

$

aabb

a a a $Input:aaab#baaa

47

Versão Sipser’s

$

aabb

#

$

aabb

b a a a $Input:aaab#baaa

48

Versão Sipser’s

$

aabb

#

$

aabb

b a a a $Input:aaab#baaa

49

Versão Sipser’s

$

aabb

#

$

aabb

a a a $Input:aaab#baaa

50

Versão Sipser’s

$

aabb

#

$

aabb

a a $Input:aaab#baaa

51

Versão Sipser’s

$

aabb

#

$

aabb

a $Input:aaab#baaa

52

Versão Sipser’s

$

aabb

#

$

aabb

$Input:aaab#baaa

53

Versão Sipser’s

$

aabb

#

$

aabb

Input:aaab#baaa

ACCEPT!

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

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

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

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.

60

PDA Exemplo.Sem bolhas

$

a$ $aAA

$

Aaa

b$ $ba a

a

a

bAA

$$

top related