O caminho que vai do eval/apply de McCarthy, em 1960, aos transformers auto-referenciais de hoje não é uma metáfora. É uma linhagem técnica precisa. A homoiconicidade do LISP estabeleceu que programas e dados podem ocupar o mesmo espaço de representação. A álgebra FP de Backus mostrou que programas se compõem a partir de um conjunto fechado de combinadores algébricos. A semântica denotacional apoiou a auto-referência na teoria dos pontos fixos. E os transformers de hoje implementam algoritmos de aprendizagem na própria passagem direta, o que na prática faz deles sistemas computacionais auto-modificáveis. Esta revisão mapeia essa linhagem em nove áreas de pesquisa e serve de base bibliográfica para dois artigos: um conceitual, que liga a auto-referência do LISP à auto-consciência emergente no ML moderno, e um técnico, que propõe experimentos de manipulação diferenciável de arquiteturas baseadas em LISP.


1. Auto-referência e homoiconicidade no LISP: onde o código virou dado

Referências fundacionais

John McCarthy, “Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I,” Communications of the ACM 3(4):184–195, 1960. McCarthy introduziu as S-expressions como representação uniforme para programas e dados e definiu a S-função universal apply, que segundo ele cumpria “o papel teórico de uma máquina de Turing universal e o papel prático de um interpretador”. Steve Russell implementou o eval como código executável no IBM 704, contra o que o próprio McCarthy esperava, e com isso surgiu o primeiro sistema de programação auto-interpretante. O resultado central: o par eval/apply do LISP constitui um sistema computacional autodescritivo, um programa que interpreta programas na sua própria representação de dados.

Harold Abelson, Gerald Jay Sussman e Julie Sussman, Structure and Interpretation of Computer Programs, MIT Press, 1984 (2ª ed. 1996). O capítulo 4 apresenta o avaliador metacircular, um interpretador Scheme escrito em Scheme. Ele é construído a partir de dois procedimentos mutuamente recursivos (eval e apply) que especificam por completo a semântica da linguagem. Diz o SICP: “Um avaliador escrito na mesma linguagem que avalia é dito metacircular.” É a demonstração canônica de que linguagens homoicônicas permitem autodescrição completa.

John C. Reynolds, “Definitional Interpreters for Higher-Order Programming Languages,” Proceedings of the ACM Annual Conference, 2:717–740, 1972. Reynolds cunhou o termo “metacircular” e mostrou que auto-interpretadores herdam propriedades semânticas (por exemplo, a ordem de avaliação) da sua metalinguagem. Para resolver as ambiguidades que isso gera, introduziu a desfuncionalização e a transformação CPS.

Combinadores de ponto fixo e o teorema da recursão de Kleene

Haskell B. Curry e Robert Feys, Combinatory Logic, Volume I, North-Holland, 1958. Define o combinador Y (Y = λf.(λx.f(x x))(λx.f(x x))), que permite recursão sem auto-referência explícita: uma função não precisa conhecer o próprio nome. A auto-referência surge só das regras de composição.

Stephen C. Kleene, Introduction to Metamathematics, North-Holland, 1952. O Segundo Teorema da Recursão afirma: para toda função computável total f, existe um índice n tal que φ_n = φ_{f(n)}. Toda transformação computável de programas tem um ponto fixo. Isso garante a existência de quines, auto-interpretadores e todas as formas de auto-referência computacional. Como Jones observou, “o teorema da recursão é quase trivial numa linguagem reflexiva”.

Oleg Kiselyov, “Kleene’s Second Recursion Theorem: A Functional Pearl,” rascunho ~2018. Junta teoria da computabilidade e metaprogramação funcional, notando que “a quotação estilo Lisp em particular ajuda” em implementações eficientes do teorema da recursão. Mostra que a prova do SRT de Kleene é estruturalmente análoga à construção do combinador Y.

Joseph Helfer, “Y is a Least Fixed Point Combinator,” arXiv:2504.19379, 2025. Prova que o combinador Y de Curry produz o menor ponto fixo quando os termos do cálculo lambda são vistos como funções parciais, o que liga os pontos fixos do lambda à teoria dos domínios.

Homoiconicidade

Calvin N. Mooers e L. Peter Deutsch, “TRAC, A Text-Handling Language,” Proceedings of the ACM ‘65, pp. 229–246, 1965. Origem do termo: “Como os procedimentos e texto do TRAC têm a mesma representação dentro e fora do processador, o termo homoicônico é aplicável, de homo significando o mesmo e icon significando representação.”

Alan Kay, The Reactive Engine, tese de doutorado, University of Utah, 1969. Popularizou o termo, descrevendo LISP e TRAC como “homoicônicos no sentido em que suas representações internas e externas são essencialmente as mesmas”.

Homoiconicidade do LISP e ML moderno

Kevin Ellis et al., “DreamCoder: Bootstrapping Inductive Program Synthesis with Wake-Sleep Library Learning,” PLDI 2021; arXiv:2006.08381. O DreamCoder aprende a resolver problemas sintetizando programas em cálculo lambda (na essência, árvores de S-expressions). Um algoritmo wake-sleep alterna síntese de programas, refatoração em abstrações reutilizáveis e treinamento de uma rede neural de reconhecimento. O sistema cultiva sua própria linguagem de programação, uma forma de metaprogramação diretamente análoga ao defun e aos sistemas de macros do LISP.

Steven T. Piantadosi, “The Computational Origin of Representation,” Minds and Machines 31:1–58, 2021. Propõe que a cognição opera por meio de uma Linguagem do Pensamento baseada em lógica combinatória. Observa: “Curiosamente, o poder computacional para usar recursão vem de graça se o cálculo lambda é o sistema representacional: a recursão pode ser construída via combinador Y a partir de nada mais do que as leis de composição do cálculo lambda.”

Martín Abadi e Gordon D. Plotkin, “A Simple Differentiable Programming Language,” Proc. ACM Program. Lang. 4, POPL, Artigo 38, 2020; arXiv:1911.04523. Define uma linguagem com funções recursivas e diferenciação reversa de primeira classe e prova que as semânticas operacional e denotacional coincidem. Ter a diferenciação como operação da linguagem é paralelo ao eval: assim como eval mapeia código-como-dado para valores, o operador de diferenciação mapeia programas para seus programas derivados.

Bohdan B. Khomtchouk, Edmund Weitz e Claes Wahlestedt, “The Machine that Builds Itself: How the Strengths of Lisp Family Languages Facilitate Building Complex and Flexible Bioinformatic Models,” arXiv:1608.02621, 2016. Argumenta que a homoiconicidade do Lisp, o sistema de macros e a facilidade de construir DSLs o tornam unicamente adequado para aplicações de IA/ML, “a máquina que se constrói a si mesma”.


2. A álgebra FP de Backus: programas como objetos algébricos

A palestra de Turing de 1977

John Backus, “Can Programming Be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs,” Communications of the ACM 21(8):613–641, 1978. Backus criticou as linguagens convencionais como “gordas e fracas” por causa do seu “estilo primitivo palavra-por-palavra” e identificou “a instrução de atribuição como o gargalo de von Neumann”. Propôs o FP: um sistema sem variáveis, em nível de funções, construído sobre formas combinadoras (composição, construção, aplicar-a-todos/map, condição, inserir/reduzir) que funcionam como operações de uma álgebra de programas. O exemplo canônico, Def Innerproduct = (/+) ∘ (α×) ∘ Transpose, define o produto interno só compondo três operações, sem nomear variáveis. As formas combinadoras são fechadas: compô-las sempre produz funções dentro do sistema FP.

O mapeamento direto para primitivas de redes neurais chama atenção: composição = encadeamento de camadas; construção = multi-head/ramificação; aplicar-a-todos = convolução/map; inserir/reduzir = pooling; condição = mecanismos de gating.

John Backus, “The Algebra of Functional Programs: Function Level Reasoning, Linear Equations, and Extended Definitions,” LNCS 107, Springer, 1981. Estende a álgebra FP com raciocínio em nível de funções e equações lineares.

Formalismo de Bird-Meertens

Jeremy Gibbons, “The School of Squiggol: A History of the Bird–Meertens Formalism,” FM 2019 International Workshops, LNCS 12233, pp. 18–42, Springer, 2020. História abrangente do BMF, “um cálculo para transformação de programas por raciocínio equacional em estilo funcional”. Os operadores do BMF (map, fold/reduce, scan, filter) são exatamente as formas combinadoras de Backus postas sobre fundamentos categóricos, com leis de fusão que permitem derivar programas de forma sistemática.

Richard S. Bird, “An Introduction to the Theory of Lists,” Monograph PRG-56, Oxford, 1986. Estabelece a teoria das listas como arcabouço calculacional, introduzindo o lema do homomorfismo e as leis de fusão.

Richard S. Bird e Oege de Moor, The Algebra of Programming, Prentice-Hall, 1997. A síntese definitiva do BMF, usando teoria das categorias (álgebras iniciais, catamorfismos) para cálculo de programas.

Semântica categórica

Erik Meijer, Maarten Fokkinga e Ross Paterson, “Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire,” LNCS 523, pp. 124–144, 1991. Introduz catamorfismos, anamorfismos, hilomorfismos e paramorfismos como operadores de recursão sobre tipos de dados algébricos. É o ponto em que a álgebra de Backus chega à forma categórica.

Tatsuya Hagino, “A Categorical Programming Language,” tese de doutorado, University of Edinburgh, 1987; arXiv:2010.05167. Apresenta tipos de dados baseados em F,G-diálgebras, ligando definições no estilo Backus a (co)álgebras iniciais/finais.

Releituras modernas com conexão ao ML

Christopher Olah, “Neural Networks, Types, and Functional Programming,” blog, setembro 2015. A formulação mais explícita da conexão entre Backus e deep learning. Olah identifica: RNNs codificadoras = folds (o inserir/reduzir de Backus); RNNs geradoras = unfolds; RNNs gerais = scanl; redes neurais recursivas = catamorfismos. “Todo modelo em deep learning que conheço envolve otimizar funções compostas. Creio que este seja o cerne do que estudamos.”

Bruno Gavranović, Paul Lessard, Andrew Dudzik et al., “Position: Categorical Deep Learning is an Algebraic Theory of All Architectures,” ICML 2024, PMLR 235:15209–15241; arXiv:2402.15332. Propõe que todas as grandes arquiteturas (RNNs, CNNs, GNNs, transformers) são instâncias de uma única teoria algébrica: álgebras de mônada numa 2-categoria de mapas paramétricos. É a afirmação moderna mais forte de que ML é fundamentalmente algébrico.


3. Computação reflexiva e auto-modificável: torres até o topo

Reflexão procedural

Brian Cantwell Smith, Procedural Reflection in Programming Languages, tese de doutorado, MIT, 1982 (MIT-TR-272). Introduziu a reflexão procedural via 3-LISP, em que todo programa é executado por um interpretador metacircular na mesma linguagem, formando uma torre infinita de meta-interpretadores. São três os requisitos para auto-raciocínio computacional: auto-referência, uma teoria embutida de si e uma conexão causal entre essa teoria e o comportamento do sistema.

Brian Cantwell Smith, “Reflection and Semantics in Lisp,” POPL ‘84, pp. 23–35, 1984. Apresentação condensada: “procedimentos reflexivos são essencialmente análogos a sub-rotinas a serem executadas ’na implementação’” e “não há uma torre de linguagens diferentes, há um único dialeto (3-LISP) até o topo”.

Pattie Maes, “Concepts and Experiments in Computational Reflection,” OOPSLA ‘87, pp. 147–155, 1987. Formalizou a reflexão computacional: um sistema reflexivo é aquele que “raciocina sobre si e age sobre si”. Distinguiu a reflexão estrutural (introspecção da estrutura do programa) da reflexão comportamental (modificar a semântica em tempo de execução).

A torre reflexiva

Mitchell Wand e Daniel P. Friedman, “The Mystery of the Tower Revealed: A Non-Reflective Description of the Reflective Tower,” Lisp and Symbolic Computation 1(1):11–38, 1988. Deu uma semântica denotacional rigorosa à torre infinita de interpretadores metacirculares de Smith sem usar reflexão para explicar reflexão.

Nada Amin e Tiark Rompf, “Collapsing Towers of Interpreters,” Proc. ACM Program. Lang. 2, POPL, 2017. Mostra como torres de interpretadores podem ser colapsadas num compilador de passo único via staging multinível, ligando a torre reflexiva à compilação moderna.

Hofstadter: strange loops como pontos fixos

Douglas R. Hofstadter, Gödel, Escher, Bach: An Eternal Golden Braid, Basic Books, 1979. Aqui interessa o conteúdo matemático, e não só o filosófico: a numeração de Gödel permite que afirmações sobre um sistema formal sejam codificadas dentro dele, que é o caso paradigmático de auto-referência computacional. Hofstadter cunhou “quining” para a construção auto-referencial em que uma afirmação é aplicada à sua própria citação. A definição de strange loop: “Um deslocamento de um nível de abstração para outro, que parece um movimento ascendente numa hierarquia, mas que, de alguma forma, os sucessivos deslocamentos ‘para cima’ acabam dando origem a um ciclo fechado.”

O Lema Diagonal (Gödel 1931, generalizado por Carnap 1934): Para toda fórmula ψ(x) com uma variável livre numa teoria suficientemente forte T, existe uma sentença φ tal que T ⊢ φ ↔ ψ(⌜φ⌝). É a formalização matemática da auto-referência, muito próxima do teorema da recursão de Kleene.

Semântica de pontos fixos

Dana S. Scott, “Outline of a Mathematical Theory of Computation,” Technical Monograph PRG-2, Oxford, 1970; “Continuous Lattices,” LNMS 274, 1972. A teoria dos domínios de Scott dá o fundamento matemático. A construção central dele resolveu D ≅ [D → D], criando um domínio isomorfo ao seu próprio espaço de funções, que é a forma matemática da homoiconicidade. O teorema do ponto fixo de Kleene-Scott garante que, para toda função contínua f sobre uma ordem parcial completa, o menor ponto fixo existe como ⊔{fⁿ(⊥) : n ≥ 0}.

Samson Abramsky e Achim Jung, “Domain Theory,” Handbook of Logic in Computer Science 3:1–168, Oxford University Press, 1994. A referência de maior autoridade sobre o papel da teoria dos domínios na semântica denotacional.


4. Transformers como computadores universais e meta-aprendizes em contexto

Completude de Turing

Jorge Pérez, Javier Marinković e Pablo Barceló, “On the Turing Completeness of Modern Neural Network Architectures,” ICLR 2019; arXiv:1901.03429. Prova que transformers são Turing-completos “com base em sua capacidade de computar e acessar representações densas internas dos dados”, sem memória externa. Assume ativações racionais com precisão arbitrária.

Jorge Pérez, Pablo Barceló e Javier Marinković, “Attention is Turing Complete,” JMLR 22(75):1–35, 2021. Versão estendida, que mostra que um transformer encoder-decoder mínimo (encoder de uma camada, decoder de três) é suficiente. A dimensão do modelo escala como d = 2|Q| + 4|Σ| + 11.

Mostafa Dehghani et al., “Universal Transformers,” ICLR 2019; arXiv:1807.03819. Adiciona recorrência com compartilhamento de pesos ao longo da profundidade, com Adaptive Computation Time, e chega a uma arquitetura praticamente Turing-completa. “Dada memória suficiente, o Universal Transformer é computacionalmente universal.”

Angeliki Giannou et al., “Looped Transformers as Programmable Computers,” ICML 2023; arXiv:2301.13196. Mostra que 13 camadas constantes num loop podem emular um pequeno computador com conjunto de instruções. “Um único transformer congelado, instruído por sua entrada, pode emular uma calculadora básica, uma biblioteca básica de álgebra linear e até um algoritmo completo de backpropagation e aprendizagem em contexto.” A entrada funciona como um “cartão perfurado”, e o transformer literalmente vira um computador programável.

Aprendizagem em contexto como otimização implícita

Ekin Akyürek et al., “What Learning Algorithm is In-Context Learning? Investigations with Linear Models,” ICLR 2023; arXiv:2211.15661. Prova construtivamente que transformers podem implementar descida do gradiente e regressão ridge em forma fechada. Transformers treinados transitam entre diferentes estimadores clássicos conforme a profundidade e o nível de ruído.

Johannes von Oswald et al., “Transformers Learn In-Context by Gradient Descent,” ICML 2023, PMLR 202:35151–35174; arXiv:2212.07677. Mostra equivalência formal entre uma única camada de self-attention linear e um passo de descida do gradiente numa loss de regressão. “Transformers treinados tornam-se meso-otimizadores, isto é, aprendem modelos por descida do gradiente em sua passagem direta.”

Damai Dai et al., “Why Can GPT Learn In-Context?” Findings of ACL 2023; arXiv:2212.10559. Deriva uma forma dual entre a atenção de transformers e a descida do gradiente: os valores de atenção funcionam como “meta-gradientes”, e a ICL é análoga a aplicar atualizações de gradiente a partir dos exemplos demonstrados.

Aprendizagem em contexto como inferência bayesiana

Sang Michael Xie et al., “An Explanation of In-context Learning as Implicit Bayesian Inference,” ICLR 2022; arXiv:2111.02080. “A aprendizagem em contexto emerge teórica e empiricamente quando a distribuição de pré-treinamento é uma mistura, resultando no modelo de linguagem realizando implicitamente inferência bayesiana em sua passagem direta.”

Samuel Müller et al., “Transformers Can Do Bayesian Inference,” ICLR 2022; arXiv:2112.10510. Introduz as Prior-Data Fitted Networks (PFNs): uma única passagem direta de transformer aproxima distribuições preditivas posteriores bayesianas, com ganhos >200× em relação a MCMC/VI.

Transformers como meta-aprendizes

Shivam Garg et al., “What Can Transformers Learn In-Context? A Case Study of Simple Function Classes,” NeurIPS 2022; arXiv:2208.01066. Demonstra que transformers codificam algoritmos de aprendizagem diversos (igualando OLS, Lasso, descida do gradiente, aprendizagem de árvores de decisão) numa única passagem direta.

Gail Weiss, Yoav Goldberg e Eran Yahav, “Thinking Like Transformers,” ICML 2021; arXiv:2106.06981. Propõe a RASP (Restricted Access Sequence Processing Language) como modelo computacional para encoders transformer. “O processo iterativo de um transformer não se dá ao longo do comprimento da sequência de entrada, mas sim ao longo da profundidade da computação.” Programas RASP compilam em arquiteturas transformer, o que dá uma visão formal, de linguagem de programação, da atenção como composição de funções.


5. Programação diferenciável como transformação algébrica de programas

AD como forma combinadora

Barak A. Pearlmutter e Jeffrey Mark Siskind, “Reverse-mode AD in a Functional Framework: Lambda the Ultimate Backpropagator,” ACM TOPLAS 30(2):7:1–7:36, 2008. Mostra que AD em modo reverso pode ser uma função de primeira classe num cálculo lambda aumentado, alcançando fechamento (a derivada continua na mesma linguagem). É a ponte mais direta entre AD e Backus: a diferenciação é uma forma combinadora que transforma programas em programas preservando as propriedades essenciais.

Conal Elliott, “The Simple Essence of Automatic Differentiation,” Proc. ACM Program. Lang. 2, ICFP, Artigo 70, 2018; arXiv:1804.00746. Deriva AD a partir de especificações categóricas. “Computações expressas neste vocabulário são diferenciáveis por construção, graças aos blocos de construção da teoria das categorias.” AD é um funtor, um mapa que preserva estrutura entre categorias. A regra da cadeia vira preservação de composição: D(g∘f) = D(g)∘D(f).

Conal Elliott, “Compiling to Categories,” Proc. ACM Program. Lang. 1, ICFP, Artigo 27, 2017. Programas funcionais tipados podem ser reinterpretados em qualquer categoria cartesiana fechada, o que permite tradução automática para AD, circuitos de hardware ou análise por intervalos. É a realização moderna mais direta da visão de Backus.

Fei Wang et al., “Demystifying Differentiable Programming: Shift/Reset the Penultimate Backpropagator,” Proc. ACM Program. Lang. 3, ICFP, Artigo 96, 2019; arXiv:1803.10228. Revela uma conexão estreita entre AD em modo reverso e continuações delimitadas (shift/reset). Backpropagation é uma instância específica de transformação CPS, ou seja, mais uma transformação algébrica de programas.

JAX como a álgebra de Backus realizada

James Bradbury et al., JAX: composable transformations of Python+NumPy programs, 2018; github.com/jax-ml/jax. Os grad, jit, vmap e pmap do JAX são transformações de ordem superior componíveis, diretamente análogas às formas combinadoras de Backus. jit(vmap(grad(loss))) compõe três transformações numa única computação otimizada. Todas operam por tracing para uma representação intermediária (jaxpr), que pode ser transformada de novo.

Roy Frostig, Matthew James Johnson e Chris Leary, “Compiling machine learning programs via high-level tracing,” MLSys 2018. Descreve o mecanismo de tracing do JAX: funções Python são capturadas como grafos de operações primitivas e depois otimizadas algebricamente via XLA (fusão, propagação de constantes, simplificação). É um pipeline concreto de transformações algébricas de programas.

Teoria das categorias em ML

Brendan Fong, David I. Spivak e Rémy Tuyéras, “Backprop as Functor: A compositional perspective on supervised learning,” LICS 2019; arXiv:1711.10455. Define uma categoria monoidal Learn em que os morfismos são “aprendizes” e a descida do gradiente define um funtor monoidal de funções euclidianas parametrizadas para aprendizes. A composição de aprendizes espelha a composição de funções de Backus, e a estrutura monoidal corresponde às formas combinadoras paralelas (construção).

G.S.H. Cruttwell, B. Gavranović, N. Ghani, P.W. Wilson e F. Zanasi, “Categorical Foundations of Gradient-Based Learning,” ESOP 2022, LNCS 13240; arXiv:2103.01931. Propõe uma semântica categórica via lentes, mapas paramétricos (construção Para) e categorias de derivadas reversas. Mostra que todo o pipeline de aprendizagem baseada em gradiente (modelo, otimizador, loss) consiste de lentes paramétricas. Cobre ADAM, AdaGrad, momento de Nesterov, MSE e softmax cross-entropy.

Bruno Gavranović, “Fundamental Components of Deep Learning: A category-theoretic approach,” tese de doutorado, University of Strathclyde; arXiv:2403.13001, 2024. Identifica duas propriedades fundamentais do deep learning, ser paramétrico e bidirecional, modeladas por actegorias e ópticas ponderadas. Combinando as duas, chega a ópticas paramétricas ponderadas, com conexões com atualização bayesiana e teoria dos jogos.

Dan Shiebler, Bruno Gavranović e Paul Wilson, “Category Theory in Machine Learning,” arXiv:2106.07032, 2021. Survey que observa que “como a maioria dos sistemas modernos de machine learning é inerentemente composicional, não surpreende que vários autores tenham começado a estudá-los pela lente da teoria das categorias”.

Linguagens de programação diferenciável

Adam Paszke et al., “Getting to the Point: Index Sets and Parallelism-Preserving Autodiff for Pointful Array Programming,” Proc. ACM Program. Lang. 5, ICFP, Artigo 88, 2021; arXiv:2104.05372. O Dex trata arrays como funções avidamente memoizadas sobre conjuntos de índices tipados, o que permite manipulações abstratas de função (currying) em arrays, com AD em modo reverso que preserva o paralelismo.


6. Síntese de programas neurais e meta-aprendizagem: programas que escrevem programas

Referências centrais

Scott Reed e Nando de Freitas, “Neural Programmer-Interpreters,” ICLR 2016; arXiv:1511.06279. O NPI aprende a compor programas de nível inferior para expressar os de nível superior, por meio de um núcleo recorrente com memória persistente de programas. Essa memória de programas é análoga a um ambiente LISP em que definições de função são de primeira classe.

Chelsea Finn, Pieter Abbeel e Sergey Levine, “Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks,” ICML 2017; arXiv:1703.03400. A otimização bi-nível do MAML (o loop externo otimiza a inicialização, o loop interno adapta) corre em paralelo ao paradigma de programa auto-modificável: o sistema modifica os próprios parâmetros para ficar melhor em se modificar.

David Ha, Andrew Dai e Quoc V. Le, “HyperNetworks,” ICLR 2017; arXiv:1609.09106. Uma rede gera pesos para outra. É o análogo neural mais direto do eval do LISP, em que código produz código. Uma hypernetwork que gerasse seus próprios pesos seria um quine neural.

Barret Zoph e Quoc V. Le, “Neural Architecture Search with Reinforcement Learning,” ICLR 2017; arXiv:1611.01578. Enquadra o design de arquiteturas como geração de sequências: um controlador RNN gera descrições de arquiteturas como strings (na prática, programas serializados). NAS é, essencialmente, busca de programas.

Esteban Real et al., “Regularized Evolution for Image Classifier Architecture Search,” AAAI 2019; arXiv:1802.01548. Trata arquiteturas como estruturas simbólicas mutáveis sujeitas a transformação, de forma análoga a macros LISP transformando S-expressions.

Síntese híbrida simbólica-neural

Kevin Ellis et al., “DreamCoder: Growing Generalizable, Interpretable Knowledge with Wake-Sleep Bayesian Program Learning,” PLDI 2021; arXiv:2006.08381. Opera numa linguagem funcional com primitivas tipo-LISP (car, cdr), cultiva sua própria linguagem aprendendo novas abstrações e usa reconhecimento neural para guiar a busca. A fase de library learning é metaprogramação: o sistema reescreve sua própria biblioteca padrão.

Alexander L. Gaunt et al., “TerpreT: A Probabilistic Programming Language for Program Induction,” arXiv:1608.04428, 2016. O Neural TerpreT (NTPT) cria programas híbridos que chamam sub-rotinas neurais aprendidas. É um interpretador diferenciável, essencialmente um eval neural.

Matej Balog et al., “DeepCoder: Learning to Write Programs,” ICLR 2017; arXiv:1611.01989. Predição neural de quais primitivas de programação funcional (map, filter, scanl) aparecem num programa, guiando a busca sobre programas funcionais.

Swarat Chaudhuri et al., “Neurosymbolic Programming,” Foundations and Trends in Programming Languages 7(3):158–243, 2021. Survey abrangente que une deep learning e síntese de programas: funções como programas que usam módulos neurais lado a lado com primitivas simbólicas.

Ziyang Li, Jiani Huang e Mayur Naik, “Scallop: A Language for Neurosymbolic Programming,” PLDI 2023; arXiv:2304.04812. Combina programação lógica baseada em Datalog com raciocínio diferenciável via semirings de proveniência.


7. Computação neural auto-referencial: Schmidhuber e além

A linhagem de Schmidhuber

Jürgen Schmidhuber, “A ‘Self-Referential’ Weight Matrix,” Proc. ICANN ‘93, pp. 446–450, Springer, 1993. Derivou um algoritmo de aprendizagem baseado em gradiente para uma rede que pode “falar sobre sua própria matriz de pesos em termos de ativações”, com unidades de entrada/saída especiais para “analisar e manipular explicitamente todos os seus próprios pesos, incluindo aqueles responsáveis por analisar e manipular pesos”.

Jürgen Schmidhuber, “Gödel Machines: Self-Referential Universal Problem Solvers Making Provably Optimal Self-Improvements,” arXiv:cs/0309048, 2003; publicado em Goertzel & Pennachin (eds.), Artificial General Intelligence, Springer, 2007, pp. 199–226. “A primeira classe de solucionadores de problemas matematicamente rigorosos, gerais, plenamente auto-referenciais, auto-aprimorantes e otimamente eficientes.” Uma máquina de Gödel “reescreve qualquer parte de seu próprio código assim que encontra uma prova de que a reescrita é útil”. O Teorema da Otimalidade Global prova que as auto-reescritas são globalmente ótimas. Schmidhuber observou que a máquina é “‘consciente’ ou ‘autoconsciente’ no sentido de que todo seu comportamento é aberto à auto-introspecção e modificável… E esse tipo de auto-referência total é precisamente a razão de sua otimalidade”.

Kazuki Irie, Imanol Schlag, Róbert Csordás e Jürgen Schmidhuber, “A Modern Self-Referential Weight Matrix That Learns to Modify Itself,” ICML 2022, PMLR 162; arXiv:2202.05780. Torna prática a visão de 1993 usando Fast Weight Programmers e Transformers lineares. “A WM de uma NN auto-referencial pode continuar modificando rapidamente toda a si mesma em tempo de execução. Em princípio, tais NNs podem meta-aprender a aprender, e meta-meta-aprender a meta-aprender a aprender, e assim por diante, no sentido do auto-aprimoramento recursivo.”

Louis Kirsch e Jürgen Schmidhuber, “Eliminating Meta Optimization Through Self-Referential Meta Learning,” arXiv:2212.14392, 2022. Prova que arquiteturas auto-referenciais exigem compartilhamento de parâmetros (N² pesos derivados de N ativações). Propõe a Fitness Monotonic Execution para auto-modificação sem meta-otimização explícita.

Imanol Schlag, Kazuki Irie e Jürgen Schmidhuber, “Linear Transformers Are Secretly Fast Weight Programmers,” ICML 2021. Demonstra que transformers lineares equivalem aos fast weight programmers dos anos 1990, o que liga a linhagem auto-referencial de Schmidhuber diretamente às arquiteturas transformer modernas.

Arquiteturas auto-modificáveis (2022 a 2025)

Xunjian Yin et al., “Gödel Agent: A Self-Referential Agent Framework for Recursive Self-Improvement,” arXiv:2410.04444, 2024. Agente baseado em LLM que modifica recursivamente a própria lógica e o próprio comportamento, inspirado na máquina de Gödel de Schmidhuber.

Andrea Ferigo e Giovanni Iacca, “Self-Building Neural Networks,” GECCO ‘23; arXiv:2304.01086. Redes que constroem a própria estrutura durante a execução da tarefa, via aprendizagem hebbiana e poda.

Louis Kirsch e Jürgen Schmidhuber, “Meta Learning Backpropagation And Improving It,” NeurIPS 2021; arXiv:2012.14905. Variable Shared Meta Learning (VSML): uma rede cujos pesos são substituídos por pequenos LSTMs pode implementar backpropagation puramente em modo direto. A rede aprende seu próprio algoritmo de aprendizagem.


8. Clojure/LISP + ML: a interseção prática

Ecossistema Clojure

O ecossistema de ML em Clojure inclui Cortex (construção/treinamento de redes neurais, da Thinktopic), Deep Diamond (computação tensorial com GPU via Intel MKL-DNN e Nvidia cuDNN, de Dragan Djuric), scicloj.ml (pipelines de ML componíveis), clj-djl (wrapper da Amazon Deep Java Library) e DL4J/DL4CLJ (deep learning na JVM). A série de blog de Djuric “Deep Learning in Clojure from Scratch to GPU” mostra como implementar redes neurais do zero em “algumas dezenas de linhas de código Clojure”. A biblioteca de interoperabilidade com Python libpython-clj permite usar TensorFlow/PyTorch direto do Clojure.

ML em Common Lisp

O MGL (de Gábor Melis) suporta redes com backpropagation, máquinas de Boltzmann e processos gaussianos. O TH oferece deep learning com autograd e modelos pré-treinados (VGG16, ResNet50, etc.). O NeuraLisp oferece ML modular com operações tensoriais, autograd e suporte a GPU. O Lush (Lisp Universal Shell) de Yann LeCun foi um dialeto Lisp desenhado especificamente para pesquisa em ML.

Scheme + programação diferenciável

O compilador STALINGRAD de Pearlmutter e Siskind (Stalin∇) compila VLAD, uma linguagem tipo-Scheme com AD de primeira classe, para código nativo eficiente. Jeffrey Mark Siskind, “Scheme as a Framework for Deep Learning,” ICFP Scheme Workshop 2021. Argumenta diretamente que as propriedades do Scheme fazem dele um framework adequado para DL.

Sistemas híbridos críticos

Garrett E. Katz et al., “NeuroLISP: High-Level Symbolic Programming with Attractor Neural Networks,” Neural Networks 146:230–251, 2022. Implementa um interpretador LISP num substrato neural usando dinâmica de atratores: memória de trabalho temporalmente local, estruturas de dados composicionais, escopo de variáveis e manipulação de programas-como-dados. Alcança desempenho perfeito no benchmark PCFG SET. Esta é a ponte mais direta: redes neurais que suportam nativamente o paradigma código-como-dado do LISP.

Chen Liang et al., “Neural Symbolic Machines: Learning Semantic Parsers on Freebase with Weak Supervision,” ACL 2017, pp. 23–33. Combina um “programador” neural seq2seq com um “computador” simbólico que é um interpretador Lisp. A rede aprende a escrever programas Lisp a partir de supervisão fraca.

“From Tool Calling to Symbolic Thinking: LLMs in a Persistent Lisp Metaprogramming Loop,” arXiv:2506.10021, 2025. Acopla aos LLMs um REPL Common Lisp persistente para construção dinâmica de ferramentas, raciocínio reflexivo e metaprogramação.

O Eshkol (github.com/tsotchke/eshkol) é uma linguagem tipo-Lisp de alto desempenho com AD nativo (simbólico, modo direto, modo reverso, além de operadores de cálculo vetorial). As funções lambda mantêm representações de S-expression por meio de um registro em tempo de execução, implementando diretamente o conceito da tese de programação diferenciável homoicônica.

Redes neurais em Lisp puro (SectorLISP): Hikaru Ikuta (2022) implementou uma rede neural em SectorLISP, um interpretador Lisp de setor de boot com 512 bytes, sem números embutidos. Usou só manipulação simbólica de átomos e listas e construiu aritmética de ponto fixo e multiplicação de matrizes a partir dos primeiros princípios.


9. Auto-consciência filosófico-computacional como moldura

Daniel C. Dennett, The Intentional Stance, MIT Press, 1987. Define três posturas (física, de projeto, intencional) para prever o comportamento de sistemas. Qualquer sistema cujo comportamento seja melhor previsto atribuindo-lhe crenças e desejos é um “sistema intencional, qualquer que sejam suas entranhas”. Levando isso para o ML moderno, Cominelli et al. (2021) argumentam que a postura intencional é “a única estratégia viável” para entender o comportamento de IAs complexas.

Douglas R. Hofstadter, I Am a Strange Loop, Basic Books, 2007. Refina o conceito de strange loop: a autoconsciência surge de ciclos auto-referenciais em sistemas simbólicos. Afirmação formal: “O pronome ’eu’ não envolve uma auto-referência mais forte do que a construção de Gödel.” Defende a causalidade descendente, ou seja, padrões auto-referenciais de alto nível podem ter eficácia causal.

Thomas Nagel, “What Is It Like to Be a Bat?” The Philosophical Review 83(4):435–450, 1974. Argumenta que a experiência subjetiva tem um caráter irredutivelmente em primeira pessoa que nenhuma descrição objetiva consegue capturar. Aqui serve de contraponto: um sistema que modela a si mesmo pode representar os próprios estados, mas o argumento de Nagel marca a fronteira do que a auto-referência computacional consegue alcançar.

Anthropic, “Emergent Introspective Awareness in Large Language Models,” Transformer Circuits, 2025. Constata que modelos Claude alcançam alta consciência introspectiva verdadeiro-positiva, com zero falsos positivos, quando testados para detectar representações de estado interno injetadas. O pós-treinamento é chave para eliciar consciência introspectiva.

“Large Language Models Report Subjective Experience Under Self-Referential Processing,” arXiv:2510.24797, 2025. O prompting auto-referencial elicia de forma consistente relatos estruturados de experiência em diferentes famílias de modelos, e aparece convergência semântica entre os modelos. Liga-se diretamente às construções gödelianas de Hofstadter.


Como as peças se encaixam: a arquitetura da tese central

As nove áreas formam um pipeline intelectual preciso que sustenta os dois artigos:

  • Camada de fundação (Artigos 1 & 2): a homoiconicidade de McCarthy + o teorema da recursão de Kleene + a semântica de pontos fixos de Scott estabelecem que a auto-referência é ao mesmo tempo acessível na prática (LISP) e matematicamente inevitável (em qualquer sistema suficientemente expressivo).

  • Camada algébrica (Artigos 1 & 2): a álgebra FP de Backus + o formalismo de Bird-Meertens + a semântica categórica mostram que programas se compõem por uma álgebra fechada de formas combinadoras, com leis equacionais para transformação.

  • Camada diferenciável (Artigo 2 principalmente): as transformações funcionais do JAX + o AD-como-funtor de Elliott + o backprop-como-funtor de Fong-Spivak demonstram que a aprendizagem baseada em gradiente é um sistema algébrico de transformação de programas que preserva a estrutura composicional. É a visão de Backus realizada para a computação diferenciável.

  • Camada de meta-aprendizagem (Artigos 1 & 2): ICL como descida implícita do gradiente (von Oswald, Akyürek) + transformers como computadores programáveis (Giannou) + completude de Turing (Pérez) mostram que transformers implementam algoritmos de aprendizagem na passagem direta. São meso-otimizadores, sistemas computacionais auto-modificáveis.

  • Camada de auto-referência (Artigos 1 & 2): as matrizes de pesos auto-referenciais de Schmidhuber + a torre reflexiva de Smith + hypernetworks demonstram que a auto-referência viabiliza o auto-aprimoramento recursivo em sistemas neurais.

  • Camada de síntese (experimentos do Artigo 2): DreamCoder + NeuroLISP + Eshkol + Neural Symbolic Machines comprovam que é viável, na prática, representar computação neural em estruturas tipo-LISP. Os experimentos propostos (redes neurais como S-expressions, busca de arquitetura como transformação simbólica, um avaliador metacircular neural) ficam nessa interseção.

A peça que falta, e que os dois artigos podem articular: nenhum sistema existente unifica plenamente homoiconicidade, diferenciabilidade e auto-modificação num único arcabouço. O DreamCoder é o que chega mais perto, mas os componentes neural e simbólico dele continuam separados. Uma arquitetura diferenciável plenamente homoicônica, em que a estrutura da rede é representada no mesmo formato que ela processa e a otimização baseada em gradiente opera sobre essa auto-representação, fecharia o ciclo que começa em McCarthy, passa por Backus e chega aos transformers modernos. Ela realizaria computacionalmente o que Hofstadter descreveu filosoficamente: um strange loop em que a representação que o sistema faz de si mesmo está causalmente conectada à sua própria operação.