6 x 9 = 42

“Ho sempre detto che c’era qualcosa di fondamentalmente sbagliato nell’universo…” (Arthur Dent)

Archive for the ‘Informatica’ Category

Il Dilemma dell’Avventuriero

Posted by scardax su settembre 16, 2011

Ci sono alcune tematiche scientifiche che possiamo solo definire trasversali: si ripropongono un po’ ovunque. Una di queste, forse leggermente meno conosciuta al di fuori del mondo accademico, è il cosidetto dilemma dell’exploration vs. exploitation che, in mancanza di una miglior traduzione italiana, chiameremo qui col nome originale. E’ un dilemma al quale tutti noi, seppur inconsciamente, siamo abituati fin dalla più giovane età, e deriva principalmente dal dover agire in un mondo di cui abbiamo solo un’informazione incompleta. Conoscendo solo una porzione di tutto quello che ci circonda, ad ogni decisione da prendere siamo confrontati con due possibili opzioni:

  1. Selezionare l’azione che, secondo la nostra conoscenza, è la migliore in quella circostanza (exploitation),
  2. Esplorare alternative al momento sconosciute, con la possibilità di un rendimento scostante ed eventuali perdite di tempo e risorse (exploration).

Dobbiamo continuare a lavorare sul progetto fallimentare che ci ha tenuti impegnati nelle ultime settimane? O è ora di abbandonarlo per dedicarsi ad altro? Meglio andare alla spiaggia che conosciamo benissimo? O cercarne un’altra? Esempi del genere riempiono la nostra attività cosciente in ogni istante.

La formulazione del problema in questi termini è relativamente recente, fine degli anni ’80, e si è presentata durante lo studio del multi-armed bandit, che in sostanza è una slot machine con N diverse leve, ciascuna delle quali ha una probabilità diversa di vittoria per il giocatore. Senza conoscere questa probabilità a priori, qual’è la strategia migliore a questo gioco? La soluzione dell’americano Gittins prevedeva il calcolo di determinati indici, detti appunto indici di Gittins, e nonostante il grande numero di assunzioni che dovette fare, contribuì a dare una prima formulazione rigorosa di questo dilemma.

Da allora, lo stesso dilemma è ricomparso sempre più spesso, soprattutto (come ci si potrebbe aspettare) nei campi di ricerca interessati a comportamenti “intelligenti” da parte di robot e agenti software: pensiamo ad un giocatore di Poker che può scegliere di sacrificare parte dei suoi guadagni per apprendere qualcosa sul tipo di gioco dell’avversario, o ad un robot mobile che deve decidere come arrivare da qualche parte senza però conoscere ancora la mappa del luogo in cui si trova. Soluzioni tipiche di questo genere di problemi richiediono generalmente alti livelli di esplorazione iniziali (quanto l’ambiente è ancora altamente incerto), e sempre più exploitation man mano che il mondo diventa più conosciuto.

Eppure, fino ad ora i ricercatori si sono concentrati su situazioni sostanzialmente statiche, nelle quali l’ambiente non cambia o, se cambia, cambia poco. Provate a pensare a quanto è difficile, invece, bilanciare questo dilemma in un universo complesso come quello umano, nel quale le informazioni cambiano (a volte anche rapidamente) e spesso sono anche sbagliate di partenza (pensate ai pregiudizi, alle supposizioni errate ecc.). In effetti, ricercatori che indagano sulle modalità neurologiche di questo bilanciamento stanno scoprendo meccanismi sempre più complessi ed affascinanti che regolano il nostro comportamento di tutti i giorni, rendendoci a tratti più avventurosi, a tratti più cauti.

Come semplice esempio per concludere, pensate alla noia: questa non è altro che un modo per dirvi che state sprecando le vostre risorse in un comportamento che non vi porta nulla, e che invece sarebbe meglio investite per esplorare qualcosa che ancora non conoscete. Riusciremo un giorno ad implementare comportamenti similmente complessi in esseri artificiali?

Annunci

Posted in Informatica, Varie | Contrassegnato da tag: , , , , | 5 Comments »

Conosce Abbastanza Chi Sa Come Apprendere

Posted by scardax su ottobre 25, 2010

Nell’ultimo post (scritto, temo, quando “scazzi” faceva solo pensare ad un buffo slang giovanile), abbiamo parlato di istinti, e di come anche l’apprendimento possa essere ricondotto, in ultimissima analisi, ad un istinto incredibilmente sviluppato del genere umano.

In fondo, all’aumentare della complessità di un organismo, va di pari passo un aumento delle sue capacità di apprendimento: mentre il famoso cane di Pavlov sembra poter imparare semplici connessioni causali tramite uno stimolo ripetuto, la capacità dell’uomo di imparare è di dimensioni incomparabilmente maggiori, e gli permette operazioni tanto diverse fra loro quanto quelle di generare una teoria scientifica o di sviluppare una particolare strategia a scacchi.

E’ chiaro come, in questo caso, io stia usando la parola “apprendere” non tanto nel senso scolastico, ovvero “imparare nozioni lette o dette da qualcun altro”, quanto nel senso più generale di generare nuova conoscenza a partire da conoscenza preesistente. Parte dell’apprendimento scolastico puo’ essere considerato un caso particolare di questo senso più ampio, nel quale (almeno in teoria) cerchiamo di far nostro un ragionamento già stabilito e di comprenderne le conclusioni.

Esistono sostanzialmente due tipi di apprendimento: deduzione ed induzione, altrettanto importanti e fra loro complementari, ma la cui distinzione spesso non viene chiarita al punto che spesso essi vengono confusi.

La deduzione è quel processo a cui veniamo abituati durante le lezioni di matematica scolastica: a partire da una serie di assiomi di cui si assume la verità, si cercano di derivare nuovi teoremi e postulati. Questo tipo di ragionamento ha il pregio di essere esatto: una volta accordatici sulla verità degli assiomi, e la correttezza della deduzione, nessuno puo’ dubitare della validità della conclusione. Se accettiamo che “in Estate fa caldo”, e che “adesso è Estate”, non possiamo opporci se poi ci viene detto che “adesso fa caldo”.

Sorvolando per il momento sulla difficoltà di trovare (ed accordarsi) sugli assiomi di base, su cui comunque faremo ritorno fra poco, possiamo comunque notare il grande limite della deduzione: il fatto di dover sempre procedere dal generale verso lo specifico. Avendo a disposizione solo teoremi ed assiomi su rette, non riusciremo mai a dedurre una proprietà su piani, o su volumi. Il confine delle nostre deduzione viene fissato nel momento stesso in cui definiamo l’insieme degli oggetti di cui parlano i nostri assiomi.

L’induzione, invece, è il processo esattamente inverso: da proprietà specifiche cerchiamo di dedurre proprietà più generali. Ci bruciamo due volte toccando una candela, e ne induciamo che il fuoco della candela fa sempre male. Non lo deduciamo, badate bene. Per quante volte una mela cada a terra, non potremo mai dedurre da questi soli fatti che cadrà sempre. Possiamo “indurlo” (in realtà non sono neanche troppo sicuro che si possa dire), oppure possiamo assumere la forza di gravità e dedurre che la mela cadrà. E’ chiaro che, mentre abbiamo perso la certezza delle nostre conclusioni e dobbiamo essere pronti in ogni momento ad ammettere la falsità di alcune di esse, ora il nostro limite risulta essere solo la cautela che poniamo nei nostri salti induttivi. Peraltro, l’unico modo di generare assiomi sembra essere un criterio induttivo.

Per tutti questi motivi, l’induzione appare una forma di ragionamento incredibilmente più potente della deduzione, se ben usata, e ce ne possiamo ben accorgere anche nella difficoltà ad implementarla in maniera automatica. Un robot ben programmato puo’ facilmente dedurre qualcosa da informazioni che già possiede… Ma “indurre” qualcosa? Richiede la capacità di lavorare a diversi livelli di descrizione della realtà, di saper dosare l’audacia delle proprie conclusioni, di poter verificare continuamente quanto si sa, e di cambiare i propri giudizi a seconda di quello che l’evidenza ci presenta. Una sfida incredibilmente più difficile, ma di certo necessaria se vogliamo poter classificare le nostre macchine come “intelligenti”.

Quanto vi interessa l’argomento? [O meglio, mi seguite ancora dopo tutto questo tempo? Battete un colpo!]

Righe conclusive: il titolo è una mia personale variazione sulla famosa frase “They know enough who know how to learn” di Adams. Per l’idea del post, si ringraziano le slides dei corsi del Prof. Rizzi.

Posted in Informatica, Riflessioni | Contrassegnato da tag: , , , , , , | 8 Comments »

Ci Sono Macchine e Macchine

Posted by scardax su agosto 18, 2009

I grandi nomi dell’Informatica – Parte 2

Oggi un post molto speciale: due vite messe a confronto, entrambe di due “padri” dell’informatica, ovvero Alan Turing e John Von Neumann, scienziati eclettici, brillanti, trovatisi al centro della Seconda Guerra Mondiale, e la cui vita é terminata con un finale degno delle migliori tragedie greche.

Alan Turing nasce nel 1908 a Londra, ma non si distingue particolarmente a scuola, soprattutto a causa della sua difficoltà ad impegnarsi in materie da lui ritenute poco interessanti, quali lo studio della Bibbia o del latino. Von Neumann, invece, nato nel 1903 a Budapest, si distingue fin da giovanissimo per la sua memoria prodigiosa e la sua grandissima intelligenza, venendo nominato miglior studente di matematica di tutta l’Ungheria già a diciotto anni, quando pubblica il suo primo lavoro.

Se Alan segue fin da subito la sua passione per la matematica, riuscendosi ad iscrivere a Cambridge, Von Neumann é costretto a seguire un percorso più tortuoso: il padre lo vuole iscritto ad una materia più “redditizia”, e John decide di far contenti entrambi prendendo simultaneamente due lauree: una in Chimica, ed una in Matematica.

Mentre Alan cerca di raggiungere una sua maturità caratteriale e scientifica, ostacolato dal suo carattere introverso, dalla sua scrittura disordinata e, soprattutto, dalla sua omosessualità, Von Neumann si destreggia alla perfezione nel mondo accademico, e si trasferisce al cuore della Matematica dell’epoca, Gottinga, dove il secolo prima avevano lavorato Gauss e Riemann. Qui si interessa a quella che viene definita metamatematica, ovvero lo studio della matematica nel suo complesso; alla Fisica Quantistica, sulla quale scrive un libro molto apprezzato dallo stesso Turing, ed in cui comincia a sviluppare la Teoria dei Giochi (in parallelo con il francese Borel).

Ma il futuro di entrambi era l’America: John Von Neumann é invitato a Princeton nel 1930, e pochi anni dopo sarà uno dei sei professori fondatori dell’Institute for Advanced Studies, che diventerà il fulcro dell’attività scientifica mondiale in seguito all’esodo dei principali scienziati ebrei della Germania (fra i quali vi era lui stesso). Anche Turing viene invitato a Princeton, dove conosce John, e dove dà uno dei suoi contributi maggiori alla Scienza: l’articolo On Computable Numbers, che descrive i limiti teorici dei calcolatori, e l’idea stessa di “calcolatore universale” (ovvero una macchina capace di simulare qualunque altra macchina) prima ancora che si cominciassero a costruire i computers. Ma, soprattutto, l’articolo risolveva anche uno dei principali problemi di metamatematica, dimostrando che era impossibile ottenere un metodo meccanico che dimostrasse la verità o la falsità di un qualsiasi enunciato matematico.

La Seconda Guerra Mondiale stava pero’ chiamando entrambi a giocare il loro ruolo nel conflitto mondiale: Von Neumann lo fece sotto gli occhi di tutti, diventando uno dei principali consulenti del progetto Los Alamos per la costruzione di una bomba atomica, mentre Turing lo fece in segreto, lavorando come criptanalista (diventando rapidamente il più rinomato) per la decifrazione dei codici tedeschi (codificati tramite la macchina Enigma). Entrambi questi lavori permisero ai due scienziati di entrare a contatto con macchine di una certa complessità, anche se ancora “stupide”, ovvero incapaci di modificare il proprio comportamento.

Finita la guerra, forti di queste esperienze, entrambi si gettarono sulla costruzione di un calcolatore che fosse invece universale: Turing divento’ consulente del progetto britannico per l’ACE ma, in seguito a rallentamenti burocratici e tecnici sulla sua costruzione, decise di trasferirsi e lavorare presso il già terminato prototipo del Mark I presso Manchester. Se Turing cominciava a teorizzare la nascitura arte della programmazione, pubblicando un libro sulla programmazione del Mark I, Von Neumann concepiva invece un’architettura per i calcolatori, da utilizzare sul progetto dell’EDVAC attualmente in costruzione in America, che ancora oggi resta centrale.

Seppur accomunati da cosi’ tante passioni, i due non potevano pero’ essere più diversi caratterialmente: Alan era spesso vestito in modo sciatto, incurante dei modi di vivere in comunità, con una voce spesso troppo acuta, a volte irritabile ed intransigente sulle sue idee, mentre John era rinomato per il suo senso dell’humour, per le sue feste e, soprattutto, per le sue tante ragazze. Inoltre, John resto’ sempre al cuore della politica, convinto anticomunista, lavorando ai problemi relativi ai missili intercontinentali e consulente del governo statunitense sulle questioni militari, mentre Alan, terminata la guerra, se ne disinteresso’ completamente.

I due avevano ancora molto da dare al mondo, ed entrambi si interessavano del comportamento umano. Von Neumann termino’ di teorizzare la sua Teoria dei Giochi, che cercava di spiegare il comportamento umano in ambienti competitivi, mentre Turing profetizzava l’avvento delle “macchine intelligenti” pubblicando nel 1950 l’ormai leggendario “Machine Computery and Intelligence” che, convenzionalmente, segna l’inizio degli studi sull’Intelligenza Artificiale.

Anche i loro ultimi lavori furono in qualche maniera accomunati: Alan si volse verso la biologia, e pubblico’ un’articolo su una sua propria teoria della morfogenesi (lo sviluppo di un organismo) che riscosse un certo plauso nella comunità scientifica, mentre Von Neumann sviluppo’ una “teoria degli automi”, programmi capaci di autoriprodursi (come il “gioco” Life, di cui abbiamo parlato nell’articolo Anno Nuovo, Giochi Vecchi).

Durante queste loro ultime ricerche, pero’, il loro declino era già iniziato e si profilava inesorabile. Alan venne arrestato per omosessualità, processato e condannato ad una terapia innovativa a base di ormoni, che lo rese impotente e, probabilmente, influi’ anche sul suo già fragile stato emotivo, mentre Von Neumann fu costretto sulla sedia a rotelle da un tumore alle ossa, forse risultato di un eccesso di radiazioni assorbito mentre assisteva ad un test atomico sull’isola di Bikini.

Alan Turing muore nel 1954, forse suicida, addentando una mela intrisa di cianuro (anche se la madre continuo’ a ritenerlo un incidente, mentre il suo biografo Hodges si spinge ad ipotizzare un coinvolgimento dei servizi segreti), mentre Von Neumann si spense nel 1957. Solo pochi amici restarono al loro fianco fino alla fine, e con la loro morte si chiudeva la prima fase di sviluppo dei calcolatori: di li a poco, con l’avvento dei transistor, essi avrebbero raggiunto la maturità arrivando a livelli forse impensabili per i loro stessi genitori.

Mentre il lavoro di Von Neumann fu, anche mentre egli era in vita, considerato da subito brillante e geniale, il valore di Turing non venne invece completamente capito (Von Neumann fu uno dei pochi a tributargli il ruolo centrale nello sviluppo nell’informatica che meritava), e solo negli ultimi decenni questo é stato riconosciuto, ivi incluso il suo lavoro durante la Seconda Guerra Mondiale.

Posted in Informatica | Contrassegnato da tag: , , , , | Leave a Comment »

Problemi di Senso Comune

Posted by scardax su maggio 21, 2009

Questa ve la devo assolutamente raccontare.

Negli anni ’80, uno dei maggiori ricercatori di Intelligenza Artificiale (o, come va di moda chiamarla oggi, di Scienze Cognitive), Douglas Lenat, era reduce da due mezzi insuccessi nel tentativo di sviluppare macchine “creative”: aveva inizialmente sviluppato un programma, Am (Automatic Mathematician), capace di esplorare nuove idee matematiche a partire da alcuni concetti standard, che pero’ aveva smesso di dare risultati dopo i primi promettenti successi.

In seguito aveva pensato di puntare più in alto, progettando un sistema, Eurisko, capace, a differenza di Am, di fare ricerche nei campi più disparati. Diede ottimi risultati in alcuni giochi di strategia, ebbe qualche altra idea notevole, ma in seguito comincio’ a bloccarsi sempre più di frequente. Ad un certo punto, secondo la leggenda, ebbe l’idea di cancellare tutte le sue idee, ma l’idea stessa si cancello’ prima di riuscire a fare ulteriori danni.

A quel punto, uno pensa, Lenat si sarebbe dovuto scoraggiare. Invece no. Si chiese: cos’é che distingue il calcolatore da noi? Risposta: l’immensa quantità di informazioni che noi diamo per scontate ma che lui non conosce. Ad esempio, che una forchetta si usa per mangiare, o che una foglia tipicamente sta attaccata ad un albero. E quindi concluse: creiamo un programma che le conosca, tutte queste cose. Anzi, che conosca TUTTO. Un’enciclopedia.

Fondo’ una compagnia, chiamo’ diversi esperti nei settori più svariati, e comincio’ a popolare il database del nuovo software, chiamato Cyc (da EnCYClopedia), di centinaia e centinaia di questi fatti. L’idea é tipica di questo genere di programmi: si inseriscono numerose frasi (non in linguaggio naturale, ma in un qualche linguaggio logico) che formano il “sapere” del calcolatore. Questi poi, grazie a delle regole di inferenza, cerca di dedurre a partire da cio’ che conosce nuove cose. Ad esempio, se sa che “il 15 Giugno é il compleanno di Mario” e “oggi é il 15 Giugno“, ne deduce facilmente che “oggi é il compleanno di Mario“.

Bene: sono passati 25 anni da quando cominciarono ad inserire frasi nel programma. Si saranno stancati? Manco per idea. E quante ne avranno aggiunte, chiederete voi: un migliaio? Diecimila? Cinquantamila?

Oltre un milione.

Oggi Cyc conosce oltre un milione di piccole informazioni di senso comune e di cultura generale, ed é capace di interpretare tantissime frasi, di chiedere quando non capisce qualcosa, e secondo Lenat presto sarà capace di “leggere un giornale” ed anche di conversare. Nel frattempo, una parte ristretta del database é utilizzabile da chiunque ne abbia necessità (ad esempio é molto utile per il controllo del terrorismo, non sto scherzando) mentre una parte ancora maggiore é disponibile con una licenza di ricerca.

Cyc sta diventando un ometto, oramai.

PS: il post mi é stato ispirato da un paragrafo della bellissima storia sull’Intelligenza Artificiale “Macchine Come Noi”, di Castelfranchi – Stock. Un po’ di pubblicità “libresca” non fa mai male.

Posted in Informatica | Contrassegnato da tag: , , , | 6 Comments »

Calcolamelo Tu – Parte 1

Posted by scardax su marzo 28, 2009

Tutto ha una sua Storia personale: ce l’avete voi, ce l’hanno i vostri amici, ce l’ha un popolo, la hanno le idee e, perché no, anche le tecnologie. Qual’é la storia del Computer? Quando nasce, dove, come si evolve?

Per rispondere, partiamo dall’etimologia: computer é tradotto in Italiano (cosi’ come in Francese) con “calcolatore“, ovvero “macchina che permette di fare calcoli” (somme, sottrazioni e cosi’ via). Ed in effetti é proprio questa, la natura di fondo di un computer: il saper fare addizioni. Di macchina adibite all’automatizzazione di calcoli ne abbiamo notizia fin dai tempi più antichi, e ne usavano già molti secoli fa i marinai che per determinare le loro rotte dovevano svolgere complicati calcoli trigonometrici e si aiutavano con Astrolabi, regoli ed altri attrezzi del genere.

Il primo a costruire una macchina capace di addizioni (e sottrazioni) automatiche fu probabilmente Pascal nel 1642: la sua Pascalina, prodotta in qualche decina di esemplari, eseguiva somme nel sistema decimale e nel sistema monetario dell’epoca grazie ad una serie di ingranaggi e ruote, ed ebbe una notorietà eccezionale: Leibniz, basandosi sul progetto di Pascal, ne costrui’ un’altra capace anche di moltiplicazioni e divisioni, e queste restarono il punto di riferimento come calcolatrici compatte ed economiche fino ai primi anni del Novecento.

In questo arco di tempo si svilupparono tutte le ricerche che, pur senza volerlo, sarebbero confluite nella nascita della vera informatica: si comincio’ a studiare il codice binario (ovvero la possibilità di poter esprimere qualunque informazione per mezzo di due soli simboli, 0 ed 1); si realizzarono le prime schede perforate, schede di cartoncino perforate in vari punti utili come input per diverse macchine automatiche (in particolare il telaio di Jacquard); e Boole studio’ quella che sarebbe diventata l’algebra Booleana (un sistema utile ad esprimere proposizioni logiche).

Babbage, di cui ho già parlato in un altro post, uso’ proprio le schede perforate per progettare il primo vero prototipo di computer: un macchinario estremamente complicato che, prendendo alcuni input su schede perforate, li elaborava e restituiva output su altre schede perforate. La macchina, chiamata Macchina Analitica, non fu mai realizzata perché troppo complessa per la tecnologia dell’epoca, ma in essa si trovava già un’idea abbastanza rivoluzionaria: la possibilità per il programma stesso di essere passato come dato di input (o memorizzato all’interno della macchina): i Calcolatori stavano per diventare Universali, ovvero capaci di effettuare praticamente qualunque operazione. La macchina di Babbage desto’ interesse ovunque: un prototipo venne sviluppato dagli svedesi Scheutz, destando l’interesse di altre nazioni che ne intuivano l’immenso potenziale.

I fondamenti teorici erano pronti, ma la tecnologia non ne teneva il passo: la svolta si ebbe quando nel 1889 Hollerith brevetto’ un sistema capace di leggere le schede perforate con dispositivi elettrici: la Meccanica, più complessa da realizzare e meno performante dell’Elettrotecnica, cedeva il passo, almeno in parte, alla nuova venuta. Hollerith fondo’ poi la Tabulating Machine Company, che sarebbe diventata in seguito la IBM.

Ma i veri computer come li concepiamo noi avrebbero dovuto aspettare ancora qualche decennio. Che l’idea fosse nell’aria lo si capiva dai progetti che di tanto in tanto fiorivano: ad esempio, negli anni Trenta lo statunitense Bush progetto’ (ma non costrui’) il sistema Memex, un macchinario capace sostanzialmente di memorizzare informazioni e di permettervi un accesso rapido ed efficiente.

La Seconda Guerra Mondiale si avvicinava, e con essa i grandi sforzi per codificare e decodificare messaggi segreti. Ma questo lo lasciamo al prossimo post!

Posted in Informatica | Contrassegnato da tag: , , , , , , | Leave a Comment »

Senza Fermarsi Mai

Posted by scardax su febbraio 25, 2009

E’ difficile pensare all’Informatica come ad una Scienza. O, meglio, é difficile immaginarsi la scienza dell’Informatica. Niente sembra più lontano dalle astratte formule e misteriosi concetti studiati al liceo dalla “realtà” dei computer con cui lavoriamo, giochiamo e comunichiamo con il resto del mondo ogni giorno. Eppure, gli Informatici in quanto Scienziati esistono davvero: ed anche loro hanno i loro modelli teorici con cui si rappresentano un ‘calcolatore modello’ (più o meno come i Fisici hanno le loro rappresentazioni di un atomo), i loro libri pieni di formule matematiche a più non posso, ed i loro bei risultati, spesso anche sorprendenti.

Il più famoso, e forse uno dei più interessanti, fu scoperto da Alan Turing qualche decennio fa, e va sotto il nome di Problema dell’Arresto. Mi piacerebbe cercare di spiegarlo, in maniera abbastanza informale (terra-terra, se vogliamo), evitando qualunque appesantimento formale o teorico (Macchine di Turing e via dicendo). Spero apprezziate il tentativo o, se siete Informatici, spero quantomeno che non mi denunciate.

Per cominciare, pensate ad un qualche programma informatico scritto in un qualunque linguaggio di programmazione (il Java, il C, fate voi, va bene pure un linguaggio che vi siete appena inventati). Se non avete mai visto un simile programma, non credo capirete molto del resto del post. L’idea generale di un programma del genere é molto semplice: prende dei dati in input, li elabora in qualche maniera, e restituisce dei dati in output. Ad esempio possiamo pensare ad un programma isPrime, che prende in ingresso un numero intero n, e verifica che il resto della divisione n/m sia sempre diverso da zero, per qualunque m compreso fra 0 ed (n-1), per verificare se il numero é primo.

Ora, quando i programma crescono in complessità, non é sempre facile capire che succederà all’interno della sua esecuzione. Magari a prima vista sembra funzionare, poi pero’ incontriamo un determinato input che comincia a far “ciclare” il programma all’infinito, non facendolo terminare mai (ad esempio, isPrime potrebbe controllare il resto della divisione per qualunque valore di m, non solo per quelli compresi fra 0 ed (n-1)). Questo é un problema serio: un programma che su alcuni input va bene e su altri no non sembra granché, e mi piacerebbe saperlo in anticipo. Ma se sapessi farlo guardando il codice, probabilmente non mi sarei neanche posto il problema. Quindi, ecco la domanda:

Potrebbe esistere un qualche programma T che, dato un altro programma P, ed un input I, dica se il programma P applicato all’input I termina oppure no?

Ecco, questo é il Problema dell’Arresto espresso nei suoi termini più generali. L’aver inserito la condizione di un dato input I sembra una presa in giro, perché adesso, per verificare la correttezza di P in generale dovrei applicare T a tutti i possibili input di P, e quindi al massimo potrei dire “esiste un input che non fa terminare P” se ne trovassi uno, ma non potrei mai dire “non esiste nessun input che non lo fa terminare“, ovvero “P termina sempre“. Il punto chiave é che, come dimostreremo fra un attimo, un programma come T non potrebbe esistere, e quindi il problema neanche si pone.

Prima di buttarci subito sulla dimostrazione, riagganciamoci un secondo alla realtà (si fa per dire), e vediamo di preciso cosa ci potremmo fare con T. Prendiamo una qualunque congettura matematica non dimostrata sui numeri interi, ad esempio la congettura di Goldbach, che afferma che qualunque numero pari maggiore di due é la somma di due numeri primi (nessuno ha ancora trovato una dimostrazione valida). In pochi minuti, potremmo scrivere un programma che verifichi che un dato numero soddisfa questa congettura (basterebbe provare tutte le possibili somme di numeri primi minori di quel numero), ed utilizzarlo per scrivere un altro programma che verifichi, partendo da 3, la validità di questa congettura per tutti i possibili valori, fermandosi appena trova un numero che non la soddisfa. Fermandosi: ecco la parola magica. E’ sufficiente applicare T al nostro programma e vedere se:

  1. Si ferma, quindi esiste un numero che non soddisfa la congettura di Goldbach, quindi questa non é valida.
  2. Non si ferma e quindi, per un ragionamento simile, la congettura é valida.

Da notare come 1) questa é una dimostrazione a tutti gli effetti e 2) si puo’ ripetere per qualunque ipotesi matematica sui numeri! Se T esistesse, sarebbe una vera e propria “manna“! Ma, come già detto, T non puo’ esistere (“e meno male”, commentano i matematici). Procediamo alla dimostrazione usando un procedimento che dovrebbe essere ben noto agli assidui (o assiDUE, visto che mi sa che non sono molti (e con questa battuta mi sa che me n’é rimasto uno solo, che quindi ora é assiUNO (ed ecco che i lettori sono finiti))) lettori di questo blog: la diagonalizzazione di Cantor.

Per prima cosa, dobbiamo pensare di associare ad ogni possibile programma un numero che lo identifichi: questo si puo’ fare (come già visto tempo fa) assegnando ad ogni carattere (compresi gli spazi ed i caratteri speciali) un numero che li identifichi (ad esempio il corrispettivo ASCII), e quindi sostituire nel programma ad ogni carattere il numero corrispondente. Vengono numeri molto lunghi, esageratamente lunghi forse, ma pur sempre numeri. Notate come ad ogni programma corrisponda un numero, ma ad alcuni numeri non corrisponda un programma: ad esempio 101103 corrisponde (in ASCII) ad “ac“, che in nessun linguaggio di programmazione (credo) é un programma valido. Possiamo pensare di modificare T in questa maniera: dati un numero a corrispondente ad un programma, ed un input (numerico) b:

  • Se il programma é corretto (ovvero, in gergo tecnico, “se si compila”) e termina per l’input b, dà in output 0.
  • Altrimenti, dà in output 1.

La modifica é banale, quindi non ci perdiamo tempo. A questo punto (seconda idea geniale dopo l’assegnamento di un numero univoco ad ogni programma) possiamo costruire una tabella in cui un generico elemento (a,b) é proprio l’applicazione di T ad a e b. Una tabella del genere, insomma:

1 2 3 4 5 …
1545465688412120003164 1 1 0 1 1
44979896432313164499 0 0 1 0 1
366595944112654747662 1 1 1 1 1

Ovviamente i numeri a sinistra, nel caso generale, sarebbero decisamente più grandi. Pero’, grazie alla modifica che abbiamo fatto, a sinistra comparirà ogni singolo numero naturale intero (e stessa cosa per le colonne). A questo punto, prendiamo i numeri sulla diagonale:

1 2 3 4 5 …
1545465688412120003164 1 1 0 1 1
44979896432313164499 0 0 1 0 1
366595944112654747662 1 1 1 1 1

Mettiamoli uno in coda all’altro, ed invertiamoli (ovvero, se c’é 1 sostituiamo con 0 e viceversa). Otteniamo un altro numero (in questo caso che comincerebbe con 010…). Poiché abbiamo detto che ogni numero ha la sua riga (ovvero si trova fra gli elementi a sinistra), ne deduciamo che anche il numero appena ottenuto ci deve essere. Ma notiamo che:

  1. Differisce dalla prima riga per il primo valore.
  2. Differisce dalla seconda riga per il secondo valore.
  3. Differisce dalla riga n per il valore n-esimo.

Ovvero: non si trova nella tabella. Contraddizione! Risalendo il ragionamento, ne deduciamo che: T non puo’ esistere. E, come ogni scienziato che si rispetti, mi sa che ci siamo pure dimenticati di cosa stavamo parlando. Quindi, per oggi, basta! 😀

Posted in Informatica | Contrassegnato da tag: , , , , | 6 Comments »

Prendendo Ispirazione

Posted by scardax su dicembre 21, 2008

Prima di tutto, non sono sparito. Semplicemente, di questi tempi sto male un giorno si e gli altri due pure, quindi non é sempre facile mettersi davanti al pc ad aggiornare il blog. Per rimediare, oggi un post che farà felici un sacco di informatici (perché io nerd non lo dico) che passano di qua. Post che, per inciso, volevo pubblicare per festeggiare le 2000 visite, ma mi sono distratto trenta secondi ed abbiamo praticamente sorpassato le 2200. Ma quanti siete là fuori?

Qualche settimana fa, in A Ciascuno I Propri Sogni, avevamo visto molto rapidamente la distinzione fra problemi P, ovvero problemi che si sanno risolvere in un tempo polinomiale (e quindi accettabile), e problemi NP, ovvero per i quali non si conosce un algoritmo di risoluzione polinomiale, pero’ non avevamo avuto il tempo di vederne uno da vicino. Il fatto é che spesso si pensa che questi “problemi” siano cose tremendamente complesse anche solo da esporre, ma la verità é che spesso si tratta di problemi facilmente riconducibili alla vita reale: ad esempio, il celeberrimo “Problema del Commesso Viaggiatore” (o, per essere cool, the Traveling Salesman Problem). L’idea di base é molto semplice: abbiamo un certo numero di città connesse fra di loro da una rete di strade, ciascuna di una certa lunghezza (per gli esperti, o per chi mi segue dai primi post, un grafo pesato) e vorremmo scoprire il cammino più corto che ci permetta di visitare tutte le città (in modo da vedere il numero maggiore di clienti nel minor tempo possibile). Bene: un problema del genere é NP, ed in alcune sue versioni addirittura NP-COMPLETO.

La cosa divertente é che, in generale, l’unico metodo per trovare la soluzione migliore é anche il più semplice che si possa pensare: si prendono tutti i cammini possibili, e li si valuta uno per uno. Per comprendere l’inefficienza di un simile metodo, di solito si considera il caso in cui ogni città sia collegata ad ogni altra città: due rapidi calcoli ci mostrano che, considerando n città, dovremo passare in rassegna n! cammini (n fattoriale, ovvero n*(n-1)*(n-2)*…*1). Giocherellando un po’ con la calcolatrice si scopre quanto rapidamente crescono i cammini: per 100 città tutte connesse fra loro, abbiamo circa 10158 cammini. 101 città, e siamo già a 10160 (ovvero 100 volte tanti). Questi sono i casi peggiori, chiaramente, ma anche se non tutte le città sono connesse fra loro questi ordini di grandezza tendono a rimanere.

Questo é, praticamente, tutto quello che si puo’ dire su questo problema se cerchiamo la soluzione migliore. Ma (e finalmente entriamo nel vivo del post) cosa succederebbe se, al posto di quella migliore, cercassimo semplicemente un’ottima soluzione (ovvero, non il cammino migliore, ma qualcosa che ci vada vicino)? Ed ecco l’idea geniale: visto che sono due settimane che discutiamo solo di genetica, perché non ispirarci alla Natura per risolvere il problema? Perché non cercare di sfruttare il meccanismo della selezione naturale? Approfondiamo quest’idea: dobbiamo trovare una maniera di far evolvere una “popolazione” di possibili soluzioni in modo che le migliori sopravvivano meglio, in modo da ritrovarci, dopo qualche “generazione”, con le migliori soluzioni molto più numerose all’interno della popolazione.

Andiamo per piccoli passi: prima di tutto, come primo passo, bisogna trovare un modo di rappresentare l’informazione genetica. In questo caso é semplice: come sequenza di geni possiamo considerare una sequenza di città da visitare in un dato ordine. Ad esempio, supponendo di avere 6 città che identifichiamo con le lettere maiuscole da A ad F, un dato individuo potrebbe essere identificato dal genoma FCBADE. La nostra popolazione iniziale, quindi, sarà data da un certo numero di individui con un genoma completamente casuale. Chiaramente, non é detto che questo genoma identifichi un percorso che passi per tutte le città: potremmo avere, ad esempio, ACEBED, ovvero un percorso che passa due volte dalla città E e mai dalla F. Meglio tenerlo a mente.

Ora che abbiamo la popolazione iniziale, dobbiamo farla evolvere: ciclicamente, tutti gli individui, a coppie, danno vita ad uno o più figli, il cui corredo genetico, ad esempio, puo’ essere dato dall’unione dei corredi dei due genitori tramite un semplice meccanismo di crossing over (visto nel post precedente): le due sequenze di DNA si spezzano in un dato punto, e la prima parte del primo genitore si unisce alla seconda parte del secondo genitore, dando vita al figlio. Un punto essenziale da ricordarsi in questo passo é includere una qualche mutazione: ogni tanto alcuni figli hanno la possibilità di ricevere un genoma cambiato in un dato punto in maniera completamente casuale. Per concludere, poi, dobbiamo ricordarci di dare una sfoltita alla nostra popolazione (eventualmente partendo dai più anziani).

Il nostro “algoritmo genetico” (ed il nome ufficiale é proprio questo) é quasi completo: ci manca solo un modo per far si che gli individui che rappresentano le soluzioni migliori sopravvivano di più e facciano più figli. Ricordandoci che la selezione non opera direttamente sul genoma, ma sui suoi effetti a livello macroscopico, dobbiamo trovare un qualche indice che ci permetta di distinguere soluzioni buone da soluzioni cattive. In questo caso ne possiamo trovare addirittura due, e li dobbiamo usare insieme: il primo deve misurare la lunghezza del percorso identificato dal genoma, mentre il secondo la percentuale di città visitate (questo é semplice: facciamo il rapporto tra le città presenti nel DNA ed il numero totali di città). Ogni volta che deve nascere un figlio o morire un individuo, usiamo questi coefficienti per favorire quelli che preferiamo. In conclusione (e lo so che adorate queste due parole):

  1. Generiamo casualmente un certo numero di individui.
  2. Ciascuna coppia genera un figlio con una probabilità che dipende dai coefficienti di “adattabilità” visti prima (con mutazioni casuali).
  3. Gli individui più anziani hanno una probabilità di morire proporzionale agli stessi coefficienti.
  4. Si ritorna al punto 2.

E si va avanti per un certo numero di generazioni. La cosa sorprendente é che la soluzione trovata (la sequenza genetica più presente nella popolazione finale) sarà, in media, del 2/3% distante dalla soluzione migliore! A questo punto manca solo di implementare l’algoritmo in un vero linguaggio di programmazione. Ma non voglio fare tutto io. 😀

Posted in Evoluzionismo, Informatica | Contrassegnato da tag: , , , , , | 3 Comments »

A Ciascuno I Propri Sogni

Posted by scardax su dicembre 1, 2008

Ogni materia scientifica ha il suo “Santo Graal“, o meglio, i suoi Santi Graal: chimere che sembrano irraggiungibili, risultati ambiti da tutti, e come nelle migliori saghe medievali dedicate alla leggendaria coppa che avrebbe raccolto il sangue di Cristo, intere generazioni di cavalieri che hanno dedicato gli studi e le battaglie di una vita alla loro causa, il più delle volte per fallire miseramente.

Qualunque matematico darebbe un braccio, forse di più, per poter provare che ogni numero pari é la somma di due numeri primi (ed alcuni propongono anche un premio di un milione di dollari!); innumerevoli fisici sono disposti a spendere miliardi e miliardi per cercare il fantomatico Bosone di Higgs, per non dover continuare ad esclamare che “la massa ci sarà pure, ma io non ho idea di dove tirarla fuori dalle mie equazioni“; i paleontologi scavano da decenni sperando di incappare nel fossile del fatidico “anello mancante“, mentre i geologi probabilmente piangerebbero se riuscissero a capire finalmente con precisione cosa provoca il campo magnetico della Terra.

Ma, a differenza di Artù e dei suoi cavalieri della Tavola Rotonda, molti dei Graal vengono costantemente raggiunti da ricercatori, o team di ricercatori, ed appena la soddisfazione si conclude la ricerca si rivela appena iniziata: se negli anni ’70 si era finalmente riusciti a comprendere il meccanismo di codifica fra i geni del DNA e gli amminoacidi (ne parleremo nel prossimo post), solo quattro anni fa si é riusciti a mappare l’intero genoma umano, e di certo la strada per la sua comprensione é ancora lunga!

Tutto questo é più o meno conosciuto dal grande pubblico, ma qualunque ricercatore ha il suo cruccio personale: anche gli informatici! Per capire il sogno di ogni “smanettone“, pero’, un po’ di teoria non guasta mai. Fra i tanti obiettivi dei moderni calcolatori, c’é quello di risolvere problemi di ogni genere: un utente vuole poter cercare dei contatti nella sua rubrica elettronica, i meteorologi vorrebbero delle previsioni sempre più accurate, i virologi desiderano capire come diffondere efficacemente un vaccino in una popolazione, un amministratore di rete esige che i computer gesticano al meglio il traffico di pacchetti… Un gran casino!

Compito di alcuni informatici é riuscire a risolvere questi problemi implementando degli algoritmi nei calcolatori: delle sequenze di passi che, dato un certo input, producano un output in un tempo finito che risolva il problema dato. Ad esempio, un algoritmo di ricerca di un nome in una rubrica telefonica puo’ essere estremamente semplice, del tipo:

1) Comincia dal primo nome

2) Se il nome corrisponde a quello cercato, fine della ricerca, altrimenti:
– Avanza di un nome e ricomincia il punto 2 finché la lista non é terminata.

Già da questo esempio si puo’ capire il vero problema dietro la creazione di algoritmi: maggiore é la dimensione della rubrica, più lunga sarà, in media, la ricerca! Le prestazioni temporali dipendono dalla grandezza dell’input, per dirla in maniera più tecnica. Al che sorge la domanda successiva: dipendono in che misura? In questo caso, linearmente: raddoppiando la grandezza dell’elenco, raddoppiero’ in media il tempo di ricerca. In altri casi potrebbe essere una dipendenza quadratica: raddoppiando la grandezza dell’input, in media quadruplico la durata di esecuzione!

La maggior parte dei problemi che si affrontano, in genere, ha una dipendenza di tipo polinomiale: n, n², n3 (dove n é una qualche misura dell’input)… L’insieme di tutti questi problemi viene chiamato P (originale, eh?), ed in pratica identifica i problemi “fattibili“: anche eseguendoli con grandi input, in media avro’ una risposta in un tempo accettabile. Al contrario, esistono problemi per i quali non si conoscono algoritmi di complessità polinomiale, ma solo di complessità esponenziale: 2n, 4n e cosi via. Questi problemi (che vengono detti NP) sono molto fastidiosi: per grandi input, abbiamo dei tempi di attesa di giorni, mesi, anni (addirittura secoli!) prima di poter avere una risposta: nella maggior parte dei casi, questo é inaccettabile – anzi, inutile.

Per ricollegarci all’inizio del discorso, manca ancora un piccolo dettaglio: all’interno dei problemi NP vi é un sottoinsieme di problemi detto NP-COMPLETO, con una proprietà molto interessante: qualunque problema NP puo’ essere ricondotto ad un problema NP-COMPLETO in tempo polinomiale! (rileggete la frase tre volte per essere sicuri di capirla prima di andare avanti). Se ho un problema A che é Np-Completo, posso ricondurre qualunque problema NP (ed anche P) ad un’istanza di A in un tempo accettabile, ovvero polinomiale.

E da qui nasce un’interessante corollario: se riuscissi a trovare un algoritmo che risolva un problema Np-Completo in tempo polinomiale, potrei risolvere… qualunque problema Np in tempo polinomiale! (sarebbe sufficiente ricondurre il problema in tempo polinomiale al problema np per cui conosco un algoritmo polinomiale, e poi risolverlo). Molti dubitano che sia possibile ricavare un simile algoritmo per i problemi Np-Completi, ma (e questo é il punto chiave) nessuno l’ha mai dimostrato!

Ero convinto di voler dire qualcos altro, ma non ricordo cos’era ed inoltre ci siamo allungati un po’ troppo, mi sa.

Spoiler: nel prossimo post parlero’ delle basi della genetica e dell’evoluzione, ed in quello successivo uniro’ il tutto per far vedere come affrontare uno dei più famosi problemi Np-Completi ispirandoci alla natura, quindi… Namasté!

Posted in Informatica | Contrassegnato da tag: , , , , | 4 Comments »

Numeri al Confine

Posted by scardax su novembre 9, 2008

NB: questo post é l’ideale continuazione del precedente Diagonalizzando.

I numeri sono una cosa alla quale siamo talmente abituati che spesso ci stupiamo di quanto a lungo se ne possa parlare, e quante cose interessanti ne escano. Numeri interi, frazioni, numeri reali, numeri complessi, immaginari, algebrici, veri e propri pilastri come pigreco… Ma possiamo veramente “conoscere” tutti i numeri?

Una domanda del genere ci lancia direttamente in uno dei campi più belli dell’Informatica, nato come molti altri dal genio del matematico Inglese Alan Turing (per la cui biografia mi riservo un prossimo post): quello dei numeri computabili, o calcolabili. Un numero viene detto computabile se, in maniera molto sintetica ed informale, possiamo scrivere un programma per computer che permetta di calcolarne le cifre decimali. A prima vista, potremmo pensare che quasi tutti i numeri reali siano computabili: del resto, lo sono i numeri razionali (quelli che si possono scrivere come una frazione del tipo m/n), e lo sono anche molti irrazionali come pigreco (per il quale esistono qualcosa come venti formule per calcolarne i decimali) o la radice quadrata di due.

Eppure, ecco la sorpresa: la maggior parte dei numeri reali sono… non calcolabili! Per dimostrarlo, partiamo dalla definizione che abbiamo dato prima: un numero calcolabile é un numero per il quale possiamo scrivere un programma che stampi su schermo le sue cifre decimali. Ora, i programmi per computer sono enumerabili, ovvero é possibile associare a ciascuno di essi un numero naturale che lo identifichi univocamente. Un modo per farlo é il seguente:

  1. Scriviamo il nostro programma in un qualche pseudolinguaggio (o anche un vero linguaggio di programmazione come il Java o il C).
  2. Il linguaggio sarà composto da un alfabeto di simboli finito: ad esempio le lettere dell’alfabeto, lo spazio, le parentesi graffe e qualche altro carattere speciale. Possiamo assegnare a ciascun simbolo un numero particolare (ad esempio il suo valore ASCII).
  3. Sostituiamo ogni simbolo del programma scritto in pseudolinguaggio con il valore associato: otterremo un numero naturale che lo identifica!

Facciamo un esempio con la stringa “Ciao mamma“: usando la tabella ASCII (in cui la A corrisponde a 97, lo spazio a 32 e cosi via) otteniamo il numerale “6710597111321099710910997”.

Poiché i programmi sono numerabili, e ad ogni numero calcolabile é associato un programma, ne segue che anche i numeri calcolabili sono numerabili: possiamo assegnargli ad esempio lo stesso numero che identifica il programma. Pero’, nell’articolo linkato ad inizio pagina abbiamo dimostrato che i reali non sono numerabili: se cerchiamo di identificarli con i naturali, possiamo ottenere facilmente un numero reale che non abbiamo considerato. Ne segue che la maggior parte dei numeri reali non sono calcolabili!

E questo é solo l’inizio del problema. Fra i numeri non calcolabili, possiamo distinguerne due categorie: quelli definibili (ovvero per i quali possiamo trovare un’espressione matematica che li identifichi, magari indirettamente) e quelli non definibili, ovvero che non possono neanche essere espressi con i termini matematici! Con un’argomentazione simile alla precedente possiamo dedurne che la maggior parte dei numeri reali sono non definibili:

  1. Un numero definibile é un numero identificato univocamente da una qualche formula matematica.
  2. L’insieme delle formule matematiche sono numerabili.
  3. I numeri definibili sono enumerabili, mentre i reali no: i numeri definibili sono un sottoinsieme neanche troppo grande dell’insieme dei Reali!

Ora, é chiaro che, se un numero del quale non possiamo calcolare le cifre decimali ma che possiamo comunque esprimere con una formula matematica puo’ essere utile in qualche ragionamento teorico, un numero che non é neanche esprimibile é, sostanzialmente, inutile!

In effetti, esiste una corrente matematica chiamata Costruttivismo che considera “veri” solo i numeri definibili. Ma é lecito approssimare i reali con i soli numeri definibili? E con questa domanda, concludo il post! 😀

Posted in Informatica | Contrassegnato da tag: , , , , , | Leave a Comment »

Guardare Oltre l’Orizzonte

Posted by scardax su ottobre 16, 2008

I grandi nomi dell’Informatica – Parte 1

Da qualunque punto di vista lo si guardi, é evidente che, oggigiorno, esistono ancora certe attività che sembrano essere destinate prevalentemente ad un solo sesso. Voglio dire, prendete l’informatica: il numero di donne che ci lavora é, come dire… imbarazzante. Potete appartenere alla schiera dei politically correct e dire che é colpa della cultura, oppure essere pionieri del neodeterminismo e puntare il dito contro i geni, ma il risultato é sempre lo stesso: prendete un informatico a caso, e con una grandissima probabilità questi sarà un uomo. Il che é paradossale, poiché il primo programmatore della Storia fu, neanche a dirlo, una donna. Ma andiamo con ordine.

Verso gli inizi del 1820, mentre in Spagna i rivoluzionari davano inizio ai loro moti, e Young e Champollion decifravano finalmente i geroglifici, un matematico inglese chiamato Babbage anticipava i tempi, e seguendo i pensieri di altri filosofi e scienziati (fra cui il celebre Pascal), progettava la prima macchina in grado di eseguire dei calcoli in maniera automatica, la Macchina Differenziale, capace di compiere alcune semplici operazioni su polinomi. Finanziata direttamente dal Governo Britannico, la sua costruzione si scontro’ pero’ con la tecnologia di allora, non sufficientemente buona da permetterne l’utilizzo.

Babbage pero’ non si scoraggio’, e pochi anni dopo progetto’ una nuova Macchina, questa volta battezzata Analitica, che era una rivoluzione nella rivoluzione: basandosi sul telaio automatico del Francese Jacquard, la macchina avrebbe in teoria dovuto utilizzare delle schede perforate per essere programmata, rendendola capace di eseguire praticamente qualunque calcolo. La Macchina aveva anche numerose altre innovazioni, fra cui una memoria in cui memorizzare risultati intermedi ed un sistema di controllo dei risultati. Anche se la sua costruzione non inizio’ neanche (reduce del semi fallimento della prima, nessuno finanzio’ questo ulteriore progetto), essa attiro’ comunque diverse attenzioni, fra cui quelle della notevole figlia del poeta Lord Byron, Ada Lovelace. Istruita alla Matematica fin dalla più giovane infanzia dalla madre che non voleva che seguisse le orme del padre, Ada supero’ anche Babbage in quanto a visioni futuristiche, arrivando a predire in un articolo che le sue Macchine sarebbero state vitali per la Scienza, ed allegando il primo programma informatico della Storia, capace di calcolare i numeri di Bernoulli.

Chiaramente, l’interesse verso Babbage e Ada Lovelace é più che altro Storico (e forse poetico), visto che la vera marcia dell’Informatica sarebbe cominciata circa un secolo dopo, e le loro idee sarebbero state scoperte nuovamente, ed in maniera indipendente, da altri. Nondimeno, entrambi continuano a far discutere: recentemente, un team di ricercatori é riuscito a costruire una macchina Analitica realmente funzionante, dimostrando che il progetto era valido, mentre é ancora acceso il dibattito provocato dalle affermazioni di Ada secondo cui “le macchine fanno solo cio’ che gli diciamo di fare“, una delle principali argomentazioni utilizzate contro l’Intelligenza Artificiale.

Ma questa é un’altra storia.

Posted in Informatica | Contrassegnato da tag: , , , , , , , , , | 1 Comment »