Documentação Completa do Simulador URM

Máquina de Registradores Ilimitados - Teoria e Implementação

Introdução

A Máquina de Registradores Ilimitados (Unlimited Register Machine - URM) é um modelo computacional teórico proposto por Shepherdson e Sturgis em 1963. Ela pertence à classe das máquinas de registradores, que são equivalentes em poder computacional à Máquina de Turing.

Definição Formal: A URM é uma máquina abstrata que opera sobre uma sequência infinita de registradores (R1, R2, R3, ...), cada um capaz de armazenar um número natural (incluindo zero). A máquina executa um programa consistindo de uma sequência finita de instruções que manipulam os valores nesses registradores.

Este simulador foi desenvolvido com os seguintes objetivos:

  • Proporcionar uma ferramenta educacional para o ensino de teoria da computação
  • Demonstrar a execução de algoritmos em um modelo computacional fundamental
  • Facilitar a compreensão de conceitos como computabilidade e complexidade
  • Servir como plataforma para experimentação com programas URM

Teoria da Máquina URM

Contexto Histórico

A URM foi desenvolvida como uma alternativa mais simples à Máquina de Turing, mas igualmente poderosa em termos de capacidade computacional. Ela surgiu no contexto da teoria da computabilidade, que busca entender os limites fundamentais da computação.

Teorema de Equivalência: Shepherdson e Sturgis provaram em 1963 que qualquer função computável por uma Máquina de Turing também é computável por uma URM, e vice-versa.

Fundamentos Teóricos

A URM opera baseada em quatro operações fundamentais:

  1. Atribuição de zero a um registrador
  2. Incremento de um registrador
  3. Cópia entre registradores
  4. Salto condicional com base na igualdade de registradores

Estas operações, embora simples, são suficientes para implementar qualquer algoritmo computável, conforme estabelecido pela Tese de Church-Turing.

Tese de Church-Turing: Qualquer função que possa ser calculada por um algoritmo eficiente pode ser calculada por uma Máquina de Turing (ou equivalentemente, por uma URM).

Arquitetura da URM

Componentes Fundamentais

Memória

Sequência infinita de registradores (R1, R2, R3, ...), cada um armazenando um número natural ≥ 0.

Propriedade: Acesso direto por índice

Unidade de Controle

Executa instruções sequencialmente, mantendo o estado atual da máquina.

Componentes:

  • Contador de Programa (PC)
  • Registrador de Instrução Actual

Programa

Sequência finita de instruções indexadas (I1, I2, I3, ..., In).

Formato: Cada instrução é uma tupla (operação, operandos)

Fluxo de Execução

O ciclo de execução da URM segue os seguintes passos:

  1. Inicialização:
    • Registradores são definidos com valores iniciais
    • Contador de Programa (PC) é definido como 1
  2. Busca:
    • Instrução na posição PC é carregada
  3. Decodificação:
    • A instrução é interpretada
  4. Execução:
    • A operação é realizada nos registradores especificados
    • PC é actualizado (incrementado ou definido para um novo valor)
  5. Terminação: Ocorre quando PC aponta para uma posição fora do programa
Fluxo de execução da URM
Figura 1: Fluxo básico de execução da Máquina URM

Conjunto de Instruções

Especificação Formal

Instrução Sintaxe Semântica Descrição Formal
Zero Z(n) Rn ← 0 Define o registrador n como zero
Sucessor S(n) Rn ← Rn + 1 Incrementa o valor no registrador n
Transferência T(m,n) Rn ← Rm Copia valor de Rm para Rn
Salto J(m,n,p) PC ← (Rm = Rn) ? p : PC+1 Salta para instrução p se Rm = Rn

Nota: O salto condicional (J) é a única instrução que altera o fluxo sequencial de execução, permitindo implementar estruturas de controle como loops e condicionais.

Propriedades de Computabilidade

O conjunto de instruções da URM é Turing-completo, o que significa que pode simular qualquer Máquina de Turing e, portanto, computar qualquer função computável.

Esta completude é alcançada através da combinação das quatro instruções básicas, que permitem:

  • Implementação de operações aritméticas básicas
  • Controle de fluxo condicional e incondicional
  • Manipulação de dados em memória
  • Implementação de loops e recursão

Teorema da Turing-Completude: Qualquer função computável por um algoritmo pode ser implementada usando apenas as quatro instruções básicas da URM.

Poder Computacional

Hierarquia de Computabilidade

A URM ocupa um lugar fundamental na hierarquia de modelos computacionais:

Hierarquia de modelos computacionais
Figura 2: Posição da URM na hierarquia de modelos computacionais

Limitações Práticas

Apesar de seu poder teórico ilimitado, implementações práticas da URM possuem restrições:

  • Limite de registradores: Implementações reais usam um número finito
  • Limite de valores: Restrições de tamanho numérico devido a limitações de hardware
  • Detecção de loops infinitos: Problema indecidível na teoria, mas detectável pragmaticamente

O simulador implementa limites práticos para prevenir travamentos: máximo de 1000 registradores e 10.000 passos de execução.

Manual do Simulador

Arquitetura do Sistema

O simulador foi implementado usando uma arquitectura em três camadas:

Camada Lógica (URM.js)

Implementação fiel da especificação URM

  • Interpretador de instruções
  • Gerenciamento de registradores
  • Controle de fluxo de execução

Camada de Apresentação (App.js)

Interface entre a lógica e a interface do usuário

  • Manipulação de eventos
  • Atualização da interface
  • Gerenciamento de estado

Camada de Interface (HTML/CSS)

Interface gráfica do usuário

  • Editor de código
  • Visualização de registradores
  • Histórico de execução

Fluxo de Trabalho

Para utilizar eficientemente o simulador, siga este fluxo:

  1. Edição:
    • Insira instruções no editor ou selecione um exemplo
    • Defina valores iniciais para os registradores
  2. Compilação:
    • Clique em "Compilar" para preparar a execução
    • Verifique erros de sintaxe
  3. Execução:
    • Use "Passo a Passo" para execução didática
    • Use "Executar Tudo" para resultados rápidos
    • Monitore registradores e histórico
  4. Análise:
    • Revise o histórico de execução
    • Verifique valores finais dos registradores
    • Identifique possíveis erros lógicos

Recursos Avançados

  • Histórico de Execução: Registro completo de cada passo com estado dos registradores
  • Limite de Segurança: Detecção automática de loops infinitos
  • Exemplos Pedagógicos: Programas pré-implementados para funções computáveis
  • Responsividade: Interface adaptável a diferentes dispositivos

Exemplos de Programas

Adição (R2 + R3 → R1)

I1: J(3,2,5)  // Se R3 = R2, salta para I5 (fim)
I2: S(1)       // Incrementa R1 (resultado)
I3: S(3)       // Incrementa R3 (contador)
I4: J(1,1,1)   // Salta incondicionalmente para I1

Análise de Complexidade: O algoritmo executa em tempo O(n), onde n é o valor em R2.

Correção do Algoritmo: A cada iteração, R1 é incrementado e R3 é incrementado até igualar R2, resultando em R1 = R2 no final.

Multiplicação (R2 * R3 → R1)

I1: Z(4)      // Contador externo = 0
I2: J(3,4,9)  // Se R3 = R4, salta para I9 (fim)
I3: Z(5)      // Contador interno = 0
I4: J(2,5,8)  // Se R2 = R5, salta para I8
I5: S(1)      // Incrementa resultado
I6: S(5)      // Incrementa contador interno
I7: J(1,1,4)  // Volta para I4
I8: S(4)      // Incrementa contador externo
I9: J(1,1,2)  // Volta para I2

Análise de Complexidade: O algoritmo executa em tempo O(m*n), onde m é R3 e n é R2.

Fatorial (R2! → R1)

I1: T(2,3)    // Copia R2 para R3 (contador)
I2: S(1)      // R1 = 1 (inicializa resultado)
I3: J(3,1,9)  // Se contador = 1, salta para I9 (fim)
I4: T(1,4)    // Salva valor atual de R1 em R4
I5: Z(1)      // Zera R1 para multiplicação
I6: J(4,5,9)  // Se R4 = R5 (sempre falso), salta para I9
I7: S(1)      // Adiciona R3 ao resultado (R1 += R3)
I8: S(5)      // Incrementa contador de multiplicação
I9: J(5,4,12) // Se contador = valor original, termina multiplicação
I10: J(1,1,6) // Continua multiplicação
I11: Z(5)     // Reseta contador de multiplicação
I12: S(3, -1) // Decrementa contador principal (pseudo)
I13: J(1,1,3) // Volta para I3

Nota: A instrução I12 (S(3,-1)) é uma pseudo-instrução. Na implementação real, o decremento deve ser simulado usando outras operações.

Apêndice: Referências

Bibliografia Fundamental

  • CUTLAND, N. Computability: An Introduction to Recursive Function Theory. Cambridge University Press, 1980.
  • HOPCROFT, J. E.; ULLMAN, J. D. Introduction to Automata Theory, Languages, and Computation. Addison-Wesley, 1979.

Sobre esta Implementação

Este simulador foi desenvolvido com fins exclusivamente educacionais, utilizando as seguintes tecnologias:

  • JavaScript (ECMAScript 2022)
  • HTML5
  • CSS3
  • Font Awesome para ícones

Licença: Este software é disponibilizado sob licença MIT. O código-fonte completo está disponível no repositório do projeto.
Código-fonte disponível no repositório do projeto.

Equipe de Desenvolvimento

Alfredo Fernando Baptista

Constantino Manuel Domingos Gola

Manuel Samuel Fuxi

Soares José Marques