Automato de Pilha.

Slides:



Advertisements
Apresentações semelhantes
Aquiles Burlamaqui AULA 09
Advertisements

Complexidade de Algoritmos Recursivos
Recursividade Inhaúma Neves Ferraz
Monitoria de Matemática Discreta
Estruturas de Repetição
Marco Antonio Montebello Júnior
Linguagem de Programação IV
Capitulo 5 Decisões.
Aula 10 Algoritmos de Busca
Estruturas de Dados Árvores Binárias
Recursividade Prof. Rosana Palazon.
Algoritmos de manipulação de estruturas elementares de dados
9 de Março de 2006Trajectória de um Projéctil1 Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2005/2006.
Introdução à Computação - Jorge Macêdo
Recursividade Inhaúma Neves Ferraz
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Pilha David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP.
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Construção de Compiladores
Listas com Ponteiros Listas encadeadas Listas circulares.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo II Confecção de Tabelas.
Laboratório de Programação de Computadores II 2S/2009.
Laboratório de Programação de Computadores II Aula 1 2S/2009.
Cronograma de SCII - 2o. Ano de STPD - Profs. Fátima e Paulo
Apresentação da linguagem Python
Slides: Prof. João Fabro UTFPR - Curitiba
ALGORITMOS E ESTRUTURAS DE DADOS
Introdução a Computação e Cálculo Numérico
IAED Tagus, 2009/2010 Introdução à Programação em C (I)
Informática e Computação Estrutura de Repetição aula 13
Linguagem de Programação I Parte III
Compiladores, Aula Nº 9 João M. P. Cardoso
Denise Guliato Faculdade de Computação – UFU
Denise Guliato Faculdade de Computação – UFU
INTELIGÊNCIA ARTIFICIAL
Algoritmos Recursivos Klauko Mota. Conceito de Recursividade Um programa recursivo é um programa que chama a si mesmo, direta ou indiretamente Conceito.
© 2003 Introdução à programaçãoComputadores e programação I Linguagens de programação Introdução ao C (continuação)
Tipos Abstratos de Dados
1 Tipos Abstratos de Dados Pilhas e Filas TPA – 2008 –1 Prof. Mateus Costa.
Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação
Estrutura de Dados Unidade 6 Simulação do exercício 6.2 Elaborada por Mauricio Falvo.
Denise Guliato Faculdade de Computação – UFU
Estruturas de Dados Módulo 3 – Controle de Fluxo
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Introdução à Programação de Computadores
Orientação a Objetos e Java Graduação em Ciência da Computação
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014
Prof.: Edson Holanda Teoria da computação
FACULDADE DE CIÊNCIAS SOCIAIS E TECNOLÓGICAS Tecnologia em Redes de Computadores Algoritmos e linguagens de programação 1 (aula 07) Prof. Alessandro Bernardo.
Introdução à Linguagem C
Aula 10 Algoritmos de Busca
FACULDADE DE CIÊNCIAS SOCIAIS E TECNOLÓGICAS Tecnologia em Redes de Computadores Algoritmos e linguagens de programação 1 (aula 06) Prof. Alessandro Bernardo.
Ciclos for, while e do...while
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013
Recursividade Bruno Silva.
FACULDADE DE CIÊNCIAS SOCIAIS E TECNOLÓGICAS Tecnologia em Redes de Computadores Algoritmos e linguagens de programação 1 (aula 09) Prof. Alessandro Bernardo.
INE Fundamentos de Matemática Discreta para a Computação
Introdução a Programação
Ciência da Computação 1 PROGRAMAÇÃO ESTRUTURADA II Profª. Noeli.
FACULDADE DE CIÊNCIAS SOCIAIS E TECNOLÓGICAS Tecnologia em Redes de Computadores Algoritmos e linguagens de programação 1 (aula 08) Prof. Alessandro Bernardo.
Estrutura de dados Pilhas e filas
1 Programação – JAVA Unidade 3 – Loops e Lógica Prof. Aparecido V. de Freitas Curso de Ciência da Computação.
Laço ou loop e repetição
ALGORITMOS Profº Antonio Carlos Marcelino de Paula 1.
Introdução ao Grads Grads Script e Funções MSc. José Leandro Campos.
Algoritmos Grupos de Slides No 7. Prof. SIMÃO Estrutura de Repetição “para - passo”” for Feito por Prof. Jean Marcelo SIMÃO e revisado por Prof. Luis Alberto.
PCI- Estruturas de Controle
CONCEITO DE VARIÁVEIS ESTÁTICAS
Transcrição da apresentação:

Automato de Pilha

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)?

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

Algoritmos Recursivos e Pilhas long factorial(int n){ if (n<=0) return 1; return n*factorial(n-1); } f(5)=5·f(4)

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)

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)

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)

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)

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)

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)

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)

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)

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)

Algoritmos Recursivos e Pilhas long factorial(int n){ if (n<=0) return 1; return n*factorial(n-1); } 5·24= 120

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

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.

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 ?

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?

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

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

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

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

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

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 $

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 $

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 $

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 $

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 $

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 $

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 $

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 $

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 $

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 $

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!

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.

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

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

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.

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:

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

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