← Últimos artigos
💻 computer science

Towards Bottom-Up Enumeration in miniKanren via Pruning and Memoization

Este artigo introduz dois combinadores da biblioteca miniKanren, `prune` e `defrel/bank`, que permitem a enumeração bottom-up com deduplicação observacional e memoização para melhorar significativamente o desempenho da síntese de programas relacionais em alvos profundos, ao mesmo tempo em que propõe uma variante ponderada para abordar casos onde a ordenação canônica depth-first falha em encontrar representantes compactos.

Autores originais: Nikolai Kudasov

Publicado 2026-07-29
📖 7 min de leitura🧠 Leitura aprofundada

Autores originais: Nikolai Kudasov

Artigo original sob licença CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Esta é uma explicação gerada por IA do artigo abaixo. Não foi escrita nem endossada pelos autores. Para precisão técnica, consulte o artigo original. Ler aviso legal completo

Imagine que você é um detetive tentando resolver um mistério, mas em vez de procurar pistas, você está tentando construir uma máquina que possa realizar um trabalho específico, como transformar o número 2 em 4, 3 em 9 e 4 em 16. Você não sabe a fórmula exata que a máquina usa; você apenas conhece os resultados. Isso é chamado de "Programação por Exemplo". Para encontrar a resposta, você poderia tentar construir todas as máquinas possíveis, uma por uma, começando com as engrenagens e alavancas mais simples, e testar cada uma para ver se funciona. Isso é um pouco como um chef tentando descobrir uma receita secreta cozinhando todas as combinações possíveis de farinha, açúcar e ovos até que uma tenha o sabor certo.

No mundo da ciência da computação, existe uma forma especial de pensar chamada "programação relacional". Em vez de dizer ao computador exatamente como encontrar a resposta passo a passo, você descreve o que a resposta parece, e deixa o computador descobrir o caminho. É como dizer a um robô: "Encontre-me um caminho através do labirinto", em vez de "Vire à esquerda, depois ande três passos e depois vire à direita". O computador é ótimo em explorar muitos camos ao mesmo tempo, mas tem um hábito complicado: ele tende a explorar os mesmos becos sem saída repetidamente, ou ficar preso em um túnel longo e sinuoso enquanto perde um atalho curto e inteligente logo ao lado. Este artigo aborda esse problema, ensinando o computador a ser um explorador mais inteligente e organizado.


O Problema: Perdendo-se no Labirinto

Imagine que você está tentando encontrar uma chave específica em um sótão gigante e bagunçado cheio de milhões de chaves. A maioria dessas chaves parece diferente, mas todas abrem exatamente a mesma porta. Se você for um explorador desastrado, pode pegar uma chave, testá-la, perceber que funciona e, então, passar horas pegando outras chaves que parecem diferentes, mas também funcionam, apenas para ter certeza. Você está perdendo tempo testando chaves que fazem exatamente o mesmo trabalho.

No mundo dos programas de computador, isso acontece o tempo todo. Quando um computador tenta construir um programa para transformar entradas em saídas, ele gera milhares de trechos de código de aparência diferente. Muitos desses trechos são "gêmeos" disfarçados — eles fazem exatamente a mesma coisa, embora pareçam diferentes por dentro. Um método de busca padrão de computador, que funciona como um explorador de mergulho profundo, verificará um gêmeo, depois o próximo, depois o próximo, tornando-se cada vez mais lento conforme o sótão aumenta. É como tentar encontrar uma agulha em um palheiro, mas o palheiro é feito de milhões de agulhas que todas parecem ligeiramente diferentes.

A Solução: O "Prune" e o "Bank"

Os autores deste artigo, Nikolai Kudasov, criaram duas ferramentas inteligentes para consertar essa bagunça. Pense nelas como um filtro mágico e uma biblioteca inteligente.

1. A Ferramenta "Prune" (O Filtro)
Imagine que você tem uma esteira transportadora de chaves sainendo de uma máquina. A ferramenta "Prune" é um guarda parado ao lado da esteira. Conforme cada chave chega, o guarda verifica qual porta ela abre. Se o guarda já viu uma chave que abre aquela mesma porta, ele simplesmente joga a nova chave no lixo sem nem testá-la. Ele mantém apenas a primeira chave que abre uma porta específica. Dessa forma, a esteira transportadora carrega apenas chaves únicas e úteis. O computador para de perder tempo com duplicatas.

2. A Ferramenta "Bank" (A Biblioteca Inteligente)
Agora, imagine que, em vez de construir chaves do zero toda vez que você precisa de uma, você tem uma biblioteca mágica. Quando você pede uma chave para a biblioteca, ela não te dá apenas uma; ela constrói uma prateleira inteira de chaves únicas uma única vez, de baixo para cima, e as salva. Se você pedir uma chave novamente mais tarde, a biblioteca apenas lhe entrega a que já construiu.

Na linguagem do artigo, isso é chamado de defrel/bank. Isso força o computador a construir sua lista de programas candidatos de uma forma específica e organizada (começando pelos mais simples) e salva os resultados. Se o computador precisar usar uma pequena parte de um programa mais tarde, ele não reconstrói essa parte; ele apenas pega a peça da "biblioteca". Isso economiza uma quantidade enorme de tempo porque o computador nunca precisa fazer o mesmo trabalho duas vezes.

A Reviravolta: Às vezes "Rápido" não é "Melhor"

Os autores também perceberam que ser organizado nem sempre é o suficiente. Às vezes, o "Bank" constrói suas prateleiras em uma ordem que é rápida para o computador, mas lenta para o humano. Por exemplo, o Bank pode construir todas as máquinas de "multiplicação" primeiro e, só muito mais tarde, construir as máquinas de "adição". Se a resposta que você procura é uma máquina de "adição", o computador pode ter que verificar milhares de máquinas de multiplicação antes de finalmente encontrar aquela que você precisa.

Para corrigir isso, eles criaram uma terceira ferramenta chamada defrel/bank-w (o Bank "Ponderado"). Esta ferramenta é como um bibliotecário que sabe que certos tipos de chaves têm mais probabilidade de serem a resposta. Ele usa uma "pontuação" especial para decidir quais chaves mostrar primeiro. Ele tenta mostrar as chaves mais simples e compactas primeiro, mesmo que estejam enterradas profundamente na biblioteca. Isso é ótimo se você quiser a solução mais elegante, mas pode ser mais lento se a resposta for, na verdade, uma máquina complexa e profunda.

O Que Eles Descobriram: Velocidade vs. Estratégia

Os autores testaram essas ferramentas em um conjunto de enigmas matemáticos e de strings (como transformar "Hello" em "Hello, World!"). Aqui está o que descobriram:

  • O "Bank" é um demônio da velocidade: Em 6 de 8 problemas matemáticos difíceis, a ferramenta defrel/bank foi de 9 a 99 vezes mais rápida do que o método de busca padrão antigo. Foi tão rápida que resolveu problemas em uma fração de segundo que o método antigo levava minutos para terminar.
  • Mas ele tem um ponto cego: O Bank é tão organizado que às vezes perde a resposta se essa resposta estiver escondida em uma parte da biblioteca que ele visita tardiamente. Por exemplo, se a resposta envolver a adição de números de uma forma específica (como (1+x)5(1+x)^5), o Bank pode ficar preso verificando milhares de exemplos de multiplicação primeiro. Nesses casos, o método antigo, mais lento, na verdade vence, porque verifica as coisas em uma ordem diferente.
  • O "Bank Ponderado" é uma troca: A ferramenta defrel/bank-w é excelente para encontrar as respostas mais compactas e elegantes. Ela encontrou a resposta certa para um enigma de string difícil em 10,4 milissegundos, superando os 31,5 milissegundos do método padrão. No entanto, para problemas matemáticos muito profundos, ela às vezes ficou presa tentando verificar muitas possibilidades e esgotou o tempo (timeout).

A Conclusão

Este artigo não afirma ter resolvido todos os problemas da ciência da computação. Em vez disso, mostra que, ao adicionar um pouco de "pruning" (filtrar duplicatas) e "banking" (salvar o trabalho para mais tarde), podemos fazer programas de computador que constroem outros programas muito, muito mais rápido.

Os autores sugerem que, se você estiver construindo um sistema para resolver enigmas, deve usar a ferramenta Bank como seu padrão, pois ela é geralmente a mais rápida. No entanto, se você estiver procurando por uma solução muito específica e compacta, ou se o problema for raso e simples, você pode querer usar o Bank Ponderado ou até mesmo o método antigo. Não se trata de uma ferramenta ser perfeita; trata-se de ter a ferramenta certa para o formato do enigma que você está tentando resolver. O artigo termina sugerindo que trabalhos futuros testarão essas ferramentas em enigmas ainda mais complexos, como construir programas que entendam listas ou dados tipados, para ver se esse aumento de velocidade se mantém no mundo real.

Afogado em artigos na sua área?

Receba digests diários dos artigos mais recentes que correspondam às suas palavras-chave de pesquisa — com resumos técnicos, no seu idioma.

Experimentar Digest →