É imaginável ensinar uma máquina a se programar para uma especificação definida? [fechadas]

12

Um amigo meu, sem conhecimentos de programação, fez-me esta pergunta e achei interessante.

Eu acho que não é possível, porque exigiria uma inteligência artificial realmente avançada capaz de analisar o texto de um problema, pensar em uma solução e programá-lo. Só de pensar em uma máquina capaz de programar uma calculadora simples parece-me bastante avançado.

Mas talvez eu esteja errado e gostaria de saber o que você acha disso e se você tem conhecimento de algum artigo / pesquisa sobre o assunto, ou se ele já existe ou se existe a possibilidade de selecionar uma especificação e obter a máquina para auto-programar para esta "especificação?"

florian
fonte
4
Definir programação. Eu poderia criar um programa que cria outros programas. Mas isso realmente aprenderia?
Pieter B
Sim, a questão não é sobre geração de código, mas sobre programação real, como fazemos como desenvolvedores.
florian
Depende do que é o programa. Um programa com muita lógica de negócios processual seria muito mais difícil (e muito menos viável) do que algo funcional e puramente baseado em matemática. (Essa é uma intuição, de qualquer maneira, mas eu não tenho nenhuma maneira de voltar-se que, infelizmente.)
lunchmeat317
@florian: Nós mesmos somos máquinas que aprenderam a programar (assumindo que aliens / god nos criou :-)). É claro que ainda não adquirimos a capacidade de programar seqüências de DNA, etc., se você criar uma máquina que precise aprender a programar eventualmente, precisará programá-la para "evoluir" e, eventualmente, aprender como ela mesma foi programada.
Nav
2
@ maple_shaft: tornei a pergunta mais objetiva, alinhando-a com as respostas existentes, e fiquei imaginando se ela poderia ser reaberta na sua forma atual.
Tom Au

Respostas:

15

Joel realmente respondeu a isso alguns anos atrás . O significado real de "ensinar uma máquina a programar por si só" é "ensinar uma máquina a obter uma especificação e criar um programa que corresponda a essa especificação". E com isso em mente:

O problema aqui é muito fundamental. Para provar mecanicamente que um programa corresponde a algumas especificações, a própria especificação precisa ser extremamente detalhada. De fato, a especificação precisa definir tudo sobre o programa; caso contrário, nada pode ser provado automática e mecanicamente. Agora, se a especificação definir tudo sobre como o programa se comportará, eis que ele contém todas as informações necessárias para gerar o programa! E agora alguns nerds vão para um lugar muito escuro, onde começam a pensar em compilar automaticamente especificações em programas e começam a pensar que acabaram de inventar uma maneira de programar computadores sem programar.

Agora, este é o equivalente da engenharia de software de uma máquina de movimento perpétuo. É uma daquelas coisas que os crackpots continuam tentando fazer, não importa o quanto você diga a eles que nunca funcionaria. Se a especificação define precisamente o que um programa fará, com detalhes suficientes para que possa ser usado para gerar o programa em si, isso apenas levanta a questão: como você escreve a especificação? Uma especificação tão completa é tão difícil de escrever quanto o programa de computador subjacente, porque tantos detalhes precisam ser respondidos pelo criador de especificações quanto o programador. Para usar a terminologia da teoria da informação: a especificação precisa de tantos bits de entropia de Shannon quanto o próprio programa de computador. Cada bit de entropia é uma decisão tomada pelo escritor de especificações ou pelo programador.

Portanto, o ponto principal é que, se realmente houvesse uma maneira mecânica de provar as coisas sobre a correção de um programa, tudo o que você seria capaz de provar é se esse programa é idêntico a outro programa que deve conter a mesma quantidade de entropia como o primeiro programa, caso contrário, alguns dos comportamentos serão indefinidos e, portanto, não comprovados. Portanto, agora a redação das especificações é tão difícil quanto a redação de um programa, e tudo o que você fez foi mudar um problema daqui para cá e não conseguiu nada.

A única maneira de contornar isso seria produzir um computador sapiente real com intuição suficiente para fazer todo o preenchimento de lacunas que você e eu fazemos automaticamente, o tempo todo, ao produzir software ... nesse caso, você acabaria com um computador que se programa tanto quanto com um desenvolvedor humano. ;)

Mason Wheeler
fonte
7
Posso escrever uma especificação completa para um algoritmo de classificação com muito mais facilidade do que posso criar classificação de inserção, classificação rápida ou classificação de bucket. No entanto, você afirma que é fácil transformar o primeiro em segundo.
precisa saber é o seguinte
Joel ... disse o suficiente! ;-) Entendo que, para fazer isso, precisaríamos de uma especificação em um determinado idioma. Mas não estou totalmente convencido sobre o argumento de que a especificação deve ser muito detalhada. Nós, como desenvolvedores, somos capazes de desenvolver um programa sem ter uma especificação muito detalhada. Não podemos desenvolver uma inteligência artificial capaz de tomar alguma decisão "aleatória" sobre o design de um programa?
florian
6
@florian Então você quer que o programa execute a tarefa de interpretação de especificações que os programadores humanos realizam? Depois, torna-se o antigo problema da "IA forte", que inúmeras pessoas inteligentes pesquisaram por décadas sem nenhum progresso a mostrar. Há um debate filosófico acalorado sobre se a IA é mesmo metafisicamente possível, muito menos praticamente possível no futuro distante, e, na minha experiência, ninguém além de vendedores de óleo de cobra prevê forte IA no futuro próximo.
Eu realmente não quero, eu estava me perguntando (como meu amigo me perguntou) se isso era possível. Entendo perfeitamente que a IA realmente não existe e se resume a algumas escolhas programadas "aleatórias".
Florian
2
@ raptortech97: Não, você não pode. Não é "completo" no significado desta pergunta. Para que suas especificações sejam tão completas que possam ser transformadas mecanicamente em um programa executável, elas precisam ser escritas em uma linguagem de programação. Caso contrário, suas especificações terão um comportamento indefinido ou você está apenas escrevendo código em um documento do MSWord.
Whatsisname
4

Claro, nós fazer isso tudo o tempo (para subconjuntos extremamente limitado de problemas). É bastante trivial imaginar dar mais um passo ou dois e vincular algo como Siri à entrada desses geradores de código (ou algo como Wolfram Alpha) que, por sua vez, escreve código e resolve seu problema. Eu esperaria que algo já exista em algum lugar para fazer as coisas mais básicas.

O problema de escrever software complexo para empresas não é criar um programa para escrever o código - é escrever um programa para obter os requisitos.

Telastyn
fonte
Obrigado pelos links. Mesmo que o Yacc e o Xamarin sejam geradores de código puramente determinísticos. Eles não criam coisas do zero.
florian
@ Florida - nada cria coisas a partir do zero. Sempre há alguma entrada, eles são apenas mais exigentes do que a maioria.
Telastyn
1
@Telastyn: comparar a entrada / saída de um gerador de analisador com a entrada / saída de uma mente humana como sendo "mais exigente" é na melhor das hipóteses.
Whatsisname
2

Acho que a resposta de @Mason Wheeler mantém a ideia principal. É assim:

A entropia de Shannon do jogo da velha é realmente pequena. Então, chamamos tic-tac-toe de um jogo "resolvido" ou "determinístico". Não é realmente interessante quando você passa a escola primária. Damas tem uma entropia mais alta, se você considerar a entropia de todos os jogos possíveis que pode jogar. Mas as damas também são um jogo "resolvido" ou "determinístico". Se você se mover primeiro, você deve vencer ou empatar. O xadrez tem uma entropia muito, muito maior, mas nenhum ser humano venceu os melhores jogadores de computador desde 2006. Então, de certa forma, os computadores dominam o xadrez de uma maneira que os humanos não conseguem. Big Blue analisou a wikipedia e depois jogou Jeopardy contra jogadores humanos, e venceu-os profundamente.

Qual é o próximo? Qual é a entropia de um romance, ou os sonetos de Shakepeare?

Da mesma forma, no espaço de programação, o que provavelmente surgirá é um conjunto crescente de competências. O Prolog solucionou um conjunto de problemas no computador em que você configurou o problema e o computador resolveu a resposta. Alguém provavelmente encontrará classes de problemas simples de programação que um computador poderá satisfazer etc. Então, alguém desenvolverá isso para produzir "personalização sob demanda" em algum espaço problemático. E por aí vai.

Eu acho que a pergunta se transforma: quanto tempo leva uma IA para dominar uma determinada quantidade de entropia ... e quantos recursos de computação são necessários? Eu acho que é inimaginável que um computador não possa dominar a entropia dominada pelo melhor cérebro humano - não há nada mágico no cérebro - mas a questão é: quantos núcleos você precisa e quantos séculos serão necessários para chegar lá?

Mas ... um computador será capaz de fazer meu trabalho? Inconcebível!

Roubar
fonte
Eu acho que é justo dizer que o Jeopardy é um caso um pouco especial: tudo se resume a recordar e associar fatos. Pegue até os melhores especialistas e haverá pepitas de conhecimento público que eles desconhecem ou que não conseguem lembrar sob pressão. Por outro lado, para um computador capaz de analisar uma enciclopédia (como Wikipedia, Encyclopedia Britannica ou qualquer outra), nenhum fato declarado nessa enciclopédia é mais (ou menos) exótico do que qualquer outro.
um CVn
1

É difícil responder porque, assim como a inteligência artificial, uma vez que tenhamos conseguido isso, será porque teremos escrito um programa que o fará. E os críticos dirão: "Bem, esta máquina não está realmente se programando! Apenas segue exatamente o programa que você deu!"

Bem, sim. Tudo o que conseguiremos realizar com computadores, faremos dando a ele algum programa e ele será executado. Se isso é um argumento contra, então não podemos realizar nada. E, no entanto, em algum momento, as pessoas pensavam que um xadrez jogando computador seria obviamente inteligente. Agora eles podem, e sabemos exatamente como, e não pensamos que isso seja inteligente. Submarinos ainda não sabem nadar.

Então - considere alguns exemplos.

Desde décadas, temos geradores de analisadores . Você fornece a descrição de um idioma, ele é processado e o resultado é o código para um analisador desse idioma. Sabemos exatamente como é feito, mas isso não é um programa de computador?

Segundo - editores que informam que você cometeu um erro (erro de sintaxe, variável inexistente, etc.). Ele não programa nada, mas pode dizer que você fez algo errado. É muito apenas na superfície.

Idiomas nos quais você pode simplesmente clicar e arrastar os controles da interface do usuário, e o código que realmente os fará funcionar é gerado automaticamente.

Compiladores JIT. Software que pode reconhecer pontos ativos no software atualmente em execução e substituir alguns deles por código compilado altamente otimizado, otimizando-se efetivamente enquanto é executado. Penso que este é um exemplo do que pode parecer ser uma máquina programada em si, até que você saiba exatamente como isso acontece, e acaba fazendo o que o programador mandou, como sempre.

Jogo geral. Esse é um campo interessante de pesquisa, no qual os pesquisadores escrevem programas que podem ler descrições das regras dos jogos, que os programas jogam um contra o outro. Portanto, em vez de um programa do jogo da velha ou um programa de xadrez, esses são programas que lêem as regras do jogo da velha ou do xadrez ou algum novo jogo criado no local e podem ser jogados. O programa não está programando sozinho, mas joga xadrez sem que as regras do xadrez tenham sido codificadas. Houve um tempo em que isso seria claramente considerado como o computador ensinando algo a si mesmo.

Demos vários pequenos passos na direção geral.

Mas não consigo pensar em nenhum programa que se reescreva com base nos resultados de execuções anteriores ou que reconheça rotinas obsoletas ou ineficientes em seu próprio código. Acho que um dia teremos isso, e não consideraremos nada de especial, pois será apenas um recurso do compilador mais recente ...

RemcoGerlich
fonte
0

Não no momento nem no futuro próximo, porque você precisa de toda a incrível complexidade do cérebro humano para criar um programa. E mesmo assim, esses cérebros precisam ser altamente treinados para fazê-lo adequadamente, e mesmo assim nem todos são capazes de executar a tarefa, embora se possa argumentar que, com tempo suficiente, você pode treinar alguém para programar.

Eu entendi da maneira como você formulou sua pergunta que você não está falando sobre tarefas simples emuladas.

Você solicitou artigos e este artigo do Science Blogs sobre Developing Intelligence responde a essa pergunta de várias maneiras.

Ian Macintosh
fonte