Computabilidade e Linguagens Formais Introdução à teoria dos autómatos Notas baseadas em John E. Hopcroft, Rajeev Motwani, Jeffrey D. Ullman. “Introduction to automata theory, languages and computation”. 2nd ed, AddisonWesley, 2001. – Gabriel David / Cristina Ribeiro 1 História Teoria dos autómatos: estudo dos dispositivos computacionais abstractos [máquinas] Alan Turing (1930’s) – – 1940’s, 1950’s – Estudos em autómatos finitos para modelar o cérebro Noam Chomsky (1950’s) – Estudou os limites de uma máquina abstracta equivalente às máquinas actuais Antes de haver computadores! Gramáticas formais - relacionadas com autómatos abstractos; úteis em compilação S. Cook (1969) – Teoria da complexidade – o que é possível ou não computar Introdução-2 Interesse da teoria dos autómatos Útil na modelação de hardware e software – – – – Projecto e teste de circuitos digitais Análise lexical em compilação Processamento de texto, pesquisa na Web Máquinas de estados, protocolos de comunicação, criptografia Autómato finito – – – – Sistema que em cada momento está num de um nº finito de estados Estado memoriza a porção relevante da história do sistema Sendo finito tem que esquecer o que não for relevante Pode ser implementado com recursos fixos Introdução-3 Interruptor on/off Press Start on off Press Autómato finito mais simples – modela interruptor – – Dois estados [círculos]: on e off Uma só entrada [etiquetas nos arcos]: Press – – Representa influência externa no sistema [transição de estado] Carregar no botão tem um efeito dependente do estado Estado inicial indicado por uma seta com a etiqueta Start Pode existir um (ou mais) estados finais ou de aceitação, indicados por círculo de linha dupla Chegar a um desses estados significa que a sequência de entradas é boa Introdução-4 Reconhecedor Start t t h th e the n then Se a entrada for a cadeia t-h-e-n o autómato evolui do estado inicial para o final – – Acumula a história das entradas O seu objectivo é reconhecer a palavra “then” Introdução-5 Representações estruturais Gramáticas – – Processar dados com estrutura recursiva [expressões] Exemplo de regra gramatical: E E + E – Uma expressão pode ser constituída por duas expressões ligadas por “+” Usadas em analisadores [parsers] de compiladores Expressões regulares – – Descreve a estrutura de cadeias de caracteres Exemplo: [1-9][0-9][0-9][0-9][-][0-9][0-9][0-9][ ][A-Z][a-z]* Descreve “4200-465 Porto” mas falha “5505-032 Vila Real” Correcção: [1-9][0-9][0-9][0-9][-][0-9][0-9][0-9]([ ][A-Z][a-z]*)* Introdução-6 Conceitos centrais Alfabeto é um conjunto finito e não vazio de símbolos – – – = {0, 1} , alfabeto binário = {a, b, …, z} , conjunto das minúsculas Conjunto dos caracteres ASCII Cadeia (ou palavra) é uma sequência finita de símbolos escolhidos de um alfabeto – – – – 01101 é uma cadeia do alfabeto = {0, 1} Cadeia vazia () tem zero ocorrências de símbolos Comprimento de uma cadeia é o número de ocorrências de símbolos: |01101| = 5, || = 0 Potência de um alfabeto k é o conjunto de cadeias de comprimento k, formadas por símbolos do alfabeto (produto cartesiano) 0 = {} Se = {0, 1} então 1 = {0, 1} , 2 = {00, 01, 10, 11}, 3 = {000, 001, …, 111} Distinção entre = {0, 1} conjunto de símbolos e 1 = {0, 1} conjunto de cadeias Introdução-7 Linguagem O conjunto de todas as cadeias sobre um alfabeto é denotada por * – – – * = 0 1 2 … + = 1 2 … * = 0 + Linguagem L sobre um alfabeto é um subconjunto de * (L *) – Linguagem das cadeias com n 0’s seguidos de n 1’s – Conjunto dos números binários que são primos – {10, 11, 101, 111, 1011, …} Linguagem vazia – {, 01, 0011, 000111, …} Linguagem só com a cadeia vazia {} Introdução-8 Problema Problema é a questão de decidir se, dada uma cadeia, ela é membro de uma determinada linguagem – Dados w * e L *, w L ? É comum descrever uma linguagem através de um construtor de conjuntos – {w | w consiste de um número igual de 0’s e 1’s} – Conjunto dos w tal que w… {w | w é um programa em C sintacticamente correcto} Problema de testar a primalidade – w Lp ? em que w é uma cadeia com a representação binária de um número e Lp é a linguagem que contém todas as cadeias que são representações binárias de números primos Introdução-9 Linguagem ou problema? Problema em sentido comum – – Pedido para calcular ou transformar uma entrada (ex: compilador) Não uma questão de decisão (sim/não) Para efeitos de estudos de complexidade, definir um problema em termos de uma linguagem é adequado – – É tão difícil resolver a questão da decisão como a do problema Se for difícil decidir se uma cadeia pertence à linguagem LX das cadeias válidas na linguagem de programação X então não é mais fácil traduzir programas na linguagem X para código objecto Se fosse, executava-se o tradutor e decidia-se da pertença a LX conforme o sucesso do tradutor em produzir código objecto. O problema da decisão ficava fácil, o que contradiz a suposição (prova por contradição) Exemplo de redução de um problema a outro Linguagens e problemas são a mesma coisa – Cadeias enquanto tal – linguagem; objectos representados – problema Introdução-10