Na computação reversível, os códigos variam conforme a linguagem de programação, mas todos seguem o princípio de preservar o estado inicial para permitir a reversão das operações. Aqui estão exemplos em algumas linguagens populares:
1. Python
Python não é nativamente reversível, mas podemos simular a reversibilidade usando estruturas como pilhas para armazenar estados:
# Pilha para armazenar estados
stack = []
# Função reversível para adicionar números
def add_reversible(a, b):
stack.append((a, b)) # Salva o estado inicial
return a + b
# Função para desfazer a operação
def undo_add():
if stack:
a, b = stack.pop()
return a, b
# Uso do código
resultado = add_reversible(5, 3)
print("Resultado:", resultado) # Saída: 8
a, b = undo_add()
print("Desfeito:", a, b) # Saída: 5, 3
Esse exemplo demonstra como armazenar o estado inicial e reverter a operação usando uma pilha.
2. C++
Em C++, o uso de funções e estruturas reversíveis é feito através de ponteiros ou referências, mantendo estados anteriores em um histórico:
#include <iostream>
#include <stack>
using namespace std;
stack<pair<int, int>> history;
// Função reversível para somar
int add_reversible(int a, int b) {
history.push({a, b}); // Armazena o estado
return a + b;
}
// Função para desfazer a soma
void undo_add() {
if (!history.empty()) {
auto state = history.top();
history.pop();
cout << "Desfeito: " << state.first << ", " << state.second << endl;
}
}
int main() {
int resultado = add_reversible(4, 2);
cout << "Resultado: " << resultado << endl;
undo_add();
return 0;
}
Essa abordagem utiliza a estrutura stack
para gerenciar o histórico de estados, permitindo desfazer operações.
3. Linguagem de Montagem (Assembly)
Em Assembly, a reversibilidade é implementada manualmente, armazenando registros antes de operações:
section .data
result dq 0
section .text
global _start
_start:
mov rax, 5 ; Atribui valor 5
mov rbx, 3 ; Atribui valor 3
push rax ; Salva o estado de RAX
push rbx ; Salva o estado de RBX
add rax, rbx ; Soma RAX e RBX
mov [result], rax
; Desfazendo a operação
pop rbx ; Recupera RBX
pop rax ; Recupera RAX
mov rax, 60 ; syscall: exit
xor rdi, rdi ; exit code 0
syscall
Esse exemplo salva e restaura registros usando a pilha, mantendo a reversibilidade manualmente.
4. Haskell (Funcional e Imutável)
Em Haskell, a reversibilidade é feita naturalmente devido à imutabilidade:
-- Função reversível para somar
addReversible :: Int -> Int -> (Int, (Int, Int))
addReversible a b = (a + b, (a, b))
-- Função para desfazer a soma
undoAdd :: (Int, (Int, Int)) -> (Int, Int)
undoAdd (_, state) = state
main :: IO ()
main = do
let resultado = addReversible 5 3
print $ fst resultado -- Saída: 8
print $ undoAdd resultado -- Saída: (5, 3)
A função retorna o resultado junto com o estado inicial, facilitando a reversão.