You are on page 1of 14

UNIVERSIDADE FEDERAL DE SERGIPE

DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO


SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO

AUTÔMATO FINITO NÃO DETERMINÍSTICO - AFND

Prof. Dr. Alcides Xavier Benicasa1 < alcides@ufs.br>


Gilmario dos Santos Silva2 <gilmariosantos1@gmail.com>
Gabriel Santana Cruz2 <gabriel.sistemasjr@gmail.com>
Igor Bruno dos S. Nascimento2 <igorb22@live.com>
Magda Tainy Nunes Amaral2 <barbie-12-girl@hotmail.com>

RESUMO

Neste artigo, está sendo detalhado o desenvolvimento das as


funcionalidades de um Autômato Finito Não Determinístico para o
usuário verifique se um determinado alfabeto é válido ou não. Foi
desenvolvido uma aplicação em linguagem java com o objetivo de
fazer uma demonstração da aplicação do conteúdo aplicado em sala
de aula.

PALAVRAS-CHAVES: Autômato, Desenvolvimento, linguagem,


alfabeto, Linguagem Java e Aplicação.

ABSTRACT:

Title: “DETERMINISTIC FINITE AUTOMATION- AFN”

In this article, the development of the functionalities of a Non-


Deterministic Finite Automaton is being detailed for the user to verify
if a given alphabet is valid or not. An application was developed in
Java language with the purpose of demonstrating the application of
the content applied in the classroom.

KEYWORDS: Automata, Development, Language, Alphabet, Java


Language and Application.

Professor e orientador do Projeto II da disciplina Teoria da Computação


2Discentes da disciplina Teoria da Computação
UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO

1 INTRODUÇÃO

Ao apresentar este Projeto, procura-se demonstrar o


entendimento do conteúdo aplicado em sala de aula, ou pelo menos
parte dele, neste caso o AFND que é uma parte de um todo, à
Disciplina de Teoria da Computação.
Atualmente as pessoas que utilizam em seus dia-a-dia
diversos objetos que em sua essência só foi possível ser produzido
graças a Teoria da Computação, seja uma simples porta automática
de um shopping a uma aeronave, existe na base um conceito de
Autômato para dar sustentação a toda uma complexidade de
ferramentas gerenciáveis.
Para fazer uma demonstração de maneira conceitual, foi
desenvolvido um autômato para mostrar de maneira básica como é o
comportamento da utilização da Teoria da Computação para
desenvolver linguagem ou reconhecer linguagem/alfabeto.
As possibilidades de utilização são bem diversificadas, nosso
estudo de caso foi para desenvolver um Software no qual pode
validar algumas entradas, ou seja, reconhecer um alfabeto. O
programa foi desenvolvido em linguagem Java.

2 DESENVOLVIMENTO DO AUTÔMATO

O autômato é uma máquina complexa e de difícil


compreensão para a maioria das pessoas, mesmo quem está em um
curso de computação, esta tarefa é árdua, o desenvolvimento do
Autômato envolve conceitos abstratos e muitas vezes parecem serem
incompreensíveis. Mas sua complexidade não impede de desenvolver
máquinas ou software baseados nos princípios de autômatos, no caso
do Autômato Finito Não Determinístico, sua aplicação depende da
solução do problema que a pessoa quer resolver.
O entendimento do autômato exige análise das
possibilidades de resolução de problemas, o AFND tem como
característica uma quíntupla, pode ter vários estados de aceitação,
nele também é possível ter uma transição vazia, desta forma ele
aceita a mudança de estados sem consumir nenhum alfabeto.
UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO
A característica mais marcante do AFND está na
indeterminação, mesmo ele utilizando o estado atual e ler um símbolo
para se dirigir para o próximo estado, neste momento o próximo
estado não depende apenas da ocorrência atual, depende de vários
eventos ocorridos posteriores, sendo assim, não se pode determinar
onde a máquina de estado está até que ocorram todos os eventos, ou
seja, os símbolos sejam lidos, desta forma ele chega ao estado de
aceitação, ou, se o AFND através do caminho de transições não
chegar ao estado final ou aceitação, a cadeia é rejeitada.
Quando a máquina está num dado estado e lê o próximo
símbolo de entrada, sabemos qual será o próximo passo, é
determinado. Chamamos isso de computação determinística.
Numa máquina não determinística, várias escolhas podem
existir para o próximo estado em qualquer ponto.
SIPSER(2006, pag. 47). Tradução(Fernando Félix)

2.1 Linguagem Java

A história começa em 1991, em San Hill Road empresa


filiada a Sun (da qual hoje pertence a empresa Oracle), formado pelo
time de engenheiros lliderados por Patrick Naugthon, Sun Fellow e
James Gosling.

A linguagem de programação chamada de Oak (carvalho) foi


criada pelo chefe do projeto James Gosling. A explicação da origem do
nome foi que enquanto pensava numa estrutura de diretórios para a
linguagem, observava pela janela um carvalho. Mas esse nome já
estava registrado, então o nome acabou surgindo na cafeteria local
da cidade onde tomavam café. “Java”, pois era o nome da terra de
origem do café, que os programadores da equipe apreciavam nessa
cafeteria, por isso que a logo do Java é um café.

Dentro das características, o principal item é o fator da


“Independência de plataforma”. Hoje a maioria das linguagens sofrem
na transferência de plataforma quando o sistema desenvolvido tem
que migrar para outra plataforma, pois quando compilado um
programa a ação do compilador é transformar o arquivo-fonte em
código de máquina.
UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO

3 SOBRE O PROJETO

A aplicação foi desenvolvida para validar cadeias de


caracteres sobre autômatos finitos não-determinísticos (AFND) na
linguagem de programação JAVA, tendo em sua estrutura principal os
pacotes modelsProjectTC e viewsProjectTC. O pacote modelsProjectTC
contém as classes Autômato, Estado, GeradorArquivo, Processador e
Transição que fazem todo o processo de construção dos autômatos e
de validação das strings informadas. Já o pacote viewsProjectTC
contém as interfaces ViewRun, ViewDefinirTransição, ViewValidar,
ViewCheckEstados que fazem todo o procedimento de interação com
o usuário.

3.1 Configurando o Autômato

Ao executar o sistema, aparecerá a interface para informar


os estados e alfabeto necessários para criar o autômato.

Figura 1 – Interface Inicial

No primeiro campo serão informados os estados do


autômato separados por vírgula, no segundo campo deverá ser
UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO
informado ao simulador o alfabeto, os símbolos também deverão ser
separados por vírgula, além de colocar $ caso haja transição vazia.
Nessa tela, os estados e o alfabeto informado serão armazenados em
ArrayList’s e passados para a próxima interface para que as
transições possam ser configuradas

Figura 1.1 – trecho de código que Armazena os estados e o Alfabeto

3.2 Configurar Estados

Após informar o alfabeto e os estados será possível indicar


o(s) estado(s) final(is) e o estado inicial do autômato. Os estados
finais poderão ser marcados na caixa ao lado, já o estado inicial pode
ser indicado escrevendo-o na caixa acima.
UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO

Figura 2 – Configurando Estados

3.3 Definir Transições

Com os estados finais e inicial definidos, deve-se construir


as transições do autômato. Cada transição deve ser feita entre dois
estados e um símbolo do alfabeto, primeiro selecionamos um estado
de saída (Estado Atual, o primeiro será o inicial), logo depois o estado
de chegada (Vai Para) e o símbolo consumido(Consumo) e clicar em
ADICIONAR LINHAS, devemos fazer isso até configurar todos as
transições, até que na última transição a estado de chegada seja o
final.
UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO
Figura 3 – Configurando Transições

Neste trecho são capturadas as transições (estadoAtual,


estadoDestino, consumo), e adicionadas em um novo ArrayList
ListTransicoes por meio do método Transicao, figura 3.2.

Figura 3.1 - Trecho do código que armazena as transições

Terminado de adicionar as transições o autômato pode ser


de fato criado, note que na linha 219 um Objeto do tipo Automato é
criado e instanciado com a seguinte lista de parâmetros: lista de
estados, todas as transições, estado inicial, estado final e o alfabeto,
figura 4.2. Note que a quíntupla que define o autômato finito não
determinístico está completa A = (Q, Σ, δ, q0, F).

Figura 3.2 – Método que armazena a transição informada


UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO

Figura 3.3 – Construtor que cria o autômato

3.3.2 Excluir Linha

Figura 4 – Excluindo transição

Para excluir uma transição indesejada basta clicar em cima


da linha que deseja excluir e clicar no botão Remover Linhas e sua
linha será removida da lista de transições, veja o resultado na figura
abaixo.

Figura 4.1 – Excluindo transição


UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO
3.4 Continuar

Ao clicar neste botão surgirá uma nova janela. Nesta


janela será possível informar as strings a serem verificadas pelo
autômato.

3.4.1 Adicionar Linha

Para que o autômato faça a validação de alguma string o


usuário deve clicar em adicionar linha, e logo abaixo do campo
Palavra, no primeiro espaço vazio deve-se dá dois clicks para que o
campo fique disponível para inserção do texto, neste caso a string a
ser verificada.

Figura 5 – Adicionando Nova Linha

3.4.2 Validar

Ao clicar no botão validar, o simulador faz as operações


necessárias dentro da configuração do autômato e informa ao usuário
se a string informada é ou não aceita pela linguagem.
UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO

Figura 6 – Informando palavras

A validação das palavras é feita por meio da classe


processador que contém métodos como processador (Construtor
customizado), processaPalavra e valida que é um método recursivo.

Figura 6.1 – Método valida().


UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO
Este método compara cada caractere da palavra informada
verificando se está contida no alfabeto do autômato, caso contenha,
cria-se um ArrayList de estados para receber a transição do símbolo
atual por meio do método proximasTransicoes (char c) e percorre
o ArrayList de estados verificando se existem transições com o
símbolo e o estado atual. Repetindo este procedimento até que toda
a palavra seja consumida, se ao final da palavra estado atual for um
estado final, a palavra é válida.

Figura 6.2 – Método que verifica se há transições com o símbolo atual.

3.4.3 Salvar Autômato

Essa opção nos permite guardar nossos autômatos para que


possamos usa-los novamente em outras plataformas como por
exemplo no JFLAP, já que o arquivo é salvo no formato .jff. O arquivo
salvo ficará na pasta arquivosExportados.
UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO

Figura 7 – Salvando Autômato

3.4.4 Novo Autômato

Para iniciarmos outro autômato basta clicarmos no botão


NOVO AUTOMATO. A aplicação irá lhe perguntar se quer salvar o
autômato, responda com sim, não ou cancele a operação se preferir,
e a tela inicial irá se abrir e poderá começar todo o processo
novamente.
UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO

Figura 8 – Reiniciando o simulador

Figura 8.1 – Simulador Reiniciado.

4 CONCLUSÃO
UNIVERSIDADE FEDERAL DE SERGIPE
DEPARTAMENTO DE SISTEMA DE INFORMAÇÃO
SISTEMAS DE INFORMAÇÃO – CAMPUS ITABAIANA
TEORIA DA COMPUTAÇÃO
Este trabalho demonstrou o funcionamento de um Sistema
Simulador de Autômato Finito Não Determinístico - AFND. Trabalho
realizado para os alunos praticarem o conhecimento aprendido em
sala de aula. Ao executar esta tarefa, foram utilizados os conceitos de
AFND, portanto, a contribuição para a formação dos discentes do
Curso Sistemas de Informação foi muito importante, já que a
disciplina Teoria da Computação é pré-requisito para a formação do
aluno.

5 REFERÊNCIAS

SIPSER, Michael. Intruducion to the Theory of Computation(second


edition). Thomson Learning, 2006.

Autômatos Finitos não Determinísticos (AFN) e


Determinísticos (AFD) Disponível em: <
http://www.dsc.ufcg.edu.br/~pet/jornal/junho2014/materias/recapitula
ndo.html> . Acesso em 24 de fevereiro de 2018.

Autômatos finitos não-determiníısticos IBM1088 Linguagens


Formais e Teoria da Computação.Disponível em: <
https://edisciplinas.usp.br/pluginfile.php/1893261/mod_resource/conte
nt/2/afn.pdf > . Acesso em 24 de fevereiro de 2018.

Teoria da Computação. Disponível em: <


https://www.devmedia.com.br/java-historia-e-principais-
conceitos/25178> . Acesso em 03 de março de 2018.

Java: história e principais conceitos. Disponível em: <


https://www.devmedia.com.br/java-historia-e-principais-
conceitos/25178> . Acesso em 03 de março de 2018.

Teoria da Computação. Disponível em: <


http://www.dainf.ct.utfpr.edu.br/~fabro/LFA/TeoriaComputacaoNovo.p
df> . Acesso em 04 de março de 2018.

BENICASA, Alcides Xavier. Notas de Aula: Estrutura de Dados I, UFS,


2017.2.

You might also like