Voltar para artigos

Lógica Simbólica & Inteligência Artificial Clássica

Construindo um Provador Simbólico de Teoremas em Python

A maioria dos provadores de teoremas modernos (como SAT solvers e provadores SMT) foi projetada para responder rapidamente se uma fórmula é satisfatível ou válida, retornando quase sempre apenas um booleano (True ou False).

No entanto, no contexto didático e matemático, a pergunta central quase nunca é apenas se o teorema é verdadeiro, mas sim qual é a sequência formal de passos que o demonstra.

1. A Filosofia do General Problem Solver (GPS)

Criado por Herbert Simon, Allen Newell e Cliff Shaw em 1957, o GPS foi um dos primeiros programas de IA voltados para a resolução de problemas humanos gerais através da análise de meios e fins (Means-Ends Analysis).

Em um provador baseado nessa abordagem:

  • Temos um conjunto de axiomas e hipóteses iniciais.
  • Temos uma meta lógica que desejamos alcançar (conclusão).
  • Em cada etapa, o provador identifica operadores válidos (como Modus Ponens, Modus Tollens e silogismos) que reduzem a distância entre os fatos conhecidos e a meta.

2. O Mecanismo de Dedução (Modus Ponens)

A regra fundamental de inferência é o clássico Modus Ponens:

$$\frac{P, \quad P \to Q}{Q}$$

Se o provador possui a premissa $P$ e a implicação $P \to Q$, deduz-se imediatamente $Q$ como um novo fato demonstrado, registrando sua justificativa no diário da prova.

Transparência Didática: Cada linha da demonstração preserva o identificador das linhas antecedentes e a regra aplicada, permitindo auditar visualmente a prova tal como em um livro-texto de lógica matemática.

3. Exemplo Prático em Python

Abaixo, um exemplo simplificado de representação e encadeamento progressivo em Python:

class Proposicao:
    def __init__(self, formula):
        self.formula = formula

    def __repr__(self):
        return self.formula

class ProvadorGPS:
    def __init__(self, premissas):
        self.fatos = set(premissas)
        self.passos = [(p, "Premissa inicial") for p in premissas]

    def aplicar_modus_ponens(self, implicacoes):
        progresso = False
        for p, q in implicacoes:
            if p in self.fatos and q not in self.fatos:
                self.fatos.add(q)
                self.passos.append((q, f"Modus Ponens de ({p}) e ({p} -> {q})"))
                progresso = True
        return progresso

# Exemplo: P e (P -> Q), (Q -> R)
provador = ProvadorGPS(["P"])
regras = [("P", "Q"), ("Q", "R")]

while provador.aplicar_modus_ponens(regras):
    pass

for i, (fato, justificativa) in enumerate(provador.passos, 1):
    print(f"Passo {i}: {fato} | Justificativa: {justificativa}")

4. Conclusão

Provadores simbólicos humanamente legíveis mostram que o poder da computação não reside apenas em acelerar cálculos numéricos, mas em estruturar o raciocínio formal com precisão, transparência e clareza.