È immaginabile insegnare a una macchina come programmarsi secondo una specifica definita? [chiuso]


12

Un mio amico senza conoscenze di programmazione mi ha posto questa domanda e l'ho trovata interessante.

Penso che non sia possibile perché richiederebbe un'intelligenza artificiale davvero avanzata in grado di analizzare il testo di un problema, pensare a una soluzione e programmarla. Il solo pensiero di una macchina in grado di programmare una semplice calcolatrice mi sembra piuttosto avanzato.

Ma forse mi sbaglio e vorrei sapere cosa ne pensi e se sei a conoscenza di articoli / ricerche sull'argomento, o se esiste già o se esiste la possibilità di selezionare una specifica e ottenere il macchina per auto-programmare a questa "specifica?"


4
Definire la programmazione. Potrei costruire un programma che farebbe altri programmi. Ma imparerebbe davvero?
Pieter B,

Sì, la domanda non riguarda la generazione del codice ma la vera programmazione come facciamo come sviluppatori.
Florian,

Dipende da quale sia il programma. Un programma con molta logica aziendale procedurale sarebbe molto più difficile (e molto meno fattibile) di qualcosa di funzionale e basato esclusivamente sulla matematica. (Questa è un'intuizione, comunque, ma non ho modo di sostenerlo, sfortunatamente.)
lunchmeat317

@Florian: Noi stessi siamo macchine che hanno imparato a programmare (supponendo che alieni / dio ci abbiano creati :-)). Naturalmente non abbiamo ancora acquisito la capacità di programmare sequenze di DNA ecc., Quindi se crei una macchina che deve imparare a programmare alla fine, devi programmarla per "evolvere" e infine imparare come è stata programmata.
Nav

2
@maple_shaft: ho reso la domanda più obiettiva allineandola alle risposte esistenti e mi chiedevo se potesse essere riaperta nella sua forma attuale.
Tom Au,

Risposte:


15

Joel in realtà ha risposto a questo qualche anno fa . Il vero significato di "insegnare a una macchina come programmare da solo" è "insegnare a una macchina come prendere una specifica e creare un programma corrispondente a quella specifica". E con questo in mente:

Il problema, qui, è molto fondamentale. Per dimostrare meccanicamente che un programma corrisponde ad alcune specifiche, le specifiche stesse devono essere estremamente dettagliate. In effetti, le specifiche devono definire tutto sul programma, altrimenti nulla può essere dimostrato automaticamente e meccanicamente. Ora, se le specifiche definiscono tutto su come si comporterà il programma, allora, ecco, contiene tutte le informazioni necessarie per generare il programma! E ora alcuni geek vanno in un posto molto buio in cui iniziano a pensare di compilare automaticamente le specifiche in programmi e iniziano a pensare di aver appena inventato un modo per programmare i computer senza programmare.

Ora, questo è l'equivalente di ingegneria del software di una macchina a moto perpetuo. È una di quelle cose che i crackpot continuano a provare a fare, non importa quanto dici che non potrebbe mai funzionare. Se la specifica definisce esattamente cosa farà un programma, con abbastanza dettagli da poter essere utilizzata per generare il programma stesso, questo fa sorgere la domanda: come si scrive la specifica? Una specifica così completa è difficile da scrivere quanto il programma per computer sottostante, perché lo scrittore di specifiche deve rispondere a tanti dettagli come il programmatore. Per usare la terminologia dalla teoria dell'informazione: le specifiche necessitano di altrettante parti dell'entropia di Shannon di quante ne avrebbe il programma per computer. Ogni bit di entropia è una decisione presa dallo spec-writer o dal programmatore.

Quindi, la linea di fondo è che se ci fosse davvero un modo meccanico per dimostrare le cose sulla correttezza di un programma, tutto ciò che si sarebbe in grado di dimostrare è se quel programma è identico a qualche altro programma che deve contenere la stessa quantità di entropia come primo programma, altrimenti alcuni comportamenti saranno indefiniti e quindi non dimostrati. Quindi ora la scrittura delle specifiche è dura quanto la scrittura di un programma, e tutto ciò che hai fatto è stato spostato un problema da qui a laggiù, e non hai realizzato nulla.

L'unico modo per aggirare questo sarebbe quello di produrre un vero e proprio computer sapiente con abbastanza intuizione per fare tutto il riempimento di spazi che io e te facciamo automaticamente, sempre, quando produciamo software ... nel qual caso tu finirei con un computer che si programma da solo e uno sviluppatore umano. ;)


7
Sono in grado di scrivere una specifica completa per un algoritmo di ordinamento molto più facilmente di quanto riesca a inventare ordinamento per inserzione, ordinamento rapido o bucket. Eppure affermi che è facile trasformare il primo nel secondo.
raptortech97

Gioele ... Ha detto abbastanza! ;-) Capisco che per farlo, avremmo bisogno di una specifica in una determinata lingua. Ma non sono del tutto convinto dell'argomento secondo cui le specifiche dovrebbero essere molto dettagliate. Come sviluppatori, siamo in grado di sviluppare un programma senza avere una specifica molto dettagliata. Non possiamo sviluppare un'intelligenza artificiale in grado di prendere una decisione "casuale" sulla progettazione di un programma?
Florian,

6
@florian Quindi vuoi che il programma esegua il compito di interpretare le specifiche dei programmatori umani? Quindi diventa l'annoso problema della "forte intelligenza artificiale", che numerose persone intelligenti hanno studiato per decenni senza alcun progresso da dimostrare. C'è un acceso dibattito filosofico sul fatto che l'IA sia persino metafisicamente possibile, molto meno praticamente possibile in un lontano futuro, e nella mia esperienza nessuno tranne i venditori di serpenti predice un'intelligenza artificiale forte nel prossimo futuro.

Non lo voglio davvero, mi stavo chiedendo (come mi ha chiesto il mio amico) se fosse possibile. Capisco perfettamente che l'IA non esiste realmente e che dipende solo da alcune scelte programmate "casuali".
Florian,

2
@ raptortech97: No, non puoi. Non "completo" nel significato di questa domanda. Affinché le vostre specifiche siano così complete da poter essere trasformate meccanicamente in un programma eseguibile, devono essenzialmente essere scritte in un linguaggio di programmazione. In caso contrario, le specifiche avranno un comportamento indefinito o si sta semplicemente scrivendo codice in un documento MSWord.
whatsisname

4

Certo, noi facciamo questo tutto il tempo (per i sottoinsiemi estremamente limitate di problemi). È abbastanza banale immaginare di fare un altro passo o due e legare qualcosa come Siri nell'input di questi generatori di codice (o qualcosa come Wolfram Alpha) che a sua volta scrive codice e risolve il tuo problema. Mi aspetto che qualcosa esista già da qualche parte per fare le cose più basilari.

Il problema con la scrittura di software complessi per le aziende non è creare un programma per scrivere il codice, ma scrivere un programma per ottenere i requisiti.


Grazie per i collegamenti. Anche se Yacc e Xamarin sono generatori di codice puramente deterministici. Non creano cose da zero.
Florian,

@Florian: niente crea cose da zero. C'è sempre qualche input, sono solo più esigenti della maggior parte.
Telastyn,

1
@Telastyn: confrontare l'input / output per un generatore di parser con l'input / output per una mente umana in quanto "più esigente" è nella migliore delle ipotesi insignificante.
whatsisname

2

Penso che la risposta di @Mason Wheeler abbia l'idea chiave. Va così:

L'entropia di Shannon di Tic-tac-toe è davvero piccola. Quindi chiamiamo tic-tac-toe un gioco "risolto" o "deterministico". Non è davvero interessante una volta superata la scuola elementare. Checkers ha un'entropia più elevata, se si considera l'entropia di tutti i giochi possibili a cui è possibile giocare. Ma anche la dama è un gioco "risolto" o "deterministico". Se ti muovi per primo, dovresti solo vincere o pescare. Gli scacchi hanno un'entropia molto, molto più elevata, ma nessun umano ha battuto i migliori giocatori di computer dal 2006. Quindi, in un certo senso, i computer hanno dominato gli scacchi in un modo che gli umani non possono. Big Blue ha analizzato Wikipedia, quindi ha giocato a Jeopardy contro giocatori umani e li ha battuti profondamente.

Qual è il prossimo? Qual è l'entropia di un romanzo o dei sonetti di Shakepeare?

Allo stesso modo, nello spazio di programmazione, ciò che probabilmente emergerà è un insieme crescente di competenze. Prolog ha risolto una serie di problemi del computer in cui è stato impostato il problema e il computer ha risolto la risposta. Qualcuno probabilmente troverà classi di semplici problemi di programmazione che un computer sarà in grado di soddisfare, ecc. Quindi qualcuno si baserà su questo per produrre "personalizzazione su richiesta" all'interno di uno spazio problematico. E così va.

Penso che la domanda si trasformi in: quanto tempo impiega un'intelligenza artificiale a padroneggiare una determinata quantità di entropia ... e quante risorse di elaborazione sono necessarie? Penso che sia inimmaginabile che un computer non sia in grado di dominare l'entropia dominata dal miglior cervello umano - non c'è nulla di magico nel cervello - ma la domanda è: quanti nuclei hai bisogno e quanti secoli ci vorranno per arrivarci?

Ma ... un computer sarà mai in grado di fare il mio lavoro? Inconcepibile!


Penso che sia giusto dire che Jeopardy è un po 'un caso speciale: si riduce a ricordare e associare fatti. Prendi anche i migliori specialisti e ci saranno pepite di conoscenza anche pubblica di cui non sono a conoscenza o incapaci di ricordare sotto pressione. D'altra parte, su un computer in grado di analizzare un'enciclopedia (come Wikipedia, l'Enciclopedia Britannica o qualsiasi altra), nessun fatto dichiarato in quell'enciclopedia è più (o meno) esotico di qualsiasi altro.
un CVn del

1

È difficile rispondere perché, proprio come con l'intelligenza artificiale, una volta che lo avremo fatto sarà perché avremo scritto un programma che lo fa. E i critici diranno: "beh, questa macchina non sta davvero programmando se stessa! Segue semplicemente esattamente il programma che gli hai dato!"

Beh si. Qualunque cosa riusciremo mai a realizzare con i computer, lo faremo dandogli un programma e lo eseguirà. Se questo è un argomento contrario, allora non possiamo realizzare nulla. Eppure, a un certo punto, la gente pensava che un computer che giocava a scacchi sarebbe stato ovviamente intelligente. Ora possono, e sappiamo esattamente come, e non pensiamo che sia intelligente. I sottomarini non sanno ancora nuotare.

Quindi, considera alcuni esempi.

Da decenni disponiamo di generatori di parser . Dai loro una descrizione di una lingua, viene elaborata e il risultato è il codice per un parser per quella lingua. Sappiamo esattamente come è fatto, ma non è un computer a programmare da solo?

Secondo: editor che indicano che hai commesso un errore (errore di sintassi, variabile inesistente, ecc.). Non programma nulla di per sé, ma può dirti che hai fatto qualcosa di sbagliato. È molto solo in superficie.

Lingue in cui è possibile semplicemente fare clic e trascinare i controlli dell'interfaccia utente e il codice che li farà effettivamente funzionare viene generato automaticamente.

Compilatori JIT. Software in grado di riconoscere gli hotspot nel software attualmente in esecuzione e sostituirne parte con codice compilato altamente ottimizzato, ottimizzandosi efficacemente durante l'esecuzione. Penso che questo sia un esempio di ciò che può sembrare una macchina programmatrice stessa, fino a quando non sai esattamente come succede, e poi si scopre che sta facendo ciò che il programmatore gli ha detto, come sempre.

Gioco generale. Questo è un campo di ricerca interessante, in cui i ricercatori scrivono programmi in grado di leggere le descrizioni delle regole dei giochi, che i programmi giocano uno contro l'altro. Quindi, invece di un programma tic-tac-toe o di un programma di scacchi, si tratta di programmi che leggono le regole del tic-tac-toe o degli scacchi o di un nuovo gioco inventato sul posto, e possono quindi giocarli. Il programma non sta programmando se stesso, ma gioca a scacchi senza che le regole degli scacchi siano state codificate. C'è stato un tempo in cui questo sarebbe stato chiaramente considerato il computer che insegnava a se stesso qualcosa.

Abbiamo fatto molti piccoli passi nella direzione generale.

Ma non riesco a pensare a nessun programma che si riscriva in base ai risultati di precedenti esecuzioni o che possa riconoscere routine obsolete o inefficienti nel proprio codice. Penso che un giorno lo avremo e non lo considereremo affatto speciale, in quanto sarà solo una caratteristica dell'ultimo compilatore ...


0

Non attualmente e non nel prossimo futuro perché hai bisogno di tutta la straordinaria complessità del cervello umano per creare un programma. E anche allora quei cervelli hanno bisogno di essere altamente addestrati per farlo correttamente, e anche allora non tutti sono in grado di svolgere il compito, anche se si potrebbe sostenere che con un tempo sufficiente è possibile addestrare chiunque a programmare.

Ho preso dal modo in cui hai formulato la tua domanda che non stai parlando di semplici compiti emulati.

Hai chiesto articoli e questo articolo di Science Blogs su Developing Intelligence risponde a questa domanda in molti modi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.