A inspiração para esta pergunta é a seguinte (vaga) pergunta: Quais são os fundamentos lógicos / da linguagem de programação para ter uma IA que possa raciocinar sobre seu próprio código-fonte e modificá-lo?
Isso não é rigoroso, então aqui está minha tentativa de extrair uma questão concreta. Há duas coisas que me interessam:
(A) Uma linguagem de programação P que pode representar e manipular seus próprios programas como um programa de tipo de dados (por exemplo, como um AST). (Se desejado, um objeto do tipo Programa pode ser convertido em uma String, que é o texto de um programa válido nesse idioma. Isso seria o oposto do que um compilador faz.)
(B) Um método para raciocinar sobre o que um programa na linguagem P faz. Aqui estão dois níveis em que estou pensando:
- Outra linguagem Q (com recursos de prova de teoremas) que modela o que um programa P faz. Deveria poder expressar e provar declarações como "o resultado da execução do Programa p é foo".
- Uma maneira de raciocinar sobre o que um programa p: Program faz na própria linguagem P. (Portanto, estamos considerando P = Q acima.)
Até que ponto algo como isso foi implementado ou qual é o progresso nessa direção? Quais são os obstáculos práticos? À luz da intenção original da pergunta, qual é a melhor maneira de formalizar o problema?
*
Como as respostas mostram (obrigado!), Ambos (A) e (B1) podem ser feitos separadamente, embora pareça que fazê-los juntos seja mais uma questão de pesquisa.
Aqui estavam alguns dos meus primeiros pensamentos sobre a questão (aviso: bastante vago). Veja também meus comentários sobre a resposta de Martin Berger.
Estou interessado na linguagem de programação que modela a mesma linguagem de programação, em vez de uma mais simples (então P = Q acima). Isso seria uma "prova de conceito" de um programa capaz de "raciocinar sobre seu próprio código-fonte". Linguagens de programação tipicamente dependentes podem dar garantias sobre as saídas de suas funções, mas isso não conta como "raciocínio sobre seu próprio código-fonte" mais do que um "Olá, mundo!" conta como um quine em um idioma que automaticamente imprime uma string nua --- precisa haver algum tipo de citação / auto-referência. O analógico aqui está tendo um tipo de dados representando o Programa.
Parece um projeto bastante grande - quanto mais simples a linguagem, mais difícil é expressar tudo nela; quanto mais complicada a linguagem, mais trabalho deve ser feito para modelar a linguagem.
No espírito do Teorema da Recursão, um programa pode "obter" seu próprio código-fonte e modificá-lo (ou seja, gerar uma versão modificada de si mesmo). (B2) nos diz que o programa deve ser capaz de expressar uma garantia sobre o programa modificado (isso deve ser capaz de se recuperar, ou seja, deve ser capaz de expressar algo sobre todas as modificações futuras-).