Alguém realmente criou um sistema que grava programas de computador a partir da especificação?

17

Alguém já escreveu um sistema (software ou explicação detalhada no papel, com exemplos simples) que gera programas de computador? Eu introduzo e ele cria um programa que lista os números primos menores que 10. é simplesmente definido como professores dizem que podem, mas ninguém dá exemplos completos reais.PrEume(x)x<10PrEume(x)

1<xUMAs.t.1<UMAUMA<xx=UMA×B, com UMA,BN
cody
fonte
13
Você quer dizer, você sabe, um compilador para uma linguagem de programação de uso geral?
Sasho Nikolov 02/03
1
Olá - bem-vindo à história! Infelizmente, sua pergunta não é uma questão de nível de pesquisa em ciência da computação teórica e está fora de tópico neste site.
Na verdade, esta é uma boa pergunta, no topo da pesquisa atual, e muito promissora. No entanto, geralmente é muito difícil especificar exatamente o que você deseja. Se você conseguir especificá-lo, precisará de um sistema que prove que faz sentido, que é viável e exigirá uma prova matemática. A partir dessa prova, um programa pode ser extraído. Mas a pesquisa para automatizar a prova e a extração do programa ainda está na infância, apesar de fazer um bom progresso. Você pode ver, por exemplo, Coq na wikipedia.- - - cc @LevReyzin
babou
2
Aqui está um livro correspondente à sua pergunta. Há outros. É não simples de entender. A multidão Coq e Isabelle (outro sistema desse tipo) inclui usuários do SE que poderiam fornecer mais informações e exemplos se a pergunta não fosse encerrada. Eu o encontrei pesquisando na web: síntese de programas de exemplo coq.
babou
2
A área de ciência da computação que captura o que você está perguntando é chamada síntese de programa e é uma área ativa de pesquisa.
Huck Bennett

Respostas:

11

Este é um tópico de pesquisa muito ativo, muito promissor, embora a automação completa da geração de programas provavelmente tenha limitações intrínsecas (mas os seres humanos são melhores?). Mas a ideia ainda é muito útil para auxiliar consideravelmente a criação de programas, mecanizando muitas etapas e verificando automaticamente a correção da geração do programa.

Está fortemente relacionado a um resultado na lógica, chamado de correspondência de Curry-Howard (ou isomorfismo), que mostra que programas de computador e provas matemáticas são muito semelhantes.

Portanto, a idéia é que o sistema leve a especificação do programa como um teorema a ser provado. No caso do seu exemplo, seria algo como (informalmente): "existe um conjunto de todos os números primos menores que 10".

Em seguida, você tentará provar esse teorema, e os sistemas existentes o ajudarão a fazer a prova, automatizando algumas partes, possivelmente toda a prova e garantindo que você nunca cometa erros.

A partir dessa prova, pode-se extrair um programa que realmente calcula a lista desejada de números primos que foram especificados inicialmente.

Vários sistemas foram desenvolvidos no passado para elucidar essas idéias. Um dos mais conhecidos foi o LCF de Robin Milner , que criou o idioma ML para esse fim. Um dos sistemas mais avançados atualmente é o Coq .

Existem exemplos totalmente elaborados, alguns deles bastante complexos. Você pode encontrar algumas no artigo a seguir , embora não seja uma leitura simples e exija conhecimentos avançados de lógica.

babou
fonte
9

A resposta da pergunta: Sim, mas no momento da redação deste artigo, para a maioria dos programas não triviais, as especificações parecem tão difíceis de escrever e depurar quanto os programas.

Mais seriamente, a resposta do babou é boa, mas também vou sugerir verificar a área dos tipos dependentes. Há um livro bastante bom usando Coq (isenção de responsabilidade completa: escrita por um amigo meu), mas também há Epigram, Agda e Idris. Isabelle / HOL também vale a pena conferir.

Tudo isso é baseado no cálculo de construções. Se você quiser conhecer a base teórica, procure a teoria do tipo Martin-Löf. Existem algumas ótimas apresentações por aí.

Pseudônimo
fonte
Concordo plenamente com as especificações (e também com o restante da sua resposta, mas você a conhece melhor do que eu). Qualquer programador real sabe o quão difícil é especificar completamente o que um programa deve fazer. É uma questão importante em engenharia de software. E isso também se traduz aqui, mesmo que os problemas abordados sejam mais matemáticos em geral. No entanto, eu não queria parecer muito desanimador (especialmente devido ao histórico dessa pergunta, ilustrado pelo primeiro comentário).
babou
4

Seguindo uma tangente aqui, os geradores de programas (ou seja, sistemas que fornecem uma descrição de alto nível de algo em alguma linguagem especial) estão sempre presentes. Qualquer compilador é um desses, assim como qualquer um dos muitos geradores de analisadores. Naquela época, os sistemas chamados "idiomas de terceira geração", que geravam (a maioria do) código de um aplicativo de negócios típico, dada uma descrição de alto nível e um catálogo de dados disponíveis, eram populares.

vonbrand
fonte
1

A programação lógica e, de maneira mais geral, a programação declarativa tomam como premissa exatamente o que você propõe: ou seja, a partir de uma especificação lógica, retorna um resultado que atenda a essa especificação.

Uma área que parece abordar especificamente o exemplo "números primos menores que 10" que você fornece é a Programação de Restrições, que tenta encontrar soluções para problemas que envolvem certas restrições, incluindo restrições de número inteiro como as que você forneceu.

Você pode tentar o ECLiPSe para uma implementação específica (de código aberto) desse sistema.

cody
fonte
Seria correto dizer que o paradigma da lógica / restrição é mais para especificar respostas do que para especificar programas. Obviamente, você pode dizer que uma especificação incompleta é um programa. Mas de alguma forma, não tenho certeza se é o mesmo jogo que a síntese do programa. É verdade, porém, que ele responde ao exemplo, porque o exemplo era muito simples. Não pretendo dizer que a programação de restrições seja apenas para problemas simples.
babou