Coding, pattern e pensiero computazionale

Post on 29-Jan-2018

193 views 2 download

transcript

coding, pattern e pensiero computazionale

Giuseppe Alessandri

PNSD – Tolentino

2017

indice

• Tecnologie• Tecnologie e didattica• Approcci imperativo e a eventi al coding e

– pattern monoagente-deliberativo– pattern multiagente-deliberativo– pattern monoagente-reattivo– pattern multiagente-reattivo

• Scratch junior• Pensiero computazionale e algoritmi• Narrazione e Pensiero computazionale• Approccio dichiarativo al coding: Prolog

una definizione (B. Arthur)

“La tecnologia è un mezzo per soddisfare uno scopo umano. […] In quanto ‘mezzo’, la tecnologia può essere un apparecchio fisico (un motore diesel, un frigorifero), un processo (un processo di filtrazione nell’ingegneria chimica o il processo risolutivo per una equazione di secondo grado, eventualmente codificato in algoritmo), un metodo (il metodo adottato per lo sviluppo di un algoritmo per il riconoscimento vocale, la modalità di progettazione didattica, ..). […]; può essere materiale […] oppure immateriale […]. Comunque è sempre un mezzo creato per soddisfare un fine umano”.

Cos’è la tecnologia(Arthur)

Alessandri G., Tecnologie autonome nella didattica, verso la robotica educativa, Morlacchi, Perugia, 2013

Spesso le tre tipologie si integrano:

• un processo sviluppato con un determinato metodo;

• un processo che ha bisogno di un apparecchio per essere eseguito (un algoritmo);

• un processo, sviluppato con un certo metodo, che si realizza con un determinato apparecchio (ancora il caso di un algoritmo).

Cos’è la tecnologia(Arthur)

Tecnologie e didattica

• Il senso del loro utilizzo oscilla in un continuo che va da forme di sostegno alle varie discipline, facilitandone e migliorandone l’apprendimento, ad approcci che accentuano il carattere di autonomia delle stesse tecnologie

Tecnologie e didattica

Tecnologie di sostegno possono suddividersi in tecnologie per presentare e tecnologie per facilitare.• La caratteristica fondamentale delle prime è la presenza di

un elemento essenziale quale il video, attraverso il quale l’utente riceve informazioni, ma può anche presentarne; un esempio è il web.

• Nel web di oggi possiamo individuare i siti vetrina (è prevalente la presentazione) e siti officina (è prevalente la discussione, la collaborazione, la costruzione). Esempi dei primi sono i siti degli utenti e, fra questi, quelli di forte concentrazione informativa come i portali. Esempi del secondo caso sono i siti per le comunità (di aiuto, di discussone, di pratica, …), siti per la formazione, applicazioni del web 2.0.

Tecnologie e didattica

• Tecnologie per facilitare. Sono tecnologie che si pongono fra lo studente che apprende e l’oggetto di studio per facilitare il processo di apprendimento introducendo delle rappresentazioni che possano aiutare nella comprensione. Un esempio di tale tecnologia è la simulazione che può essere considerata una ricostruzione di qualche segmento della realtà rappresentandone un modello nella forma e una riproduzione delle funzionalità. Il tentativo è quello di far conoscere parti del mondo ricreandoli, in modo artificiale, e dando all’utilizzatore la possibilità di interagire con gli aspetti che sono riprodotti, e osservando le conseguenze delle azioni frutto delle decisioni prese.

• Altri due esempi sono i DGS (Dynamic Geometry Software; es. Geogebra) e i CAS (Computer Algebra System); entrambi si riferiscono all’insegnamento della Matematica.

Tecnologie e didattica

• Tecnologie autonome. Sono quelle che permettono di sviluppare esperienze che altrimenti non sarebbe possibile svolgere. Il loro valore non sta nel presentare, nel miglior modo possibile, la fruizione di mondi fittizi che realizzino il reale attraverso il digitale, ma nel costruire questi mondi che possono essere realizzati attraverso propri linguaggi e regole di queste tecnologie. Esse disegnano percorsi di apprendimento consapevole nei domini che sono loro tipici e propongono metodologie di lavoro attive e autonome.

• Le pratiche didattiche che si possono realizzare mediante tali tecnologie delineano:

– approcci maggiormente orientati alla soluzione di problemi;

– l’assimilazione di metodologie di lavoro in grado di migliorare la significatività del processo di apprendimento (attraverso la realizzazione di artefatti)

Tecnologie e didattica

I tratti fondamentali dell’autonomia sono rintracciabili:• in una maggiore sovranità rispetto alla lezione del

docente; non sono, cioè, al servizio di un itinerario già tracciato; non sono pacchetti chiusi, o anche simulazioni già fatte, ma sono strumenti che gli studenti possono utilizzare per costruire conoscenze nei diversi settori disciplinari; essi sperimentano e scoprono e formalizzano leggi dai loro esperimenti;

• in un metodo di lavoro che privilegia l’azione;• nella necessità di utilizzare un loro linguaggio.

Le tecnologie autonome si sostanziano nelpensiero computazionale e nel coding

Come visto nella mappa del pensierocomputazionale, possiamo individuare diversiapprocci nella programmazione; in questocontesto ci si riferisce a quello imperativo e aquello a eventi e, successivamente, a quellodichiarativo

• Approccio imperativo e a eventi

• In via prioritaria è bene conoscere il significato di modello e, in particolare, i formalismi più comuni per la sua rappresentazione (nel nostro caso i linguaggi grafici e i linguaggi di programmazione).

Si possono individuare quattro modalità di costruzione dei programmi: monoagente, multiagente, deliberativa e reattiva:• modalità monoagente: si riferisce a realizzazioni che si sviluppano con una

sola programmazione; l’applicazione risiede in un unico nodo elaborativo che vive in un solo agente;

• modalità multiagente: le applicazioni risiedono su più nodi elaborativi (elaborazione distribuita) e vivono in più agenti; si hanno, cioè, diverse programmazioni che svolgono operazioni differenti nell’ambito di una macro–applicazione;

• modalità deliberativa: indica la possibilità di sviluppare una applicazione attraverso una programmazione predeterminata, rispettata passo dopo passo, isolata rispetto all’ambiente circostante;

• modalità reattiva: in una applicazione è possibile interagire con l’ambiente della stessa e con l’esterno; gli eventuali agenti possono interagire fra di loro. Il suo sviluppo non è rigidamente predeterminato, ma può tener conto delle interazioni che si sviluppano.

• Sistemando le quattro modalità sui vertici di un diagramma si hanno quattro poli: deliberativo, reattivo, monoagente, multiagente; di conseguenza è possibile avere quattro combinazioni che rappresentano quattro patterndi riferimento per realizzare applicazioni: monoagente-deliberativo (imperativo) (a), multiagente-deliberativo (imperativo) (b), monoagente-reattivo (a eventi) (d), multiagente-reattivo (a eventi) (c) .

• Nel quadrante a (pattern monoagente–deliberativo) si ha una unicaprogrammazione che impone all’unico agente dei comportamentiprestabiliti e dettati dall’applicazione; questa non prevedeinterazione con l’ambiente e con l’esterno;

• nel quadrante b (pattern multiagente–deliberativo) si individuanoapplicazioni con più agenti guidati da programmazioni che nonpermettono interazioni fra agenti, con l’ambiente e con il mondoesterno.

• nel quadrante d (pattern monoagente–reattivo) le applicazioni sonocostruite intorno a un unico agente che può interagire conl’ambiente e con il mondo esterno;

• nel quadrante c (pattern decentralizzato–reattivo) si hanno piùagenti; ciascuno, con la propria programmazione, può interagirecon gli altri, con l’ambiente e con l’esterno.

Molteplici sono gli ambienti per la composizione di programmi ed èpossibile individuare una distinzione:

• fra quelli che permettono la scrittura del codice in un ambientetestuale

• e quelli che mettono a disposizione un ambiente dove inserire leistruzioni del linguaggio (in genere prelevabili da elenchi giàpredisposti) e vicino un ambiente grafico ove vivono gli agentidell’applicazione.

Oggi, generalmente, le applicazioni, sviluppate secondo i dettami di unoqualunque dei pattern presentati in precedenza, vivono in ambienti delsecondo tipo. Nelle figure seguenti sono riportati quelli di Scratch e diSnap!

Scratch

Snap!

Dall’analisi al programma

Dall’analisi al programma: percorso che porta dalla individuazione e formulazione di unproblema alla scrittura del programma relativo.

• Definiamo come programma un insieme di istruzioni e dati, finalizzato a dei compiti benprecisi e delimitati. Il programma viene costruito dall’uomo e viene eseguito dal computer e,perciò, deve essere scritto utilizzando un linguaggio che l’elaboratore comprende. Perlinguaggio di programmazione intendiamo un insieme di istruzioni e di regole che definisconole modalità con le quali le stesse istruzioni ed i dati possono essere inseriti in un programma.

• I passi fondamentale del percorso sono:

a) analisi:

-individuazione dei dati sui quali il programma deve “lavorare”;

-individuazione del procedimento risolutivo, che generalmente prevede unfrazionamento, per passi successivi, del programma in parti via via più semplici;

b) costruzione del programma e relativa codifica utilizzando un linguaggio diprogrammazione;

c) prove del programma, individuazione degli errori;

d) feed back.

Nel prosieguo vengono presentati i quattro pattern: monoagente-deliberativo, multiagente-deliberativo, monoagente-reattivo, multiagente-reattivo.Nell’insieme rappresentano un percorso che il docente potrebbe seguire nel proprio itinerario di alfabetizzazione sul pens. comp. e sul coding.

• Non vuole essere un itinerario da proporre immediatamente in aula con gli studenti, in special modo per quelli della primaria ma, anche, della secondaria di primo grado.

• Per costoro è meglio iniziare con un approccio più light che preveda direttamente un impatto con il linguaggio (preferibilmente Scratch) impostando semplici programmi e procedendo per prove ed errori.

• Tuttavia il docente deve essere consapevole che il suo punto di arrivo dovrà essere l’aver “convinto” i propri studenti che occorra, dapprima, analizzare il problema, sviluppare un bozza di modello risolutivo (attraverso opportuni diagrammi, come si vedrà), individuare il pattern che pensa possa essere idoneo e quindi passare alla stesura del programma.

pattern

• pattern monoagente-deliberativo

• pattern multiagente-deliberativo

• pattern monoagente-reattivo

• pattern multiagente-reattivo

pattern monoagente–deliberativo

• Il primo passo del percorso è rappresentatodall’analisi del problema che si sviluppaattraverso l’individuazione dei dati con i qualioperare ed il relativo procedimento risolutivo. Idati possono essere iniziali, cioè conosciuti econsegnati in ingresso al programma, dati creatidal procedimento e dati in uscita. Il procedimentopuò consistere in una scomposizione delproblema in parti secondo il metodo top down. Ilproblema viene suddiviso in sottoproblemi, iquali possono anch’essi essere frazionatiulteriormente in altri sottoproblemi;

pattern monoagente–deliberativo• il procedimento avanza fino alla individuazione di parti

non più scomponibili. Queste sono i nuclei essenzialidello sviluppo del programma; sono, in genere, chiamateprocedure. Si passa, quindi, allo sviluppo delle stesseutilizzando opportuni formalismi, ad esempio pseudo–codifica o diagramma a blocchi; successivamente siassembla il tutto nel procedimento finale, lo si traducenel codice del linguaggio utilizzato, lo si esegueall’elaboratore. Spesso si evita il passaggio della scritturain pseudo–codifica (o diagramma a blocchi) e si scrivonole procedure direttamente nel linguaggio diprogrammazione scelto.

• Quindi il procedimento si sviluppa, attraversoraffinamenti successivi, da una struttura generale delproblema alla formulazione finale del programma cheverrà fatto eseguire dall’elaboratore. La progettazionenasce da prime ipotesi risolutive e si sviluppa lungosuccessivi momenti nei quali si progettano nuoviitinerari. La progettazione termina alla fine della suaattuazione.

• Il procedimento di analisi si articola attraverso lestrutture di sequenza, confronto, ripetizione.

• Esistono diversi strumenti per formalizzare ilprocedimento di analisi; presentiamo qui i diagrammidi Jackson.

pattern monoagente–deliberativo

sequenza

Si legge “x è una sequenza di a, b, c”

pattern monoagente–deliberativo

confronto

Si legge: “x è a se vale cond 1, x è c se vale cond2”.

pattern monoagente–deliberativo

ripetizione

Si legge “x è una ripetizione di b, per n volte”

pattern monoagente–deliberativo

• Attraverso corrette combinazioni di tali strutture è possibile sviluppareprocedimenti risolutivi.

x è una sequenza— di a, che è una sequenza di m e n,— di b, che è una ripetizione di z per 5 volte,— di c, che è w se vale c1, y se vale c2.

pattern monoagente–deliberativo

• Tale diagramma si legge dall’alto verso il basso e da sinistraverso destra; m, n, z, w, y rappresentano procedure.

• Una volta giunti a questo livello di rappresentazione delproblema, si sviluppano le varie procedure nella forma diuna pseudo–codifica o di un diagramma a blocchi e, quindi,si codificano le istruzioni secondo il linguaggio scelto; si‘passa’ poi il programma codificato all’elaboratore cheprovvederà a eseguirlo.

• Realizziamo ora due applicazioni seguendo il procedimentosopra delineato:

• a) costruire una casa senza finestre (Esempio 1).• b) costruire una casa con finestre (Esempio 2).

pattern monoagente–deliberativo

Esempio 1: costruire una casa senza finestre con il corpo di 100 punti di lato ed il tetto di 120 punti.

Si disegni su carta il seguente schema:

Analizzando si può vedere che per rappresentare una casa occorre costruire una facciata e un tetto; la facciata è un quadrato e il tetto un triangolo; quindi il problema è scomponibile in due procedure:

facciata, tetto.

Con i diagrammi di Jackson:

A questo punto si realizzano le varie procedure scrivendo il relativo codice in pseudo–codifica e quindi in Snap!, Scratch.

pattern monoagente–deliberativo

Esempio 2: costruire una casa con finestre.

Si disegni su carta il seguente schema:

Analizzando si può vedere che per rappresentare una casa si possono utilizzare un quadrato ed un triangolo (che costituiscono, nell’insieme, la casa senza finestre), due quadrati per le finestre ed un rettangolo come porta di ingresso. Ma la casa senza finestre è stata già costruita e la relativa procedura è disponibile, quindi:

pattern monoagente–deliberativo

Possiamo scrivere una versione equivalente del diagramma precedente, costruendo una procedura finestre, che contiene, al suo interno, le due procedure finestra:

pattern monoagente–deliberativo

Come esempio di utilizzo di una pseudo–codifica e dei diagrammi a blocchi,sviluppiamo la procedura quadrato, che rappresenta il corpo della casa.

inizio

avanti 100

destra 90

avanti 100

destra 90

avanti 100

destra 90

avanti 100

destra 90

fine

Ottimizzato

inizio

ripeti 4 volte

avanti 100

destra 90

fine

Fine

(struttura di ripetizione)

inizio

ripeti 4 volte

avanti 100

destra 90

fine

Esempio di struttura di controllo; in base al valore di un numero si costruisce una casa con o senza finestre

Esempio di struttura di ripetizione; si deve ripetere il procedimento precedente per dieci volte; per ogni ciclo, in base al valore di un numero, si costruisce una casa con o senza finestre

ripeti

# 10 volte

acq. numero

Area SPRITE

STAGE

Area SCRIPT

Area ISTRUZIONI

Snap!(Sito ufficiale di Snap)

Snap! È la versione 4.0 di BYOD (Build Your Own Blocks).

• Per fare la prima conoscenza di Snap! Si utilizza il programma per la realizzazione della casa senza finestre; dapprima senza procedure e poi con procedure.

• Manuale Snap!

• Negli esempi seguenti, per vedere il codice Snap! occorre un click sul simbolo in alto a destra

pattern multiagente-deliberativo

• Si parla di pattern multiagente quando le applicazioni risiedono su più nodi elaborativi (elaborazione distribuita). Le programmazioni possono esplicitarsi nelle azioni di agenti che agiscono in un apposito ambiente e hanno, teoricamente, la possibilità di interagire fra loro, con l’ambiente e con l’esterno; tuttavia in questo caso (pattern multiagente-deliberativo) tutto ciò è impedito in quanto sono deliberatamente guidati nella loro vita “di comunità”. Il deliberare i loro comportamenti significa che i loro movimenti, le loro azioni sono etero-dirette dall’utente attraverso le programmazioni che ha associato ad essi.

pattern multiagente-deliberativo

pattern multiagente-deliberativo

• Riprendendo l’esempio precedente (costruzione di una casa), possiamo implementare la costruzione del portone e demandarlo a un secondo sprite; è possibile ipotizzare una distribuzione dei compiti fra diversi agenti, invece nella situazione già analizzata esisteva un unico agente con un’unica programmazione.

• Con una soluzione decentralizzata, è possibile impostare un procedimento che preveda un agente che costruisce la facciata ed il tetto della casa, un secondo che si interessa della costruzione del portone (e, volendo, un terzo che modella le finestre). È ovvio che si potrebbe operare in altri modi, impegnando un numero diverso di agenti e assegnando loro compiti diversi.

Snap!

1° sprite disegna la facciata e il tetto 2° sprite disegna il portone

multi_deliberativo_1

pattern monoagente-reattivo

• Il pattern monoagente-reattivo introduce al modo di costruire applicazioni di codingsecondo una programmazione orientata agli eventi. Si ha un unico nodo elaborativo, tuttavia la programmazione si sviluppa in interazione con l’ambiente circostante (interno ed esterno). L’applicazione si esplicita nelle azioni di un agente che non vive in una bolla isolata, ma interagisce con l’ambiente interno ed esterno.

pattern monoagente-reattivo

pattern monoagente-reattivo

• Un programma in Snap!, generalmente, si sviluppaattraverso la vita di diversi agenti chiamati sprite, aciascuno dei quali è possibile associare più script (insiemedi istruzioni dedicato a compiti specifici). Per simulare ilpattern che stiamo analizzando, tuttavia, dobbiamolimitarci alla gestione di un solo sprite che interagisce conl’ambiente nel quale vive. Ciascuno script ha un hat block intesta che stabilisce quando deve essere eseguito. L’hatblock dà l’avvio all’evento rappresentato dalla sequenzadelle successive istruzioni (blocchi). Generalmente il nomedi un hat block inizia con la parola “quando”. Nei precedentiesempi abbiamo sorvolato sull’uso dell’hat block per nonintrodurre elementi di “reattività” in contesti deliberativi; siricordi, comunque, che tale blocco è indispensabile.

pattern monoagente-reattivo

• In genere uno script inizia con un blocco hat con la parola quando (when) e l’azione che lo avvia, a indicare quando deve andare in esecuzione. Fino ad ora abbiamo utilizzato l’hat block

in questo caso quando si clicca sulla bandiera verde, in alto a destra nell’interfaccia di Snap! si avviano gli script che fanno iniziare ad agire gli sprite (nel caso multiagente, altrimenti un solo sprite).

pattern monoagente-reattivo

Nell’esempio seguente, abbiamo quattro script; quello con: • hat block “quando si clicca su bandiera verde”, permette

l’avvio del programma e fa spostare lo sprite al punto di coordinate 0,0;

• hat block “quando si preme il tasto spazio”, fa avanzare lo sprite di dieci passi (punti) sullo schermo (tenendo premuto la barra spazio, lo sprite si muove costantemente in avanti);

• hat block “quando si preme il tasto freccia su” lo spriteruota di 90 gradi verso sinistra;

• hat block “quando si preme il tasto freccia giù”, lo spriteruota di 90 gradi verso destra.

pattern monoagente-reattivo

• Ovviamente i singoli script possono avere una struttura più complessa; ad esempio nell’evento collegato alla pressione della barra spazio, nella figura seguente, si impone allo sprite di tornare indietro di dieci passi (punti) se si incontra il bordo della finestra dove si sviluppa il programma.

pattern monoagente-reattivo

Differenza fra pattern deliberativo e pattern reattivo nel caso di uno sprite che deve attraversare il seguente labirinto

pattern monoagente-reattivo

• Approccio deliberativo:

l’applicazione non sviluppa alcuna interazione con l’ambiente, escludendo quella per l’avvio, e si sviluppa facendo procedere allo sprite un percorso predeterminato da rilevazioni di distanze, effettuate in fase di costruzione dello script, e riversate nelle istruzioni dello stesso.

pattern monoagente-reattivo

Approccio reattivo

• L’applicazione (figura seguente), si sviluppa attraverso quattro scriptche gestiscono quattro eventi che permettono:

• l’avvio con il posizionamento iniziale dello sprite;• la pressione sulle frecce, a destra e a sinistra, per far ruotare lo

sprite, a destra o a sinistra, di cinque gradi (tenendo premuta la freccia a lungo si potrà far ruotare lo sprite dell’angolo che si vuole);

• il movimento dello sprite lungo il percorso: quando lo sprite tocca il colore nero, torna indietro di 20 passi, quindi l’utente dovrà farlo ruotare in modo opportuno a destra o a sinistra; quando lo spriteincontra il bordo (a fine itinerario) viene ricollocato nella posizione iniziale.

Approccio reattivo

Snap!(mono_reattivo_3)

l’essere reattivo dello sprite è evidenziato nei momenti di contatto con il bordo nero della pista e con il bordo dell’ambiente nel quale agisce e di risposta alle azioni dell’utente.

modello per pattern monoagente-reattivo

pattern multiagente-reattivo

• Diversamente dal precedente, il pattern decentralizzato-reattivo individua

animazioni nelle quali possono vivere più sprite/agenti e permette

interazioni fra loro e con gli ambienti esterno e interno.

• Tutto ciò permette, indifferentemente, un agire autonomo e indipendente

dall’azione degli altri sprite, oppure una collaborazione fra essi.

Snap!(multi_reattivo_1)

• Nella seguente applicazione (Figura 6.2) vivono due sprite, chiamati “sprite1” e “sprite2”, che non interagiscono fra loro, ma solo con l’ambiente interno (il bordo).

Snap!(multi_reattivo_2)

• È possibile farli interagire fra loro e con l’ambiente interno (il bordo).

pattern multiagente-reattivo

• Altresì, è possibile far cooperare i due sprite sulla scena del racconto di una storia, di un gioco, di una simulazione. Uno sprite potrebbe invitare un altro a eseguire delle azioni. In una storia potrebbero costruire un dialogo, alternandosi in modo sincronizzato. È possibile realizzare una sincronizzazione inserendo i messaggi di uno sprite in una sequenza temporale e quelli dell’altro in un’altra sequenza che non si sovrapponga alla prima e, nell’insieme, le due sequenze restituiscano un colloquio corretto fra i due protagonisti. Tuttavia esiste una diversa modalità che prevede che i due sprite si passino la parola (figura seguente)

pattern multiagente-reattivo

• L’esecuzione degli script avviene, secondo la numerazione visualizzata in figura 6.4, attraverso lo scambio dei seguenti “ciao”, “come”, “dove”. In particolare:

• l’esecuzione si avvia con un click sulla bandiera verde che lancia lo script n.1 del primo sprite (sprite1), che

– visualizza, sul video “Ciao, io sono Michele, tu chi sei?”, per 3 secondi;

– quindi invia a tutti gli sprite il messaggio “ciao” tramite il blocco di broadcast “invia a tutti ciao e attendi”;

• il messaggio viene ricevuto solo dal secondo sprite (sprite2) attraverso lo script n. 2, che

– visualizza sul video “Ciao io sono Anna; come stai, che fai?” , per 3 secondi;

– quindi invia a tutti il messaggio “come”;

• il messaggio viene ricevuto dal primo sprite attraverso lo script n. 3, che

– visualizzerà sul video “Io sto bene; sto andando a scuola, andiamo insieme?” , per 3 secondi;

– quindi invia a tutti gli sprite il messaggio “dove”;

• questo viene ricevuto dal secondo sprite attraverso lo script n. 4, che

– visualizzerà “va bene, andiamo”, per 2 secondi.

• Quindi l’esecuzione termina.

• In questa applicazione solamente uno sprite alla volta, alternativamente, ha uno script da eseguire quando viene inviato un messaggio di broadcast.

• Le parole “ciao”, “come”, “dove”, sono arbitrarie e sono scelte da colui che costruisce l’applicazione.

anna

sente messaggio

“ciao”

eseguireInvia messaggio:Ciao! io sono Anna, come stai, che fai?

anna

sente messaggio

“andiamo”

eseguireInvia messaggio:Va bene, andiamo

Scratch Junior(https://www.scratchjr.org/index.html)

• È un ambiente visuale ed è adatto per sviluppare esperienze di coding con bambini dai cinque ai sette anni. Ha una interfaccia semplificata rispetto alle versioni di Scratch e di Snap!. Gli sprite sono chiamati character. Mantiene la struttura di questi ambienti di livello superiore in merito alla creazione di sfondi e/o nuovi stage, alla modifica del character, alla registrazione di audio e, infine, al raggruppamento di comandi.

• Inizialmente disponibile solo su iPAD, ora anche su sistemi Android.

Un percorso

Utilizzando Scratch Junior, un possibile itinerario può essere quello presentato in precedenza con opportune modifiche:

• Nel pattern mono-deliberativo potranno essere trattati i seguenti argomenti:

– familiarizzazione con l’ambiente di Scratch Jr;

– uso dei comandi di movimento e di gestione del character ;

– composizione di sequenze di azioni e concetti di istruzione e programma ;

– azioni ripetitive .

• In quello multi-deliberativo, verranno inseriti più character, tuttavia non interagenti fra loro e con l’ambiente per introdurre al significato di decentralizzazione.

• Infine nei pattern mono-reattivo e multi-reattivo, si introduce il concetto di evento e si analizza come, attraverso questo, sia possibile gestire le interazioni di un character e di più character fra loro e con l’ambiente

Una considerazione [1]

• In linea generale, senza cioè puntare l’attenzione sulla costruzione di applicazioni, l’attrazione che i piccoli sentono verso i dispositivi mobili è dovuta alla possibilità di una interazione tattile sullo schermo.

• Gli oggetti sono presi, spostati, eliminati e tutto avviene attraverso il tatto. Diversamente da altri dispositivi digitali, quelli mobili eliminano gli strumenti di input che permettono di trasformare le intenzioni degli utenti, impartite con opportune combinazioni di tasti o inclinazioni e orientamenti di un input dedicato, in possibili comandi da impartire. Si elimina questo passaggio intermedio e le azioni divengono immediate interazioni con ciò che avviene sullo schermo; l’azione è collocata sullo sviluppo della narrazione sul video.

Una considerazione [2]• Se l’apprendimento è dettato dall’azione sugli oggetti, in questo

caso ciò si realizza attraverso l’eliminazione di strumenti di intermediazione.

• Gli ambienti visuali, nel caso di costruzioni attraverso il coding, riducendo al minimo la necessità di scrivere codice e dando la possibilità di agire per mezzo del tatto sugli oggetti astratti, possono facilitare la costruzione di applicazioni.

• In questo caso possiamo “proprio parlare di costruzione”: i mattoni dell’artefatto programma sono spostati e portati agendo manualmente fra depositi e stage.

• Le stesse istruzioni hanno, nella loro veste grafica, degli ancoraggi che permettono loro di collegarsi l’una con l’altra, quasi a materializzare il significato astratto di programma in una costruzione fisico-grafica reale.

Pensiero computazionale e algoritmi

• Un algoritmo è un insieme di istruzioni finalizzato alla soluzione di un compito. Si ricorre spesso all’esempio di una ricetta per chiarirne il significato. Può essere utile, in quanto identifica da un lato un processo e dall’altro una serie di valori che vengono utilizzati nel processo. L’esempio è riferito ad una ricetta per fare biscotti:

• Tale esempio può far capire il significato di algoritmo come insieme di azioni finalizzato a un certo scopo. Chiarisce anche che un programma agisce su “qualcosa”, in questo caso gli ingredienti, senza i quali non è possibile fare la torta. Introduce anche al significato di azione che si ripete: l’istruzione 3 va ripetuta sei volte.

Pensiero computazionale e algoritmi

• Realizzare programmi senza costruire un computational thinking significa fare codingsecondo un mechanic learning by doing piuttosto che secondo un learning by making. Chi costruisce programmi deve essere consapevole di concetti quali azioni ripetitive, condizionali, algoritmo, pattern, però deve essere in grado di agirli globalmente e non localmente. Spesso un learning by doing diviene un procedere per prove ed errori che interviene in punti precisi del programma tralasciando la logica globale.

Pensiero computazionale e algoritmi

• Occorre invece riuscire a generalizzare le proprie soluzioni, a concepire pattern e a essere consapevoli delle operazioni di astrazione che il costruire programmi comporta. In definitiva non si tratta di usare regole di coding ma si tratta di costruire esperienze significativa attraverso ilcoding. Costruire programmi deve significare sviluppare attività autentiche e non solamente imparare codice; significa usare le proprie capacità nell’articolare e arricchire le abilità logiche di pensiero possedute.

Pensiero computazionale e algoritmi

• Costruire programmi è una attività di pensiero che porta a riflettere sul proprio modo di pensare, di analizzare e risolvere problemi; non è quindi fine a se stessa e solamente orientata alle cosiddette “discipline scientifiche”, ma investe un livello che sta sopra i contenuti disciplinari, investe la capacità di ciascuno di astrarre, di generalizzare.

Pensiero computazionale e algoritmi

• Il docente dovrebbe invitare lo studente alla realizzazione di modelli di progettazione che possano essere riutilizzati, anche attraverso delle modifiche, in situazioni diverse.

• Un patrimonio di pattern da riutilizzare permette a chi li costruisce di affinare le proprie capacità e a chi ne fruisce di implementare quelle di riconoscimento di similarità, quindi di generalizzazione. Significa vedere la propria soluzione non come fatto a se stante, ma come appartenente a una categoria che si riesce a cogliere nei suoi aspetti significativi. Significa saper condurre azioni, su un piano puramente cognitivo, di riconoscimento di modelli, di controllo e di modifica, se necessario, per un proficuo utilizzo nel contesto che si sta gestendo.

Narrazione e computational thinking

Bruner (1986) scrive che ci sono due tipi fondamentali di pensiero umano che sono in corrispondenza con due tipi di comunicazione: narrativo e paradigmatico. • La modalità narrativa è utilizzata comunemente per descrivere le

situazioni di vita nella ricchezza del loro sviluppo in un contesto; esplicita un pensiero e lo narra, racconta di situazioni umane;

• la modalità paradigmatica descrivere concetti e situazioni, cercando di astrarre dal contesto.

Sono due modi di ordinare l’esperienza e di costruire la realtà; il primo è un racconto, il secondo è una descrizione ben costruita di un argomento. La verifica li differenzia: nel secondo attiene a «processi che permettono di stabilire una prova formale e empirica»; nel primo «si stabilisce la più vicina approssimazione alla verità. Gli argomenti devono convincere per la loro verità» (Balbi J., Cimbolli P., 2009, pag. 241).

Narrazione e computational thinking

• Il pensiero paradigmatico è tipico del ragionamento scientifico: il pensiero segue una logica formale, che procede per inferenze; è finalizzato alla categorizzazione ed opera per astrazione.

• Quello narrativo viene impiegato prevalentemente nell'ambito di discorsi e ragionamenti quotidiani; è dentro ai contesti che forniscono categorie di senso e permettono di interpretare fatti. I suoi enunciati sono particolari, locali, dipendono dall’orizzonte interpretativo.

Narrazione e computational thinking

• Il mondo paradigmatico è popolato da tentativi di costruzione scientifica della realtà, da modelli che riescano a spiegare e a verificare la veridicità delle stesse spiegazioni. I suoi processi sono caratterizzati da passi logici dove vige categorizzazione e generalizzazione espressi da procedure formali.

• Il mondo narrativo persegue una costruzione narrativa, appunto, della realtà; non esplicita bisogni di prove e dimostrazioni. I suoi processi sono caratterizzati da soggettività che si sviluppa in storie che si dilatano e si comprimono nello spazio e nel tempo, seguendo bisogni di focalizzazioni per esplicitare valori, emozioni, capaci di risuonare nelle coscienze (Scaratti G., Grazzani Gavazzi I., 1998, pp. 310, 311).

Narrazione e computational thinking

• Il mondo della scuola è un terreno fertile per il pensiero narrativo e spesso si sviluppano esperienze vissute su palcoscenici dove recitano gli studenti e che prevedono la realizzazione di un video per memoria storica, ma anche come forma elementare di drammatizzazione filmica.

• Sarebbe possibile realizzare delle storie facendole vivere nel mondo digitale. Ambienti softwareopportuni permetterebbero di unire esperienze di narrazione con quelle di computational thinking. La narrazione con costruzione di una storia digitale (digital story telling) può essere un ideale terreno per esercitare il c.t.

Narrazione e computational thinking

• Uno sfondo interpretativo della convivenza fra pensiero paradigmatico e pensiero narrativo di Bruner può essere un digitaltale.

• Lo sviluppo del codice può rappresentare un esempio di pensiero del primo tipo e lo sviluppo della storia un esempio del secondo.

• Nel codice possiamo rintracciare le caratteristiche del pensiero paradigmatico quali l’astrazione, il formalismo per sviluppare modelli;

• nello sviluppo della storia tutte le caratteristiche dell’altro: i significati ricostruiti e trasmessi dall’autore; tutte le focalizzazioni su particolari temi e aspetti, attraverso opportune scelte degli spazi e dei tempi. I due approcci convivono nello stesso ambito e il primo spiega il secondo in modo formale.

Narrazione e computational thinking

• In particolare un ulteriore riferimento teorico di lettura può essere il richiamare due aspetti individuabili in una storia (Kermode F., 1981): la fabula e il sjuzet; la fabula è il senso della storia e lo sviluppo generale, il sjuzet e la sua realizzazione. Il sjuzet si interfaccia con il codingche rappresenta la trama che permette lo sviluppo della storia che vive in una fabula. La fabula esprime il tema fondamentale e i valori che vivono nella scansione del racconto che si sviluppa poi lungo le tappe del sjuzet.

Narrazione e computational thinking

La progettazione complessiva si sviluppa nelle seguenti fasi:

• individuazione della fabula (ovvero il mondo dei valori nel quale si sviluppa la storia);

• individuazione del sjuzet: le modalità di interazione degli attori in relazione ai temi della storia, nelle varie scene;

• progettazione del programma che permette lo sviluppo della storia:

– realizzazione delle scene;

– realizzazione degli script da associare agli attori della storia;

– prove e correzioni.

Narrazione e computational thinking

Nello sviluppo del sjuzet è possibile aiutarsi con uno schema attori-scene, che potrà poi essere utilizzato durante la digitalizzazione della storia.

Narrazione e computational thinking

• Gli attori sono gli sprite; la numerazione delle scene indica la loro sequenza nello sjuzet qualora siamo in un patterndecentralizzato-deliberativo invece, nel patterndecentralizzato-reattivo, sono nomi assegnati alle scene ma non identificano una sequenzialità che, appunto, in questo pattern non esiste. Le diverse scene vanno descritte testualmente, specificando le rispettive sceneggiature, descrivendo gli attori e le azioni che svilupperanno e cosa le attiveranno. Dettagliare questa fase di analisi in questa maniera facilità la realizzazione del programma relativo, in quanto contiene in fieri tutto ciò che occorrerà per lo sviluppo della storia; descrivendo le azioni dei vari attori si indicano, implicitamente, i diversi script che dovranno essere associati agli sprite.

approccio dichiarativo

dichiarativo, prolog

• Obiettivo di questa sezione è quello di introdurre la programmazione logica nel percorso del PNSD. La differenza sostanziale tra gli approcci precedenti (imperativi, ad oggetti, a eventi, ..) e l’approccio dichiarativo (e quindi linguaggi logici e non solo) è che nel primo caso il programma è caratterizzato da un insieme di istruzioni che esprimono “come” ottenere un determinato risultato; nel secondo caso il programma è caratterizzato da un insieme di affermazioni che descrivono uno specifico “stato del mondo” e di regole che permettono di elaborare queste affermazioni per ottenere delle risposte a domande poste. In definitiva si specifica che cosa occorre calcolare, piuttosto che come.

• I linguaggi logico-dichiarativi, rispetto ai linguaggi procedurali, sono molto simili al linguaggio naturale.

Da: Un software didattico per imparare la programmazione logica a scuola;Pierpaolo Di Bitonto, Teresa Roselli, Veronica Rossano, Dipartimento di Informatica – Università degli Studi di Bari

dichiarativo, prolog

• Un esempio di linguaggio dichiarativo logico è il PROLOG (PROgramming LOGic) che è stato progettato ed implementato a Marsiglia da Colmerauer e Roussel nel 1972. In un programma Prolog si descrive la conoscenza relativa al problema, rappresentata da fatti e regole fra questi, e poi sarà compito del sistema gestire lo sviluppo risolutivo a fronte di interrogazioni. Il PROLOG possiede un motore (Controllo), cioè un meccanismo interno che gli permette di collegare l'interrogazione con la conoscenza costituita per costruire una risposta.

esempio 1 di pgm Prolog

• Abbiamo un elenco di persone con numero telefonico e un secondo elenco delle stesse persone con il relativo indirizzo; si vuole gestire questi due elenchi per realizzare un elenco di abbonati al telefono;

esempio 1(elenco_tel.pl)

Il programma potrà essere strutturato nel seguente modo:

• tel(giorgio,223344).

• tel(maria,233445).

• tel(andrea,12234).

• tel(giorgio,283749).

• tel(giuseppe,223344).

• tel(anna,256781).

• tel(enrico,455466).

• tel(gianni,887799).

• indirizzo(giorgio,roma).

• indirizzo(maria,milano).

• indirizzo(andrea,torino).

• indirizzo(giuseppe,garibaldi).

• indirizzo(anna,tasso).

• indirizzo(enrico,marconi).

• indirizzo(gianni, garibaldi).

(Casadei G.A., Teolis A.G.B.)

ciascun “fatto” è formato da un predicato (“tel”, “indirizzo”) e da 2 argomenti ; sono delle costanti e vanno scritte in lettera minuscola e anche il predicato;I fatti possono avere 1, 2, 3, …. più argomenti.

esempio 1

Diverse sono le domande che possiamo porre al programma Prolog, ad esempio:

1. sapere se un utente con un numero telefonico esiste nell’elenco;

2. sapere se un utente con una via esiste nell’elenco;3. il numero telefonico di un utente conosciuto,4. a chi corrisponde un determinato numero telefonico,5. l’indirizzo di un determinato utente,6. chi abita in un certo indirizzo,7. il numero telefonico e l’indirizzo di un determinato utente,8. l’utente ed il suo indirizzo, conoscendo il numero

telefonico.

esempio 1

esistono due modalità di interrogazione:

• di controllo: per verificare se un fatto è compreso nella base di conoscenza;

• di ricerca: per ottenere delle informazioni dalla base di conoscenza.

domande di controllo

• Se si domanda:?- tel(andrea,12234).Prolog risponde: “true”

• Se si domanda :?- tel(andrea,45234).Prolog risponde: “false”

domande di ricerca

• il numero telefonico di un utente conosciuto:?-tel(anna, X).Prolog risponde: X:256781 (Prolog ricerca nei fatti un fatto che abbia come primo argomento “anna” e assegna a X il valore del secondo argomento; X è una variabile; la prima lettera di una variabile deve essere in maiuscolo)

• a chi corrisponde un determinato numero telefonico:?-Tel(X, 233445).Prolog risponde: X: Maria.

domande

Prendiamo in considerazione la domanda 7. Per conoscere il numero telefonico e l’indirizzo di anna dobbiamo dapprima chiedere:• ?-tel(anna, Numero_tel).

Prolog risponderà:Numero_tel=256781,

• quindi dobbiamo chiedere:?-indirizzo(anna, Via).Prolog risponderà:Via=tasso

Possiamo formulare una richiesta complessa formata dalle due domande:?-tel(anna, Numero_tel),indirizzo(anna, Via).Prolog cerca di soddisfare dapprima la prima domanda e poi la seconda, solo se entrambe sono soddisfatte, viene presentato il risultato, nel nostro caso:Numero_tel = 256781,Via = tasso

domande

Volendo conoscere l’elenco degli abbonati di via romacon il relativo numero di telefono, possiamo formulare al programma la seguente domanda:

?-tel(X,Num),indirizzo(X,roma).Prolog restituirà:X=GiorgioNum=223344X=GiorgioNum= 283749.

Giorgio abita in via roma e ha due numeri telefonici.

istanziazione, unificazione

Prendiamo in considerazione la domanda 8. Per conoscere quale utente ha un certo numero di telefono e dove abita, la domanda da formulare è la seguente:• tel(Persona, 455466), indirizzo(Persona, Via).

Prolog ricerca fra i fatti del predicato tel, quello che ha numero telefonico 455466 e quando lo incontra assegna il valore enrico alla variabile Persona (istanziazione); quindi cerca di soddisfare la seconda domanda con un fatto del predicato indirizzo che abbia come primo argomento l’attuale valore di Persona, cioè enrico, quando lo trova assegna alla variabile Via il valore tasso:Persona = enricoVia = marconi

In Prolog assegnare un valore ad una variabile si dice istanziare la variabile e ‘operazione di trovare un fatto uguale a un altro si chiama unificazione.

regole

Il Prolog non permette solamente di costruire programmi con una serie di fatti, ma esiste la possibilità di ‘combinare’ fatti per formare regole. Aggiungendo al programma la regola seguente:abbonato(X, Num, Via):-indirizzo(X,Via),tel(X,Num).esso diventa:tel(giorgio,223344).tel(maria,233445).……………………………..indirizzo(giorgio,roma).indirizzo(maria,milano).indirizzo(andrea,torino).……………………………………..abbonato(X, Num, Via):-indirizzo(X,Via),tel(X,Num).

Nella regola, ‘abbonato(X,Num,Via)’ rappresenta la testa e ‘indirizzo(X,Via),tel(X,Num)’, il corpo. Quindi una regola è formata da un termine, chiamato testa della regola, dal simbolo ‘:-‘ e da uno o più termini che costituiscono il corpo della regola.

Esempio 2

Stanze di un appartamento

Esempio 2(labirinto_0.pl)

Fatti:porta(a,b).porta(b,c).porta(c,d).porta(c,e).porta(e,f).

Domande:?-porta(a,b).

true?porta(b,a).

false

Esempio 2(labirinto_1.pl)

Si introducono due regole:porta(a,b).porta(b,c)porta(c,d).porta(c,e).porta(e,f).da(X,Y):-porta(X,Y).da(X,Y):-porta(Y,X).

Domande:da(b,a).true

Esempio 2

• Stanze vicine: quando nel passaggio da una all’altra si attraversa una sola stanza.

porta(a,b).porta(b,c)porta(c,d).porta(c,e).porta(e,f).da(X,Y):-porta(X,Y).da(X,Y):-porta(Y,X).

vicine(X,Y):-da(X,Z),da(Z,Y).

esempio 3

• Esempio: costruire una tabella di calciatori delle squadre del campionato di serie A e interrogare questa tabella. Lavorare a gruppi; ciascun gruppo crea una tabella per una squadra scelta.

M. Famiglietti, Tecnologia. Ricerca sul curricolo e innovazione didattica, Ufficio scolastico regionale dell’Emilia Romagna

esempio 3

Inter, Marco Andreolli, DifensoreInter, Cristian Ansaldi, DifensoreInter, Danilo Ambrosio, DifensoreInter, Joao Miranda de Souza Filho, DifensoreInter, Jeison Murillo, DifensoreInter, Yuto Nagatomo, DifensoreInter, Trent Sainsbury, Difensore Inter, Davide Santon, DifensoreInter, Guy Yao, DifensoreInter, Ever Banega, CentrocampistaInter, Jonathan Biabiany, CentrocampistaInter, Marcelo Brozovic, CentrocampistaInter, Antonio Candreva, CentrocampistaInter, Roberto Gagliardini, Centrocampista Inter, Joao Mario, CentrocampistaInter, Geoffrey Kondogbia, CentrocampistaInter, Gary Medel, CentrocampistaInter, Ivan Perisic, CentrocampistaInter, Citadin Martins Éder, AttaccanteInter, Gabriel Barbosa Almeida, AttaccanteInter, Mauro Icardi, AttaccanteInter, Rodrigo Sebastian Palacio, Attaccante

inter(andreolli, difensore)inter (ansaldi, difensore)inter (ambrosio, difensore)inter (miranda, difensore)inter(murillo, difensore)inter(nagatomo, difensore)inter(sainsbury, difensore )inter (santon, difensore)inter (yao, difensore)inter(banega, centrocampista)inter(biabiany, centrocampista)inter(brozovic, centrocampista)inter(candreva, centrocampista)inter(gagliardini, centrocampista )inter( joao_mario, centrocampista)inter(kondogbia, centrocampista)inter(medel, centrocampista)inter(perisic, centrocampista)inter(éder, attaccante)inter(barbosa, attaccante)inter(icardi, attaccante)Inter(palacio, attaccante)

PROLOG

squadra, giocatore, ruolo

M. Famiglietti, Tecnologia. Ricerca sul curricolo e innovazione didattica, Ufficio scolastico regionale dell’Emilia Romagna

esempio 3

Sono possibili richieste:

• inter(X, portiere) – risposta: handanovic (di ricerca)

• inter(eder, attaccante) - risposta: si (di controllo)

Con queste basi di conoscenza separate non è possibile rispondere a domande tipo: “Quali sono tutti i portieri del campionato di serie A?”. Ciascun gruppo vede la propria squadra e non si ha una base di conoscenza totale. Occorre costruire un nuovo modello che raggruppi tutte le squadre e permetta di identificare l’appartenenza dei giocatori alla propria squadra.

M. Famiglietti, Tecnologia. Ricerca sul curricolo e innovazione didattica, Ufficio scolastico regionale dell’Emilia Romagna

esempio 3

inter(andreolli, difensore).

inter (ansaldi, difensore).

inter (ambrosio, difensore).

inter (miranda, difensore).

……………..

milan(lapadula, attaccante).

milan(donnarumma, portiere).

………..

torino(belotti, attaccante).

……………..

giocatore (inter, andreolli, difensore).

giocatore(inter, ansaldi, difensore).

giocatore(inter, ambrosio, difensore).

giocatore(inter, miranda, difensore).

……………..

giocatore(milan,lapadula, attaccante).

giocatore(milan,donnarumma, portiere).

……………………

giocatore(torino, belotti, attaccante).

……………..

Il nome della squadra da nome del predicato è divenuto argomento di un predicato più generale.

M. Famiglietti, Tecnologia. Ricerca sul curricolo e innovazione didattica, Ufficio scolastico regionale dell’Emilia Romagna

esempio 3

domanda: quali sono i portieri di serie A?

• ?-campionato(Squadra, Nome, portiere).Risposta:Squadra: interNome: handanovicSquadra: milanNome: donnarummaSquadra: torinoNome: hart

M. Famiglietti, Tecnologia. Ricerca sul curricolo e innovazione didattica, Ufficio scolastico regionale dell’Emilia Romagna

un passo avanti

Analizzando meglio si nota che si possono individuare 3 insiemi (classi): giocatori, squadre e ruoli; proviamo a scrivere la nostra conoscenza nel seguente modo:

giocatore(1,andreolli).giocatore(2, ansaldi).giocatore(3, ambrosio).giocatore(4, miranda).giocatore(5, lapadula).giocatore(6, donnarumma).giocatore(7, belotti).

squa(1,inter).squa(2,milan).squa(3,torino).

ruo(at, attaccante).ruo(di, difensore).ruo(ce, centrocampista).ruo(po, portiere).

Ora però come si riesce a capire in quale squadra e con quale ruolo gioca un calciatore?

un passo avanti

Possiamo creare un’altra serie di fatti che metta in relazione le tre classi

gio_squa_ruo(1, 1, di).gio_squa_ruo(1, 2, di).gio_squa_ruo(1, 3, di).gio_squa_ruo(1, 4, di).gio_squa_ruo(2, 5, at).gio_squa_ruo(2, 6, po).gio_squa_ruo(3, 7, at).

La prima riga indica:squadra con codice 1 (inter), giocatore con codice 1 (andreolli), ruolo con codice di (difensore), in altri termini: il difensore andreolli gioca nell’inter

un passo avanti(calcio_3.pl)

La regola:

• domanda(Squadra,Nome,Ruolo):-squa(X,Squadra), giocatore(Y,Nome), ruo(Z,Ruolo), gio_squa_ruo(X,Y,Z).

• Permette di interrogare il pgm prolog per sapere:– ruolo e squadra, dato il giocatore

– i giocatori con il rispettivo ruolo, data una squadra;

– i giocatori con la rispettiva squadra, dato un ruolo;

– l’elenco dei giocatori con squadra e ruolo

– …………………………….

un passo avanti

• Se si fa la seguente domanda:?-domanda(Squadra, lapadula, Ruolo).Prolog restituisce:Squadra: milanRuolo: attaccante

Se si vuole sapere in quale squadra, e con quale ruolo, gioca miranda?

• Ulteriore materiale in http://www.didafor.com

Bibliografia

• Alessandri G., 2016, Didattica per il coding. Didattica, pensiero computazionale, corporeità, Aracne, Roma

• Alessandri G., 2014, Didattica e tecnologie: intersezioni. Complessità, coding, robotica educativa, Anicia,Roma

• Alessandri G., 2013, Tecnologie autonome nella didattica. Verso la robotica educativa, Morlacchi, Perugia.

• Alessandri G., Paciaroni M., 2013, Appunti sull’uso ludico delle tecnologie, Morlacchi, Perugia.

• Alessandri G., 2008, Dal desktop a second life. Tecnologie nella didattica, Morlacchi, Perugia