Prévia do material em texto
Prof. Dr. Boente, Alfredo (PhD) COMPUTAÇÃO Linguagens Formais, Autômatos e Computabilidade COMPUTAÇÃO Bibliografia Recomendada COMPUTAÇÃO UNIDADE 1: Programas, Máquinas, Computação e Função Computada COMPUTAÇÃO Introdução O perfeito entendimento acerca dos principais pontos que cercam a teoria da computação, perfaz um cientista da computação com ideias e atitudes mais eficientes e eficazes, quando está em busca de uma solução ótima (S*) para certo problemas de computação. Na aula de hoje iremos compreender melhor a relação existente entre programas, máquinas, computação e função computada. COMPUTAÇÃO Programas Os programas são sequências finitas de passos que foram definidas por um programador para alcançar um objetivo específico. Os programas... - expressam um algoritmo lógico computacional - representado por um conjunto de operações e testes compostos de diversas estruturas lógicas - é classificado como MONOLÍTICO, ITERATIVO ou RECURSIVO COMPUTAÇÃO Programas Um programa monolítico é estruturado, usando desvios condicionais e incondicionais, não fazendo uso explícito de mecanismos auxiliares de programação. A lógica é distribuída por todo o bloco (monólito) que constitui o programa. COMPUTAÇÃO Programas Exemplo de programa monolítico COMPUTAÇÃO Programas Os programas iterativos são baseados em três mecanismos de composição (sequenciais) de programas, os quais podem ser encontrados em um grande número de linguagens de alto nível: sequencial, condicional e repetitivo. COMPUTAÇÃO Programas Exemplo de programa iterativo COMPUTAÇÃO Programas O programa recursivo é baseado em sub-rotinas recursivas, ou seja, ele faz chamada a si mesmo. COMPUTAÇÃO Programas Exemplo de programa recursivo Algoritmo Fatorial Variável numero : inteiro Função fat (n : inteiro) : inteiro Início Se n = 0 Então retorne 1 Senão retorne n * fat (n – 1) Declaração da Fim-Se Função Recursiva Fim_fat COMPUTAÇÃO Programas Início Escreva(“Digite um número:”) Leia (numero) Escreva (“O fatorial de “, numero, “ é “, fat (numero)) Fim Realiza a chamada da função recursiva COMPUTAÇÃO Máquinas As máquinas interpretam os programas de acordo com os dados fornecidos desde que possua uma interpretação para cada operação ou teste que constitui o programa. São classificadas como simples ou poderosas (complexas). As máquinas possuem aplicações práticas restritas devido ao fato das informações de saída serem limitadas a lógica binária Aceitar/Rejeitar. COMPUTAÇÃO Máquinas As máquinas podem representar: - Um computador (hardware) - Uma modelagem computacional - Uma estruturação de modelo físico com modelo lógico (robô, androides etc.) COMPUTAÇÃO Programa para uma Máquina Sejam: M = (V, X, Y, πX, πY, ΠF, ΠT) uma máquina P um programa onde PF e PT são os conjuntos de identificadores de operações e de testes de P, respectivamente. P é um Programa para a Máquina M se, e somente, se: • para qualquer F ∈ PF, existe uma única função πF:V→V em ΠF; • para qualquer T ∈ PT, existe uma única função πT: V→ {verdadeiro, falso} em ΠT. COMPUTAÇÃO Computação e Função Computada A computação representa a aplicação de um modelo matemático que consiga expressar algo realmente computável. Representa historicamente o funcionamento da máquina para o programa considerando um valor inicial. Uma função é uma relação na qual cada elemento do domínio está relacionado, com no máximo, um elemento de cada co- domínio. COMPUTAÇÃO Computação e Função Computada Faz-se relação com as funções parciais representada por f A x B e denotada por f : A → B Essa função sendo computada pode assumir os estados de função Injetora (monomorfismo), Sobrejetora (epimorfismo) ou Bijetora (isomorfismo). Elas são aplicadas ao estudo da lógica da Teoria da Computação aplicada às máquinas, através do uso de Autômatos. COMPUTAÇÃO Computação e Função Computada Função Injetora (monomorfismo): Uma função injetora, também chamada de função injetiva, é aquela em que cada elemento da imagem está ligado a um único elemento do domínio. A ilustração do diagrama a seguir, mostra o comportamento da função f(x)=2x, em que o domínio é o conjunto dos números naturais menores que 4, e o contradomínio é o conjunto dos naturais menores que 9. COMPUTAÇÃO Computação e Função Computada Observe que nenhuma das flechas liga um elemento do conjunto B a dois elementos do conjunto A. COMPUTAÇÃO Computação e Função Computada Isso é possível nas funções, como é o caso da função f(x)=x2, na qual f(2)=f(–2)=4, ou seja, em que há elementos de B relacionados a dois elementos distintos em A. Logo, a função f(x)=2x, no domínio e contradomínio definidos, é injetora. Vale ressaltar que uma função pode ter dois elementos distintos de A ligados a um único elemento de B, mas o contrário não é possível pela definição de função. Portanto, o conceito mais fundamental de função injetora é: qualquer elemento que pertence à imagem de uma função injetora está relacionado a um único elemento de seu domínio. COMPUTAÇÃO Computação e Função Computada Função Sobrejetora (epimorfismo): Uma função é sobrejetora quando seu contradomínio e imagem são o mesmo conjunto. Em outras palavras, uma função é sobrejetora quando todos os elementos do contradomínio estão relacionados a, pelo menos, um elemento do domínio. A ilustração do diagrama a seguir, representa uma função na qual a imagem e o contradomínio são iguais. COMPUTAÇÃO Computação e Função Computada Esse diagrama realmente representa uma função, pois cada elemento do primeiro conjunto está relacionado a um único elemento do segundo. COMPUTAÇÃO Computação e Função Computada Observe também que essa função é sobrejetora, já que o contradomínio (ou seja, o segundo conjunto) é igual à imagem da função. A imagem de uma função é o conjunto dos elementos do contradomínio que estão ligados a algum elemento do domínio. Dessa forma, as funções sobrejetoras também podem ser compreendidas como aquelas nas quais não “sobram” elementos no contradomínio. COMPUTAÇÃO Computação e Função Computada Função Bijetora (isomorfismo): A função bijetora, também chamada de bijetiva, é um tipo de função matemática que relaciona elementos de duas funções. Desse modo, os elementos de uma função A possuem correspondentes em uma função B. É importante notar que elas apresentam o mesmo número de elementos em seus conjuntos, conforme ilustrado na próxima figura a seguir. COMPUTAÇÃO Computação e Função Computada A partir desse diagrama, podemos concluir que: O domínio dessa função é o conjunto {1, 2, 3, 4}. COMPUTAÇÃO Computação e Função Computada O contradomínio reúne os elementos: {1, 3, 5, 7}. O conjunto imagem da função é definido por: Im(f)={1, 3, 5, 7} A função bijetora recebe esse nome pois ela é injetora e sobrejetora ao mesmo tempo. Portanto, uma função f:A→B é bijetora quando f é injetora e sobrejetora, também. COMPUTAÇÃO Equivalência de Programas e Máquinas Tanto os programas quanto máquinas usam algoritmos para a interpretação e execução de certa função para alcançar ou superar as expectativas de uma dada solução. COMPUTAÇÃO Equivalência de Programas e Máquinas Sua real equivalência consiste em: Programas equivalentes fortemente Programas equivalentes Máquinas equivalentes COMPUTAÇÃO Equivalência de Programas e Máquinas Relação Equivalência Forte de Programas Um par de programas pertence à relação se as correspondentes funções computadas coincidem para qualquer máquina. Relação Equivalência de Programas em uma Máquina Um par de programas pertence à relação se as correspondentes funções computadas coincidem para uma dada máquina. COMPUTAÇÃO Equivalência de Programas e Máquinas Relação Equivalência de Máquinas Um par de máquina pertence à relação se as máquinas podem se simular mutuamente. A simulação de uma máquina por outra pode ser feita usando programas diferentes.A Relação Equivalência Forte de Programas é especialmente importante pois, ao agrupar diferentes programas em classes de equivalências de programas cujas funções coincidem, fornece subsídios para analisar propriedades de programas como complexidade estrutural. COMPUTAÇÃO Equivalência de Programas e Máquinas Um importante resultado é que programas recursivos são mais gerais que os monolíticos, os quais, por sua vez, são mais gerais que os iterativos. COMPUTAÇÃO Equivalência de Programas e Máquinas Exemplo de equivalência de programas: COMPUTAÇÃO Equivalência de Programas e Máquinas Exemplo de equivalência de máquinas: COMPUTAÇÃO UNIDADE 2: Máquinas Universais COMPUTAÇÃO Introdução Uma máquina de estados finita ou autômato finito é um modelo matemático usado para representar programas de computadores ou circuitos lógicos. O conceito é concebido como uma máquina abstrata que deve estar em um de um número finito de estados. A máquina está em apenas um estado por vez, este estado é chamado de estado atual. Um estado armazena informações sobre o passado, isto é, ele reflete as mudanças desde a entrada num estado, no início do sistema, até o momento presente. COMPUTAÇÃO Introdução Uma transição indica uma mudança de estado e é descrita por uma condição que precisa ser realizada para que a transição ocorra. No caso da transição quando é realizada no mesmo estado atual, dizemos ter uma recursão, ou seja, uma transição ou chamada recursiva. Uma ação é a descrição de uma atividade que deve ser realizada num determinado momento. COMPUTAÇÃO Máquinas Universais - Hipótese de Church (1936) por Alonzo Church; - Máquina de Turing (1936) por Alan Turing; - Máquina de Post (1943) Emil Post; - Máquina de Mealy (1955) George Mealy; - Máquina de Moore (1956) Edward Moore; - Máquina de Norma (1976) Richard Bird; COMPUTAÇÃO Tese de Church A Tese ou Hipótese de Church foi apresentada por Alonzo Church em 1936. Church afirma que qualquer função computável pode ser processada por uma Máquina de Turing. Essa MT apresenta um algoritmo expresso na forma de interpretação dessa máquina, capaz de processar a função computável. Como a noção intuitiva de algoritmo não é matematicamente precisa, é impossível formalizar uma demonstração de que a MT é, efetivamente, o mais genérico dispositivo de computação. COMPUTAÇÃO Tese de Church Todas as evidências internas e externas imaginadas foram sempre verificadas, reforçando a Hipótese de Church. Os demais modelos de máquinas propostos, bem como qualquer extensão de suas capacidades, possuem, no máximo, a mesma capacidade computacional da Máquina Turing. Baseado nisso, Alan Mathison Turing (1936) propôs um formalismo para a representação de procedimentos efetivos (identificação de programas escritos para uma “máquina computacional autômata”, como noções intuitivas de efetividade, o que mais tarde acenderia a chama da computabilidade efetiva). Esse formalismo era representado por uma Máquina de Turing (MT). COMPUTAÇÃO Tese de Church Assim, a hipótese de Church (1936) diz: A capacidade de computação representada pela Máquina de Turing é o limite máximo que pode ser atingido por qualquer dispositivo de computação Alonzo Church COMPUTAÇÃO Tese de Church Tal capacidade computacional é requerida nos modelos matemáticos desenvolvidos com objetivo de gerar modelos computacionais, baseados na lógica matemática, visando alcançar ou superar as expectativas de seus contratantes. Portanto, torna-se necessário uma sessão prática da lógica matemática aplicada a teoria da computação para solucionabilidade de problemas através dos chamados de Métodos de Provas. COMPUTAÇÃO Máquina de Turing A máquina de Turing é uma máquina universal que apresenta um controle finito, com todas as máquinas universais existentes, e uma fita, que pode servir como dispositivo de entrada, como área de trabalho ou como dispositivo de saída. Inventada por Allan Mathison Turing em 1936. Por convenção a fita é finita podendo ser aumentada sempre que houver necessidade de mais espaço, com mais de uma célula em branco. COMPUTAÇÃO Máquina de Turing De acordo com a tese de Church, detalhes de funcionamento da máquina de Turing (MT) são determinantes e influenciam em sua capacidade de computação. COMPUTAÇÃO Máquina de Turing A MT é uma oito-upla representada por M=(, Q, , q0, F, V, , ☼), onde: é o alfabeto de símbolos de entrada Q é o conjunto de estados possíveis da MT é o programa ou função de transição (função parcial - : Q × (Σ V { ß, ☼}) → Q × (Σ V { ß, ☼ }) × { E, D }) q0 é o estado inicial da máquina tal que q0 é elemento de Q F é o conjunto de estados finais tal que F está contido em Q V é o alfabeto auxiliar é o símbolo especial branco ☼ é símbolo especial de marcador de início da fita COMPUTAÇÃO Máquina de Turing O programa poder ser representado por um grafo finito (p, au)= (q, av, m) COMPUTAÇÃO Máquina de Turing O programa também pode ser representado por meio de uma tabela de transição, conforme figura abaixo para (p, au)= (q, av, m) : COMPUTAÇÃO Máquina de Turing O processamento de uma Máquina de Turing M=(Σ,Q, , q0, F, V, ß, ☼) para uma palavra de entrada w consiste na sucessiva aplicação da função programa, a partir do estado inicial q0 e da cabeça posicionada na célula mais à esquerda da fita até ocorrer uma condição de parada. O processamento de M para a entrada w pode parar ou ficar em loop infinito. A parada pode ser de duas maneiras: aceitando ou rejeitando a entrada w. COMPUTAÇÃO Máquina de Turing As condições de parada são as seguintes: Estado Final: A máquina assume um estado final: a máquina pára, e a palavra de entrada é aceita; Função Indefinida: A função programa é indefinida para o argumento (símbolo lido e estado corrente): a máquina pára, e a palavra de entrada é rejeitada; Movimento Inválido: O argumento corrente da função programa define um movimento à esquerda e a cabeça da fita já se encontra na célula mais à esquerda: a máquina pára, e a palavra de entrada é rejeitada. COMPUTAÇÃO Máquina de Turing Uma das abordagens do estudo das Máquinas de Turing ou das Máquinas Universais em geral é como reconhecedores de linguagens, ou seja, dispositivos capazes de determinar se uma dada palavra sobre o alfabeto de entrada pertence ou não a certa linguagem. A Linguagem Aceita por uma Máquina de Turing procede da seguinte forma: Seja M = (Σ, Q, , q0, F, V, ß, ☼) uma Máquina de Turing. Então: COMPUTAÇÃO Máquina de Turing a) A linguagem aceita por M, denotada por ACEITA(M) ou L(M), é o conjunto de todas as palavras pertencentes a Σ* aceitas por M, ou seja: ACEITA(M)={w|M ao processar wΣ*, pára em um estado qfF} b) A linguagem rejeitada por M, denotada por REJEITA(M), é o conjunto de todas as palavras de Σ* rejeitadas por M, ou seja: REJEITA(M) = {w|M ao processar wΣ*, pára em um estado qF} c) A linguagem para a qual M fica em loop infinito, denotada por LOOP(M) é conjunto de todas as palavras de Σ* para as quais M fica processando indefinidamente. COMPUTAÇÃO Máquina de Turing Assim, as seguintes afirmações são verdadeiras: ACEITA(M) REJEITA(M) = ACEITA(M) LOOP(M) = REJEITA(M) LOOP(M) = ACEITA(M) REJEITA(M) LOOP(M) = ACEITA(M) REJEITA(M) LOOP(M) = Σ* Consequentemente, o complemento de: ACEITA(M) é REJEITA(M) LOOP(M) REJEITA(M) é ACEITA(M) LOOP(M) LOOP(M) é ACEITA(M) REJEITA(M) COMPUTAÇÃO Máquina de Turing Ex: MT para o problema de Duplo Balanceamento: COMPUTAÇÃO Máquina de Turing Representando a MT através da tabela de transição para o problema apresentado (Duplo Balanceamento): COMPUTAÇÃO Máquina de Turing A Máquina de Turing Alan Turing COMPUTAÇÃO Máquina de Post O conceito de computador abstrato de Post é simples. Foi apresentado por Emil Leon Post em 1943. O computador ou máquina de Post permite formular tudo aquilo que é passível deser computado. A máquina de Post (MP) apresenta o estado “ativo” ou “inativo” de cada neurônio (0 ou 1, na linguagem do computador de Post) que forma a base dos processos do pensamento humano e que é responsável pelo nosso comportamento. COMPUTAÇÃO Máquina de Post Exemplo da Máquina de Post: Emil Leon Post COMPUTAÇÃO Máquina de Post A principal característica da Máquina de Post é que usa estrutura de dados do tipo fila para entrada, saída e memória de trabalho. Estruturalmente, a principal característica de uma fila é que o primeiro valor gravado é também o primeiro a ser lido (FIFO). COMPUTAÇÃO Máquina de Mealy Uma máquina de Mealy é uma máquina de estado finito que produz um resultado (saída de dados) baseando-se no estado em que se encontra e na entrada de dados. Inventada por George H. Mealy em 1955. Assim, o diagrama de estado irá incluir tanto o sinal de entrada como o de saída para cada vértice de transição. Em contraste, a saída de uma máquina de Moore depende apenas do estado atual da máquina, sendo que as transições não possuem qualquer sinal em anexo. COMPUTAÇÃO Máquina de Mealy Mesmo assim, por cada máquina de Mealy existe uma máquina de Moore equivalente cujos estados consistem na união dos estados da máquina de Mealy e o produto cartesiano dos estados da máquina de Mealy com o alfabeto de entrada de sinais. COMPUTAÇÃO Máquina de Mealy Exemplo da Máquina de Mealy: George H. Mealy COMPUTAÇÃO Máquina de Moore Uma máquina de Moore é uma máquina de estado finita cujos valores de saída são determinados somente pelo estado atual. Inventada por Edward F. Moore em 1956. A máquina de Moore é diferente de uma máquina de Mealy, cujos valores de saída são determinados tanto pelo estado atual quanto por suas entradas. COMPUTAÇÃO Máquina de Moore Exemplo da Máquina de Moore: Edward F. Moore COMPUTAÇÃO Máquina de Norma O nome da máquina universal Norma vem de Number TheOretic Register MAchine (NORMA). Foi proposta por Richard S. Bird em 1976. Apresenta um conjunto de registradores naturais associados a três instruções: - Operação de incremento a um (adição) - Operação de decremento a um (subtração) - Teste coexistente para verificar se o valor armazenado é igual a zero COMPUTAÇÃO Máquina de Norma Sabe-se que N o conjunto de todas as uplas (conjunto de valores advindos de uma função). Para evitar subscritos os componentes das uplas são denotados por letras maiúsculas, as quais denotam os registradores da máquina de Norma. Ela é uma sete-upla. Dessa forma, suponha que K seja um registrador, K {A, B, X, Y, ...} : Norma = (N, N, N, ent, sai, {addK, subK}, {zeroK}) COMPUTAÇÃO Máquina de Norma A máquina de Norma simula características de máquinas reais como: operações, testes, valores numéricos, dados estruturados, endereçamento indireto, recursão e cadeia de caracteres. Exemplo do uso da máquina de Norma para atribuir o valor zero a um registrador A: Programa Iterativo A 0 : até A=0 faça (AA-1) COMPUTAÇÃO Máquina de Norma Exemplo da máquina de Norma Richard S. Bird COMPUTAÇÃO UNIDADE 3: Linguagem Lambida COMPUTAÇÃO Introdução Linguagem lambida ou lambida linguagem é uma representação notacional utilizada na teoria da computação, através do estudo das linguagens formais, autômatos e Computabilidade. Introduzida por Church, permeou o trabalho com o cálculo lambida com o principal objetivo de evitar ou minimizar as denominadas ambiguidades de notação adotadas na teoria da computação. COMPUTAÇÃO - Linguagem É apresentada a notação conhecida como Linguagem Lambda (λ-Linguagem), introduzida por Alonzo Church em 1941, no Cálculo Lambda (λ-Cálculo), cujo principal objetivo é evitar ambiguidades de notação. O λ-cálculo é um ramo da lógica matemática que sustenta desenvolvimentos importantes na teoria das linguagem de programação, tais como: - estudo de questões fundamentais da computação; - design de linguagens de programação; - semântica das linguagens de programação; - arquitetura de computadores; - modelagem de autômatos. COMPUTAÇÃO - Linguagem O λ-cálculo é universal no sentido de que qualquer função computável pode ser expressa e avaliada usando esses formalismo. Isto é equivalente para Máquina de Turing. O λ-cálculo enfatiza o uso de regras de transformação e não se importa em relação a implementação em uma máquina real. Esta é uma abordagem mais relativa ao software do que ao hardware propriamente dito. Chamada de menor linguagem universal do mundo. COMPUTAÇÃO - Linguagem O λ-cálculo pode ser considerado como uma linguagem de programação abstrata: funções podem ser combinadas para formar outras funções. É uma linguagem sem complicações sintáticas. Refere-se a uma maneira de formalizar o conceito de computabilidade efetiva. Alonzo Church (1936) inventou o cálculo lambda e definiu a noção de função computacional através deste sistema. Enquanto isso, Alan Turing (1936) inventou uma classe de máquinas (conhecida mais tarde como Máquinas de Turing) e definiu a noção de função computacional através dessas máquinas. COMPUTAÇÃO - Linguagem Ainda em 1936, Alan Turing provou que ambos os modelos são igualmente fortes no sentido que elas definem a mesma classe de funções computáveis. Em 1941, Alonzo Church introduz a notação de λ-Linguagem. Função: Correspondência biunívoca de membros de um conjunto domínio com o conjunto imagem. A λ-Linguagem fornece um meio de definir funções sem nome, onde uma λ-expressão especifica o parâmetro e a correspondência biunívoca de uma função. COMPUTAÇÃO - Linguagem Vejamos: Possui duas construções básicas: Abstração: abstrai a definição da função. Aplicação: determina o valor da função aplicada a um dado parâmetro. xxxxcubo =)( xxxx . 8)2)(.( = xxxx COMPUTAÇÃO - Linguagem Identificando elementos: x. x + a escopo de x local de ligação ocorrência ligada ocorrência livre COMPUTAÇÃO - Linguagem Variáveis Livres A mesma variável pode aparecer como livre e ligada numa única expressão. (x.z x) (y.y x) ligada livre COMPUTAÇÃO - Linguagem Linguagem Não-Tipada A λ-Linguagem e LISP são linguagens não-tipadas: - Programas x Dados: não distinguíveis. A associação de tipo a um termo lambda é como uma definição tradicional. Porém, a definição formal de termos lambda tipada é omitida: f(x)=x+4 f=λx.x+4 : N→N f(x)=g(x2) f=λx.λx(x) : NxN COMPUTAÇÃO - Linguagem Linguagem Não-Tipada Por ser “free-type” a λ-linguagem é útil para a simulação de recursão, ou seja, aplicação junto às funções recursivas. Considerando (F.A) onde a expressão F é um algoritmo, e a expressão A um entrada, podemos ter a expressão (F.F), sendo uma recursão de uma expressão chamando a si mesmo. COMPUTAÇÃO -redução Corresponde ao conceito de substituição do parâmetro formal de uma função por seu parâmetro real. Permite a simplificação de expressões- sem alterar o seu significado, enquanto houver uma redex (expressão reduzível). () (x.P) Q → [Q/x] P COMPUTAÇÃO UNIDADE 4: Funções Recursivas COMPUTAÇÃO Introdução Inúmeros cientistas tiveram o propósito da buscar um “procedimento mecânico” que justificasse as transformações funcionais de números. As funções recursivas mostram-se como um método eficiente para se encontrar valores de uma função. Um exemplo clássico disso é a escrita algorítmica da função FATORIAL. Pode ser construída para simular numericamente as computações de uma Máquina de Turing. COMPUTAÇÃO Funções Recursivas Uma função recursiva (FR) é uma função que se refere a si própria. Em toda a função recursiva, existem os componentes: - Um passo básico (ou mais) cujo o resultado é imediatamente conhecido; - Um passo recursivo (ou mais) em que se tenta resolver um subproblema do problema inicial; - Geralmente possui expressão condicional; - Sua execução consiste em ir resolvendo subproblemas mais simples, até se atingir omais simples de todos (resultado conhecido de imediato). COMPUTAÇÃO Funções Recursivas Padrão comum para se escrever uma FR: 1. Testar os casos mais comuns 2. Fazer chamada(s) recursivas com subproblemas cada vez mais próximo dos casos mais simples. Nos problemas mais comuns, busca-se: - Não detectar casos mais simples; - Perda de desempenho a nível de implementação computacional (tempo de resposta); - Fazer a abstração necessária não é tão intuitivo. COMPUTAÇÃO Formalismo para Algoritmos Na busca da formalização do conceito de formalismo utiliza-se 3 classificações: Operacional: Define-se uma máquina abstrata, baseada em estados, em instruções primitivas e na especificação de como cada instrução modifica cada estado. Exemplo: Formalismos tais como Máquina de Norma e MT. COMPUTAÇÃO Formalismo para Algoritmos Axiomático: Associam-se regras às componentes da linguagem. As regras permitem afirmar o que será verdadeiro após a ocorrência de cada cláusula considerando o que era verdadeiro antes da ocorrência. Exemplo: Aqui temos a visão da gramática, e como esquema de procedimento temos a Máquina de Post, por exemplo, sob esta montagem de regra. COMPUTAÇÃO Formalismo para Algoritmos Denotacional ou Funcional: Trata-se de uma função construída a partir de funções elementares de forma composicional no sentido em que o algoritmo denotado pela função pode ser determinado em termos de suas funções componentes. Esta é a visão que será tratada neste estudo. COMPUTAÇÃO Funções Recursivas Parciais Tipo de formalismo denotacional, introduzidas por Sephen Kleene (1936). Kleene tinha o objetivo de formalizar a noção intuitiva de função computável. Verifica-se que a composição de três funções naturais simples: Constante zero; Sucessor; Projeção. Juntamente com as estratégias de recursão e minimização, constituem uma forma compacta e natural para definir muitas funções e capaz de descrever toda e qualquer função intuitiva computável. Stephen Kleene COMPUTAÇÃO Funções Parciais e Total Função Parcial: Dados dois conjuntos A e B. Dizemos que uma função é parcial se f AxB onde cada elemento do domínio (conjunto A) está relacionado com, no máximo, um elemento do contradomínio. f A x B é denotada por f: A → B O tipo de f é A → B (a,b) f é denotado por f(a)=b COMPUTAÇÃO Funções Parciais e Total Exemplo: Sejam os conjuntos A={a, b, c}, B={3,5,7}, e as relações f, g de A em B: f={(a,2), (a,8)} Não é função parcial g={(b,3), (c,3)} É função parcial Se {x A, y B | f(x) = y} É função total Então, com base no exemplo anterior: g={(a,3), (b,5), (c,7)} É função total COMPUTAÇÃO Argumento da Função Dadas as três funções parciais, onde as variáveis X e Y têm seus valores em N. f(x) = x3 + 4 g(x,y) = (x2, y-x) h(f,x) = f(f(x)) A função f possui só um argumento, uma variável, portanto seu tipo é: f: N → N A função g possui dois argumentos: g: N x N → N x N ou N2 → N2 COMPUTAÇÃO Argumento da Função A função h é um exemplo de função que possui funções como argumentos. Sendo composta pelo produto cartesiano do tipo de f: h: (N → N) x N → N Tem-se o conceito de funcional, que é a função que possui uma ou mais funções como argumentos. Esse tipo ocorre com frequência em programação. COMPUTAÇÃO Argumento da Função Considere um programa que receba como parâmetro um par constituído por um arranjo A de números naturais e um número natural n e que calcula o máximo entre... A(1), A(2), ..., A(n) Arranjo: A: N → N Função: f: (A, n) = max {A(i) | 1 i n} Tipo: (N → N) x N → N COMPUTAÇÃO Hierarquia das Funções Recursivas Todas as funções de números naturais Funções recursivas primitivas Funções recursivas Parciais que são totais Funções recursivas Parciais COMPUTAÇÃO Função Computada Então a função computada W, M é tal que, para qualquer x X: W, M(x) = fY(x) Cada função computável por Norma pode ser definida recursivamente. A função recursiva fornece uma abordagem (denotacional) diferente da operacional. A quase totalidade das linguagens de programação modernas possui recursão como um construtor básico de programas. As arquiteturas da maioria dos atuais computadores possuem facilidades para implementar recursão. COMPUTAÇÃO Princípio da Recursão No princípio da recursão o problema como um todo e reduz-se o problema a subproblemas menores, até que se chega a um problema base, iniciando assim o processo reverso, com a resolução de cada instância do problema. COMPUTAÇÃO Definições Recursivas de Bird Considere a seguinte definição recursiva da função fatorial: fatorial = λx.(x = 0 → 1, x• fatorial (x - 1)) fatorial(0) = 1. fatorial(0) = (0 = 0 →1, 0•fatorial(0 - 1)) = 1 Observa-se que: 0•fatorial(0-1) não tem valor definido, pois fatorial(0-1) é indefinido. Como x=0 é verdadeira, a função tem valor igual a 1. COMPUTAÇÃO Definições Recursivas de Bird Adição, Multiplicação e Potenciação Considere as seguintes definições recursivas das funções adição (adição), multiplicação (mult) e potenciação (pot): adição = λ(x, y).(x = 0 → y, adição(x - 1, y) + 1) mult = λ(x, y).(x = 0 → 0, adição( mult(x - 1, y), y) ) pot = λ(x, y).(y = 0 → 1, mult( pot(x, y - 1), x) ) Observa-se que: A adição é definida em termos da função sucessor (sucessor= λy.y+1); A multiplicação é definida em termos de adições de y; A potenciação é definida em termos de multiplicações de x. COMPUTAÇÃO Definições Recursivas de Bird Divisão, Multiplicação Considere a definição da função multiplicação mult, juntamente com as definições recursivas das funções divisão inteira (div) de x por y (indefinida para y = 0) e a multiplicação (m) dessa por y: div = λ(x, y).(x < y → 0, div(x - y, y) + 1) m = λ(x, y).mult(y, div(x, y)) Entretanto, para y = 0, m(x,0) admite as seguintes interpretações: • m(x,0) = mult(0, div(x, 0)) = 0 e, portanto, é definida; • m(x,0) = mult(0, div(x, 0)) é indefinida pois div(x, 0) é indefinida. COMPUTAÇÃO Definições Recursivas de Bird Portanto, o argumento (0, div(x, 0)) é indefinido; logo, mult(0, div(x, 0)) é indefinida. Observação: Problemas de dupla interpretação (definida/indefinida) são solucionados usando regras de avaliação de funções recursivas. COMPUTAÇÃO UNIDADE 5: Classes de Solucionabilildade de Problemas COMPUTAÇÃO Introdução Programas mais rápidos são aqueles que apresentam tamanhos menores quando alocados na memória real do computador para sua execução (run-time). Os problemas em uma Máquina de Turing podem ser considerados tratáveis e intratáveis. A complexidade computacional nos permite analisar o quão complexo é a execução de um programa, nos permitindo, muitas das vezes, adotando o princípio da redução, a ter soluções computacionais para o mesmo programa, com complexidade menor que o original, sem que seja perdido a sua essência na solucionabilidade de problemas. COMPUTAÇÃO Complexidade Computacional A complexidade computacional diz respeito à quantidade de trabalho envolvida na resolução do problema pelo algoritmo (tempo de execução), medida, muitas vezes, pela quantidade de trabalho que uma determinada instância do problema necessita para resolvê-lo. Também se pode considerar a quantidade de memória necessária (espaço) e, no caso de processamento paralelo e distribuído, o número de processadores necessários para a conclusão do programa executado. COMPUTAÇÃO Problemas Previamente Tratados Soluções algorítmicas de ordem limitado polinomialmente, representadas por (Θ(n3)) Com solução polinomial: tratável Sem solução polinomial conhecida: intratável COMPUTAÇÃO Problemas de Decisão e de Otimização Coloração de Grafos: dados G = (V, E) e S, achar C : V → S tal que se (u, v) ∈ V, então C(u) C(v). Número cromático de G: mínima |Imagem(C(V))|, denota X(G) Problema de otimização: dado G, determine X(G) e produza uma coloração ótima Problema de decisão: dados G e k ≥ 0, determine se existe Ccom |Imagem(C(V))| ≤ k COMPUTAÇÃO Problemas de Decisão e de Otimização Execução de tarefas com penalidades: dadas sequências, j1, ..., jn , t1, ...,tn , d1, ..., dn , p1, ..., pn respectivamente, de tarefas, tempos de execução, prazos limite e penalidades, uma execução das tarefas é uma permutação π de [1, ..., n]. A penalidade de π é, Pπ := σ𝑘=1 𝑛 k=1[if tπ(1) + · · · + tπ(k) > dπ(k) then pπ(k) else 0] Problema de otimização: determine a penalidade mínima. Problema de decisão: dado, adicionalmente k ∈ N, determine se existe uma execução π com Pπ ≤ k. COMPUTAÇÃO Problemas de Decisão e de Otimização Empacotamento (bin packing): Dado um número ilimitado de caixas de capacidade 1 e n objetos com tamanhos s1, ..., sn, onde 0 ≤ si ≤ 1, para todo 1 ≤ i ≤ n. Problema de otimização: determine o menor número de caixas para empacotar os n objetos Problema de decisão: dado, adicionalmente k ∈ N, determine se existe um empacotamento dos n objetos em k caixas COMPUTAÇÃO Problemas de Decisão e de Otimização Soma de subconjuntos: Dados C ∈ N e n objetos com tamanhos s1, ..., sn. Problema de otimização: encontre o subconjunto de objetos com máximo tamanho total que não exceda C Problema de decisão: determine se existe um subconjunto de objetos com tamanho total de exatamente C COMPUTAÇÃO Problemas de Decisão e de Otimização Forma Normal Conjuntiva - Satisfatibilidade (CNF-SAT – Conjuntive Normal Form Satisfiability): Um literal é uma variável booleana p ou sua negação ¬p. Uma cláusula é uma disjunção de literais. Uma fórmula lógica em forma normal conjuntiva é uma conjunção de cláusulas. Exemplo: (p ∨ q ∨ r ∨ ¬s) ∧ (r ∨ ¬q ∨ ¬p) ∧ (s ∨ ¬r) Problema de decisão: determine se existe uma atribuição de valores true e false para as variáveis booleanas de uma fórmula lógica em CNF tal que a fórmula é true. COMPUTAÇÃO Problemas de Decisão e de Otimização Caminhos e circuitos Hamiltonianos: Dado um grafo não dígrafo, G = ({v1, ..., vn}, E), um caminho Hamiltoniano em G é uma permutação π de [1, ..., n], tal que para todo 1 ≤ i < n, (vπ(i) , vπ(i+1)) ∈ E. Se adicionalmente (vπ(n), vπ(1)) ∈ E, diz-se que o caminho é um circuito Hamiltoniano. Problema de decisão: dado um dígrafo G, determine se existe um caminho (circuito) Hamiltoniano em G. COMPUTAÇÃO Problemas de Decisão e de Otimização Problema do caixeiro viajante: Dado um dígrafo com pesos, G = ({v1, ..., vn}, E, p), onde p : E → R ∗, um circuito Hamiltoniano π em G tem custo, 𝑖=1 𝑛−1 p((𝑣 𝑖 , 𝑣 𝑖 + 1 )) + 𝑝((𝑣 𝑛 , 𝑣 1 )) Problema de otimização: dado um dígrafo com pesos, encontre o circuito hamiltoniano de custo mínimo. Problema de decisão: dado adicionalmente um inteiro k, determine se existe um circuito Hamiltoniano com peso menor ou igual que k. COMPUTAÇÃO Problemas de Decisão e de Otimização Tentativa e Erro (Backtraking): decompor o processo em um número finito de subtarefas parciais que devem ser exploradas exaustivamente numa Máquina de Turing. Problema de otimização: encontre o melhor movimento para gerar o menor grau de impacto negativo às jogada realizada Problema de decisão: determine se existe um espaço disponível válido para movimentar, por exemplo, a peça de xadrez, cavalo. Caso não existam espaços disponíveis para a movimentação, deve-se escolher outra peça para movimentar. COMPUTAÇÃO Complexidade Computacional Problema abstrato de decisão: conjunto I de instâncias e função f : I → {SIM, NÃO} Exemplo: Problema circuito hamiltoniano. I: conjunto de todos os grafos. Para todo G em I, SIM se G tem um circuito hamiltoniano f(G) = NÃO caso contrário O valor f(X) é a resposta do problema para a instância X em I. COMPUTAÇÃO Complexidade Computacional Para um problema abstrato ser resolvido, instâncias devem estar convenientemente codificadas. Problema concreto de decisão: problema abstrato de decisão em que as instâncias estão codificadas convenientemente em um alfabeto finito Σ. Exemplo: Problema circuito hamiltoniano. G dado pelas suas listas de adjacências. Considere, sem perda de generalidade, que Σ = {0, 1}. Logo, daqui para frente, todos os problemas são concretos. COMPUTAÇÃO Modelo de Computação Algoritmo: programa escrito em uma linguagem “X”. Custo de uma operação: proporcional ao número de bits dos operandos. Custo de um acesso à memória: proporcional ao número de bits dos operandos. (Isto é polinomialmente equivalente à Máquina de Turing) Um algoritmo resolve ou decide um problema de decisão (I, f) se, para cada X em I, o algoritmo encontra a resposta para X, isto é, o algoritmo calcula f(X). COMPUTAÇÃO Problemas Indecidíveis Existem problemas para os quais não existe um algoritmo: Estes são os ditos problemas indecidíveis. Exemplo: Problema da parada dado um programa e um arquivo de entrada para ele, decidir se tal programa pára ou não quando executado com este arquivo de entrada. Não existe algoritmo que resolva o problema da parada COMPUTAÇÃO As Classes P, NP e NP-Completude A Classe P Um algoritmo resolve um problema de decisão (I, f) em tempo O(T(n)), se para cada n em N e cada X em I com |X| = n, o algoritmo encontra a resposta f(X) para X em tempo O(T(n)). Para uma Máquina de Turing, um problema de decisão é solúvel em tempo polinomial, se existe algum k para o qual existe um algoritmo que resolve o problema em tempo O(nk). Tais problemas são ditos tratáveis. Portanto, a classe de complexidade P, apresenta um Conjunto dos problemas de decisão tratáveis. COMPUTAÇÃO As Classes P, NP e NP-Completude A Classe NP Considere o problema circuito hamiltoniano. Se a resposta para uma instância G for SIM, então existe um circuito hamiltoniano C no grafo. Dados G e C, é possível verificar em tempo polinomial em |G| se C é de fato um circuito hamiltoniano em G ou não. Ou seja, temos como certificar eficientemente que a resposta SIM está correta. COMPUTAÇÃO As Classes P, NP e NP-Completude A Classe NP Conseguimos certificar eficientemente a resposta NÃO? Surpreendentemente, não se conhece nenhum método de certificação eficiente para a resposta NÃO no caso do problema circuito hamiltoniano. Portanto, a classe de complexidade NP, apresenta problemas para os quais a resposta SIM pode ser certificada e verificada em tempo polinomial. COMPUTAÇÃO As Classes P, NP e NP-Completude A Classe NP Mais precisamente, um problema de decisão está em NP se existe um algoritmo A tal que: 1. para qualquer instância X do problema com resposta SIM, existe um Y em Σ∗ tal que A(X, Y) devolve SIM; 2. para qualquer instância X do problema com resposta NÃO, para todo Y em Σ∗, A(X, Y) devolve NÃO; 3. A consome tempo polinomial em |X|. Y é chamado de certificado para SIM da instância X. COMPUTAÇÃO As Classes P, NP e NP-Completude A Classe NP-Completude Complemento de um problema de decisão Q: problema de decisão obtido invertendo-se o SIM e o NÃO na resposta ao problema Q. Exemplo: Problema não-hamiltoniano Resposta é SIM sempre que o grafo não tem um circuito hamiltoniano e NÃO caso contrário, independentemente do modelo da MT utilizada. Classe de complexidade NP-Completude: problemas de decisão que são complemento de problemas de decisão em NP. Problemas para os quais existe um certificado (curto) para a resposta NÃO. COMPUTAÇÃO As Classes P, NP e NP-Completude P x NP x NP-Completude (coNP) O problema circuito hamiltoniano é um exemplo de problema em NP enquanto que o problema não-hamiltoniano é um exemplo de problema em coNP. Note ainda que P ⊆ NP ∩ coNP. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT A complexidade de tempo de uma computação mede a quantidade de trabalho gasto pela computação. O tempo de uma computação de uma Máquina de Turing é quantificado pelo número de transições processadas. Seja uma máquina de Turing M que aceita palíndromos sobre o alfabeto Σ = {a, b} COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT Máquinade Turing COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT Tabela de Transição COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT Como esperado, o número de transições em uma computação depende da cadeia de entrada. De fato, a quantidade de trabalho difere para cadeias de mesmo comprimento. Ao invés de tentar determinar o número exato de transições para cada cadeia de entrada, a complexidade de tempo de uma Máquina de Turing é medida pelo trabalho necessário para cadeias de um comprimento fixo. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT Definição: Seja M uma Máquina de Turing. A complexidade de tempo (“tempo de execução”) de M é a função ctM : N → N tal que ctM (n) é o número máximo de transições processadas por uma computação de M quando iniciada com uma cadeia de entrada de comprimento n, independente de M aceitar ou não. Quando se avalia a complexidade de tempo de uma Máquina de Turing, assume-se que a computação termina para toda cadeia de entrada. Não faz sentido discutir a eficiência de uma computação que continua indefinidamente. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT A definição serve para máquinas que aceitam linguagens e computam funções. A complexidade de tempo de máquinas determinísticas multi- trilhas e multi-fitas é definida de maneira similar. A complexidade de tempo dá a performance de pior caso da Máquina de Turing. Analisando um algoritmo, escolhe-se a performance do pior caso por duas razões: 1. Considera-se as limitações da computação algorítmica. O valor ctM (n) especifica os recursos mínimos necessários para garantir que a computação de M termina quando iniciada com uma cadeia de entrada de comprimento n. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT 2. A performance do pior caso é frequentemente mais fácil de avaliar do que a performance média. A máquina M que aceita os palíndromos sobre Σ = {a, b} é usada para demonstrar o processo de determinar a complexidade de tempo de uma Máquina de Turing. Uma computação de M termina quando toda a cadeia de entrada foi substituída por brancos ou o primeiro par de símbolos não previsto é descoberto. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT Como a complexidade de tempo mede a performance do pior caso, há necessidade de se preocupar apenas com as cadeias cujas computações fazem com que a máquina faça o maior número possível de ciclos acha-e-apaga. Esta condição é satisfeita quando a entrada é aceita por M. Usando estas observações, pode-se obter os valores iniciais da função ctM da computações da tabela . ctM (0) = 2 ctM (1) = 3 ctM (2) = 7 ctM (3) = 10 COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT Quando M processa uma cadeia de comprimento par, a computação alterna entre sequências de movimentos a direita e a esquerda da máquina. Inicialmente a cabeça é posicionada no símbolo mais a esquerda da porção não branca da fita e então: Movimentos à direita: a máquina se move à direita, apagando o símbolo não-branco mais à esquerda. O resto da cadeia é lida e a máquina entra no estado q4 ou q7. Isto requer k + 1 transições, onde k é o comprimento da porção não-branca da cadeia. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT Movimentos à esquerda: M se move para a esquerda, apagando o símbolo correspondente, e continua através da porção não- branca da fita. Isto requer k transições. As ações acima reduzem o comprimento da porção não-branca da fita por dois. O ciclo de comparações e apagamentos é repetido até que a fita esteja completamente em branco. Como observado, a performance do pior caso para uma cadeia de comprimento par ocorre quando M aceita a entrada. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT A computação que aceita uma cadeia de comprimento n requer n/2 iterações do loop anterior. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT O número máximo de transições em uma computação de uma cadeia de comprimento par n é a soma dos primeiros n + 1 números naturais. Uma análise de cadeias de comprimento ímpar produz o mesmo resultado. Consequentemente, a complexidade de tempo de M é dada pela função: COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT A máquina de duas fitas M’ também aceita o conjunto de palíndromos sobre Σ = {a, b}. Uma computação de M’ percorre a entrada fazendo uma cópia na fita 2. A cabeça da fita 2 é depois movida à posição inicial. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT Então, as cabeças se movem ao longo da entrada, fita 1 para a esquerda e fita 2 para a direita, comparando os símbolos das fitas 1 e 2. Se as cabeças encontrarem símbolos diferentes, a entrada não é um palíndromo e a computação para num estado de não- aceitação. Quando a entrada é um palíndromo, a computação para e aceita quando brancos são simultaneamente lidos nas fitas 1 e 2. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT Para uma entrada de comprimento n, o número máximo de transições ocorre quando a cadeia é um palíndromo. Uma aceitação requer três passos completos: a cópia a volta a comparação Contando o número de transições em cada passo, vê-se que a complexidade de tempo de M’ é ctM’(n) = 3(n + 1) + 1 COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT A definição da complexidade de tempo ctM é baseada nas computações da máquina M e não na linguagem aceita pela máquina. Sabe-se que muitas máquinas diferentes podem ser construídas para aceitar a mesma linguagem, cada qual com diferentes complexidades de tempo. Diz-se que uma linguagem L é aceita em tempo determinístico f(n) se houver uma Máquina de Turing determinística M qualquer com ctM (n) ≤ f(n) para todo n ∈ N. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT A máquina M mostrou que o conjunto de palíndromos sobre Σ = {a, b} é aceito em tempo (n2+3n+2) 2 enquanto que a máquina de duas fitas M’ exibiu aceitação no tempo 3n + 4. Uma transição de uma máquina de duas fitas utiliza mais informação e realiza uma operação mais complicada do que a máquina de uma fita. COMPUTAÇÃO Complexidade de Tempo e Espaço de uma MT A estrutura adicional da transição de duas fitas permitiu a redução no número de transições de M’ necessárias para processar uma cadeia em relação à máquina de uma fita M. Portanto, vê-se um equilíbrio entre a complexidade das transições e o número que deve ser processado. Há formas de “acelerar” uma máquina que aceita uma linguagem L para produzir uma nova máquina que aceita L num tempo menor. COMPUTAÇÃO Complexidade de MT em Casos Reais Buscaremos aqui fazer aplicações reais do dia-a-dia que requerem uma modelagem das mesmas por meio de máquinas de estado, baseadas na estrutura e complexidade lógica da máquina de turing, MT. Vejamos um exemplo prático: Modele uma máquina de estado computável, semelhante a uma MT, que simule o funcionamento de uma lâmpada padrão comum, assumindo os estados de ACESA ou APAGADA, mediante o acionamento de um interruptor com as funções de Liga (ON) e Desliga (OFF). COMPUTAÇÃO Complexidade de MT em Casos Reais Solução do problema: COMPUTAÇÃO UNIDADE 6: Sistemas de Estados Finitos COMPUTAÇÃO Introdução A computabilidade tem por objetivo o estudo da solucionabilidade de problemas. Isso significa investigar a existência ou não de algoritmos que solucionem determinada classe de problemas. A computabilidade permite a investigação dos limites computacionais das classes de problemas e, consequentemente, os limites do que pode efetivamente ser implementado em um computador. O Sistema de Estados Finitos tem que proporcionar a computabilidade parcial ou total de certo problema. COMPUTAÇÃO Computabilidade Em 1901, David Hilbert formulou uma lista de problemas que contia vinte e três problemas matemáticos, até o momento insolúveis. Em 1970, Yuri Matijasevic provou que um problema pode ter uma solução satisfatível ou não, independente de comoele é classificado. COMPUTAÇÃO Computabilidade A verificação da solucionabilidade de um problema pode ser tratada como a verificação se determinada linguagem é recursiva, associando as condições de ACEITA/REJEITA de uma Máquina Universal às respostas sim/não, respectivamente, caracterizando-o solúvel ou não. A Classe dos Problemas Solucionáveis (solúveis) é equivalente à Classe das Linguagens Recursivas. Ainda existem muitos problemas que são considerados não-solucionáveis (insolúveis). COMPUTAÇÃO Computabilidade Alguns Problemas Clássicos: a) Equivalência de Compiladores: Não existe algoritmo genérico que seja capaz de comparar quaisquer dois compiladores de linguagens livres do contexto (reconhecidas pelo formalismo Autômato Não-Determinístico com uma Pilha); b) Detector Universal de Loops: Dados um programa e uma entrada quaisquer, Não existe algoritmo genérico capaz de verificar se o programa vai parar ou não, para a entrada dada. Este problema é universalmente conhecido como o Problema da Parada. COMPUTAÇÃO Computabilidade Alguns problemas não-solucionáveis, são parcialmente solucionáveis (parcialmente solúvel), ou não. Exemplo: Existe um algoritmo capaz de responder sim, embora, eventualmente, possa ficar em loop infinito para uma resposta que deveria ser não. COMPUTAÇÃO Computabilidade Problemas parcialmente solúveis são computáveis! A Classe dos Problemas Parcialmente Solúveis é equivalente à Classe das Linguagens Enumeráveis Recursivamente. Classe dos Problemas = Computáveis × Não-Computáveis Um solução aparentemente solúvel, quando não-solúvel, pode tanto ser caracterizada como insolúvel, quanto parcialmente solúvel, dependendo do caso a que ela for aplicada. COMPUTAÇÃO Classe de Solucionabilidade de Problema Um problema é dito Solúvel ou Totalmente Solúvel se existe um algoritmo (Máquina Universal) que solucione o problema tal que sempre pára, para qualquer entrada, com uma resposta afirmativa (ACEITA) ou negativa (REJEITA). Um problema é dito insolúvel ou não-solúvel se não existe um algoritmo (Máquina Universal) que o solucione que sempre pára, para qualquer entrada. COMPUTAÇÃO Classe de Solucionabilidade de Problema Um problema é dito Parcialmente Solúvel ou Computável se existe um algoritmo (Máquina Universal) que solucione o problema tal que pára quando a resposta é afirmativa (ACEITA). Entretanto, quando a resposta for negativa, o algoritmo pode parar (REJEITA) ou continuar indefinidamente (LOOP). Um problema é dito Completamente Insolúvel ou Não- Computável se não existe um algoritmo (Máquina Universal) que solucione o problema tal que pára quando a resposta é afirmativa (ACEITA). COMPUTAÇÃO Problemas de Decisão Dado um programa P para uma máquina universal M, decidir se a função computada 〈P, M〉 é total (ou seja, se a correspondente computação é finita). Dessa forma, quando P precisa decidir entre duas ou mais alternativas válidas, através de uma dada função computada, dizemos ter um Problema de Decisão. LD = { p|<P, M> (p) → p1 ou p2 } COMPUTAÇÃO Problemas de Decisão Dado um programa P para uma máquina universal M, decidir se a função computada 〈P, M〉 é total (ou seja, se a correspondente computação é finita). Dessa forma, quando P precisa decidir entre duas ou mais alternativas válidas, através de uma dada função computada, dizemos ter um Problema de Decisão. COMPUTAÇÃO Problemas da Auto Aplicação Dado um programa monolítico arbitrário P para a Máquina Norma, decidir se a função computada <P, Norma> é definida para p, onde p é a codificação de P. Dado um programa monolítico arbitrário P para Norma, decidir se a computação de P em Norma termina ou não, para a entrada p. LAA = { p|<P, Norma>(p) é definida, P programa de Norma, p= código(P) } COMPUTAÇÃO Problemas da Auto Aplicação Dessa forma, a questão da solucionabilidade do Problema da Auto Aplicação é a investigação se a linguagem é recursiva. Portanto, constata-se que o Problema da Auto Aplicação é Parcialmente Solúvel. COMPUTAÇÃO Princípio da Redução Sejam dois problemas A e B e as correspondentes linguagens LA e LB. Para uma Máquina de Redução R de LA para LB é tal que (w Σ): - Se w LA, então R(w) LB - Se w LA, então R(w) LB Portanto, o mapeamento de linguagens é uma função computável total. COMPUTAÇÃO Princípio da Redução Sejam dois problemas A e B e as correspondentes linguagens LA e LB. Se existe uma máquina de redução R de LA para LB (sobre um alfabeto Σ), então os seguintes resultados podem ser estabelecidos: a) Se LB é recursiva, então LA é recursiva; b) Se LB é enumerável recursivamente, então LA é enumerável recursivamente; c) Se LA não é recursiva, então LB não é recursiva; d) Se LA não é enumerável recursivamente, então LB não é enumerável recursivamente. COMPUTAÇÃO Princípio da Redução Seja R Máquina de Turing de Redução que sempre pára e que reduz LA a LB. COMPUTAÇÃO Princípio da Recursão Na recursão, vê-se o problema como um todo e reduz-se o problema a subproblemas menores, até que se chega a um problema base, iniciando assim o processo reverso, com a resolução de cada instância do problema. COMPUTAÇÃO Problema da Parada Dada uma Máquina Universal M qualquer e uma palavra w qualquer sobre um alfabeto de entrada, existe um algoritmo que verifique se M pára, aceitando ou rejeitando, ao processar a entrada w? Isso requer um entendimento referente ao problema da parada, obviamente. COMPUTAÇÃO Problema da Parada O Problema da Parada é um problema de decisão (do tipo sim/não) e pode ser redefinido assim: LP = { (m, w) | m = código(M) e w ACEITA(M) REJEITA(M) } O Teorema do Problema da Parada é Não-Solúvel. COMPUTAÇÃO Problema da Parada A linguagem LP (Problema da Parada) não é recursiva: LP = { (m, w) | m = código(M) e w ACEITA(M) REJEITA(M) } COMPUTAÇÃO Problema da Parada da Palavra Vazia Dada uma Máquina Universal M qualquer, existe um algoritmo que verifique se M pára, aceitando ou rejeitando, ao processar a entrada vazia. COMPUTAÇÃO Problema da Totalidade Dada uma Máquina Universal M qualquer, existe um algoritmo que verifique se M pára, aceitando ou rejeitando, ao processar qualquer entrada. COMPUTAÇÃO Problema da Equivalência O Problema da Equivalência é um problema de decisão (do tipo sim/não) que verifica a equivalência de duas máquinas universais. COMPUTAÇÃO Problema da Correspondência de Post O Problema da Correspondência de Post é definido sobre um Sistema de Post. Um Sistema de Post S definido sobre um alfabeto Σ é um conjunto finito e não-vazio de pares ordenados de palavras sobre Σ. O Problema da Correspondência de Post é a investigação da existência de um algoritmo que análise qualquer Sistema de Post e determine se ele tem pelo menos uma solução. COMPUTAÇÃO Problema da Correspondência de Post Teorema Problema da Correspondência de Post é Não- Solucionável A linguagem que traduz o Problema da Correspondência de Post não é recursiva: LCP={s|s = código(S) e S é Sistema de Post com pelo menos uma solução } Prova: A partir de uma Máquina de Post M qualquer sobre o alfabeto Σ e de uma palavra w ∈ Σ* qualquer, constrói-se um Sistema Normal de Post baseado na sequência de comandos executados por M para a entrada w, de tal forma que o Sistema Normal tenha solução se, e somente se, M pára para a entrada w. COMPUTAÇÃO Problema da Correspondência de Post Portanto, o Problema da Parada é reduzido ao Problema da Correspondência de Post. A linguagem LP que traduz o Problema da Parada (que não é recursiva) é reduzida à linguagem LCP. COMPUTAÇÃO Propriedades da Solucionabilidade Dado: • o complemento de uma linguagem recursiva é uma linguagem recursiva; • uma linguagem é recursiva se, e somente se, a linguagem e seu complemento são enumeráveis recursivamente; • o complemento de um problema solucionável é solucionável; • um problema é solucionável se, esomente se, o problema e seu complemento são parcialmente solucionáveis. EXEMPLO: Problema da Parada • o Problema da Parada é parcialmente solucionável; • o Problema da Parada é não-solucionável; • portanto, o Problema da Não-Parada é não-solucionável. COMPUTAÇÃO Propriedades da Solucionabilidade Teorema: Complemento de uma Linguagem Recursiva - é uma Linguagem Recursiva - se uma linguagem L sobre um alfabeto Σ qualquer é recursiva, então o seu complemento Σ* - L também é uma linguagem recursiva. Prova: Suponha L uma linguagem recursiva sobre Σ. Então existe M, Máquina Universal, que aceita a linguagem e sempre para para qualquer entrada. Ou seja: ACEITA(M) = L REJEITA(M) = Σ* - L LOOP(M) = ∅ COMPUTAÇÃO Propriedades da Solucionabilidade Seja M' uma Máquina Universal construída a partir de M, mas invertendo-se as condições de ACEITA por REJEITA e vice- versa. Portanto, M' aceita Σ* - L e sempre pára para qualquer entrada. Ou seja: ACEITA(M') = Σ* - L REJEITA(M') = L LOOP(M') = ∅ Logo Σ* - L é uma linguagem recursiva. COMPUTAÇÃO Sistema de Estados Finitos Um estado descreve um nó de comportamento do sistema em que está à espera de uma condição para executar uma transição. Normalmente, um estado é introduzido quando o sistema não reage da mesma forma para uma mesma condição. No exemplo de um sistema de rádio de carro, quando se está ouvindo uma estação de rádio, o estímulo "próximo" significa ir para a próxima estação. Mas quando o sistema está no estado de CD, o estímulo "próximo" significa ir para a próxima faixa. O mesmo estímulo desencadeia ações diferentes, dependendo do estado atual. COMPUTAÇÃO Sistema de Estados Finitos Em algumas representações de máquinas de estado finitas, também é possível associar ações a um estado: •Ação de entrada: o que é realizado ao entrar no estado, •Ação de saída: o que é executado ao sair do estado. A transição é um conjunto de ações a serem executadas quando uma condição for cumprida ou quando um evento é recebido. Máquinas de estado são utilizadas para descrever circuitos sequenciais. Diferentemente de um contador que em geral conta eventos, uma máquina de estado costuma ser usada para controlar o evento. COMPUTAÇÃO Sistema de Estados Finitos A máquina está em apenas um estado por vez, este estado é chamado de estado atual. Um estado armazena informações sobre o passado, isto é, ele reflete as mudanças desde a entrada num estado, no início do sistema, até o momento presente. Uma transição indica uma mudança de estado e é descrita por uma condição que precisa ser realizada para que a transição ocorra. Uma ação é a descrição de uma atividade que deve ser realizada num determinado momento. O sistema de estados finitos são representados na teoria da computação através do estudo dos autômatos finitos. COMPUTAÇÃO UNIDADE 7: Autômatos Finitos COMPUTAÇÃO Introdução Os sistemas de estados finitos representa um modelo matemático de sistema com entradas e saídas discretas. Podem possuir um número finito e predefinido de estados. Cada estado assume somente as informações necessárias para determinar as ações para a próxima entrada. O fato de possuir um número finito e predefinido de estados significa que todos os estados possíveis do sistema podem ser mecanicamente explicitado antes de iniciar o processamento, ou seja, podem ser definidos de partida, por extensão. Um forte motivacional para estudo de sistemas de estados finitos é o fato de poderem ser associados a diversos tipos de sistemas naturais e construídos. COMPUTAÇÃO Autômatos Finitos Determinísticos Autônomos Finitos Determinísticos refere-se a um sistema de estados finitos o qual constitui um modelo computacional do tipo sequencial muito comum em diversos estudos teórico- formais da Computação e da Informática. Cmo destaque dessa aplicabilidade, temos: - Linguagens Formais; - Compiladores; - Semântica Formal; - Modelos para Concorrência. COMPUTAÇÃO Autômatos Finitos Determinísticos Veja o sistema de estados com suas funções de transição: f(pq) – Função de transição que permite a mudança do estado p para o estado q; f(qp) – Função de transição que permite a mudança do estado q para o estado p; f(p) – Função recursiva que permanece no estado p de origem; f(q) – Função recursiva que permanece no estado q de origem; COMPUTAÇÃO Autômatos Finitos Determinísticos Um Autômato Finito Determinístico ou simplesmente Autômato Finito pode ser visto como uma máquina constituída basicamente de três partes: Fita: Dispositivo de entrada que contém a informação a ser processada; Unidade de Controle: Reflete o estado corrente da máquina. Possui uma unidade de leitura (cabeça de leitura da fita) a qual acessa uma célula da fita de cada vez e movimenta-se exclusivamente para a direita. Programa, Função Programa ou Função de Transição: Função que comanda as leituras define o estado da máquina. COMPUTAÇÃO Autômatos Finitos Determinísticos Autômato Finito como Máquina de Estado - A fita é finita, sendo dividida em células, cada uma das quais armazena um símbolo. - Os símbolos pertence a um alfabeto de entrada. - Não é permitido gravar sobre a fita. COMPUTAÇÃO Autômatos Finitos Determinísticos A unidade de controle possui um número finito e predefinido de estados (controle finito). A unidade de controle lê o símbolo de uma célula um de cada vez. Como método de construção de um AF nem sempre é importante considerar desde logo a obrigatoriedade acima referida. Muitas vezes o problema resolve-se nos seus aspectos essenciais deixando alguns estados sem transição para algumas entradas. COMPUTAÇÃO Autômatos Finitos Determinísticos As transições acrescentam-se depois e vão para o mesmo estado único denominado estado “armadilha” (trap state). A função de transição estendida, *, materializa a ideia da dinâmica do autômato. Em certos problemas, é mais simples desenhar o autômato que reconhece a linguagem complementar e, depois, transformar os estados finais em não finais e vice-versa. Este fato pode ser provado e a situação de termos a função total é um elemento importante para a prova. COMPUTAÇÃO Autômatos Finitos Determinísticos As linguagens associadas aos autômatos finitos dizem-se regulares. Em problemas do tipo, “Desenhe um autômato que reconheça a linguagem sobre o alfabeto = {a1, a2 , ..., an} cujas palavras têm a característica x...”, o método usual é começar por desenhar a parte do autômato que satisfaz a característica x e depois preocuparmos-nos como o fato de todas as transições terem que estar definidas. Um AF pode ser representado por um grafo de transição (também chamado de diagrama de estados) ou por uma tabela de transição. COMPUTAÇÃO Autômatos Finitos Determinísticos Exemplo de um Autômato Finito Determinístico: COMPUTAÇÃO Autômatos Finitos Não Determinísticos Símbolo do alfabeto de entrada: (lambda). A tabela de transições de um AFND passa a ter mais uma coluna. Esta transição simboliza a possibilidade da máquina mudar de estado sem consumir nenhum símbolo da entrada. Sua utilização facilita determinadas construções com os autômatos, mas obriga a alguma atenção relativamente às situações de não determinismo que a sua utilização determina. As transições, se fazem para subconjuntos dos estados do autômato. COMPUTAÇÃO Autômatos Finitos Não Determinísticos É possível a situação de não haver, para determinados símbolos do alfabeto de entrada, nenhuma transição, ou seja, é possível (q, a) = 0. Daqui também decorre não ser necessário o uso do estado “armadilha” (trap state) para completar a especificação. Logo, podem existir no autômato de estados “armadilha”. O não determinismo consiste na possibilidade de um autômato transitar para um dado estado e um símbolo do alfabeto de entrada para mais do que um estado. A transição pode não consumir nenhum símbolo da entrada. COMPUTAÇÃO Autômatos Finitos Não Determinísticos Um AFND define-sepor: M = (Q, , , q0, F) onde: : Q x {} → 2Q Veja no exemplo: As transições () são importantes em determinados processos construtivos mas elas podem ser eliminadas. O algoritmo de eliminação tem duas fases: 1. Eliminação de ciclos de transições - 2. Eliminação de transições - ”simples” COMPUTAÇÃO Autômatos Finitos Não Determinísticos Algoritmo elimina_ciclos Entrada: Autômato Saída: Autômato equivalente sem ciclos de transição - Início Marcar todos os estados com 0; Enquanto existirem estados com 0 faça Escolhe um; Constrói a sua árvore de transição - Se o estado aparece repetido então Funde o respectivo caminho senão Marca o estado com 1 Fim-se Fim-Enquanto Fim COMPUTAÇÃO Autômatos Finitos Não Determinísticos Situação inicial de um autômato com dois ciclos de transição - : Elimina o primeiro ciclo: COMPUTAÇÃO Autômatos Finitos Não Determinísticos Eliminando o próximo ciclo, teremos então a situação final (sem ciclos): O segundo, e último passo, será a eliminação de transição - simples. Para tanto, vejamos o algoritmo responsável. COMPUTAÇÃO Autômatos Finitos Não Determinísticos Algoritmo elimina_transição_simples Entrada: autômato sem ciclos de transições - Saída: autômato equivalente sem transições - Início Enquanto existirem transições- faça Escolher um estado p tal que (p, ) = q Faz (p, ) = 0 Acrescentar (p, ai) = qi para todo ai : (p, ai) = qi Acrescentar p a F, caso q seja estado final Fim-Enquanto Fim COMPUTAÇÃO Autômatos Finitos Não Determinísticos Considere o exemplo a seguir (situação inicial): COMPUTAÇÃO Autômatos Finitos Não Determinísticos Aplicando o algoritmo obtemos numa primeira iteração a situação intermediária mostrada na figura a seguir: COMPUTAÇÃO Autômatos Finitos Não Determinísticos Numa nova iteração obtemos como resultado final (autômato sem transições vazias): COMPUTAÇÃO Transformação Não Determinísticos em Determinismo Os AFND são métodos cômodos de especificação de solução para problemas complexos. Sua implementação tem custos operacionais elevados. Veja o algoritmo a seguir: Algoritmo transforma_ND_D Entrada: AFND, tabela de transição Saída: AFD equivalente Início Transforma todos os estados qi em {qi}=, mantendo a indicação do estado inicial e dos finais Se ({qi}, a) = {qj, qk, ..., qm} Então Introduzir este subconjunto na tabela, caso seja novo Fim-Se COMPUTAÇÃO Transformação Não Determinísticos em Determinismo Enquanto existirem subconjuntos de estados novos faça Para cada estado novo {qj, qk, ..., qm} faça Determine suas transições conforme definição: ({qj, qk, ..., qm}, a) = (qj, a) qi{qj, qk, ..., qm} Fim-Para Acrescentar à tabela de transições novos estados, caso existam Fim-Enquanto Fim COMPUTAÇÃO Transformação Não Determinísticos em Determinismo É fácil concluir que o algoritmo apresentado termina, pois, para um autômato que inicialmente tem n estados, o número de estados possíveis é igual ao número de subconjuntos que se podem formar, ou seja, 2n. Observe o autômato a seguir: COMPUTAÇÃO Transformação Não Determinísticos em Determinismo Segue a tabela de transição correspondente ao autômato: Estado final COMPUTAÇÃO Transformação Não Determinísticos em Determinismo Para fixar o conceito, vamos representar o autômato abaixo, por meio da tabela de transição: Estado final COMPUTAÇÃO UNIDADE 8: Expressão Regular e Gramática Regular COMPUTAÇÃO Alfabetos e Linguagens LINGUAGEM Linguagem é um conceito fundamental no estudo da Teoria da Computação, pois trata-se de uma forma precisa de expressar problemas, permitindo um desenvolvimento formal adequado ao estudo da computabilidade. O dicionário Aurélio define linguagem como: "o uso da palavra articulada ou escrita como meio de expressão e comunicação entre pessoas". Esta definição não é suficientemente precisa para permitir o desenvolvimento matemático de uma teoria sobre linguagens. COMPUTAÇÃO Alfabetos e Linguagens As definições que seguem são construídas usando como base a noção de Símbolo ou Caractere, que é uma entidade abstrata básica, não sendo definida formalmente. Letras e dígitos são exemplos de símbolos frequentemente usados. ALFABETO Um Alfabeto é um conjunto finito de símbolos ou caracteres. • um conjunto infinito não é um alfabeto; • o conjunto vazio é um alfabeto. Os seguintes conjuntos são exemplos de alfabetos: • {a, b, c}; • conjunto vazio. COMPUTAÇÃO Alfabetos e Linguagens Os seguintes conjuntos não são exemplos de alfabetos: • conjunto dos números naturais; • {a, b, aa, ab, ba, bb, aaa,...}. CADEIA DE SÍMBOLOS E PALAVRA Uma Cadeia de Símbolos sobre um conjunto é uma sequência de zero ou mais símbolos (do conjunto) justapostos. Uma Cadeia de Símbolos Finita é usualmente denominada de Palavra. ε denota a cadeia vazia ou palavra vazia. Se Σ representa um conjunto de símbolos (um alfabeto), Σ* => o conjunto de todas as palavras possíveis sobre Σ; Σ+ denota Σ* - { ε }. COMPUTAÇÃO Alfabetos e Linguagens COMPRIMENTO OU TAMANHO DE UMA PALAVRA O Comprimento ou Tamanho de uma palavra w, representado por |w|, é o número de símbolos que compõem a palavra. PREFIXO, SUFIXO E SUBPALAVRA Um Prefixo (respectivamente, Sufixo) de uma palavra é qualquer sequência inicial (respectivamente, final) de símbolos da palavra. Uma Subpalavra de uma palavra é qualquer sequência de símbolos contígua da palavra. COMPUTAÇÃO Alfabetos e Linguagens Exemplos de Palavra, Prefixo, Sufixo, Tamanho: a) abcb é uma palavra sobre o alfabeto {a, b, c}; b) Se Σ = {a, b}, então: Σ+ = {a, b, aa, ab, ba, bb, aaa,...} Σ* = {ε , a, b, aa, ab, ba, bb, aaa,...} c) |abcb| = 4 e |ε| = 0; d) Relativamente à palavra abcb, tem-se que: ε, a, ab, abc, abcb são os prefixos; ε, b, cb, bcb, abcb são os respectivos sufixos. e) Qualquer prefixo ou sufixo de uma palavra é uma subpalavra. COMPUTAÇÃO Alfabetos e Linguagens LINGUAGEM FORMAL Uma Linguagem Formal ou simplesmente Linguagem é um conjunto de palavras sobre um alfabeto. Suponha o alfabeto Σ = {a, b}. Então: a) O conjunto vazio e o conjunto formado pela palavra vazia são linguagens sobre Σ. Obviamente, { } ≠ { ε }. b) O conjunto de palíndromos (palavras que têm a mesma leitura da esquerda para a direita e vice-versa) sobre Σ é um exemplo de linguagem infinita. ε, a, b, aa, bb, aaa, aba, bab, bbb, aaaa,... COMPUTAÇÃO Alfabetos e Linguagens Dados L1={r, rs} e L2=(r, sr}, linguagens sobre {s, r}. Qual o resultado de L1L2 ? L1L2 = {r, rs, sr} Qual o resultado de L1L2 ? L1L2 = {r} Qual o resultado de L1–L2 ? L1–L2 = {rs} COMPUTAÇÃO Alfabetos e Linguagens Dados L1={r, rs} e L2=(r, sr}, linguagens sobre {s, r}. Qual o resultado de L1.L2 ? L1.L2 = {r, rr, rsr, rs, rsr, rssr} Qual o resultado de L12=L1.L1 ? L12=L1.L1 = {rr, rrs, rsr, rsrs} Qual o resultado de 2L1 ? 2L1 = {2r, 2rs} COMPUTAÇÃO Alfabetos e Linguagens CONCATENAÇÃO DE PALAVRAS A Concatenação de Palavras é uma operação binária, definida sobre uma linguagem L, a qual associa a cada par de palavras uma palavra formada pela justaposição da primeira com a segunda tal que: • não necessariamente é fechada em L; a concatenação de duas palavras de uma linguagem não necessariamente resulta em uma palavra da linguagem. • é associativa; v(wt) = (vw)t = vwt • possui elemento neutro à esquerda e à direita, o qual é a palavra vazia. ε w = w = wε COMPUTAÇÃO Alfabetos e Linguagens Suponha o alfabeto Σ = {a, b}. Então, para as palavras v = baaaa e w = bb, tem-se que: • vw = baaaabb • vε = v = baaaa CONCATENAÇÃO SUCESSIVA DE UMA PALAVRA A Concatenação Sucessiva de uma Palavra (com ela mesma) ou simplesmente Concatenação Sucessiva, representada na forma de um expoente (suponha w uma palavra): wn onde n é o número de concatenações sucessivas, é definida indutivamente a partir da operação de concatenação binária. COMPUTAÇÃO Alfabetos e Linguagens Veja: w0 = ε; wn = wn-1w, para n > 0.Vamos a um exemplo: Sejam w uma palavra e a um símbolo. Então: w3 = www w1 = w a5 = aaaaa an = aaa...a (o símbolo a repetido n vezes) COMPUTAÇÃO Linguagens Regulares O estudo das linguagens regulares ou tipo 3, é abordado usando o seguinte formalismo: a) Expressão Regular: Trata-se de um formalismo denotacional, também considerado gerador, o qual é definido a partir de conjuntos (linguagens) básicos e das operações de concatenação e de união; b) Gramática Regular: Trata-se de um formalismo axiomático ou gerador, o qual, como o nome indica, é uma gramática, mas com restrições de forma das regras de produção. c) Autômatos Finitos: Trata-se de um formalismo operacional ou reconhecedor, sendo, basicamente, um sistema de estados finitos; COMPUTAÇÃO Linguagens Regulares As linguagens regulares constituem a classe das linguagens mais simples, sendo possível desenvolver algoritmos de reconhecimento, de geração ou conversão entre formalismo de pouca complexidade, de grande eficiência e de fácil implementação. Nesta aula iremos abordar a expressão regular e a gramática regular, deixando para a próxima aula o estudo dedicado aos Autômatos Finitos. COMPUTAÇÃO Linguagens Regulares EXPRESSÃO REGULAR As Linguagens Regulares são classes de linguagem simples de cunho importante para o contexto. Elas estão presentes, direta ou indiretamente, na modelação de sistemas físicos, nos compiladores etc. Elas são, em geral, infinitas, pelo que se torna necessário a existência de caracterizações finitas dessa linguagem. Uma possibilidade é o recurso à teoria dos conjuntos, como no exemplo: L = {anbm, n, m ≥ 0} Estas descrições com base em conjuntos têm, no entanto, um problema: não são operacionais. COMPUTAÇÃO Linguagens Regulares EXPRESSÃO REGULAR Elementos e instrumentos de descrição de linguagem: - Expressões regulares - Gramáticas regulares - Autômatos finitos COMPUTAÇÃO Linguagens Regulares Dada uma expressão regular sobre um alfabeto se define por indução: Ø, e a a , são expressões regulares. Se r1 e r2 são expressões regulares, então: r1 + r2 r1 . r2 r*1 (r1) Também são expressões regulares. Nada mais é uma expressão regular que não resulte especificamente da aplicação das regras 1 e 2. COMPUTAÇÃO Linguagens Regulares Existe uma relação evidente entre expressões regulares sobre um alfabeto e uma linguagem sobre este mesmo alfabeto. Assim: COMPUTAÇÃO Linguagens Regulares GRAMÁTICA REGULAR Uma gramática G = (N, T, , P) diz-se regular se e somente se todas as suas produções forem da forma: e diz-se que a gramática é linear à direita ou exclusivo. e agora dizemos que é linear à esquerda. As gramáticas regulares são utilizadas, como um exemplo prático, em projetos de desenvolvimento de compiladores para linguagens de programação. COMPUTAÇÃO Propriedades de Linguagens Regulares Como ilustração de uma abordagem das Linguagens Formais às linguagens n-dimensionais, no que segue é apresentada a noção de Gramática de Grafos. No caso de reescrita de grafos como termos, os grafos têm que ser necessariamente dirigidos, etiquetados e com ordenação nas arestas, e as operações são caracterizadas sobre uma especificação de grafo, definida como: G = <|{1=t1, ..., n=tn}> COMPUTAÇÃO Propriedades de Linguagens Regulares Em que 1 é um par disjunto de nós (com variáveis) e ti um termo. Também, o nó indica a raíz do grafo. nó raíz ( ) COMPUTAÇÃO Propriedades de Linguagens Regulares A idéia básica da gramática de grafos é análoga à das gramáticas de Chomsky, ou seja: - regras de produção são pares (mas de grafos); - uma derivação é a substituição de um sub-grafo de acordo com uma regra de produção. As gramáticas de grafos constituem um caso particular de gramáticas das categorias. A idéia básica é substituir palavras por grafos no conceito do contexto. COMPUTAÇÃO Gramáticas Livres de Contexto Uma gramática livre de contexto é uma quádrupla (V, Σ, P, S) onde: • V é um conjunto de variáveis; • Σ é o conjunto de símbolos terminais; • P é um conjunto de regras que são elementos de um conjunto V × {V ∪ Σ} ∗ , sendo, em geral, uma regra (A, w) escrita como A → w. • S ∈ V é um símbolo (uma variável) inicial. COMPUTAÇÃO Gramáticas Livres de Contexto A gramática G = ({S, A}, {a, b}, P, S) com o conjunto P de regras... S→ AA A→ AAA A→ bA A→ Ab A→ a gera strings com um número positivo de a’s. COMPUTAÇÃO Gramáticas Livres de Contexto Quando temos diferentes regras para uma mesmo símbolo, como A → Ab e A → a, podemos simplificar a escrita usando uma barra vertical para separar as regras. Poderíamos escrever o exemplo como A → Ab | a. O conjunto P de regras da gramática G = ({S, A}, {a, b}, P, S), ilustrado anteriormente, pode ser simplificada como: S → AA A → AAA | bA | Ab | a COMPUTAÇÃO Gramáticas Livres de Contexto O processo fundamental para a geração de uma string é a aplicação de regras. A aplicação de uma regra A → w sobre um string uAv ∈ {V ∪ Σ} ∗ , produz a string uwv. Os prefixo u e o sufixo v definem o contexto em que a regra é aplicada. Uma gramática livre de contexto é aquela em que os prefixos e sufixos não definem restrições sobre quando e onde a regra pode ser aplicada. COMPUTAÇÃO Gramáticas Livres de Contexto Uma string w ∈ {V ∪ Σ} ∗ é derivada de v ∈ {V ∪ Σ} ∗ , se existe uma sequência finita de aplicações de regras que transformam v em w: v ⇒ w1 ⇒ w2 ⇒ . . . ⇒ wn = w Essa derivação pode ser representada por v ∗⇒= w. Seja G = (V, Σ, P, S) uma gramática livre de contexto e v ∈ {V ∪ Σ} ∗ . O conjunto de strings deriváveis de v é definido como: • Base: v é derivável de v; • Passo: Se u = xAy é derivável de v e A → w ∈ P, então xwy é derivável de v. COMPUTAÇÃO Gramáticas Livres de Contexto Uma derivação da string ababaa na gramática G = ({S, A}, {a, b}, P, S) com o conjunto P de regras S → AA A → AAA | bA | Ab | a pode ser escrita como S ⇒ AA ⇒ aA ⇒ abA ⇒ abAAA ⇒ abaAA ⇒ ababAA ⇒ ababaA ⇒ ababaa COMPUTAÇÃO Gramáticas Livres de Contexto A derivação de uma string pode também ser visualizada como uma árvore. Seja G = (V, Σ, P, S) uma gramática livre de contexto e S ∗⇒= w uma derivação de G. A árvore de derivação de S ∗⇒= w, pode ser construída da seguinte forma: 1. Inicia a árvore com raiz S 2. Se A → x1x2 ... xn com xi ∈ {V ∪ Σ} é a regra de derivação aplicada à string uAv, então adicione x1, x2, ... , xn como nós filhos de A na árvore 3. Se A → λ é a regra de derivação aplicada à string uAv, então adicione λ como filho de A na árvore COMPUTAÇÃO Gramáticas Livres de Contexto pode ser visualizada como Árvore S ⇒ AA ⇒ aA ⇒ abA ⇒ abAAA ⇒ abaAA ⇒ ababAA ⇒ ababaA ⇒ ababaa COMPUTAÇÃO Autômato Finito Determinístico e Não-Determinístico Os Autômatos Finitos que vimos até agora funcionam da seguinte forma: quando a máquina está em um dado estado e lê o próximo símbolo de entrada, sabemos qual será o próximo estado, está determinado. Chamamos isso, portanto, de computação determinística. Segundo Messis(2013), “em um AFND, autômato finito não- determinístico, várias escolhas podem existir para o próximo estado em qualquer ponto”. Em um AF, autômato finito, um estado pode ter zero, uma ou várias setas saindo para cada símbolo do alfabeto. COMPUTAÇÃO Autômato de Pilha Analogamente às Linguagens Regulares, a Classe das Linguagens Livres do Contexto pode ser associada a um formalismo do tipo autômato, denominado Autômato com Pilha. O Autômato com Pilha é análogo ao Autômato Finito que reconhece as Linguagens Livre de Contexto, basicamente um AFNDε incluindo uma pilha como memória auxiliar e a facilidade de não-determinismo. A pilha é independente da fita de entrada e não possui limite máximo de tamanho ("infinita"). Estruturalmente, sua principal característica é que o último símbolo gravado é o primeiro a ser lido (LIFO last in first out). COMPUTAÇÃO Autômato de Pilha Ao contrário da fita de entrada, a pilha