Você está na página 1de 9

SIMS: Um simulador de máquinas universais

Luiz Antonio Carraro1, Diego Gadens dos Santos2

Departamento de Ciência da Computação - Universidade Estadual do Centro-Oeste do


Paraná (UNICENTRO)
Caixa Postal 3010 – 85.015-430 – Guarapuava – PR – Brasil
lacarraro@gmail.com, diegogadens@gmail.com

Resumo. Este artigo descreve o funcionamento básico e a utilização de um


simulador de duas máquinas universais clássicas. Os conceitos abstratos que
envolvem as máquinas de computação são de difícil compreensão por
iniciantes na área, e a utilização de simuladores pode ser uma grande
ferramenta de apoio a este desafio.

Abstract. This paper describes the basic operation and use of two known
universal machines simulator. The abstract concepts involving the machinery
of computing are difficult to understand for beginners in the area, and the use
of simulators can be a great tool to support this challenge.

Palavras-chave: Máquina de Turing, simulador, multiplas fitas.

Keywords: Turing Machine, simulator, multiple tapes.

1. Introdução
As máquinas universais são modelos formais de computação que demonstram o
funcionamento básico dos computadores que conhecemos hoje, e, com elas é possível
resolver todos os problemas onde existe uma solução passível de ser computada, ou seja
podem resolver todos os problemas que qualquer computador é capaz de resolver.
Atualmente o modelo de máquina universal abstrata implementado pelos computadores
reais, é a máquina de Turing [TURING36]. A partir de sua versão inicial, proposta por
Alan Turing em 1936, várias modificações e/ou adições foram incluídas e testadas, a
fim de tentar obter um maior poder computacional para estas máquinas. Aumentar o
poder computacional de uma máquina de Turing, por exemplo, significa elevar sua
capacidade de resolução de problemas, torná-la capaz de gerar soluções ótimas para
problemas que até então não possuam solução. Apesar de muito estudo nesta área, até
hoje nenhuma das modificações e adições implantadas conseguiu acrescentar poder
computacional à máquina de Turing original, fornecendo apenas um melhor
entendimento na leitura de máquinas existentes bem como facilidade na construção de
máquinas novas.
Ao longo da história, outras máquinas universais foram propostas, porém a
máquina de Turing foi a que se sobressaiu devido à sua relativa simplicidade de
execução em relação à outras máquinas. Esta simplicidade está no fato de que um
mesmo problema poder ser resolvido mais facilmente, devido à utilização de estados.
Uma mesma tarefa pode então ser realizada em uma máquina de Turing com um
número menor de passos do que seria necessário em uma máquina de registradores,
conseqüentemente com uma menor complexidade.
A Teoria da Computação estuda os modelos de computação genéricos, assim
como os limites da computação, tentando responder questões relativas às capacidades de
um computador, independentemente de sua velocidade ou memória. Além disso, a
Teoria da Computação preocupa-se com o estudo do tempo de execução de soluções, as
quais podem requerer um período de tempo tão extenso, que acabem por tornar as
soluções impraticáveis.
As máquinas universais pertencem a um campo muito estudado pela Teoria da
Computação, este trabalho descreve a utilização de um simulador de máquinas
universais como ferramenta de apoio ao aprendizado dos conceitos envolvidos nesta
área.
Este artigo está organizado da seguinte forma: a seção 2 apresenta uma breve
apresentação das máquinas de Turing, seu funcionamento básico e algumas de suas
extensões. Nesta seção é também apresentada a máquina de registradores, que também é
uma máquina universal. As seções 3 e 4 são exclusivamente utilizadas para apresentar o
simulador destas duas máquinas universais, objetos deste trabalho. Por fim, a seção 5,
contém algumas conclusões e considerações finais.

2. As Máquinas Universais
As máquinas universais devem ser poderosas o suficiente para simular todo e qualquer
problema que as máquinas reais ou teóricas são capazes de resolver, e ser simples em
seu modo de operação para que suas funcionalidades possam ser estudadas ou
modificadas e conclusões possam ser feitas sobre suas características [DIVERIO03]. Os
modelos universais descritos por este trabalho são: Máquina de Turing e Máquina de
Registradores [LEWIS00].

2.1 Máquina de Turing


Uma máquina de Turing é constituída por um controle finito, uma fita de trabalho, e um
cabeçote (Figura 1) que pode ser usado para efetuar operações nesta fita [LEWIS00].
Existem algumas tentativas para aumentar o poder computacional da máquina de
Turing, porém, nenhuma delas mostrou eficácia, sendo assim, sua única vantagem seria
a facilidade na criação de uma máquina. Duas destas técnicas serão abordadas nesse
trabalho, a utilização de Múltiplas Fitas e a adição do Não-Determinismo.
Figura 1 – Exemplo de uma máquina de turing

2.1.1 Múltiplas Fitas


É possível criar máquinas de Turing com várias fitas (Figura 2). Cada uma dessas fitas
deverá estar ligada ao controle finito por meio do cabeçote correspondente, sendo assim,
a máquina poderá ler os símbolos presentes em cada cabeçote e, então, realizar as
operações necessárias, reescrevendo símbolos em cada fita e movendo os cabeçotes para
a esquerda ou direita.

Figura 2 – Máquina de Turing com Múltiplas Fitas

2.1.2 .ão-Determinismo
Uma Máquina de Turing Não-Determinística permite que mais de uma ação possa ser
feita a partir da um único símbolo em um determinado estado [WIKI08]. Isso faz com
que a máquina possua mais de um caminho possível para validar uma cadeia ou realizar
uma determinada tarefa, sendo assim, pode-se supor que, quando isso acontecer a
máquina se ramificará em cópias, onde cada uma levará a transições diferentes, e, se
uma dessas ramificações terminar em um estado de aceitação, a cadeia foi aceita pela
máquina.
Esta técnica, assim como a adição de várias fitas, não acrescenta poder
computacional à máquina, portanto, existindo uma máquina de Turing não-
determinística que aceita como entrada a gramática G, a mesma gramática deverá ser
aceita por uma máquina de Turing determinística. Dessa forma, pode-se concluir que
toda máquina de Turing não-determinística possui uma máquina de Turing
determinística correspondente.

Figura 3 – Ramificação de uma MT não-determinística [Fonte: ODU08]

2.2 Máquina de Registradores


A máquina de registradores, proposta por Richard Bird em 1976[UCP08], é um
formalismo mais recente em comparação com a máquina de Turing, sendo definida de
modo a lembrar a arquitetura básica dos computadores. A máquina de registradores
possui um número infinito de registradores que funcionam como memória e três
instruções sobre cada um destes registradores:
• Adição do valor um.
• Subtração do valor um.
• Teste se o valor armazenado é zero.
É impressionante, e muitas vezes difícil de acreditar, que a máquina de
registradores também é uma máquina universal. Com apenas estas três operações,
extremamente simples, pode-se resolver todos os problemas que um computador é
capaz de resolver, tendo a mesma capacidade que uma máquina de Turing, por exemplo.
Qualquer algoritmo que possa ser executado em um computador possui um equivalente,
escrito para a máquina de registradores e que produz os mesmos resultados.

3. O Simulador
O simulador SIMS(Sims is a Machine Simulator) foi desenvolvido por um grupo de
pesquisa em Ciência da Computação, no ano de 2004, na Universidade Cergy-Pontoise,
na França. O simulador foi escrito utilizando-se a linguagem Java, e está sobre a licença
GPL(General Public License).
No simulador(Figura 4) da máquina de Turing escolhido[SIMS08], existem 3
componentes, sendo o primeiro uma interface principal, onde é feita a entrada dos dados
referentes à máquina, como a definição da máquina, seus estados, alfabetos e regras de
transição. Além disso, conta também com alguns controles da simulação, como
velocidade de execução e passo-a-passo.
Uma máquina é um programa de computador, e portanto tem uma linguagem
que a descreve. As extensões dos arquivos são “.tur” para as máquinas de Turing e
“.reg” para as máquinas de registradores. Não é permitido carregar um arquivo que não
possua uma dessas extensões. As maquinas devem ser arquivos de texto puro, e é
recomendado o uso da codificação ISO-88591-1.
O arquivo de uma máquina pode ser dividido em duas partes:
• Diretivas: no topo do arquivo, antes de qualquer instrução. Diretivas são
especificas para cada maquina e deverá ser da forma #<nome da
diretiva> = <valor da diretiva>
• Instruções: o programa em si. Cada maquina possui sua própria sintaxe
de instruções.

Figura 4 - Visualização geral do simulador.

4. Utilização
Esta seção descreve brevemente como utilizar o simulador, com alguns exemplos para
ilustrar o processo.
4.1 Criando uma Máquina de Turing
Para criar uma máquina de Turing no simulador SIMS, algumas diretivas são
necessárias. Os valores utilizados para o alfabeto são do tipo string, e devem estar entre
aspas duplas e sem separação por vírgula, ou espaço. Ex.: #alphabet = "01".
Os estados da máquina só podem ser definidos utilizando caracteres
alfanuméricos. Ou seja, não é possível utilizar caracteres especiais como @, #, $, %, etc.
Ex.: q0, e1, t2.
 #nbBandes = inteiro: Numero de fitas da máquina. Parâmetro requerido. Ex.:
#nbBandes = 3
 #alphabet = string: Alfabeto da máquina, especificado sem utilizar espaços em
branco. Parâmetro requirido. Observação: O símbolo "Branco" é sempre incluído
no alfabeto, portanto você não precisa incluí-lo na declaração.
 #alphabet = integer, string : Alfabeto específico de uma fita, neste caso a fita
representada pelo inteiro que é o primeiro parâmetro. Observação: As fitas são
numeradas de 0 a n-1.
 #bande = string: Conteúdo inicial da fita 0 (zero), ou ainda, a cadeia de entrada.
 #vitesse = integer : Velocidade da simulação, variando de um a cinco.
 #stop = string, ..., string: Estado de pausa, existe apenas na simulação
computacional, serve para realizar alguma verificação, ou apenas pausar a
máquina por algum determinado período de tempo.
 #accepte = string, ..., string: Conjunto dos estados de aceitação, podendo conter
um ou mais estados válidos. Se o número de estados aceitos for maior do que
um, eles devem ser separados por vírgula.
 #rejette = string, ..., string : Conjuntos dos estados de não-aceitação, ou
estados de erro, podendo conter um ou mais estados de erro. Se o número de
estados for maior do que um, eles devem ser separados por vírgula.
 #nom = string: Nome da máquina.
 #init = string : Estado inicial da máquina
 #nd = yes | no : yes se a máquina for não-determinística, no caso contrário (o
valor padrão é de uma máquina determinística, ou seja #nd = no).
 #prob = yes | no : yes se a máquina for probabilística (conseqüentemente é
também não-determinística, porém o parâmetro #nd não é requerido neste caso).
 #gravity = yes | no : yes se a máquina for gravitacional (conseqüentemente é
também probabilística, porém o parâmetro #prob não é requerido neste caso).
As regras de transições também possuem um padrão que deve ser seguido para a
sua criação. Por exemplo, se a máquina tiver pelo menos duas fitas, o modelo de regra é
mostrado na Figura 5.
(estado1,t_1,r_1,w_1,s_1,...,t_n,r_n,w_n,s_n,estado2)

Figura 5 – Exemplo de regra de transição

Isso significa que se o estado corrente for o estado1, para qualquer i variando de
1 até n, o caractere r_i é lido na fita t_i, então a máquina escreve o símbolo w_i e faz o
movimento s_i. O movimento pode ser especificado pela letra L, N ou R
respectivamente esquerda, nenhum ou direita. Os campos r_i e w_i podem ser quaisquer
símbolos do alfabeto, incluindo o caractere “Branco” que não precisa ser representado,
sendo o mesmo apenas a ausência de um símbolo. O caractere genérico * pode ser usado
para fazer o casamento entre qualquer símbolo do alfabeto. Se * é uma instrução como
leitura e gravação de um símbolo, o símbolo escrito na fita será o mesmo lido.
A Figura 6 mostra um exemplo das diretivas e transições de uma máquina de
Turing, com multiplas fitas, que reconhece as cadeias do tipo wcwr, onde w = (0*1*)+

/*Máquina de Turing*/
#nom = "Exemplo"
#alphabet = "01c"
#nbBandes = 2
#accepte = q2
#init = "q0"
#vitesse = 3
#bande = "011100c001110"
(q0,0,0,0,R,1, ,0,R,q0)
(q0,0,1,1,R,1, ,1,R,q0)
(q0,0,c,c,R,1, , ,L,q1)
(q1,0,1,1,R,1,1,1,L,q1)
(q1,0,0,0,R,1,0,0,L,q1)
(q1,0, , ,N,1, , ,N,q2)

Figura 6 – Exemplo de uma máquina de Turing, para o SIMS

4.2 Criando uma Máquina de Registradores


Na máquina de registradores, as diretivas #vitesse, #stop e #nom possuem o mesmo
significado que para máquina de Turing. A única nova diretiva é:
• Ri = x : Onde i é um número inteiro representando o rótulo do registrador e x é o
valor inicial.
As instruções afetam os registradores através do rótulo i de cada registrador, cada
um destes rótulos, é criado como se fosse um desvio de fluxo, ou chamada de função.
As instruções são:
• rótulo: : Define um desvio de fluxo, semelhante a uma chamada de função.
• inc id [rótulo] : Incrementa o registrador que possui a id localizada após o
parâmetro inc. O fluxo de execução é então desviado para a linha indicada pelo
parâmetro rótulo, ou simplesmente desviado para a próxima instrução se este
parâmetro for omitido.
• dec id [rótulo_0] [rótulo_p] : Se o registrador indicado pelo parâmetro id estiver
vazio, é realizado um desvio de fluxo para o rótulo indicado por rótulo_0, ou
simplesmente desviado para a próxima linha se o parâmetro rótulo_0 for
omitido. Se o registrador não estiver vazio, ele é então decrementado e o fluxo é
desviado para o rótulo indicado por rótulo_p, ou para a próxima linha se
omitido.

5. Conclusões
Com a realização deste trabalho algumas conclusões podem ser retiradas a respeito do
estudo das máquinas universais. Primeiramente, nota-se que a utilização de um
simulador pode fornecer um grande auxílio no aprendizado da Teoria da Computação,
uma vez que os conceitos abstratos que envolvem o funcionamento das máquinas
universais são, muitas vezes, difíceis de serem compreendidos pelos estudantes iniciais
da área. Portanto, o simulador fornece uma maior clareza no funcionamento desta
máquina, e por conseqüência, uma maior facilidade no aprendizado. Além disso, é
interessante mostrar aos estudantes o funcionamento mais básico por trás de um
computador, evidenciando que mesmo com um pequeno conjunto de regras simples, é
possível realizar tarefas grandes e complexas.
Outro aspecto muito importante é o de confirmar, que até os dias de hoje,
nenhuma das adições feitas à Máquina de Turing conseguiu aumentar seu poder
computacional. Mesmo com muito estudo nessa área, não foi possível encontrar nada
que supere o poder computacional desta máquina. Portanto, evidencia-se que a máquina
de Turing é suficiente para resolver todos os problemas que um sistema de computação
tem a capacidade de resolver, bem como implica a ele as mesmas limitações.

Referencias
[DIVERIO03] DIVERIO, T. A; MENEZES, P. B. Teoria da Computação. 2 ed. Porto
Alegre: Sagra Luzzatto, 2003.
[LEWIS00] LEWIS, HARRY R. Elementos de Teoria da Computação. 2ª ed. Porto
Alegre: Bookman, 2000.
[WIKI08] Turing Machine, acessado em 4 de julho de 2008, disponível em
http://en.wikipedia.org/wiki/Turing_machine
[ODU08] Old Dominion University, Department of Computer Science,
acessado em 17 de junho de 2008, disponível em
http://www.cs.odu.edu/~toida/nerzic/390teched/tm/othertms.html
[TURING36] TURING, M. Alan, On Computable Numbers, With An Application To
The Entscheidungsproblem, acessado em 28 de junho, disponível em
http://web2.comlab.ox.ac.uk/oucl/research/areas/ieg/e-library/sources/tp2-ie.pdf
[SIMS08] Turing and register machine simulator, acessado em 28 de maio de 2008,
disponível em http://www.131002.net/data/code/sims/

[UCP08] PALAZZO, Luiz A. M., Teoria da Computação – Universidade Católica de


Pelotas, acessado em 3 de julho de 2008, disponível em
http://ia.ucpel.tche.br/~lpalazzo/Aulas/TC/

Você também pode gostar