Documente Academic
Documente Profesional
Documente Cultură
PETROLINA, 2015
SUMÁRIO
PREFÁCIO ......................................................................................................................................... 4
1. INTRODUÇÃO .......................................................................................................................... 5
1.1. HISTÓRICO ........................................................................................................................ 5
4. GRAMÁTICAS ........................................................................................................................ 32
1. CONCEITO ............................................................................................................................ 32
2. CLASSES DE GRAMÁTICAS .............................................................................................. 32
3. GRAMÁTICAS COM ESTRUTURA DE FRASE ................................................................... 33
4. GRAMÁTICAS LIVRES-DE-CONTEXTO ............................................................................. 35
4.1. SEPARAÇÃO DE VARIÁVEIS DAS GRAMÁTICAS LIVRES-DE-CONTEXTO ....... 36
4.2. LEMAS DAS GRAMÁTICAS LIVRES-DE-CONTEXTO .............................................. 37
4.3. FORMAS NORMAIS DAS GRAMÁTICAS LIVRES-DE-CONTEXTO ........................ 40
5. GRAMÁTICAS REGULARES ................................................................................................. 43
5.1. SEPARAÇÃO DE VARIÁVEIS DAS GRAMÁTICAS REGULARES ........................... 43
5.2. PROPRIEDADES DAS GRAMÁTICAS REGULARES .................................................. 45
6. GRAMÁTICAS SENSÍVEIS-AO-CONTEXTO ...................................................................... 48
6.1. SEPARAÇÃO DE VARIÁVEIS DAS GRAMÁTICAS SENSÍVEIS-AO-CONTEXTO. 48
2
5. AUTÔMATOS A PILHA ........................................................................................................ 51
1. CONCEITO ............................................................................................................................ 51
2. CONVENÇÕES ...................................................................................................................... 52
3. DETERMINISMO .................................................................................................................. 53
4. CONSTRUÇÃO DOS AUTÔMATOS A PILHA .................................................................. 53
5. LEMAS DO AUTÔMATO A PILHA .................................................................................... 55
6. TRANSFORMAÇÃO DE GRAMÁTICAS LIVRES-DE-CONTEXTO EM AUTÔMATOS
A PILHA ........................................................................................................................................ 59
REFERÊNCIAS ............................................................................................................................... 81
ANEXOS ........................................................................................................................................... 82
1. TABELA ASCII ..................................................................................................................... 82
2. OS MESTRES......................................................................................................................... 84
3
PREFÁCIO
Os textos existentes nesta apostila são de minha autoria e de vários autores renomados na área de
linguagens formais, como Noam Chomsky, John Hopcroft, Benedito Acióly, entre outros. Alguns
exemplos e analogias foram adicionados aos textos originais para facilitar a compreensão do assunto.
Este material não se propõe a substituir a riqueza presente nos livros publicados pelos autores
mencionados, mas sim, servir como apoio às aulas da disciplina de Linguagens Formais e Teoria da
Computação do Curso de Ciência da Computação da Facape.
Dada a grande quantidade de trechos extraídos praticamente na íntegra de alguns livros, fica
impraticável referenciar todos eles. Em compensação, os livros citados na bibliografia, ao final desta
apostila, constituem as fontes principais do texto que a partir daqui se inicia.
Espero que realmente este grande “resumo” possa ser útil para que os alunos da disciplina
compreendam os aspectos mais importantes das Linguagens Formais e da Teoria da Computação.
4
APOSTILA DE LINGUAGENS FORMAIS – INTRODUÇÃO Prof. TENORIO
1. INTRODUÇÃO
A importância dessa teoria na Ciência da Computação é dupla: tanto apoia diversos aspectos teóricos
da Ciência da Computação, como a decidibilidade, computabilidade, complexidade computacional,
entre outros, como fundamenta diversas aplicações computacionais tais como processamento de
linguagens de programação, reconhecimento de padrões, modelagem de sistemas, etc.
1.1. HISTÓRICO
O homem sempre tentou explicar a natureza utilizando a matemática. Na antiga Grécia, pode-se ver
isso em desenhos de algoritmos feitos por Euclides, no século III a.C., muitos antes do termo
algoritmo ser criado. Na antiga Babilônia, existem estudos sobre a complexidade de problemas e
como reduzi-los, em problemas menores e mais fáceis de serem resolvidos, porém a Teoria da
Computação, como nós a conhecemos, teve início nos primeiros anos do século XX, antes da
invenção dos modernos computadores eletrônicos.
Um marco inicial da Teoria da Computação é o problema proposto por David Hilbert, o qual consistia
em encontrar um procedimento para demonstrar se uma dada fórmula no cálculo de preposições de
primeira ordem era válida ou não. (Fórmula do cálculo de predicados no qual a quantificação é restrita
às variáveis individuais). Em 1931, Kurt Gödel, em seu “teorema da não completude”, demonstrou
que o problema da mecanização do processo de prova de teoremas não tinha solução. A classe de
funções usada por Gödel foi à classe das funções primitivas recursivas definidas anteriormente por
Dedekind em 1888. Embora não tenha sido proposital, Gödel foi (aparentemente) o primeiro a
identificar um formalismo para definir a noção de procedimento efetivo. Em 1936, Alonzo Church
usou dois formalismos para mostrar que o problema de Hilbert não tem solução: λ-calculus (Church,
1936) e funções recursivas (Kleene, 1936). Também em 1936, Alan Turing propôs um formalismo
para a representação de procedimentos efetivos. Esse foi o primeiro trabalho a identificar programas
escritos para uma “máquina computacional automática”, como noções intuitivas de efetividade.
Desde então, muitos outros formalismos foram propostos, os quais possuem o mesmo poder
computacional que as funções recursivas ou Cálculo Lambda:
5
APOSTILA DE LINGUAGENS FORMAIS – INTRODUÇÃO Prof. TENORIO
Em resumo, os estudiosos estavam tentando descobrir quais problemas matemáticos poderiam ser
resolvidos por um método simples, e quais não poderiam. O primeiro passo estava em definir o
significado de um "método simples" para resolver o problema. Em outras palavras, eles precisavam
de um modelo formal de computação. Diversos modelos foram propostos e são alguns destes modelos
que iremos estudar ao longo desta apostila.
6
APOSTILA DE LINGUAGENS FORMAIS – CONCEITOS BÁSICOS Prof. TENORIO
2. CONCEITOS BÁSICOS
Na computação, todos os dados que você vê na tela de seu monitor são gerados a partir da presença
(1) ou ausência (0) de energia nos circuitos lógicos. Essa energia é convertida em unidades, que serão
utilizadas pelo hardware para permitir a execução de softwares. Tudo que pode ser projetado via
hardware, pode ser projetado via software, utilizando-se apenas quatro comandos básicos: a
atribuição, a soma, a condição (if) e o deslocamento (jump), que altera a sequência corrente de
execução dos comandos.
Para facilitar a programação, essas unidades deveriam representar símbolos conhecidos, daí vem o
conceito de Caractere.
Um exemplo de caracteres são as letras e os dígitos. Como existem infinitos caracteres (símbolos) no
universo, foi necessário limitar sua quantidade a fim de permitir seu uso nos computadores. Para isso,
foram criadas tabelas de símbolos, dito válidos, que poderiam ser utilizados. A tabela mais usada e
conhecida é chamada de tabela ASCII (American Standard Code for Information Interchange –
Código Americano Padrão para o Intercâmbio de Informações), que contém 256 caracteres e associa
um número sequencial a cada caractere que pode ser utilizado no computador (válidos). Na tabela
ASCII, os caracteres correspondentes a valores de 0 a 31 são códigos de controle, de 32 a 127 são
caracteres padrões e de 128 a 255, podem variar de S.O. (Sistema Operacional) para S.O. A tabela
ASCII completa pode ser conferida no final desta apostila.
Para o computador, trabalhar com 256 caracteres é perfeito, porém, nas atividades do dia-a-dia, não
é interessante para o ser humano trabalhar com essa quantidade, até porque o computador precisa
reservar alguns caracteres para uso próprio, daí vem o conceito de alfabeto.
7
APOSTILA DE LINGUAGENS FORMAIS – CONCEITOS BÁSICOS Prof. TENORIO
Uma Cadeia, sobre um alfabeto, é uma sequência qualquer de símbolos que pertença a este alfabeto,
ou seja, é uma sequência de zero ou mais símbolos do alfabeto justapostos. Uma Cadeia de
Símbolos Finita é usualmente denominada de Palavra. Uma cadeia é denotada pelo símbolo C.
Atenção: Caso uma cadeia seja formada por algum símbolo que não faça parte do alfabeto
corrente, dizemos que trata-se de uma cadeia inválida.
Atenção: Por exemplo, a cadeia “C6 = acacadaa” é uma cadeia inválida, ou seja, não é uma aceita no
alfabeto do exemplo, por possuir um caractere que não existe no alfabeto da questão, no caso a letra
‘d’.
| C1 | = 3 | C2 | = 4 | C3 | = 1 | C4 | = 8 | C5 | = 4 | C6 | =
2. Concatenação: ocorre quando construímos uma nova cadeia a partir de duas ou mais
cadeias, uma seguida da outra. É denotado por //, ou simplesmente o símbolo pode ser
omitido, ou seja, a // b = ab.
8
APOSTILA DE LINGUAGENS FORMAIS – CONCEITOS BÁSICOS Prof. TENORIO
Atenção: cuidado para não confundir a cadeia vazia, com uma cadeia inválida, com o
conjunto vazio ou com a cadeia válida, não vazia, que possui apenas o caractere ‘espaço’
(ASCII = 32).
Atenção 2: a maioria dos autores denotam a cadeia vazia com o símbolo ε, diferente do
utilizado neste material.
5.1. Fecho Positivo: é a concatenação da cadeia n vezes, aonde n vai de 1 (um) até o
infinito e é denotado por x+.
Atenção: No exemplo 05.3, a cadeia ‘aba’, não faz parte do fecho por que não compõe a
concatenação da cadeia inteira com ela mesma inteira;
Atenção: No exemplo 05.6, o primeiro ‘a’ é totalmente independente do segundo ‘a’, cujos
mesmos variam livremente um do outro. O b é uma constante;
9
APOSTILA DE LINGUAGENS FORMAIS – CONCEITOS BÁSICOS Prof. TENORIO
Observação: a* = a+ ∪ λ
Uma linguagem, denotada por L, é um meio de comunicação, formada por um conjunto de palavras
e de regras gramaticais que permitem combinar as palavras em sentenças sintaticamente corretas.
Uma linguagem é dita formal quando pode ser representada através de um sistema com sustentação
matemática, ou seja, uma linguagem é um conjunto de palavras qualquer, que possuem uma regra em
comum, com elementos pertencentes a um alfabeto.
Com este conceito, podemos afirmar que qualquer subconjunto de cadeias formadas a partir de um
alfabeto é uma linguagem, o próprio conjunto formado por todas as palavras do alfabeto também é
uma linguagem, além de existir a linguagem vazia, composta apenas pela cadeia vazia (λ).
Exemplo 07: Um exemplo de linguagem, dentro do alfabeto {a, b}, é a linguagem formada por todas
as palavras de tamanho igual a dois: L = {aa, ab, ba, bb}.
Exemplo 08: Linguagem de todas as cadeias iniciadas em ‘a’, dentro do alfabeto {a, b}: L = {a, ab,
aa, aba, abb, abbb, aaa, abbabab, aabba, ...}.
Como uma linguagem é definida como sendo simplesmente um conjunto de palavras sobre símbolos
de um alfabeto, todas as operações sobre conjuntos podem ser aplicadas sobre linguagens. Em
particular, podem-se aplicar sobre linguagens as operações de união, intersecção, diferença e
complemento (Não). O significado destas operações sobre linguagens é bastante intuitivo.
10
APOSTILA DE LINGUAGENS FORMAIS – CONCEITOS BÁSICOS Prof. TENORIO
L = L1 L2 = {w ∈ Σ* / w ∈ L1 ou w ∈ L2 }
Exemplo 09: L1 = {a, ab, abb, abbb, abbbb, ...} e L2 = {b, ab, aab, aaab, aaaab, ...}
L = L1 ∩ L2 = {w ∈ Σ* / w ∈ L1 e w ∈ L2}
Atenção: Caso não existisse nenhuma cadeia presente em ambas as linguagens, a intersecção
seria o conjunto vazio, denotado por O. Neste caso jamais a resposta poderia ser o vazio (λ),
pois o vazio não está presente em nenhuma as linguagens do exemplo.
3. Não (~): Também chamado de complemento. É uma linguagem que contém todas as cadeias
que não pertencem a L. Uma vez que Σ* é o conjunto de todas as palavras que podem ser
formadas sobre um alfabeto Σ, então o complemento da linguagem L, construída sobre Σ é a
linguagem Σ* ~ L, ou ainda, definido formalmente:
Σ*~L = {w ∈ Σ*/ w ∈ L}
~L1 = {λ, b, bb, bbb, ba, baa, bab, aaba, ababa, ...}
L = L1 – L2 = {w ∈ Σ* / w Є L1 e w ∈ L2 }
11
APOSTILA DE LINGUAGENS FORMAIS – CONCEITOS BÁSICOS Prof. TENORIO
Um dos grandes propósitos das Linguagens Formais é conseguir representar de maneira finita, um
subconjunto de linguagens de um alfabeto. Para as linguagens finitas, a enumeração exaustiva de
todas as palavras resolve a questão, o grande desafio são as linguagens infinitas.
Essa representação finita deve ser formada por um conjunto de símbolos finitos, dentre eles os
símbolos do alfabeto da linguagem a ser representada. Como o conjunto de todas as palavras que
pertençam a um alfabeto é infinito podemos dizer que o conjunto de todas as possíveis linguagens
dentro de um alfabeto também é infinito. Por ser infinito, não é possível representar todas as
linguagens de um alfabeto com um número finito de símbolos, porém podemos encontrar
representações finitas para a maioria das linguagens ditas interessantes.
Existem vários modelos de representações propostos para descrever uma linguagem, alguns mais
poderosos (reconhecem mais linguagens) que outros. O modelo mais simples de ser utilizado é
chamado de Expressão. Uma expressão é a representação da linguagem através de símbolos
matemáticos. Quando a expressão é formada apenas pelos elementos do alfabeto, parênteses e
as propriedades da cadeia e da linguagem, dizemos que a expressão é Regular. Toda expressão
Regular representa uma linguagem pela interpretação de seus símbolos. Uma linguagem é dita
regular se existir alguma expressão regular que a defina. Toda linguagem regular pode ser descrita
por uma expressão regular que nada mais é do que um formalismo gerador, pois expressa como
construir (gerar) as palavras de uma linguagem.
Pergunta importante: Qual é a Expressão Regular que representa todas as possíveis cadeias do
alfabeto {a, b}?
12
APOSTILA DE LINGUAGENS FORMAIS – CONCEITOS BÁSICOS Prof. TENORIO
Não existe uma regra geral para construção de uma expressão regular a partir de uma linguagem,
apenas a prática leva a perfeição.
Atenção: em algumas literaturas, poderá ser encontrado o termo “Substring” que nada mais é
do que um pedaço de um string.
EXERCÍCIOS
Atenção: Este exercício não tem valor quantitativo (para a nota), serve apenas para desenvolver o
aprendizado e ganhar experiência para as avaliações.
Construa linguagens regulares que reconheçam as sequências abaixo (Considere Σ = {0, 1}):
25. Contêm (algures) pelo menos três “0” seguidos, mas não contêm dois ou mais “1” seguidos;
26. Se têm algum par de “0” adjacentes, este aparece antes de qualquer par de “1” adjacentes;
27. Não terminam em “1101” nem em “1011”;
28. Têm igual número de “0” e “1” e nenhum seu prefixo tem um número de “0” que excede em
dois o número de “1”, nem um número de “1” que excede em dois o número de “0”
13
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
3. AUTÔMATOS FINITOS
Como já foi dito, existem vários modelos de representações propostos para descrever uma linguagem,
alguns mais poderosos (reconhecem mais linguagens) que outros. Alguns modelos, além de
linguagens, são capazes de representar todo um sistema. Imaginem uma agenda eletrônica. Agora, na
posição de analistas de sistemas, vamos apresentar aos programadores essa mesma agenda de duas
formas diferentes.
Forma 01: O sistema consiste em uma agência eletrônica com uma tela principal, e as opções de
Inserir, Alterar, Remover, Buscar e Sair. Ao teclar 01 o usuário vai para a tela de inserção que pede
um nome e depois a tecla ‘Enter’. Na tela seguinte pedirá o telefone e novamente a tecla ‘Enter’,
retornando ao menu principal. Teclando 2 no menu principal, o sistema irá para a tela de Alterar.
Nesta tela será pedido o nome de uma pessoa e a tecla ‘Enter’. Na tela seguinte o telefone desta pessoa
e novamente a tecla ‘Enter’. Por fim, uma mensagem de “Atualizada com sucesso! Tecle Enter.”,
após pressionar a tecla ‘Enter’, o sistema retorna ao menu principal. Teclando 3 no menu principal, o
sistema irá para a tela de remover. Nela será solicitado um nome. Caso esse nome esteja cadastrado,
vai aparecer a mensagem: “Removido com sucesso”. Caso o nome não esteja cadastrado, aparece a
mensagem “Nome não existe, tecle Enter” e teclando Enter, o sistema retorna ao menu principal.
Teclando 4 no menu principal, o sistema irá para a tela de buscar. Esta tela ira pedir o nome da pessoa
que se quer buscar. Caso o nome exista, irá aparecer em tela seguinte o nome e o telefone da pessoa
cadastrada. Caso não exista, aparece a mensagem “Nome não existe. Tecle Enter”. Retornando ao
menu principal. Teclando 5 no menu principal, o sistema vai para a tela de confirmação de saída, com
a mensagem: “Tem certeza que deseja sair [s/n]?”. Caso o usuário tecle ‘S’, o programa será
encerrado, caso tecle ‘N’, o sistema retorna ao menu principal. Também existe a opção de que se tiver
transcorrido muito tempo sem que o usuário tecle algo o sistema irá para uma proteção de tela que só
será liberada quando o usuário teclar “Enter”.
Forma 02:
14
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
Qual das duas formas é mais legível, ou seja, é mais fácil de entender? Claro que é o diagrama, pois
o texto é chato e deixa margem para ambiguidades e interpretações diferentes. Isso não acontece no
diagrama. A esse diagrama damos o nome de Diagrama de Estados, esse é o nome mais utilizado,
porém, seu nome formal é Autômato Finito. E é a construção desse diagrama que iremos aprender
daqui para frente.
Um autômato finito pode ser considerado um modelo matemático (máquina abstrata) de um sistema,
com entradas e saídas discretas. O sistema pode estar em um de vários, porém finitos, estados
(configurações internas). O estado de um sistema resume as informações anteriores, até o momento
atual do reconhecimento, necessárias para determinar o seu comportamento face ao resto da sequência
que está analisando. Um bom exemplo de um autômato finito é o mecanismo de controle de um
elevador. Ele não lembra todas as requisições anteriores mas somente o andar atual, a direção de
movimento (para cima ou para baixo), e a relação de requisições pendentes. Uma máquina de estados
finitos ou Autômato Finito é uma modelagem restrita de um comportamento, composto por estados
e transições.
Um estado reflete a posição do sistema em um determinado instante. É como se fosse uma fotografia
do sistema que o mostra naquele exato momento em que a ‘fotografia’ foi tirada e uma transição
indica uma mudança de estado e é descrita por uma única1 condição que precisa ser realizada para
que a transição ocorra. Existem três tipos de transições:
Essa máquina de estados recebe uma entrada de dados, porém não gera nenhuma saída em seu
processamento, exceto a indicação informando se a entrada é ou não aceitável naquela máquina. O
que torna o Autômato Finito restrito é a falta de memória externa, que possa ser expandida ou utilizada
para gravar dados, assim como a memória RAM encontrada nos computadores atuais.
3.1. CONCEITO
1
Única, neste caso, significa que cada transição só possui um único elemento do alfabeto em questão.
15
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
Para facilitar o estudo e a construção dos autômatos, não serão utilizados exemplos de sistemas reais,
como a agenda apresentada no início deste capítulo, serão feitos diagramas genéricos que servem para
quaisquer situações, pois nosso objetivo é aprender a montar o diagrama e não sua aplicabilidade, que
será vista em outra disciplina. Para tanto vamos conhecer algumas convenções adotadas pelos mais
diversos autores para a construção de autômatos.
Vale lembrar que o autômato é a quíntupla e não o diagrama. O diagrama é uma mera representação
gráfica do que pode ser o autômato.
O principal objetivo dos autômatos é a validação de cadeias. Para uma cadeia ser válida, ela precisa
fazer transições que iniciem no estado inicial do autômato e terminem em algum estado final do
mesmo. Caso a cadeia termine em um estado dito não-final, a cadeia é considerada inválida.
Formalmente falando, as cadeias são escritas em uma fita (vetor de caracteres) e esta fita tem seus
caracteres lidos um a um terminado após a leitura do último caractere. Ao terminar, se a posição atual
for um estado final, a cadeia é dita válida.
3.2. CONVENÇÕES
As convenções usadas neste material, são usadas por muitos autores, mas não por todos, portanto, em
algumas literaturas, símbolos diferentes podem ser encontrados, sem que isto altere o conceito dos
mesmos.
1) O nome dos estados será sempre a letra q, e serão diferenciados por um índice.
Exemplo: q0, q1, q2, q3, q4, q5, q6, q7, q8, q9 ,q10, ..., qN
4) As transições serão representadas por uma seta com um único elemento do alfabeto rotulando-
a. Exemplo:
a
5) O estado inicial será demarcado com uma seta que vem do ‘nada’ e apontando para o mesmo.
Exemplo:
q
16
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
7) Duas transições diferentes, partindo de uma mesma origem e chegando a um mesmo destino,
poderão ser representados, com uma seta única, e seus nomes serão separados por vírgula.
Exemplo:
a a, b
q b q equivale a: q q
3.3. DETERMINISMO
O autômato finito é dito Determinístico se, e somente se, para cada elemento do alfabeto exista
uma, e apenas uma transição de saída, de cada estado pertencente ao autômato, ou seja, um
mesmo elemento do alfabeto não pode ter duas ou mais transições de saída de um mesmo estado e
obrigatoriamente, deve ter uma saída do mesmo. Isto significa que, estando o processamento em um
estado qualquer, e obtendo um valor qualquer do alfabeto como entrada, sempre existirá um único
caminho a percorrer dentro do autômato.
O autômato que não seguir esta regra é denominado de Autômato Finito Não Determinístico. Uma
entrada será válida em um autômato finito não determinístico se houver pelo menos uma sequência
correta de passos que leve o processamento a um estado final.
O autômato finito determinístico possui apenas transições de usuário e a transição instantânea, não
possuindo transições espontâneas (vazias).
Para melhor representar um autômato, utilizaremos a forma mais conveniente chamada de Diagrama
de Estados. É um grafo dirigido (dígrafo) onde os vértices são os estados e as arestas são as transições.
Sempre lembrando que o autômato é a quíntupla e não o diagrama, sendo este apenas uma
representação gráfica do autômato.
Nem sempre é possível escrever um autômato pela regra da cadeia mínima, nestes casos, deve-se
utilizar obrigatoriamente a regra da transformação que serve para qualquer linguagem regular.
Vale lembrar que não importa a regra que se use para criar um autômato, o que devemos ter em mente
é que sempre uma cadeia válida deve começar no estado inicial e parar em um estado final e uma
cadeia inválida NÃO pode começar em um estado inicial e chegar em um estado final
17
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
• Passo 1 – Verificar se os elementos que compõem a linguagem (vamos nos referir a expressão
regular que representa a linguagem, como a própria linguagem) fazem parte do alfabeto;
• Passo 2 – Isolar a chamada “Cadeia Mínima”. A cadeia mínima será formada pelos elementos
do alfabeto, que aparecem na linguagem, na mesma ordem em que aparecem, excluindo-se as
propriedades e os elementos dentro da Estrela de Kleene (Fecho Estrela);
• Passo 3 – Escrever uma sequência do estado inicial a um estado final, com a cadeia mínima,
utilizando-se das convenções, lembrando que cada transição só poderá conter um único
elemento do alfabeto. A essa sequência daremos o nome de “Esqueleto”;
• Passo 4 – Tornar o autômato determinístico, ou seja, incluir as saídas não criadas pelo item
anterior. Essas saídas devem corresponder aos elementos das propriedades presentes na
linguagem (excluídas no passo 02);
Caso não se tenha encontrado o destino de alguma saída pelo passo 4, esta saída deve ser direcionada
para um estado chamado de Estado Morto. Este estado nunca será um estado final e suas saídas
sempre retornarão para si mesmo. Este estado será representado no diagrama da seguinte forma:
M Σ
L = 10+
Neste caso sim, pois a linguagem é composta apenas de elementos do alfabeto e de propriedades, no
caso, ao propriedade do fecho positivo.
Esta linguagem é formada pelas seguintes cadeias: {10, 100, 1000, 10000, 100000, 1000000, ...}
• Passo 2: A cadeia mínima será ‘10’, ou seja, é a expressão da linguagem apresentada sem as
propriedades e sem os elementos que estão na Estrela de Kleene (Neste exemplo não existe
nenhum elemento na Estrela de Kleene – Fecho Estrela).
18
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
Neste caso sim, pois a linguagem é composta apenas de elementos do alfabeto e de propriedades.
Esta linguagem é formada pelas seguintes cadeias: {100, 1100, 1001, 10011, 11001, 110011, ...}
• Passo 2: A cadeia mínima será ‘100’, ou seja, é a linguagem sem as propriedades e sem os
elementos que estão na Estrela de Kleene (Neste exemplo o elemento 1* foi omitido da cadeia
mínima por estar na Estrela de Kleene – Fecho Estrela);
Neste exemplo verificamos a simplificação do Estado Morto com a 7ª convenção. Agora é hora do
aluno fazer o teste de validação das cadeias encontradas no passo 1.
Fazer o teste de validação é fundamental para o aprendizado. Validar uma cadeia significa testá-la,
ou seja, verificar se, iniciando no estado inicial, ela realmente para em um dos estados finais do
diagrama.
19
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
Na regra da cadeia mínima, alguns detalhes devem ser observados. Esses detalhes visam auxiliar o
aluno na construção dos autômatos, impedindo que cadeias inválidas cheguem ao estado final e
permitindo que cadeias válidas sempre cheguem ao estado final. São lemas na construção do autômato
que devem sempre ser respeitados. Estes lemas serão mostrados a partir de exemplos sempre no Σ =
{0,1, 2}
Nos exemplos deste tópico, o estado morto foi omitido a fim de simplificar os desenhos. Lembre-se
sempre da regra do determinismo.
Lema 01: Fecho Positivo com um único elemento. O fecho positivo com um único elemento é
geralmente formado por um loop no estado em que seu elemento obrigatório o aponta.
Exemplo: L = 21+2. Neste exemplo o 1 do positivo aponta para o q2, assim o loop ficará no q2
Lema 02: Fecho Estrela (Estrela de Kleene) com um único elemento. O fecho estrela com um
único elemento é geralmente formado por um loop simples na sua devida posição. A posição é dada
pelo antecessor e pelo sucessor na linguagem. Neste caso NÃO se deve criar estados.
Lema 03: Fecho Positivo com dois ou mais elementos. O fecho positivo com dois ou mais
elementos é representado apenas por um retorno (seta voltando), saindo do último estado pertencente
ao fecho e apontoando para o segundo. O elemento do alfabeto desta transição é o elemento inicial
do fecho. Vale lembrar que as transições que representam um mesmo elemento devem apontar sempre
para o mesmo lugar
20
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
Lema 04: Fecho Estrela com dois ou mais elementos. O fecho estrela com dois ou mais
elementos é representado com a criação de x novos estados, onde x é a quantidade de elementos
constantes/positivos que se encontram dentro do fecho menos um. Esses novos estados fecharão um
loop no estado onde se encontra o fecho na linguagem (antecessor e sucessor).
Lema 05: Loops Sucessivos. Este lema é usado quando, na linguagem, existem dois ou mais
fechos estrelas seguidos (consecutivos), caracterizando elementos diferentes que precisam de loop.
Neste caso, apenas o primeiro elemento recebe um loop simples (seguindo o lema 2), para os demais
fechos estrelas é criado um novo estado para suprir a necessidade do loop. Um estado para cara fecho.
Exemplo: L = 20*1*2. Neste caso, será criado um estado para o 1* e NÃO será criado estado para o
0*, que seguirá normalmente pelo lema 2.
Errado Certo
21
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
Lema 06: Regra obriga duas saídas. Quando os lemas anteriores são aplicadas corretamente e
um loop gera duas ou mais saídas iguais, o loop causador do não-determinismo deve seguir para o
próximo estado.
Exemplo: L = 21+12. Neste exemplo, seguindo corretamente o lema 1, conforme o diagrama, é gerado
duas saídas 1 para o estado q2. Uma saída apontando para o estado q3 e outra formando um loop
apontando para o próprio q2. O lema 6 pede para o loop ser transferido para o estado seguinte (neste
caso o q3). Caso a mesma coisa ocorresse no q3, ou seja, se ele já tivesse uma saída 1, basta aplicar
novamente o lema 6, fazendo o loop seguir em frente.
Errado
Certo
Lema 07: Cadeia mínima é vazia. Quando a cadeia mínima é vazia, por conta de um fecho estrela
que engloba toda a linguagem, o estado inicial q0, torna-se um dos estados finais, transformando o
fecho estrela em positivo. Depois disso, resolve a questão aplicando os demais lemas estudados.
Exemplo: L = (2012)*. Neste exemplo, o q0 tornou-se final e a linguagem passou a ser: L = (2012)+
Atenção: o retorno do loop estrela (transição 2 do q4) jamais deve retornar ao q0, pois permitiria que
uma cadeia inválida chegasse ao estado final – ex: 201222012. Lembre-se que as transições que
representam um mesmo elemento devem apontar sempre para o mesmo lugar. Neste exemplo, as
transições 2 do q0 e do q4 representam o mesmo elemento na linguagem, por isso, devem apontar
para o mesmo estado.
Lema 08: Não. Quando a linguagem vier com um “não”, basta simplesmente inverter o tipo dos
estados do diagrama, ou seja, se o estado não for final ele passará a ser, inclusive o estado Morto e se
caso ele já seja final, passará a ser uma estado não final.
22
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
Exemplo: ~ (001)
Sem o ~ (não)
Com o ~ (não)
Lema 09: União. Na união, cada lado deve começar no estado inicial, porém, os estados que
fazem parte de um lado da união, NÃO podem, de forma nenhuma, estarem ligados aos estados que
pertencem a um outro lado da união.
Exemplo: 0*21 U 110*. Neste exemplo, o loop do elemento 0* do primeiro lado da união, não poderá
ficar no estado q0, pois isso permitiria que cadeias, iniciadas em 0*, pudessem terminar com 110*,
validando cadeias como 000011, que são inválidas na linguagem, ou seja, colocando o loop 0* no q0,
como saber a qual lado ele pertence apenas olhando para o desenho? No autômato, não pode haver
ambiguidades.
É importante salientar que estados compartilhados pelos lados da união (como o q0 neste exemplo)
não poderão participar de nenhum loop ou ciclo, pois, desta forma, não teremos controle de qual lado
da união o loop ou ciclo pertence.
Errado Certo
Muitas vezes, não é apenas o q0 que será compartilhado entre os lados da união. Vários estados poder
ser compartilhados por lados diferentes de uma união, isto significa que nenhum deles pode estar
23
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
contido em um ciclo, nem receber transições fora a transição do esqueleto. Caso seja necessário
a criação destes ciclos, novos estados, que representam os compartilhados, devem ser criados. Estes
novos estados serão exclusivos de um lado da união, mas representação os estados compartilhados.
Exemplo: (12012)+ U 12*10. Neste exemplo, ambos os lados da união iniciam em 1 e logo após o 1
tem um elemento 2 obrigatório do primeiro lado e estrela no segundo lado, isso obrigará a criação de
novos estados. Como os dois primeiros elementos podem ser iguais, temos três estados
compartilhados entre os lados da união, o q0, o q1 e o q2. Estes estados não podem receber setas
exceto as setas do esqueleto. O q1 é o estado que divide as cadeias mínimas dos lados da união,
seguindo 2 para o q2 (primeiro lado da união) e 1 para q6 (segundo lado da união). O segundo lado
da união traz um fecho estrela do elemento 2, que, conforme o lema 2 deveria ficar no q1, como o q1
é compartilhado (portanto não pode receber setas que não sejam do esqueleto) foi criado o q8 para
receber o loop. Além disso, foram criadas as possibilidades para este q8 receber o loop (transições 1
e 2 saindo do q2).
Em relação ao fecho positivo do primeiro lado da união, segundo o lema 3, uma transição 1 deveria
sair do q5 e retornar ao q1, porém, o q1 é um estado compartilhado, portanto, não pode receber setas
além da seta do esqueleto (o que fecharia um ciclo). Para resolver este problema foi criado o q9, que
na verdade é uma “cópia” do q1, porém, exclusivo do primeiro lado da união, podendo este receber
a transição 1. Como o q9 é “cópia” do q1, ele também precisa da transição 2 para o q2, porém, o q2
também é compartilhado e pelo mesmo motivo não pode receber transições fora do esqueleto. Para
resolver este problema foi criado o q10 para “copiar” o q2 e receber a transição 2. Saindo do q10 deve
ter uma transição 0 para o q3, como o q3 não é compartilhado e só pertente ao primeiro lado da união,
ele recebe a transição 0 sem nenhum problema. Caso o q3 fosse compartilhado, seria criado um q11
para substituí-lo e a sua transição iria para o q4.
Atenção: Estes lemas não funcionam para qualquer linguagem, mas são eficientes para um grande
número delas. Só é preciso ter em mente que nenhuma cadeia inválida deve terminar em um dos
estados finais e nenhuma cadeia válida deve terminar em um estado dito não-final.
Pra garantir isso, a melhor maneira é testar diversas cadeias válidas e inválidas.
24
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
Como já foi dito, a regra da cadeia mínima não funciona para todas as linguagens/expressões
regulares. Para as linguagens que a cadeia mínima não resolve, opta-se pela regra da transformação.
A regra da transformação funciona para qualquer expressão regular/linguagem regular e consiste em
duas etapas principais:
É sempre bom lembrar que não só existe uma única forma de se fazer um autômato finito. Vários
autômatos, feitos de maneiras diferentes, podem chegar a uma mesma linguagem, o que vale sempre
é que uma cadeia válida precisa terminar em um dos estados finais e uma cadeia inválida não pode
terminar em um desses estados finais.
Uma cadeia/entrada será válida em um autômato finito não determinístico se houver pelo menos uma
sequência correta de passos que leve o processamento a um estado final. Isso por que, como os estados
podem ter duas ou mais saídas iguais levando a caminhos diferentes, uma cadeia válida pode, por um
caminho chegar no estado final, mas em outro caminho, não chegar. Para ser válida, basta que exista
um caminho até o estado final. A única forma de saber é percorrer todos os caminhos possíveis com
a cadeia, a partir do inicial, e verificar se pelo menos um deles chega ao estado final.
As linguagens que contenham, em algum momento, a expressão que reconhece todas as cadeias, deve
ser feita pela regra da transformação. Sua versão não-determinística é feita apenas colocando os loops
no estado correspondente.
25
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
Apesar de aparente força e generalidade do autômato finito Não-Determinístico, eles não são mais
poderosos que os determinísticos, ou seja, para cada autômato finito Não-Determinístico, há um
autômato finito Determinístico equivalente.
Formalmente, dizemos que os dois autômatos são equivalentes entre si, pois não há nenhuma
linguagem que possa ser representada por um autômato finito Não-Determinístico, que não possa ser
representada por um autômato finito determinístico.
26
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
1 – A primeira diz respeito à criação do conjunto de cada estado que é formado pelo próprio estado e
todos os estados alcançáveis (possuem caminho) com a leitura de elementos vazios (λ), inclusive
sequenciados;
2 – A segunda etapa diz respeito à identificação do estado inicial do autômato determinístico a que
se quer chegar. O estado inicial do AFD é formado pelo conjunto do estado inicial do AFND;
3 – A terceira etapa especifica o destino correto de uma única saída para cada elemento do alfabeto,
em função recursiva, partindo das possíveis saídas do estado inicial encontradas na etapa anterior.
Deve-se perguntar para qual estado irá cada um dos elementos do alfabeto envolvido e criar o estado
caso ele não exista. Essa operação deve ser repetida até que o autômato já esteja seguindo a regra do
determinismo;
Atenção: Nesta etapa devemos ter em mente que os estados do AFD são os conjuntos dos estados do
AFND e não simplesmente os estados do AFND.
4 – A última etapa trata da detecção dos estados finais. Os estados finais do AFD serão todos aqueles
que possuem, em seu conjunto, algum estado final do AFND.
Resposta:
• Etapa 02: Identificação do estado inicial. No exemplo, o q0 do AFD será formado pelos
estados q0 e q1, que compõe o conjunto do q0 do AFND.
• Etapa 03: Verificar os destinos para os elementos 0 e 1 a partir do estado inicial. O AFD
poderá ter até 2N estados, onde N é a quantidade de estados do AFND.
27
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
• Etapa 04: Demarcar os estados finais. No exemplo, todos os estados que possuem o q4 serão
finais, pois o q4 é final no AFND.
•
Em muitos casos, um autômato finito, seja ele determinístico ou não, pode ser escrito de maneira mais
simples, com menos estados, sem que seja alterada a linguagem reconhecida por este autômato. Esse
é o processo conhecido como minimização de estados. É um processo bastante simples, baseado
apenas em apenas duas fases.
A primeira fase diz respeito à eliminação de estados inalcançáveis. Um estado é dito inalcançável
se, e somente se, partindo do estado inicial não haja nenhuma possibilidade de entrada no autômato
28
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
que leve a este estado, ou seja, se o autômato não pode utilizar um determinado estado, então esse
estado pode ser removido sem nenhum prejuízo à linguagem reconhecida por ele.
A segunda fase diz respeito à função de cada estado. Quando dois ou mais estados possuem a
mesma função, é possível fazer a fusão deles em um estado único. Dizemos que dois ou mais
estados possuem a mesma função quando, a partir de qualquer um deles, as mesmas entradas
conduzem o autômato a uma situação única, de aceitação ou rejeição. Para comprovar
matematicamente que dois ou mais estados possuem a mesma função, deve-se seguir os seguintes
passos:
1 – Construir a pirâmide (matriz) de marcação, que nada mais é do que uma matriz triangular, sem a
diagonal principal, que confronta um a um todos os estados do autômato. Nela, os estados são
dispostos de cima para baixo e da esquerda para a direita. Deve-se tentar verificar, na matriz, com os
passos seguintes, a possibilidade de um par qualquer de estados serem iguais. Caso seja provado que
um par de estados é diferente entre si, sua posição na pirâmide será marcada, caso não se garanta a
diferença, a posição não será marcada. No final, os estados não marcados na pirâmide serão
colapsados em um estado único entre si e os demais (marcados) ficaram isolados no novo autômato;
2 – Marcar estados finais com os estados não-finais. Pela simples função de aceitação e rejeição, os
estados finais são diferentes dos estados não-finais e por isso precisam ser marcados na pirâmide;
3 – Devem ser marcados na pirâmide também, os estados cujos destinos com a leitura de qualquer
um dos elementos do alfabeto sejam diferentes, ou seja, um elemento qualquer do alfabeto deve
encaminhar os estados para uma mesma posição, só assim, poderemos garantir que esses estados são
iguais;
29
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
Primeira fase: eliminar os estados inalcançáveis. Com essa eliminação o autômato fica assim:
Atenção: No resultado da minimização não pode haver, de forma alguma, inclusão de outros estados
que não sejam os estados presentes na pirâmide de marcação, inclusive estado morto. Isto quer dizer
que o resultado da minimização pode ou não ser determinístico.
30
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS FINITOS Prof. TENORIO
Como já vimos, o poder os autômatos finitos são restritos as linguagens regulares. Uma linguagem é
regular se e somente se, em processando qualquer cadeia, a informação a ser armazenada em qualquer
estágio é estritamente limitada àquele estágio, ou seja, a leitura de qualquer símbolo de uma cadeia é
totalmente independente da leitura dos demais símbolos da cadeia.
Neste exemplo, para que possa saber a quantidade de caracteres 1’s a serem lidos é necessário
armazenar a quantidade de elementos 0’s lidos, pois a linguagem pede que a quantidade de uns seja
exatamente igual a quantidade de zeros.
Como o autômato finito não possui nenhuma estrutura de memória, não há como guardar este valor,
ou seja, não há como saber a quantidade de zeros lidos, impossibilitando assim a leitura correta da
quantidade de uns.
Assim, chegamos à conclusão que as linguagens não-regulares precisam de uma estrutura de memória
para poderem ser representadas formalmente e como o autômato finito não possui nenhuma estrutura
de memória, seu poder não abrange as linguagens não-regulares.
31
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
4. GRAMÁTICAS
A Gramática é uma linguagem formal que serve para definir qual o subconjunto de sentenças que faz
parte de uma determinada linguagem. Especifica linguagens potencialmente infinitas de uma forma
finita. Seu poder é superior ao poder dos autômatos finitos, pois abrange as Linguagens Regulares e
Linguagens Não-Regulares.
1. CONCEITO
• V: Conjunto de Variáveis;
• ∑: Alfabeto;
• S0: Produção Inicial. S0 ∈ V. Por convenção usaremos S como S0;
• δ: Função de Produção.
2. CLASSES DE GRAMÁTICAS
Conforme as restrições impostas ao formato das produções de uma gramática, a classe de linguagens
que tal gramática gera varia correspondentemente. Segundo Chomsky (Avram Noam Chomsky –
Filadélfia, 7 de dezembro de 1928 – professor Cátedra do MIT), as Gramáticas são organizadas em
quatro grandes classes, sendo que cada classe de gramática é capaz de gerar uma classe
correspondente de linguagens. Essa teoria é denominada Hierarquia de Chomsky (1959).
A Hierarquia de Chomsky organiza as classes das Gramáticas mediante o seu poder. Uma classe
superior engloba todas as classes inferiores e mais um conjunto de gramáticas próprias. As quatro
classes de gramáticas definidas por Chomsky são:
G. Sensíveis ao Contexto
G. Livres de Contexto
G. Regulares
32
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
As Gramáticas com Estrutura de Frase, também chamadas de Gramáticas Irrestritas ou TIPO 0, são
aquelas às quais nenhuma limitação em sua construção é imposta. São capazes de reconhecer
quaisquer linguagens recursivamente enumeráveis (uma linguagem formal é dita recursivamente
enumerável se ela é computável, ou seja, se existe um algoritmo que reconhece esta linguagem mas
que não necessariamente para qualquer entrada).
O universo das linguagens que se podem definir através dos mecanismos gerativos definidos pela
gramática corresponde exatamente ao conjunto das linguagens que esta classe de gramática é capaz
de gerar.
Para se construir uma gramática qualquer basta listar sua quádrupla. Vejamos um exemplo de
gramática para a linguagem L = 0N1N / N ≥ 1.
1 – Variáveis: Ainda não sabemos como calcular a quantidade de variáveis que a linguagem irá
precisar, por isso vamos declarar apenas uma e caso seja necessário declararemos mais. Por
convenção a primeira variável será sempre S, portanto, vamos declarar apenas o S.
V = S;
2 – Alfabeto: Como já sabemos, o alfabeto são os caracteres presentes na linguagem, neste caso,
apenas 0 e 1;
Σ = 0, 1;
3 – Produção Inicial: Por convenção será sempre S, a primeira variável declarada na gramática.
S0 = S;
33
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
Para analisarmos melhor as árvores sintáticas, primeiramente vamos listar as cadeias válidas da
linguagem:
Árvore sintática da
cadeia mínima
Sabemos que S = 01, agora imagine a segunda cadeia válida: 0011, assim temos: 0011 = 0S1. No
caso da terceira cadeia válida temos: 000111 = 00S11, e assim por diante. Vejamos as árvores
sintáticas:
Árvore sintática da segunda cadeia válida Árvore sintática da terceira cadeia válida
Com isso chegamos à conclusão que S = 0S1, ficando assim a função de produção:
δ S= 0S1 ∪ 01
Replicação Obrigatória
• V = S;
• Σ = 0, 1;
• S0 = S;
• δ S = 0S1 ∪ 01
34
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
• V = S, A, B;
• Σ = 0, 1;
• S0 = S;
• δ
o S = 0S ∪ AB
o AB = BA ∪ λ
o A=0
o B=1
0* 0*01 0*10
L = 0* ∪ 0*01 ∪ 0*10
4. GRAMÁTICAS LIVRES-DE-CONTEXTO
∀ α ∈V & β ∈ Σ α = (α∗β∗)∗
Em resumo, toda gramática é classificada como Livre-de-Contexto se, e somente se, no lado esquerdo
da igualdade de cada produção existe uma e apenas uma variável.
35
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
Antes de iniciarmos os exemplos, vamos a uma pergunta importante: É possível saber a quantidade
de variáveis que se precisa declarar, apenas observando a linguagem?
A resposta para essa pergunta é SIM! Para cada tipo de Gramática, com restrições, existe uma forma
diferente de se saber a quantidade de variáveis a serem declaradas.
Em todas as gramáticas, devemos isolar os elementos independentes de uma linguagem, pois cada
um desses elementos será uma variável.
Exemplo 01:
L= 0* 1+ (10)+ 1 0 1 1*
Nas Gramáticas Livre-de-Contexto, as variáveis devem ser contadas de fora para dentro. Os
elementos variáveis (de expoente N, M, etc.) são dependentes entre si, por isso, contam apenas uma
única variável cada um. Esses elementos variáveis só devem ser contados quando todos os elementos
a esquerda do primeiro e a direita do segundo já o foram.
Exemplo 02:
S D E F G B A
L= 0 1N 1+ (110)+ 0 1 0N 1 1*
Nas Gramáticas Livres-de-Contexto, além do que já foi exposto, a contagem de variáveis possui
algumas particularidades.
1 – Na União, o sinal da união é uma variável e essa variável representa todas as uniões simples da
linguagem;
2 – Quando todos os elementos da linguagem estão dentro de um fecho, esse fecho será uma variável
e será contado antes de seus elementos internos;
3 – A estrutura que reconhece todas as cadeias de uma linguagem, o qual chamamos de “qualquer
coisa”, será uma única variável;
4 – Quando existir um fecho dentro de outro, o fecho interno é uma variável independente da variável
do fecho externo e não será contado na sequência normal da gramática;
36
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
Exemplo 03:
B E F I J G C A S K R T P L
L = (1 0N 1* (01*0)+ 0M 1* 0+ 0M 0 1N 2*) * ∪ (0*1*2*)* (10)N 1 0 1N (2+0)+ 1*
α H γ
D Q
Importante: Para saber o posicionamento das variáveis nas produções, deve-se sempre orientar-se
pela linguagem, ou seja, na linguagem, a próxima variável está na direita ou na esquerda na variável
que está sendo resolvida. Se ela estiver na direita, a variável deve aparecer à direita dos elementos do
alfabeto que compõe a produção, o mesmo acontece quando a variável está a esquerda ou dentro da
variável que está sendo resolvida. Numa mesma produção as variáveis devem estar sempre no mesmo
lado (em construções normais).
Atenção: Nos exemplos deste subtópico, os três elementos iniciais da gramática (V, Σ e S0) foram
omitidos a fim de simplificar os exemplos. Lembre-se que nas questões e provas isto não será
tolerado.
Lema 01: Elementos Constantes. Cada constante é uma variável e a produção não possui a parte
“replicação”, pois uma constante é estática.
Exemplo: L = 01 δ S = 0A
A=1
Lema 02: Fecho Positivo. No fecho positivo, a parte replicação e a parte obrigatória são formadas
pelo elemento que compõe o fecho.
Exemplo: L = 0+1 δ S = 0S ∪ 0A
A=1
Lema 03: Fecho Estrela. No fecho estrela, a parte replicação se dá como no fecho positivo e a parte
obrigatória é vazia.
Exemplo: L = 0*1 δ S = 0S ∪ λA ou S = 0S ∪ A
A=1 A=1
37
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
Lema 04: Fecho com mais de um elemento constante. Quando existir duas ou mais constantes
dentro de um fecho, esse fecho será uma única variável e as constantes tratadas como se fossem
apenas uma.
Lema 05: Expoentes variáveis. Este lema também é chamado de Lema do Triângulo. Em expoentes
variáveis, a parte replicação é formada pelos elementos que estão na primeira variável em quantidade
do coeficiente desta primeira variável, seguido de V (antes da igualdade), seguido pelos elementos
que estão na segunda variável em quantidade do coeficiente desta segunda variável. A parte
obrigatória é formada pelos elementos que estão na primeira variável em quantidade do coeficiente
desta primeira variável multiplicado pelo valor nominal da variável, seguido de V (o próximo caso
exista), seguido pelos elementos que estão na segunda variável em quantidade do coeficiente desta
segunda variável também multiplicado pelo valor nominal da variável.
δ S = 212121S2222 ∪ 212121212121212121A222222222222
A=1
Lema 06: Fecho geral. Quando um fecho engloba toda a linguagem, esse fecho é contado como uma
variável e é feito antes dos elementos internos. Sua parte replicação é composto pela variável antes
da igualdade, seguido da primeira variável interna ao fecho. Sua parte obrigatória é formada por
vazio, em caso de fecho estrela ou da primeira variável interna ao fecho, no caso de fecho positivo.
Exemplo 01: L = (0 2* 0 1+ 0) *
ABCDE S δ S = SA ∪ λ
A = 0B
B = 2B ∪ C
C = 0D
D = 1D ∪ 1E
E=0
38
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
Exemplo 02: L = (0 2* 0 1+ 0) +
ABCDE S δ S = SA ∪ A
A = 0B
B = 2B ∪ C
C = 0D
D = 1D ∪ 1E
E=0
Lema 07: Todas as cadeias. A estrutura que representa todas as cadeias é representada pela união
de seus elementos em separado, com a variável antes da igualdade, unido a próxima variável, ou a
vazio, caso a próxima variável não exista.
Exemplo: L = (0*1*2*)* 1 δ S = 0S ∪ 1S ∪ 2S ∪ A
A=1
Lema 08: Fecho dentro de outro fecho. Quando existir um fecho dentro de outro, o fecho interno
será nomeado com uma variável fora da sequência normal e resolvido a parte. O fecho externo
continua sendo resolvido com os lemas anteriores, sendo usada a variável do fecho interno ao invés
do elemento que compõe esse fecho interno.
Atenção: O “qualquer coisa” possui seu lema próprio e não pode ser resolvido com este lema 07.
Exemplo: L = 1 (00*1)+ 1
δ S = 1A
S α AB A = 0α1A ∪ 0α1B
B=1
α = 0α ∪ λ
Lema 09: União. As uniões simples, presentes em uma linguagem, são representadas por uma única
variável formada pela união da primeira variável de cada lado das uniões da linguagem. Cada lado da
união é totalmente independente dos demais, ou seja, uma variável de um lado da união não aparece
nas produções de um outro lado qualquer.
Exemplo: 0* ∪ 1+ ∪ (10)*0
δ S=A∪B∪C
A SB S C D A = 0A ∪ λ
B = 1B ∪ 1
C = 10C ∪ D
D=0
39
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
As Formas Normais são maneiras diferentes de se escrever uma mesma gramática. Cada pesquisador
pode descrever uma Forma Normal, desde que descreva também para qual propósito sua Forma
Normal está sendo criada. Uma gramática é dita normalizada em relação a um certo padrão quando
todas as suas produções satisfazem as restrições impostas pelo padrão em questão.
As formas normais estabelecem restrições rígidas na definição das produções, sem reduzir o poder de
geração das Gramáticas Livres de Contexto, ou seja, todas as cadeias válidas pela gramática original,
também serão válidas na gramática em sua Forma Normal, o mesmo acontece com as cadeias
inválidas. São usadas principalmente no desenvolvimento de algoritmos (com destaque para
reconhecedores de linguagens) e na prova de teoremas.
Vamos conhecer agora as três Formas Normais mais importantes para a Teoria da Computação, seu
propósito e sua formação. Para exemplificar essas Formas Normais que iremos apresentar, vamos
utilizar a seguinte gramática:
• V = S, A, B, C, D, E;
• Σ = 0, 1;
• S0 = S;
• δ S = 00S11 ∪ 00A11
A = A10 ∪ B
B = 0C
C = 00C ∪ 00D
D = 0D ∪ 1D ∪ E
E = 01 ∪ 111 ∪ λ
Na Forma Normal de Chomsky, em cada produção, só poderá existir variáveis ou alfabetos, ou seja,
nunca existirá um elemento do alfabeto concatenado com uma variável em alguma produção.
Passos da Construção:
2 – Cada uma destas novas variáveis deve substituir um dos elementos do alfabeto na
gramática;
3 – Ao final da gramática, deve ser acrescentado o significado de cada variável, ou seja, qual
elemento do alfabeto aquela nova variável representa.
40
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
Exemplo:
• V = S, A, B, C, D, E, F, G; { Passo 01}
• Σ = 0, 1;
• S0 = S;
• δ S = FFSGG ∪ FFAGG
A = AGF ∪ B
B = FC Passo 02
C = FFC ∪ FFD
D = FD ∪ GD ∪ E
E = FG ∪ GGG ∪ λ
F=0 Passo 03
G=1
Estruturas com o mesmo poder podem ser transformadas umas nas outras. Para facilitar a
transformação de uma gramática Livre-de-Contexto em um Autômato a Pilha (assunto que veremos
no capítulo seguinte) é necessário que esta gramática esteja na Forma Normal de Greibach. Esta
Forma Normal foi criada por Sheila A. Greibach (Nova York, 1939 – Doutora por Harvard e
Professora na Universidade da Califórnia) e é criada com os passos a seguir.
Passos da Construção:
2 – Cada uma destas novas variáveis deve substituir um dos elementos do alfabeto na
gramática, exceto o elemento inicial da gramática, de cada lado da união, caso este elemento
pertença ao alfabeto;
3 – Ao final da gramática, deve ser acrescentado o significado de cada variável, ou seja, qual
elemento do alfabeto aquela nova variável representa.
Exemplo:
• V = S, A, B, C, D, E, F, G; { Passo 01}
• Σ = 0, 1;
• S0 = S;
• δ S = 0FSGG ∪ 0FAGG
A = AGF ∪ B
B = 0C Passo 02
C = 0FC ∪ 0FD
D = 0D ∪ 1D ∪ E
E = 0G ∪ 1GG ∪ λ
F=0 Passo 03
G=1
41
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
Nem sempre é fácil de ler uma gramática, ainda mais com as diferenças de alfabetos em idiomas
estrangeiros, como o japonês e o árabe. Para facilitar a leitura das gramáticas, sejam elas escritas em
qualquer idioma, ou qualquer conjunto de ideogramas, foi criado um padrão internacional para se
escrever uma gramática, esse padrão é a Forma Normal de Backus. Também chamada de Formalismo
de Backus-Naur ou Forma de Panini-Backus, esta Forma Normal foi assumida por comitês
internacionais e tem seu nome em homenagem a John Backus (Filadélfia, 31 de dezembro de 1924 –
Ashland, 17 de março de 2007), um dos criadores do Fortran e contribuinte deste formalismo.
A construção desta forma normal é bem simples, basta substituir os sinais utilizados, pelos sinais do
padrão.
Passos da Construção:
Exemplo:
• V = <S>, <A>, <B>, <C>, <D>, <E>
• Σ = 0, 1
• S0 = <S>
• δ <S> ::= 00<S>11 | 00<A>11
<A> ::= <A>10 | <B>
<B> ::= 0<C>
<C> ::= 00<C> | 00<D>
<D> ::= 0<D> | 1<D> | <E>
<E> ::= 01 | 111 | λ
42
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
5. GRAMÁTICAS REGULARES
O Poder das Gramáticas Regulares é o mesmo dos Autômatos Finitos, ou seja, reconhecem apenas
Linguagens Regulares.
Toda Gramática Regular é dita Linear. Uma gramática é linear quando suas produções geram
resultados com apenas uma ou nenhuma variável, sendo que esta variável, caso exista, deve aparecer
sempre na extrema direita, neste caso diz-se Gramática Linear a Direita, ou na extrema esquerda,
neste caso diz-se Gramática Linear à Esquerda, não permitindo composições hibridas. Portanto, para
que uma gramática possa ser classificada como regular, a restrição em suas produções formalmente
descrita é:
Em resumo, toda gramática é regular se, e somente se, exista apenas uma variável no lado esquerdo
da igualdade de cada produção e, em seu lado direito, exista no máximo uma variável de cada lado
da união, sendo que essa variável, caso exista, está sempre na extrema direita (gramática regular linear
à direita) ou na extrema esquerda (Gramática Regular linear à esquerda).
Atenção: Se uma variável aparece na extrema esquerda e, em outra produção, aparece uma variável
na extrema direita, essa gramática não é regular.
Nas gramáticas regulares, a forma de contagem de variáveis é diferente da forma aprendida para as
demais gramáticas. Existem duas formas de se contar as variáveis de uma linguagem regular. “Da
esquerda para a direita”, seguindo uma linha linear ou “Da direita para a esquerda”, também seguindo
uma linha linear.
Caso a contagem de variáveis seja feita “da esquerda para a direita”, o resultado será uma gramática
regular linear à direita, caso a contagem seja feita “da direita para a esquerda”, o resultado será uma
gramática regular linear à esquerda. Ambas as contagens sempre geram resultados corretos em
linguagens regulares.
Vejamos um exemplo de uma mesma linguagem regular, tendo suas variáveis contadas das duas
formas.
43
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
S AB C D E F G G F E D C B A S
Atenção: Os mandamentos das gramáticas regulares são os mesmos das gramáticas livres-de-
contexto, exceto os lemas 5, 6 e 8 que não podem ser usados nas gramáticas regulares devido as suas
restrições de construção das produções.
Importante: Para saber o posicionamento das variáveis nas produções, deve-se sempre orientar-se
pela linguagem, ou seja, na linguagem, a próxima variável está na direita ou na esquerda na variável
que está sendo resolvida? Se ela estiver na direita, a variável deve aparecer à direita dos elementos
do alfabeto que compõe a produção, o mesmo acontece quando a variável está a esquerda. Em
gramáticas regulares as variáveis devem estar sempre no mesmo lado.
44
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
Algumas propriedades podem ser aplicadas às gramáticas regulares. Vejamos a seguir cada uma
delas.
CONCATENAÇÃO ( // )
Concatenar duas gramáticas regulares significa concatenar todas as cadeias válidas da primeira
gramática, uma a uma, com todas as cadeias válidas da segunda gramática, criando um novo conjunto
de cadeias válidas.
Atenção: Duas ou mais gramáticas regulares só poderão ser concatenadas se forem lineares para o
mesmo lado.
1 – V = VG1 ∪ VG2;
2 – Σ = ΣG1 ∪ ΣG2;
3 – S0 = S0G1;
4–δ
4.1 – δG1;
4.2 – Acrescentar S0G2 em todas as produções da etapa 4.1 que não possuam
variáveis;
4.3 – δG2;
Atenção: No item 4.2, as inserções de S0G2 serão feitas a direita, quando a gramática regular for
linear à direita ou a esquerda, quando a gramática regular for linear a esquerda.
A concatenação de duas gramáticas regulares gera uma nova gramática cuja linguagem reconhecida
é exatamente a concatenação das cadeias válidas na primeira gramática, com as cadeias válidas na
segunda gramática.
Exemplo:
G1 G2 G1 // G2
V = S’, A, B, C V = S’’, D, E V = S’, S’’, A, B, C, D, E
Σ = 0, 1 Σ = 0, 1, 2 Σ = 0, 1, 2
S0 = S’ S0 = S’’ S0 = S’
δ δ δ
S’ = 0S’ ∪ 0A S’’ = S’’20 ∪ D S’ = 0S’ ∪ 0A
A = 1B ∪ λ D = D121 ∪ E111 ∪ 01 ∪ λ A = 1B ∪ λS’’
B = 000B ∪ C ∪ 00 E = E10 ∪ 22 B = 000B ∪ C ∪ 00 S’’
C = 10 ∪ 01 ∪ λ C = 10 S’’ ∪ 01 S’’ ∪ λS’’
S’’ = S’’20 ∪ D
D = D121 ∪ E111 ∪ 01 ∪ λ
E = E10 ∪ 22
45
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
UNIÃO ( ∪ )
Unir duas gramáticas regulares significa validar todas as cadeias válidas da primeira gramática e todas
as cadeias válidas da segunda gramática.
Atenção: Duas ou mais gramáticas regulares só poderão ser unidas se forem lineares para o mesmo
lado.
A união de duas ou mais gramáticas regulares gera uma nova gramática que reconhece todas as
cadeias válidas da primeira e da segunda gramática.
Exemplo:
G1 G2 G1 ∪ G2
V = S’, A, B, C V = S’’, D, E V = S’, S’’, A, B, C, D, E, N
Σ = 0, 1 Σ = 0, 1, 2 Σ = 0, 1, 2
S0 = S’ S0 = S’’ S0 = N
δ δ δ
S’ = 0S’ ∪ 0A S’’ = S’’20 ∪ D N = S’ ∪ S’’
A = 1B ∪ λ D = D121 ∪ E111 ∪ 01 ∪ λ S’ = 0S’ ∪ 0A
B = 000B ∪ C ∪ 00 E = E10 ∪ 22 A = 1B ∪ λ
C = 10 ∪ 01 ∪ λ B = 000B ∪ C ∪ 00
C = 10 ∪ 01 ∪ λ
S’’ = S’’20 ∪ D
D = D121 ∪ E111 ∪ 01 ∪ λ
E = E10 ∪ 22
46
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
CONJUNTO CLAUSURA ( * )
O conjunto clausura é o fecho de uma gramática. Colocar a gramática em clausura significa validar
todas as suas cadeias já válidas e todas as cadeias formadas pela concatenação sucessivas dessas
cadeias válidas, com elas mesmas, até o infinito, ou seja, se a cadeia 0010 é válida na gramática
original, na gramática com clausura, serão válidas, além da própria cadeia 0010, as cadeias 00100010,
001000100010, 0010001000100010, ..., além da cadeia vazia (no caso do clausura estrela).
O Conjunto Clausura Estrela de uma gramática regular G1, representado por G1* se dá através da
seguinte regra:
1 – V = VG1, N;
2 – Σ = ΣG1;
3 – S0 = N;
4–δ
4.1 – Incluir N = S0G1 ∪ λ;
4.2 – Acrescentar N em todas as produções da etapa 4.1 que não possuam
variáveis;
O conjunto clausura de uma gramática gera uma nova gramática cuja linguagem é a estrela de Kleene
da gramática anterior.
Exemplo:
G1 G1*
V = S’, A, B, C V = S’, A, B, C, N
Σ = 0, 1 Σ = 0, 1
S0 = S’ S0 = N
δ δ
S’ = 0S’ ∪ 0A N = S’ ∪ λ // Etapa 4.1
A = 1B ∪ λ S’ = 0S’ ∪ 0A
B = 000B ∪ C ∪ 00 A = 1B ∪ λN Etapa 4.2
C = 10 ∪ 01 ∪ λ B = 000B ∪ C ∪ 00N
C = 10N ∪ 01N ∪ λN
Para fazer o chamado “Clausura Positivo”, ou seja, o fecho positivo de uma gramática regular, a regra
é a mesma para o clausura estrela, com uma única exceção, a produção inicial não será a nova variável.
Ela permanece sendo a produção inicial da gramática G1
G1 G1+
V = S’, A, B, C V = S’, A, B, C, N
Σ = 0, 1 Σ = 0, 1
S0 = S’ S0 = S’ ATENÇÃO
δ δ
S’ = 0S’ ∪ 0A N = S’ ∪ λ // Etapa 4.1
A = 1B ∪ λ S’ = 0S’ ∪ 0A
B = 000B ∪ C ∪ 00 A = 1B ∪ λN Etapa 4.2
C = 10 ∪ 01 ∪ λ B = 000B ∪ C ∪ 00N
C = 10N ∪ 01N ∪ λN
47
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
6. GRAMÁTICAS SENSÍVEIS-AO-CONTEXTO
Devemos isolar todos os elementos da uma linguagem, pois cada um desses elementos será uma
variável. A forma de contagem continua sendo a mesma usada nas gramáticas livres-de-contexto, ou
seja, “de fora para dentro”, porém, os expoentes iguais que tiverem três ou mais aparições, devem ser
contados seqüencialmente da esquerda para a direita, como nas gramáticas regulares lineares à direita.
Os expoentes variáveis com exatamente duas aparições, mantêm a regra de contagem das gramáticas
livres-de-contexto.
Exemplo 01:
L = 0* 0N (10)* 0M 1M 22M 0* 0M 1 2N (1 1+ 0 2)* 0 ∪ 0 1N 0/ N ≥ 2 e M ≥ 1
A E G H I J K F α C BS L P Q
D
Para se construir uma gramática Sensível-ao-contexto, devemos ter em mente que todas as regras de
construção das gramáticas livres-de-contexto serão utilizadas em todas as produções, exceto naquelas
que fizerem parte da estrutura que possui três ou mais aparições de um expoente variável. Nestas
estruturas, serão seguidos os três passos seguintes:
Atenção: Essa regra faz referência sempre parte da linguagem que vai do primeiro expoente variável
ao último expoente variável que compõe a parte dita sensível da linguagem. A essa parte vamos
chamar apenas de estrutura.
1 – Replicação & Cadeia Mínima: Será criada uma produção. Do lado esquerdo da produção será
colocada a primeira variável da estrutura. Na replicação existirá o alfabeto que compõe a primeira
variável da estrutura, em quantidade igual ao coeficiente de seu expoente, seguido da variável antes
da igualdade, seguido direto das demais variáveis que representam os expoentes variáveis da
estrutura, na quantidade do coeficiente de seus respectivos expoentes. A cadeia mínima será formada
pelo alfabeto que compõe a primeira variável da estrutura, em quantidade igual ao coeficiente de seu
48
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
expoente, seguido pelas demais variáveis que compõe a estrutura, em quantidade igual ao seu
coeficiente, ou apenas uma aparição, caso seja um elemento constante.
2 – Ordem Alfabética: Colocar em ordem alfabética, pares de dois em dois, de todas as variáveis
que compõe a estrutura.
3 – Substituição: Para cada variável da estrutura, que representa um elemento com expoente variável,
exceto o primeiro, existirão duas produções formadas da seguinte maneira:
2.2. Do lado esquerdo da igualdade existirá o elemento do alfabeto que representa a variável
em questão, seguido da própria variável. Do lado direito da igualdade, existirá duas vezes
o elemento do alfabeto representado pela variável em questão.
Para os elementos constantes, serão criadas produções para cada um deles em separado, onde não
existirá próxima variável. Como exemplo destes passos, vamos resolver a linguagem do exemplo 01
deste tópico.
V = S, A, B, C, D, E, F, G, H, I, J, K, L, P, Q, α
Σ = 0, 1, 2
S0 = S
δ S=A∪L
A = 0A ∪ B
B = C0
C = C1α02 ∪ D
D = 0D2 ∪ 00E22
E = 10E ∪ F
F = G1
G=0GHIIK ∪ 0HIIJK // Passo 01
IH=HI
JH=HJ
KH=HK // Passo 02
JI=IJ
KI=IK
KJ=JK
0H=01
1H=11
1I=12 // Passo 03
2I=22
0K=00
2K=20
0K=00 // não é necessária a duplicidade
J = 0J ∪ λ
α=1α∪1
L=0P
P = 1 P ∪ 11Q
Q=0
49
APOSTILA DE LINGUAGENS FORMAIS – GRAMÁTICAS Prof. TENORIO
Importante: Pergunta: É possível saber qual gramática será construída apenas olhando para a
linguagem? A resposta é GERALMENTE SIM. Tudo depende da quantidade de expoentes variáveis
iguais, em cada lado da união, que a linguagem possui. Caso exista apenas uma aparição de cada um
dos expoentes variáveis da linguagem, deverá ser construída uma gramática regular; caso existam
duas aparições de um mesmo expoente variável, deverá ser construída uma gramática Livre-de-
Contexto, caso existam três ou mais expoentes variáveis iguais, então a gramática é Sensível-ao-
Contexto. Essa regra possui algumas exceções, que só podem ser verificadas durante a construção da
gramática, mas funciona de modo geral.
50
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS A PILHA Prof. TENORIO
5. AUTÔMATOS A PILHA
Vimos que o poder dos Autômatos Finitos limita-se as Linguagens Regulares. Para representar as
linguagens não-regulares recorremos a estruturas mais poderosas. Isto se deve ao fato dos autômatos
não terem estruturas de memória para auxiliá-los, como as variáveis nas gramáticas.
Para resolver este problema, pesquisadores da área foram atrás de uma estrutura de memória, que
pudesse ser vinculada aos autômatos finitos, a fim de que estes passassem representar também as
linguagens não-regulares. Várias estruturas de dados foram testadas e chegou-se a conclusão de que
a melhor estrutura para essa tarefa seria a pilha. As pilhas são estruturas baseadas no princípio LIFO
(last in, first out), na qual os dados que foram inseridos por último na pilha serão os primeiros a serem
removidos. Da fusão dos Autômatos Finitos com a estrutura de dados Pilha, nasceram os Autômatos
a Pilha.
O poder dos autômatos a pilha engloba as linguagens regulares e também as não-regulares. O quadro
a seguir mostra um comparativo de poder entre o autômato a pilha e as gramáticas da Hierarquia de
Chomsky.
Gramáticas Autômatos
Gramáticas Regulares Autômatos Finitos
Gramáticas Livres-de-Contexto Autômatos a pilha, utilizando-se de apenas uma pilha
Gramáticas Sensíveis-ao-Contexto Autômatos a pilha, utilizando-se de duas pilhas
Gramáticas com Estrutura de Frase Autômatos a pilha, utilizando-se de três ou mais pilhas
Importante: Vale lembrar que o principal objetivo dos autômatos é a validação de cadeias. Para uma
cadeia ser válida no autômato a pilha, não é suficiente que a cadeia termine em um estado final. Para
que uma cadeia possa ser validada em um autômato a pilha, duas condições devem ser
obrigatoriamente satisfeitas: sua chegada em um estado final e a pilha estar vazia, não podendo sobrar
ou faltar elementos.
1. CONCEITO
Esse conceito nos mostra que o autômato a pilha, nada mais é do que o autômato finito, unido as
estruturas de pilha.
Explicando os elementos que compõe o autômato a pilha:
51
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS A PILHA Prof. TENORIO
• Z0 é um elemento do conjunto ΣP, distinto dos demais pela convenção de que sua presença,
no topo da pilha que implementa a memória do autômato, indica a ausência de outros
elementos na mesma. É um marcador de pilha vazia (z0∈ ΣP);
2. CONVENÇÕES
Para facilitar o estudo e a construção dos autômatos a pilha, vamos conhecer algumas convenções
adotadas pelos mais diversos autores.
1) A função de produção será representa em uma tabela, cujas linhas expressam o estado
atual e o topo da pilha e as colunas, os elementos do alfabeto.
3) Existirá apenas um estado final e este não será o inicial e nem terá saída alguma;
4) Z0 será sempre Z e estará sempre na base da pilha. Não poderá existir outro elemento Z
na pilha e o último comando de todo autômato a pilha será desempilhar este Z;
52
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS A PILHA Prof. TENORIO
3. DETERMINISMO
Construir um Autômato a Pilha é escrever toda sua sétupla. Ao contrário do Autômato Finito, a cadeia
mínima não é uma cadeia interessante para se construir um Autômato a Pilha, pois, as particularidades
dos loops não são tão simples de se verificar e requerem um pouco mais de cuidados.
Não existe uma regra para construção dos Autômatos a Pilha, porém, ao se deparar com uma
linguagem qualquer que se queira criar um Autômato a Pilha, algumas dicas podem ser seguidas.
Essas dicas remontam os seguintes passos:
3 – Evidenciar uma cadeia não mínima, ou seja, uma cadeia onde os elementos variáveis se replicam,
ao menos, duas vezes;
5 – Construir a δ, com base nas ligações do autômato, tomando cuidado com os expoentes variáveis
da linguagem, pois nestes, e somente nestes, a pilha (memória auxiliar) deve sofrer alterações;
A tabela da função de transição do autômato a pilha é constituída da seguinte maneira:
53
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS A PILHA Prof. TENORIO
Elementos do Σ
Σ
Q x ΣP
Estado atual e
Topo atual da pilha
Em cada cruzamento da tabela será colocado o estado destino e o novo elemento do topo da pilha.
Esse elemento do topo da pilha substituirá o elemento da pilha que se encontra na coluna Q x ΣP.
Caso não se queira mexer na pilha, basta repetir o elemento a coluna Q x ΣP, pois isso fará com que
o Autômato a Pilha substitua o elemento por ele mesmo, mantendo assim, a pilha constante.
A ideia do uso da memória auxiliar (pilha) serve apenas para os elementos que precisam ser contados,
por isso, constantes e fechos não a utilizam. No escopo da apostila, só iremos trabalhar com
linguagens livres-de-contexto, portanto só existirá, na linguagem, o máximo de dois expoentes
variáveis iguais de cada lado da união. Esses expoentes são os únicos elementos a usarem a pilha, e
este uso se dará da seguinte maneira: o primeiro expoente variável empilhará N elementos e o segundo
expoente variável, precisará desempilhar exatamente os N elementos empilhados anteriormente, pois,
como já vimos, uma cadeia só será válida se chegar ao estado final com a sua pilha vazia, sem sobrar,
nem faltar elementos.
54
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS A PILHA Prof. TENORIO
Atenção: Lembre-se que ao se construir um autômato a pilha, toda sua sétupla deve ser descrita.
Lema 1: Elementos Regulares. Os elementos constantes e fechos estrelas e positivos são tratados
como se estivéssemos construindo um autômato finito e NÃO alteram a memória auxiliar. Isto
significa que os elementos obrigatórios mudam de estado e os não-obrigatórios não mudam, porém,
na pilha, nada se altera;
Exemplo: L = 01+01*
Exemplo: L = 01N01N0 / N ≥ 1
Atenção: Caso exista apenas uma aparição de um expoente variável, este deve ser tratado como
Elemento Regular.
55
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS A PILHA Prof. TENORIO
Lema 3: Elementos Livres-de-Contexto com valor nominal maior que 1. Neste caso, o valor
nominal indicará quantas vezes precisarei mudar de estado nos elementos que alteram a pilha.
Exemplo: L = 01N01N0 / N ≥ 3
Q = q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10 Q x ΣP 0 1 λ
Σ = 0, 1 q0, Z q1, Z
S0 = q0 q1, Z q2, NZ
F = q10 q2, N q3, NN
ΣP = N, Z q3, N q4, NN
Z0 = Z q4, N q5, N q4, NN
q5, N q6, λ
q6, N q7, λ
q7, N q8, λ
q8, N q8, λ
q8, Z q9, Z
q9, Z q10, λ
Exemplo: L = 0(10)N0(01+)N0 / N ≥ 1
Importante: Note bem o que acontece com o q6. Ele possui duas saídas 0 (zero), uma em direção ao
q5 e outra em direção ao q7, porém isto não desqualifica o determinismo, ou seja, este autômato a
pilha é determinístico, pois q6 só lerá o zero em direção ao q5, quando o topo da pilha for N e só lerá
o zero em direção ao q7, quando o topo da pilha for Z.
56
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS A PILHA Prof. TENORIO
Exemplo: L = 01N01M01M01N0 / N ≥ 1, M ≥ 1
Q = q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10 Q x ΣP 0 1 λ
Σ = 0, 1 q0, Z q1, Z
S0 = q0 q1, Z q2, NZ
F = q10 q2, N q3, N q2, NN
ΣP = M, N, Z q3, N q4, MN
Z0 = Z q4, M q5, M q4, MM
q5, M q6, λ
q6, M q6, λ
q6, N q7, N
q7, N q8, λ
q8, N q8, λ
q8, Z q9, Z
q9, Z q10, λ
Lema 6: União. Quando, na linguagem, existir a união, nada se altera. Basta iniciar todos os
elementos do q0, assim como no autômato finito. Lembrando que teremos apenas um estado final.
Atenção: No caso de união, lembrar sempre do Lema 9 do autômato finito, que também vale no
autômato a pilha.
57
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS A PILHA Prof. TENORIO
Lema 7: Autômato a Pilha Não Determinístico. Caso parta, de algum estado, duas ou mais saídas
iguais, tendo o mesmo elemento no topo da pilha, dizemos que o autômato a pilha é não-
determinístico.
Atenção: Atentar para o fecho estrela geral (no lado esquerdo na união) e para o “qualquer coisa”, no
lado direito na união. Esses elementos são feitos exatamente como no autômato finito, por isso, não
possuem lemas específicos nos autômatos a pilha.
Importante: Neste exemplo, no lado esquerdo da união, vemos um fecho estrela que abrange toda a
estrutura. Os fechos permitem repetir tudo que está dentro deles. Na repetição, pode ser que seja
necessário garantir que a quantidade de elementos com expoente variável da primeira repetição seja
a mesma das repetições seguintes. Para tornar isto possível, deverão ser criadas duas pilhas de apoio
que irão guardar esse valor e serão chegadas a cada repetição.
Lema 8: Elementos Livres-de-Contexto com coeficientes maiores que 1. No caso das variáveis
dos expoentes livres-de-contexto apresentarem coeficientes, esses coeficientes serão usados apenas
no momento do empilhar e do desempilhar, não alternado, em nada, a sequência dos estados do
autômato a pilha. No momento do empilhar, serão empilhados, simultaneamente, C2 elementos na
pilha, onde C2 é o valor do coeficiente do desempilhar da variável. E no momento de desempilhar,
serão desempilhados, simultaneamente, C1 elementos, onde C1 é o valor do coeficiente do empilhar
da variável.
Exemplo: L = 015N013N0 / N ≥ 1
Lema 9: Elementos Livres-de-Contexto com valor nominal igual a 0 (ZERO). Quando o valor
nominal da variável for igual a zero, deve-se construir o autômato a pilha considerando duas
hipóteses: a primeira, de o elemento ser vazio e a segunda, deste elemento não ser vazio.
Exemplo: L = 014N01+015N0 / N ≥ 0
Sempre que duas ou mais estruturas tiverem o mesmo poder, podemos converter uma na outra. Neste
tópico, vamos demonstrar o algoritmo de conversão de gramáticas livres-de-contexto em autômatos
a pilha.
Esta nova forma de descrever o autômato a pilha só é possível devido a possibilidade de leitura, entre
os elementos da cadeia, de elementos vazios. Por exemplo, a cadeia 01011 pode ser lida da seguinte
maneira: λ0λ1λ0λ1λ1λ sem que a informação contida da mesma seja alterada.
2.1. Q = q0, q1, q2; // Independente da linguagem, o autômato a pilha só terá três estados;
2.2. Σ = ΣG // Alfabeto do autômato a pilha é o mesmo da gramática;
59
APOSTILA DE LINGUAGENS FORMAIS – AUTÔMATOS A PILHA Prof. TENORIO
∀α ∈ Σ & X, Y ∈ V temos X = αY
δ (q1, X, α) = { (q1, Y) };
Exemplo:
Passo 01:
• V= S, A, B, C, D • V= S, A, B, C, D, E, F, G
• Σ = 0, 1, 2 • Σ = 0, 1, 2
• S0 = S; • S0 = S;
• δ • δ
S = 0S0 ∪ 00A00 S = 0SE ∪ 0EAEE
A = A1 ∪ B1 A = AF ∪ BF
B = 0B ∪ 1B ∪ 2B ∪ C B = 0B ∪ 1B ∪ 2B ∪ C
C = 01C ∪ C10 ∪ 01D C = 0FC ∪ CFE ∪ 0FD
D = 01 ∪ 102 ∪ λ D = 0F ∪ 1EG ∪ λ
E = 0;
F = 1;
G = 2;
60
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
6. MÁQUINAS DE TURING
1. HISTÓRICO
A computação digital, quando surgiu, um século após Charles Babbage (26/12/1791 – 18/10/1871)
ter projetado o primeiro computador analógico da história (1837), não se mostrou através de uma
feira de informática ou em um laboratório de algum cientista famoso de alguma universidade
consagrada. A possibilidade de se construir um computador digital foi dada ao mundo através de um
inusitado artigo, em um jornal de matemática no ano de 1936. No momento, quase ninguém percebera
que a descoberta descrita naquele obscuro artigo iria conduzir a uma arrancada mundial no campo
tecnológico, embora seu jovem autor, na época com 24 anos, já estivesse na busca de uma máquina
que simulasse os processos humanos de conhecimento desde 1934.
Esse autor foi Alan Turing, que se consagrou como um dos maiores matemáticos do seu tempo
quando fez antever aos seus colegas que era possível executar operações computacionais sobre a
teoria dos números (leia-se número binários) por meio de uma máquina que tivesse embutidas as
regras de um sistema formal. Um sistema formal é uma espécie de "jogo" rigorosamente definido,
que especifica regras para manipulação de símbolos.
Apesar da maquina ser abstrata, por possui memória ilimitada, Turing usou seus conceitos para
construir uma máquina física, com o objetivo de quebrar os códigos secretos das comunicações
alemãs durante a II Guerra Mundial. Essa máquina ficou conhecida como Colossus e certamente
salvou a vida de muitos soldados ingleses durante a guerra.
Turing também é responsável por diversos conceitos que estudamos hoje na Ciência da Computação.
O Colossus
61
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
2. CONCEITO
As Máquinas de Turing são os autômatos mais potentes que estudaremos. Elas podem computar
qualquer função computável, ou seja, executam quaisquer instruções de um computador, por mais
moderno que ele seja.
Num sentido preciso, uma Máquina de Turing Padrão é um modelo abstrato de um computador, que
se atém apenas aos aspectos lógicos do seu funcionamento e não à sua implementação física. Uma
Máquina de Turing Padrão pode simular o funcionamento de qualquer computador digital. Entretanto,
é mais fácil explicar o que é uma Máquina de Turing Padrão apresentando-a como uma máquina
realizada fisicamente.
• Uma fita infinita em ambas as direções (direita e esquerda), que é dividida em células, uma
adjacente à outra. Cada célula contém um símbolo de algum alfabeto finito. O alfabeto contém
um símbolo especial branco (aqui escrito como Б), um delimitador (aqui escrito como ►) e
um ou mais símbolos adicionais. Assume-se que a fita é arbitrariamente extensível para a
esquerda e para a direita, isto é, a máquina de Turing possui tanta fita quanto é necessário para
a computação. Assume-se também que células que ainda não foram escritas estão preenchidas
com o símbolo branco.
• Um cabeçote, que pode ler e escrever símbolos na fita e mover-se para a esquerda e para a
direita.
• Um operador de estados, que armazena o estado da máquina de Turing. O número de estados
diferentes é sempre finito e há um estado especial denominado estado inicial com o qual o
registrador de estado é inicializado.
• Uma tabela de ação (ou função de transição) que diz à máquina que símbolo escrever, como
mover o cabeçote ('E' para esquerda e 'D' para direita) e qual será seu novo estado, dados o
símbolo que ele acabou de ler na fita e o estado em que se encontra. Se não houver entrada
alguma na tabela para a combinação atual de símbolo e estado então a máquina pára.
Note que cada parte da máquina é finita, porém, a quantidade de fita potencialmente ilimitada é que
dá uma quantidade ilimitada de espaço de armazenamento na máquina.
62
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
1 – A máquina de Turing tem uma fita que é ilimitada, em ambas as direções, permitindo qualquer
número de movimentos para a direita (R) ou para a esquerda (L);
3 – Não existe fita de entrada especial. Assumimos que o início da fita tem o conteúdo especial.
Alguns destes podem ser considerados entradas. Analogicamente, não existe nenhum dispositivo de
saída. Sempre que a máquina pára, algum ou todo o conteúdo da fita pode ser visto como saída.
4. CONVENÇÕES
1) A função de produção será representa em uma tabela, cujas linhas expressam o estado atual e
as colunas, os elementos do alfabeto.
3) Existirá apenas um estado final e este não será o inicial e nem terá saída alguma;
63
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
5. TESE DE CHURCH-TURING
• O algoritmo consiste de um conjunto finito de instruções simples e precisas, que são descritas
com um número finito de símbolos;
• O algoritmo sempre produz resultado em um número finito de passos;
• O algoritmo pode, a princípio, ser executado por um ser humano com apenas papel e lápis;
• A execução do algoritmo não requer inteligência do ser humano além do necessário para
entender e executar as instruções;
Um exemplo de tal método é o algoritmo de Euclides para a determinação do máximo divisor comum
de dois números naturais.
A noção de algoritmo é intuitivamente clara mas não é definida formalmente, pois não está claro o
que quer dizer "instruções simples e precisas", e o que significa "inteligência necessária para executar
as instruções". Informalmente a tese enuncia que nossa noção de algoritmo pode ser formalizada (sob
a forma de funções computáveis) e que computadores podem executar esses algoritmos. Além disso,
qualquer computador pode, teoricamente, executar qualquer algoritmo, isto é, o poder computacional
teórico de cada computador é o mesmo e não é possível construir um artefato de cálculo mais
poderoso que um computador.
A tese, de acordo com as palavras do próprio Turing, pode ser enunciada como:
“Toda função que seria naturalmente considerada computável pode ser computada por uma
Máquina de Turing”
Devido à imprecisão do conceito de uma "função que seria naturalmente considerada computável", a
tese não pode ser nem provada nem refutada formalmente. Já que não pode ser matematicamente
demonstrada, a tese de Church-Turing pode ser considerada uma lei física.
“Qualquer computação que pode ser efetuada por meios mecânicos, pode ser efetuada por uma
Máquina de Turing padrão”.
Em resumo: Qualquer programa de computador pode ser traduzido em uma máquina de Turing, e
qualquer máquina de Turing pode ser traduzida para uma linguagem de programação de propósito
geral; assim, a tese é equivalente a dizer que qualquer linguagem de programação de propósito geral
é suficiente para expressar qualquer algoritmo.
64
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
1.1. Qualquer algoritmo que pode ser executado em máquina existente, também pode ser
executado por uma máquina de Turing padrão;
1.2. Ninguém foi capaz de sugerir um problema solúvel, pelo o que intuitivamente entendemos
por um algoritmo, para o qual, um programa de máquina de Turing não possa ser escrito
para ele;
1.3. Têm sido propostos modelos alternativos de computação mecânica, porém, nenhum deles é
mais poderosos do que o modelo da máquina de Turing padrão;
Desde aquela época muitos outros formalismos foram propostos para descrever a computabilidade
efetiva, incluindo funções recursivas, o cálculo lambda, máquinas de registros, sistemas de Post,
lógica combinatória e algoritmos de Markov. Foi mostrado que todos esses sistemas computam
essencialmente o mesmo conjunto de funções que as máquinas de Turing; sistemas como esses são
chamados Turing completos. Como todas as diversas tentativas de formalizar o conceito de
algoritmo levaram a resultados equivalentes, geralmente assume-se que a tese de Church-Turing é
correta. No entanto, a tese é uma definição, e não um teorema, e portanto não pode ser provada. Ela
poderia, no entanto, ser refutada se alguém descobrisse um método que fosse universalmente aceito
como um algoritmo efetivo mas que não pudesse ser executado por uma máquina de Turing.
6. O PROBLEMA DA PARADA
Na teoria da computabilidade o problema da parada é um problema de decisão2 que pode ser declarado
informalmente da seguinte forma:
“Dado uma descrição de um programa e uma entrada finita, decida se o programa termina de
rodar ou rodará indefinidamente, dada essa entrada.”
Alan Turing provou em 1936 que um algoritmo genérico para resolver o problema da parada para
todos pares programa-entrada possíveis não pode existir. Dizemos que o problema da parada é
indecidível nas Máquinas de Turing.
2
Um problema de decisão é uma questão sobre um sistema formal com uma resposta do tipo sim-ou-não. Por exemplo,
o problema: "dados dois números x e y, y é divisível por x?" é um problema de decisão. Ou ainda: "Dado um número
inteiro x, x é um número primo?". A resposta para esses problemas pode ser 'sim' ou 'não', e depende dos valores que as
variáveis assumem em cada instância do problema.
65
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Como já vimos, as máquinas de Turing são capazes de executar todo e qualquer algoritmo existente.
Para cada classe de algoritmo, existem formas diferentes de se construir uma máquina de Turing
padrão. Lembre-se que, construir uma máquina de Turing, significa descrever toda sua nôntupla.
A tabela da função que compõe a máquina de Turing é composta, em sua primeira linha, pelos
elementos do alfabeto de fita e em sua primeira coluna, pelos possíveis estados atuais. Cada
componente da tabela é formado pelo próximo estado, pelo elemento do alfabeto de fita que será
gravado na fita e pelo movimento da máquina.
Neste tópico, vamos estudar os dois tipos de máquinas de Turing mais importantes para a Teoria da
Computação, são eles:
Neste caso, a função das máquinas de Turing é a validação de cadeias em uma linguagem específica,
na prática, verifica se um algoritmo está escrito de maneira correta em relação à sintaxe da linguagem
de programação.
Para as linguagens regulares, uma forma simples de se descrever a máquina de Turing é construir o
autômato finito da linguagem, conforme demonstrado no módulo 2 desta apostila. Em seguida,
montar sua nôntupla.
Dica: em linguagens regulares, o cabeçote de leitura só precisa fazer movimentos para a direita e
dificulmente precisará alterar o conteúdo da fita.
Depois de construir o autômato finito para esta linguagem chegamos à seguinte máquina de Turing:
Detalhamento: assim como no autômato a pilha, o elemento que está na tabela, substitui o elemento
que está na fita. Neste caso, como já foi dito, nenhum elemento da fita precisou ser alterado, devido
à linguagem ser regular.
66
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Atenção 02: Toda e qualquer máquina de Turing possui a instrução q0, ► = q0, ►, R.
Para as linguagens não-regulares é necessário garantir que a quantidade de elementos nos expoentes
variáveis esteja de acordo com o descrito na linguagem. Para que essa quantidade seja garantida é
necessário que a máquina conte essas quantidades e verifique esse valor resultante da contagem.
Uma forma de se contar elementos em uma máquina de Turing é a técnica da marcação dos valores.
Marcar significa substituir o valor, presente na máquina de Turing, por um marcador, que será um
caractere qualquer que não faça parte do alfabeto da linguagem e obrigatoriamente, faça arte do
alfabeto da fita.
Imagine verificar a quantidade de elementos presentes em dois conjuntos ‘A’ e ‘B’, sem usar os
números reais. Uma forma seria, por exemplo, pintar os elementos. Iniciamos pintando um elemento
de ‘A’ e logo em seguida, pintamos um elemento de ‘B’, ficamos nesse loop até que todos os
elementos de ‘A’ estejam pintados ou que não haja mais correspondentes em ‘B’ para serem pintados.
Daí, basta fazer as verificações:
2 – Se todos os elementos de ‘A’ já foram pintados e ainda existir, ao final do loop, elementos
em ‘B’ não pintados, significa que a quantidade de elementos de ‘A’ é menor do que a quantidade de
elementos de ‘B’;
3 – Se ao pintarmos o último elemento em ‘A’, também for pintado o último elemento em ‘B’,
no mesmo loop, significa que a quantidade de elementos de ‘A’ e ‘B’ são iguais.
Fazendo uma analogia deste exemplo, vamos construir uma máquina de Turing para a linguagem:
L = 0N1N / N ≥ 1
Detalhamento: Neste exemplo, fazendo uma analogia ao exemplo das pinturas de ‘A’ e ‘B’, temos
que X é a cor com que pintamos (marcamos) os elementos ‘0’ e Y é a cor com que pintamos
(marcamos) os elementos ‘1’. Portanto, se ao final da execução da máquina, sobrar elementos não
marcados na fita, significa que a cadeia não é válida e não chegará ao estado final. O passo-a-passo
da fita, com a cadeia 000111 de entrada (escolhida aleatoriamente uma cadeia não mínima) fica da
seguinte maneira:
67
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
... Б ► 0 0 0 1 1 1 Б Б Б ...
... Б ► X 0 0 1 1 1 Б Б Б ...
... Б ► X 0 0 Y 1 1 Б Б Б ...
... Б ► X X 0 Y 1 1 Б Б Б ...
... Б ► X X 0 Y Y 1 Б Б Б ...
... Б ► X X X Y Y 1 Б Б Б ...
... Б ► X X X Y Y Y Б Б Б ...
... Б ► X X X Y Y Y Б Б Б ...
Note que, ao final da execução, não sobrou nenhum elemento sem marcar, portanto a cadeia é válida,
como podemos constatar também na linguagem.
Neste caso, a função das máquinas de Turing é a execução de cálculos matemáticos. Esse tipo de
máquina expressa exatamente o que acontece na U.L.A. (Unidade de Lógica e Aritmética) em um
computador.
Para a construção dessas máquinas de Turing é importante definir, anteriormente, a função de cada
estado na máquina. Essa função depende do operador que está sendo usado na equação, da quantidade
de variáveis e da base dessas variáveis (binária, decimal, etc.). Nenhum estado pode acumular
funções, ou seja, cada estado terá uma única função dentro da máquina. Vamos ao exemplo 01.
X2 + 1 / X ∈ΙΝ
Note que, neste exemplo, a base de X é dois, ou seja, estamos trabalhando com a base binária
(números binários). A soma de uma unidade ao um número binário é feita da seguinte forma:
1 – Se o último elemento for 0, basta que esse elemento se transforme em 1 para obtermos o resultado.
01101000100
+1
01101000101
2 – Se o último elemento for 1, este um passa a ser 0 e verificamos o elemento logo a sua esquerda.
Esse passo é feito até que se encontre um elemento 0 para que seja aplicado a regra anterior.
01101000111
+1
01101001000
68
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
q0 = Encontrar o último elemento da máquina; Como a maquina sempre inicia no delimitador e o que
interessa para equação é o último elemento, precisamos de um estado para fazer o cabeçote apontar
para esse último elemento.
Importante Para fazer uma máquina apontar para o último elemento da cadeia, basta mover o
cabeçote de leitura para direita até que se encontre o branco de fita (Б). Daí basta mover o cabeçote
uma única vez para a esquerda e pronto, ele estará apontando para o último elemento da cadeia.
q1 = Substituir os elementos; Nesta equação, quando o elemento for 0, esse estado vai trocar esse 0
por 1 e desligar a máquina, pois o resultado já estará pronto. Caso encontre o elemento 1, esse estado
vai substituir esse 1 por 0 e continuará sua busca por um elemento 0, para poder concluir sua
execução.
q2 = Estado Final; Todas as máquinas de Turing terão um estado, cuja única função é ser um estado
final.
Q = q0, q1, q2 ΣF 0 1 ► Б
Σ = 0, 1 Q
S0 = q0 q0 q0, 0, R q0, 1, R q0, ►, R q1, Б, L
F = q2 q1 q2, 1, P q1, 0, L
ΣF = 0, 1, ►, Б q2
R = q0, q1
►=►
Б=Б
Atenção: Nas máquinas de Turing como Operador Algébrico, o alfabeto da máquina (Σ) é exatamente
a base das variáveis. O alfabeto da fita (ΣF) pode variar bastante.
Importante Sempre que um estado conclui sua função, a máquina troca de estado.
... Б ► 0 1 0 0 1 1 Б Б Б ...
... Б ► 0 1 0 0 1 1 Б Б Б ...
... Б ► 0 1 0 0 1 0 Б Б Б ...
... Б ► 0 1 0 0 0 0 Б Б Б ...
... Б ► 0 1 0 1 1 1 Б Б Б ...
... Б ► 0 1 0 1 1 1 Б Б Б ...
Para os próximos exemplos, com o objetivo de facilitar a construção das máquinas, vamos
trabalhar com a base unária.
Base unária: {1, 11, 111, 1111, 11111, 111111, 1111111, 11111111, 111111111, ...}
69
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Antes de definir as funções de cada estado, vamos observar a montagem da fita e o seu passo-a-passo.
Na fita, deverá existir um separador, para que possamos identificar onde termina o X e onde começa
o Y.
... Б ► 1 1 1 1 + 1 1 Б Б ...
... Б ► 1 1 1 1 + 1 1 Б Б ...
... Б ► 1 1 1 1 1 1 1 Б Б ...
... Б ► 1 1 1 1 1 1 1 Б Б ...
... Б ► 1 1 1 1 1 1 Б Б Б ...
... Б ► 1 1 1 1 1 1 Б Б Б ...
Importante Nas máquinas de Turing como Operador Algébrico, sempre que um estado encontrar
um separador, ele deve concluir imediatamente sua função e trocar de estado.
70
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Neste exemplo vamos usar o sinal de – como separador. Para definir a função de cada estado, vamos
analisar o passo-a-passo da máquina:
... Б ► 1 1 1 1 – 1 1 Б Б ...
... Б ► 1 1 1 1 – Y 1 Б Б ...
... Б ► 1 1 1 X – Y 1 Б Б ...
... Б ► 1 1 1 X – Y Y Б Б ...
... Б ► 1 1 X X – Y Y Б Б ...
... Б ► 1 1 Б Б Б Б Б Б Б ...
71
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Neste exemplo, não precisaremos do separador, pois só existe uma variável a ser executada. Lembre-
se que qualquer máquina de Turing pode ser construída de maneiras diferentes. Nesta apostila, estou
mostrando exemplos da maneira que julgo ser mais fácil para o aprendizado dos alunos. Vamos ao
passo-a-passo:
... Б ► 1 1 1 1 Б Б Б Б Б ...
... Б ► X X X X Б Б Б Б Б ...
... Б ► X X X 1 Б Б Б Б Б ...
... Б ► X X X 1 1 Б Б Б Б ...
... Б ► X X 1 1 1 Б Б Б Б ...
... Б ► X X 1 1 1 1 Б Б Б ...
... Б ► X 1 1 1 1 1 Б Б Б ...
... Б ► X 1 1 1 1 1 1 Б Б ...
... Б ► 1 1 1 1 1 1 1 Б Б ...
... Б ► 1 1 1 1 1 1 1 1 Б ...
... Б ► 1 1 1 1 1 1 1 1 Б ...
72
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Neste caso, vale a precedência de operadores, ou seja, primeiro realizamos a multiplicação e somente
após a conclusão desta multiplicação, realizaremos a soma. Mais uma vez, não precisaremos de
separador, pois existe apenas uma variável a ser processada. Vamos ao passo-a-passo:
... Б ► 1 1 Б Б Б Б Б Б Б ...
... Б ► X X Б Б Б Б Б Б Б ...
... Б ► X 1 Б Б Б Б Б Б Б ...
... Б ► X 1 1 Б Б Б Б Б Б ...
... Б ► X 1 1 1 Б Б Б Б Б ...
... Б ► 1 1 1 1 Б Б Б Б Б ...
... Б ► 1 1 1 1 1 Б Б Б Б ...
... Б ► 1 1 1 1 1 1 Б Б Б ...
... Б ► 1 1 1 1 1 1 Б Б Б ...
... Б ► 1 1 1 1 1 1 1 Б Б ...
... Б ► 1 1 1 1 1 1 1 1 Б ...
... Б ► 1 1 1 1 1 1 1 1 Б ...
Importante Nas multiplicações, deve-se acrescentar ‘1s’ (uns) no final da fita. A quantidade de
uns é exatamente igual ao coeficiente de X – 1.
Importante Para acrescentar ‘1s’ no final da fita, deve-se saber a quantidade exata destes ‘1s’ e
declarar um estado para cada ‘1’ que se quer colocar, ou seja, caso queira colocar quatro ‘1s’ no final
da fita, deve declarar quatro estados diferentes para realizar esta tarefa, um estado para cada ‘1’ a ser
acrescentado.
Detalhamento: Os estados q0 e q1 possuem as mesmas funções do exemplo anterior, isto por que se
trata de uma multiplicação e a regra pode ser aplicada a todos os casos semelhantes. Como o
coeficiente de X é 3, devemos acrescentar dois elementos no final a fita (Lema 4), para isto
utilizaremos os estados q2 e q3 (Lema 5). Os estados q4 e q5 resolvem a soma da equação (neste
exemplo a soma é de dois elementos) acrescentando dois ‘1s’ no final da fita. Essa soma será iniciada
quando a multiplicação estiver resolvida, ou seja, quando o q1 encontrar o delimitador.
73
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Este exemplo é bastante similar ao anterior. Vamos verificar esta afirmação comparando a função de
cada estado de ambos os exemplos, mas antes, vamos verificar o passo-a-passo da máquina:
... Б ► 1 1 Б Б Б Б Б Б Б Б Б ...
... Б ► X X Б Б Б Б Б Б Б Б Б ...
... Б ► X 1 Б Б Б Б Б Б Б Б Б ...
... Б ► X 1 1 Б Б Б Б Б Б Б Б ...
... Б ► X 1 1 1 Б Б Б Б Б Б Б ...
... Б ► X 1 1 1 1 Б Б Б Б Б Б ...
... Б ► X 1 1 1 1 1 Б Б Б Б Б ...
... Б ► 1 1 1 1 1 1 Б Б Б Б Б ...
... Б ► 1 1 1 1 1 1 1 Б Б Б Б ...
... Б ► 1 1 1 1 1 1 1 1 Б Б Б ...
... Б ► 1 1 1 1 1 1 1 1 1 Б Б ...
... Б ► 1 1 1 1 1 1 1 1 1 1 Б ...
... Б ► 1 1 1 1 1 1 1 1 1 1 Б ...
... Б ► 1 1 1 1 1 1 1 1 1 Б Б ...
... Б ► 1 1 1 1 1 1 1 1 Б Б Б ...
... Б ► 1 1 1 1 1 1 1 Б Б Б Б ...
... Б ► 1 1 1 1 1 1 1 Б Б Б Б ...
74
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Com base neste passo-a-passo, podemos definir a função de cada estado da máquina.
Importante Para eliminar o último elemento, primeiro devemos localizá-lo e somente depois
eliminá-lo. Neste caso, usa-se um estado apenas para localizar e outro para eliminar. Um único estado
NÃO pode localizar e eliminar o último elemento ao mesmo tempo.
Importante Para subtrair ‘1s’ no final da fita, deve-se saber a quantidade exata destes ‘1s’ e
declarar um estado para cada ‘1’ que se quer eliminar, ou seja, caso queira eliminar quatro ‘1s’ no
final da fita, deve declarar quatro estados diferentes para realizar esta tarefa, um estado para cada ‘1’
a ser apagado. Este último lema é semelhante ao lema 5.
Detalhamento: Os estados q0 e q1 possuem as mesmas funções do exemplo anterior, isto por que se
trata de uma multiplicação e a regra pode ser aplicada a todos os casos semelhantes. Como o
coeficiente de X é 5, devemos acrescentar quatro elementos no final a fita (Lema 4), para isto serão
utilizados os estados q2, q3, q4 e q5 (Lema 5). O estado q6, serve apenas para localizar o último ‘1’
da fita (Lema 6) e os estados posteriores irão eliminar a quantidade de ‘1s’ necessária, neste exemplo
serão três elementos (– 3 da equação), portanto precisaremos dos estados q7, q8 e q9 (Lema 7). Vamos
à máquina de Turing deste exemplo, baseando-se nas funções de cada estado:
Q = q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10 ΣF 1 X ► Б
Σ=1 Q
S0 = q0 q0 q0, X, R q0, ►, R q1, Б, L
F = q10 q1 q1, 1, L q2, 1, R q6, ►, R
ΣF = 1, X, ►, Б q2 q2, 1, R q3, 1, R
R = q0, q1, q2, q3, q4, q5, q6, q7, q8, q9 q3 q4, 1, R
►=► q4 q5, 1, R
Б=Б q5 q1, 1, L
q6 q6, 1, R q7, Б, L
q7 q8, Б, L
q8 q9, Б, L
q9 q10, Б, P
q10
75
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Com o objetivo de aumentar a velocidade das Máquinas de Turing, algumas variações em sua
construção podem ser propostas. Vejamos as mais comuns:
8.1. Máquina de Turing com opção de permanência: Nesta variação, a máquina de Turing passa a
ter os seguintes movimentos: Direita (R), Esquerda (L), Parada (P) e Imobilidade (S), em relação ao
cabeçote de leitura, sendo que o ‘S’, representa uma mudança de estado e/ou gravação de elementos
na fita, sem a necessidade de movimentar o cabeçote ou finalizar a execução da máquina;
8.2. Máquina de Turing com fita semi-infinita: Neste caso, a fita, que é ilimitada em ambas as
direções na máquina de Turing padrão, passa a ter uma fita ilimitada somente à direita e a primeira
posição é o delimitado. Note que não houve redução no tamanho da fita;
8.3. Máquina de Turing Off-line: É uma Máquina de Turing com duas fitas, sendo uma fita de
entrada, onde fica a cadeia a ser testada, e onde a informação não pode ser alterada e a outra fita
onde são gravadas as modificações e a saída da execução da máquina;
76
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
8.4 Máquinas de Turing com fitas Múltiplas: É a máquina composta por duas ou mais fitas. Cada
fita possui seu próprio cabeçote de leitura, porém, todos os cabeçotes estão ligados a um mesmo
operador de estados (unidade de controle);
8.5. Máquinas de Turing Multidimensional (3D): É uma máquina que possui um único cabeçote
de leitura, ligado a um único operador de estados, com uma única fita, porém, a fita é infinita em
todas as direções 3D, ou seja, é ilimitada para a esquerda, para a direita, para cima, para baixo, para
frente e para trás, sendo que o cabeçote possui todos estes movimentos de máquina (R, L, U, D, F,
A);
8.7. Máquina de Turing Mista: É a máquina de Turing, composta por duas ou mais variações da
máquina de Turing padrão;
Atenção: Nenhuma variação da Máquina de Turing padrão aumenta o PODER da máquina, apenas
aumenta sua velocidade;
77
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Toda Máquina de Turing processa uma certa função computável parcial a partir de uma cadeia
formada pelos símbolos do alfabeto. Neste sentido, ela se comporta como um computador com um
programa fixo. No entanto, como Alan Turing descreveu, podemos codificar a função de transição de
qualquer máquina de Turing em uma cadeia de símbolos, como veremos no último tópico deste
capítulo. Portanto, podemos tentar construir uma máquina de Turing que espera em sua fita uma
cadeia descrevendo a funções de transição seguida por uma cadeia descrevendo a fita de entrada, e
então computa a fita que a máquina de Turing codificada teria computado.
Como Turing mostrou, tal máquina de Turing é de fato possível e, como é capaz de simular outras
máquinas de Turing, ela é chamada de máquina de Turing universal.
Com essa codificação de funções de transição como cadeias, torna-se possível, a princípio, que
máquinas de Turing respondam questões sobre o comportamento de outras máquinas de Turing.
Muitas dessas questões, no entanto, são indecidíveis, o que significa que a função em questão não
pode ser calculada por nenhuma máquina de Turing. Por exemplo, Turing mostrou em seu artigo
original que o problema de determinar se uma máquina de Turing em particular vai parar para uma
entrada dada (ou para qualquer entrada), conhecido como Problema da parada, é indecidível. O
teorema de Rice mostra que qualquer questão não-trivial sobre o comportamento ou saída de uma
máquina de Turing é indecidível.
Se expandirmos a definição para incluir qualquer máquina de Turing que simule algum modelo
computacional Turing-completo (e não apenas máquinas de Turing que simulam diretamente outras
máquinas de Turing), então uma máquina de Turing universal pode ser bem simples, usando apenas
alguns estados e alguns símbolos. Por exemplo, apenas 2 estados são necessários, uma vez que uma
máquina universal 2×18 (com 2 estados e 18 símbolos) é conhecida. Uma lista completa das menores
máquinas de Turing universais conhecidas é: 2×18, 3×10, 4×6, 5×5, 7×4, 10×3, 22×2. Elas simulam
um modelo computacional chamado tag systems.
Uma máquina de Turing universal é Turing-completa. Ela pode calcular qualquer função recursiva,
decidir qualquer linguagem recursiva e aceitar qualquer linguagem enumeravelmente recursiva. De
acordo com a tese de Church-Turing, os problemas solucionáveis por uma máquina de Turing
universal são exatamente aqueles problemas solucionáveis por um algoritmo ou um procedimento
efetivo de computação, para qualquer definição razoável destes termos.
78
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Como vimos anteriormente, qualquer computação realizada pelas máquinas mais modernas, pode ser
processada por uma Máquina de Turing padrão. Vejamos agora, como converter uma Máquina de
Turing padrão em uma sequência de números binários, provando definitivamente, que qualquer
algoritmo nada mais é do que uma sequência binária (energia sim – energia não) dentro do hardware.
Para que possamos realizar essa tarefa, vamos seguir os seguintes passos:
2.1 – Estados:
q0 = 0
q1 = 10
q2 = 110
q3 = 1110
q4 = 11110
q5 = 111110
...
qn = n-uns // 0
4 – Converter os comandos da máquina, em binário, usando a legenda, iniciando pela primeira coluna.
79
APOSTILA DE LINGUAGENS FORMAIS –MÁQUINAS DE TURING Prof. TENORIO
Q = q0, q1, q2 ΣF 0 1 ► Б
Σ = 0, 1 Q
S0 = q0 q0 q0, 0, R q0, 1, R q0, ►, R q1, Б, L
F = q2 q1 q2, 1, P q1, 0, L
ΣF = 0, 1, ►, Б q2
R = q0, q1
►=►
Б=Б
Passo 1:
Q = q0, q1, q2 ΣF 0 1 ► Б
Σ = 0, 1 Q
S0 = q0 q0 q0, 0, R q0, 1, R q0, ►, R q1, Б, L
F = q2 q1 q2, 1, P q1, 0, L q0, ►, P q0, Б, P
ΣF = 0, 1, ►, Б q2 q0, 0, P q0, 1, P q0, ►, P q0, Б, P
R = q0, q1
►=►
Б=Б
Passo 2:
Estados: Alfabeto de Fita Movimentos da Máquina:
q0 = 0 0=0 R = 110
q1 = 10 1 = 10 L = 1110
q2 = 110 ► = 110 P = 11110
Б = 1110
Passo 3: Existem três estados e quatro alfabetos de fita, em binário de 8 bits, esses números (3 e 4)
ficam assim:
00000011 e 00000100
Passo 4:
Resultado final:
00000011000001000011011010111100011110010110100111001011110011011001101111001101
1110101110111001110111100111011110
◄►
80
APOSTILA DE LINGUAGENS FORMAIS – APÊNDICES Prof. TENORIO
REFERÊNCIAS
Livros:
ACIÓLY, Benedito Melo e BEDREGAL, Benjamín René Callejas. Notas de Aula de Teoria da
Computação. UFRN – DIMAP, 1999.
DIVERIO, Tiarajú Asmuz e MENEZES, Paulo Blauth. Teoria da Computação. Sagra Luzzatto,
Porto alegre, 2000.
HOPCROFT John E.; MOTWANI, Rajeev e ULLMAN Jeffrey D. Introdução à Teoria dos
Autômatos, Linguagens e Computação. Campus, São Paulo, 2002.
MENEZES, Paulo Blauth. Linguagens Formais e Autômatos. Sagra Luzzatto, Porto alegre, 2002.
PENROSE, Roger. A Nova Mente do Rei: Computadores, Mentes e as Leis da Física. Campus,
Rio de Janeiro, 1993.
RAMOS, Marcus Vinícius Midena; JOSÉ NETO, João e VEGA, Ítalo Santiago. Linguagens
Formais. Bookman, Porto Alegre, 2009.
Apostilas de professores:
81
APOSTILA DE LINGUAGENS FORMAIS – APÊNDICES Prof. TENORIO
ANEXOS
1. TABELA ASCII
82
APOSTILA DE LINGUAGENS FORMAIS – APÊNDICES Prof. TENORIO
Cód Carac Cód Carac Cód Carac Cód Carac Cód Carac Cód Carac
32 <espaço> 33 ! 34 " 35 # 36 $ 37 %
38 & 39 ' 40 ( 41 ) 42 * 43 +
44 , 45 - 46 . 47 / 48 0 49 1
50 2 51 3 52 4 53 5 54 6 55 7
56 8 57 9 58 : 59 ; 60 < 61 =
62 > 63 ? 64 @ 65 A 66 B 67 C
68 D 69 E 70 F 71 G 72 H 73 I
74 J 75 K 76 L 77 M 78 N 79 O
80 P 81 Q 82 R 83 S 84 T 85 U
86 V 87 W 88 X 89 Y 90 Z 91 [
92 \ 93 ] 94 ^ 95 _ 96 ` 97 a
98 b 99 c 100 d 101 e 102 f 103 g
104 h 105 i 106 j 107 k 108 L 109 m
110 n 111 o 112 p 113 q 114 R 115 s
116 t 117 u 118 V 119 w 120 X 121 y
122 z 123 { 124 | 125 } 126 ~ 127 <delete>
128 Ç 129 ü 130 é 131 â 132 ä 133 à
134 å 135 ç 136 ê 137 ë 138 è 139 ï
140 î 141 ì 142 Ä 143 Å 144 É 145 æ
146 Æ 147 ô 148 ö 149 ò 150 û 151 ù
152 ÿ 153 Ö 154 Ü 155 ø 156 £ 157 Ø
158 × 159 ƒ 160 á 161 í 162 ó 163 ú
164 ñ 165 Ñ 166 ª 167 ° 168 ¿ 169 ®
170 ┐ 171 ½ 172 ¼ 173 ¡ 174 « 175 »
176 ░ 177 ▒ 178 ▓ 179 │ 180 ┤ 181 Á
182 Â 183 À 184 © 185 ╣ 186 ║ 187 ╗
188 ╝ 189 ¢ 190 ¥ 191 ┐ 192 └ 193 ┴
194 ┬ 195 ├ 196 ─ 197 ┼ 198 ã 199 Ã
200 ╚ 201 ╔ 202 ╩ 203 ╦ 204 ╠ 205 ═
206 ╬ 207 ¤ 208 δ 209 Ð 210 Ê 211 Ë
212 È 213 ¬ 214 Í 215 Î 216 Ï 217 ┘
218 ┌ 219 █ 220 ▄ 221 ¦ 222 Ì 223 ▀
224 Ó 225 β 226 Ô 227 Ò 228 õ 229 Õ
230 Μ 231 Þ 232 þ 233 Ú 234 Û 235 Ù
236 ý 237 Ý 238 ¯ 239 ´ 240 - 241 ±
242 ≡ 243 ¾ 244 ¶ 245 § 246 ÷ 247 ,
248 º 249 “ 250 . 251 ¹ 252 ³ 253 ²
254 ■ 255
83
APOSTILA DE LINGUAGENS FORMAIS – APÊNDICES Prof. TENORIO
2. OS MESTRES
Quem são os maiores contribuintes para a formulação da Teoria da Computação? Eis a resposta.
John Edward Hopcroft Peter Naur Avram Noam Chomsky Stephen Cole Kleene
07/10/1939 25/10/1928 07/12/1928 05/01/1909 – 25/01/1994
Andrei Andreyevich Markov David Hilbert Emil Leon Post Kurt Friedrich Gödel
04/05/1821 – 26/11/1894 23/01/1862 – 14/02/1943 11/02/1897 – 21/04/1954 28/04/1906 – 14/01/1978
84
APOSTILA DE LINGUAGENS FORMAIS – APÊNDICES Prof. TENORIO
85
APOSTILA DE LINGUAGENS FORMAIS – APÊNDICES Prof. TENORIO
Avaliação:
- Apresentação (Resposta precisa, rápida e correta): 3,0 Pontos
- Corretude: 2,0 Pontos
- Exercícios entregues: 1,0 Ponto
Desenvolvimento do Trabalho:
O exemplo abaixo é de um autômato que aceita todas as cadeias que iniciem em 10:
4
01
0
2
003
011
102
113
202
212
303
313
86
APOSTILA DE LINGUAGENS FORMAIS – APÊNDICES Prof. TENORIO
O aluno deve fazer um programa que leia um número binário a partir de um arquivo texto.
Transforme este número binário em uma Máquina de Turing seguindo as regras de conversão e
execute a Máquina de Turing mediante entradas digitadas pelo usuário do software durante sua
execução. O arquivo texto com um número binário qualquer será levado pelo professor e deverá
ser utilizado pelo programa. O programa NÃO deve ter uma Máquina de Turing em seu algoritmo,
já que o mesmo será gerado a partir do número binário lido do arquivo. ATENÇÃO: A FITA
BRANCA DEVE SER CONSIDERADA PELO SEU PROJETO.
Avaliação:
- Apresentação (Resposta precisa, rápida e correta): 3,0 Pontos
- Corretude: 2,0 Pontos
- Exercícios entregues: 1,0 Ponto
Exemplo de arquivo:
00011001000011011010111100011110010110100111001011110011011001101111001101111010
1110111001110111100111011110
Type
R register:
Est : integer; {Estados}
Alf : integer; {Alfabeto da fita}
MM: char; {Movimentos da Máquina}
End;
87
APOSTILA DE LINGUAGENS FORMAIS – APÊNDICES Prof. TENORIO
Begin
Abrir Arquivo;
For I := 0 to Qtdest – 1 do
For j := 0 to Qtdalf – 1 do
Begin
Valor := ‘’;
Repeat
Aux := lerum;
Valor := Concat (Valor, Aux)
Until Aux = 0;
Função [i,j].est := BinEst (valor);
Valor := ‘’;
Repeat
Aux := lerum;
Valor := Concat (Valor, Aux)
Until Aux = 0;
Função [i,j].alf := BinAlf (valor);
88
APOSTILA DE LINGUAGENS FORMAIS – APÊNDICES Prof. TENORIO
Valor := ‘’;
Repeat
Aux := lerum;
Valor := Concat (Valor, Aux)
Until Aux = 0;
Função [i,j].mm := Binmm (valor);
End;
End;
Inifita;
Write (‘Digite a fita:’);
Readln (FITA);
Estatual := 0;
AlfAtual := Delimitador;
Mmatual := R;
Pos := 1;
Case mmatual of
‘R’: Pos := pos +1;
‘L’: Pos := pos – 1;
End;
EstFinal := Qtdest – 1;
Write (FITA); { CUIDADO}
89
APOSTILA DE LINGUAGENS FORMAIS – APÊNDICES Prof. TENORIO
10000000010111010011010001001010101101000110100010100000110101001101000101
01001011010000110100010100101011010010011101001010010010111010100011101010
10010010101110101010011010001010001010110100000110100100000101011010001001
11010010100001010111010010001110100101010000101110100101001101000010000111
01010000111010100001001001110100010101010010101010111010000100111010010101
01010101011101000010101011101000010100010111010001010011010010000101001101
00101001001101001000101101010001011101001001010111010010100011101010010100
10011101010101000011010010101010111010100100010110101000010110101000100110
10101010100010110100101010010010110101001001011101010100101011101010010100
11010101000011101000100100101011101010100101011101010100000111010100100000
11010101010010111010100101011010001001000111010000000111010010100101010101
11010010100100101011101000001010111010000100011101000001010100111010000101
00111010000010001011101000100001110100001001010011101000100001011010001010
01011101000101001011010010000010110100010101001001101000101010101110100100
00011101001001010101011101010101001101001000101011010010010010110100000001
01101000001000110100000100101101000000000110100101000101110100101010001101
00101001010110100000100111010010101001011010010011101010000001010111010100
00001101010100010101011010010101011010100001010111010100100101011101010001
00101101010010000101110100000011101010010001011010100101001101010100010111
01010010100101110101010000010111010101000001011101000000101010101000010101
11010010101011010101000010111010100010101011101010100100101110101010100001
11010100000001110100100100001101001001000101101010101010011101000000001011
01001000011010101010100101110100100001101001000101010111010000100011101000
10000111010000110100000001011010000010010111010101001010101101000100010010
11101000001001110101010011010000010101011010000100001110100100001000111010
10101010100111010000100100111010001001000011101000010100101101000010100001
11010101010101011101000100100110100010010011010100101001011101110100010101
11010000000111010001001001011101001101001001000010110101010100110100010100
01011101000011010100001000101101010011010101001010010110101010011010010010
10111010011010010000010110100010101010001110100100001010110100000010011010
01000100101110100100001101010000010010111010010010100110100100101010110100
11010010010100101101001101001010000010110100100000111010100100110101010100
00101110100101000010111010010101010111010100010010110100100111010010101000
10111010001001110101000010110100100111010010101010101110100100011101001010
10100101110100100011101010000010101011100110101000001011010010011101010000
00101110100101101010000010101101001010010111010100001001011101000011010100
01000010110101001101010001000101101010101001011101010001010010110100010101
01011101001000010101101010001011101010010010101011101010100100101110101000
11101010001110101001001001011101010001110101001010001011101010001011101010
00010010111010100011101000101000101110100101001011101010010101001011101001
01010101010110101000010101010110100001001110100001010101010111010101000101
90
APOSTILA DE LINGUAGENS FORMAIS – APÊNDICES Prof. TENORIO
01110101010001010111010000001110101010001001011101000000111010101001000101
11010100000011010100001011010000001110100100000010111010100011101010010001
01011101010011010101010001010110100000110101010100101010110100000010011010
10101001001110101001101010101001001011010100110100100100111010000011010101
01010010101101010001001101000101001010101110100000110101010101010010110100
01000111010001010101010101101000100011101000010101110100010010000111010011
01000000010011101000000100101110100010001010011101000000100101110100101010
10100101101000010101010111010001001010010111010000010001011101010100101101
00010001001110100000100101011101000000101010110100001000111001111010000100
00011101000010010011101000001010010111010000010100101101000010001010111010
00010001001101000100001110101111010000100100101110100001001001011101000000
01010111010000101010001101000100101110100001000001110100001001110100010000
01011101010100101101000100000101110100001010101011101000000101010111010001
00001010111010001000010101110100100000111010100100100110100000010101110100
01000100101110101010000111010100101011010010101010000110100000101001110100
00001110100000100100111010010110100100010100101101010100110100010100100101
10101010011010001010100010110011010100100101110101010011010001010101010110
01101011001010101100110100100010101010111010001000111010010010101010101101
00101001010001101001000000101110100000110101010010101010110100101010100100
10001000101110100010101011010100000101011010001000001101001000101011010000
10011101010010101010101110100101101001001000101011001101001001001010101110
10011010010010010101101001011010010010010010110100101101001001010001011001
10100100101001010111010001010111010010010111001101001001010100101110011010
01010001010101110100010001110100001010010110100101000101110100101000101011
01000100111010010100010010111010001001110100101001000101110011010010001000
11101000100111010010100101010111001101001010000011100110101010101011010000
00011101001010100101010111010010001110100101010010101110011010000101001001
10011010100000110100000001110100101010100101011100110101000100001101000000
01110100010010101010111010001000111010101010101010101101000010011101001000
10010101110100101010001001101010000000101101001001110101000010101110100100
00110101000000010110100100011101010010010111010000110101000010101011010100
01011101010000101001011101010001011101010001010101011100110101000101011010
0001101010001001010
91