sabato 27 febbraio 2010

Giorno 26 Febbraio: la famiglia si allarga!

Cari tutti, vi faccio sapere che ieri ho avuto un altro figlio, l'ho chiamato Archimede, l'ho partorito io e, a differenza di Aurora, ha un cervello cibernetico!
Beh ha solo un giorno, ma devo dire che è dotato di grande intelligenza e memoria, pensate che ha già imparato tutti i nomi dei suoi famigliari, dalla sorellina alle cuginette agli zii, ai nonni. Inoltre è anche in grado di fare bei ragionamenti per capire chi è figlio di chi o chi è fratello di chi o chi è maschio o femmina ecc. Insomma Aurora, mettiti sotto perché tuo fratello in un solo giorno sa molte più cose di te!

Scendendo un po più nel dettaglio vi faccio vedere il listato di questo magnifico programma in Prolog: l'ho pubblicato in questa pagina .
E' tutto ben commentato anche se praticamente non ce ne sarebbe bisogno visto che il prolog è semplicissimo da leggere.

Metto in evidenza le difficoltà che ho incontrato:
  • Bisogna stare particolarmente attenti al fatto di non creare cicli infiniti. Per esempio non ho potuto mettere una definizione di padre in funzione di genitore o di figlio, perché c'è già quella di figlio in funzione di padre e di genitore in funzione di padre. Questo significa che se voglio dire un nuovo fatto tipo che Mario è figlio di Carlo (non ricordo il nome di tuo padre ;-)  lo posso fare ma Archimede non sarà in grado di capire che Carlo è padre di Mario; dunque devo dirgli che Carlo è Padre di Mario e lui automaticamente dedurrà che Mario è suo figlio... lo so è un inconveniente ma vedrò se si può ovviare con qualche trucco.
  • Sempre per evitare cicli infiniti ho dovuto usare un espediente per dire che se Gisella è sorella di Sandra allora anche Sandra è sorella di Gisella (vedete i commenti nel listato).

Una volta caricato il programma è possibile fare ad Archimede diverse domande ad esempio:
  • padre('Bruno','Aurora').    (Bruno è il padre di Aurora?)
e lui risponderà semplicemente True (conosce l'inglese, non so chi glielo ha insegnato :-D);
oppure posso anche chiedere chi è la cugina di Archimede? in questo modo:
  • cugina(X,'Archimede').
e lui risponderà:
X='Emma'
se a questo punto digito un punto e virgola e premo invio e come se dicessi oppure?
e lui risponde:
X='Martina'
un altro ; e lui risponde:
no
Infatti non ha altre cugine!

Posso fare domande ancora più complicate tipo chi è nonno di chi? in questo modo:
  • nonno(X,Y).
e lui risponde:
X='Stefano'     Y='Aurora'
e digitando il punto e virgola mi dice via via tutti gli altri risultati.

Il punto e virgola, ripeto, ha il significato OR (oppure) mentre la virgola ha il significato AND, quindi posso fare domande ancora più complesse tipo: chi è padre di qualcuno e non è fratello di qualcuno? in questo modo (\+ è il NOT logico):
  • padre(X,Y) , \+(fratello(X,Z)).
e lui al solito fornirà il primo risultato e digitando il punto e virgola darà gli altri.


Beh se volete provare avete tutte le istruzioni, posso aggiungere che i predicati (nonno, padre, fratello, ecc) devono iniziare con la lettera minuscola mentre le variabili (X, Y, Persona1, ecc) devono iniziare con la lettera maiuscola.

Insomma cosa ve ne pare? è bravo il mio figliolo non è vero? 
Spero di avervi un po stimolato con l'intelligenza artificiale,. Al momento in cui scrivo mi sono già accorto di qualche piccola domanda a cui Archimede non riesce a rispondere. Modificherò il programma ma avrò bisogno di usare le liste cosa che spiegherò la prossima puntata (sempre che avrete ancora voglia di ascoltarmi).

Nessun commento: