2. Questa presentazione
● Questa presentazione descrive un ipotetica attività di "coding" da fare in
classe (perché non si dica che siamo capaci solo di criticare )
● Il dominio è quello della lingua Italiana, scelto perché scarseggiano gli
esempi.
● L'obiettivo è costruire insieme un automa linguistico, cioè un programma
in grado di simulare un parlante della lingua Italiana, in una situazione
specifica molto semplice: premettere l'articolo ad un nome.
● Questa proposta non è nuova. Circa venticinque anni fa era in corso in
Italia una riflessione sui possibili usi dei computer e dei linguaggi di
programmazione nell'apprendimento della lingua.
● E' uno dei limiti della modalità corrente di fare coding: dimenticare la storia
3. Quali sono gli obiettivi del "coding"
1. Quello di sviluppare il Computational Thinking
2. Quello di preparare le nuove generazioni ai nuovi
lavori
3. Quello di far costruire ai ragazzi delle storie in maniera
alternativa alla scrittura
4. Quello di vaccinare i giovani contro lo strapotere delle
multinazionali ICT
5. Quello di dare ad ognuno le competenze minime per
scriversi un programma per risolvere i propri problemi
6. Quello di affrontare la didattica di qualsiasi disciplina
in maniera costruttivista
4. Il contesto
●
L'oggetto è costituito da conoscenze di base, che fanno parte del programma
della terza classe della scuola primaria.
●
Tuttavia i concetti utilizzati nell'attività sono probabilmente troppo complessi
per quell'età, almeno nella forma qui proposta.
●
Si può quindi ipotizzare che si tratti di una ripresa di quelle conoscenze da
parte di un gruppo di ragazzi più grandi, per esempio nella secondaria
inferiore.
●
Si può immaginare che lo scopo sia quello di costruire un programma che aiuti
i bambini più piccoli, o di un'altra lingua-madre; oppure può essere il punto di
partenza per un confronto tra lingue diverse nel quadro delle attività di
apprendimento della seconda lingua.
●
Spetti ad ogni docente trovare il momento ed il modo di introdurre un'attività
nella sua classe, riducendola, modificandola, adattandola al contesto reale.
5. A che serve
● Non si tratta di un'attività per imparare cosa sono gli
articoli e come si usano. Queste conoscenze, almeno
in forma generale, si considerano acquisite.
● Costruire un automa in grado di assegnare la forma
giusta di articolo ad un nome è soprattutto un modo di
riflettere sulle competenze linguistiche apprese, di
scomporle, di rappresentarle in modo da essere in
grado di applicarle anche a casi particolari.
● E' anche, o soprattutto, un modo di acquisire
consapevolezza della lingua.
6. Modello didattico
● A differenza di altri esempi (quiz, giochi) il modello è
esplicitamente quello dell'insegnamento al computer
da parte dello studente, o meglio da parte di un
gruppo di studenti.
● Il punto non è come trasmettere conoscenze agli
studenti; il punto è come un gruppo di studenti arriva
a costruire una conoscenza stabile, condivisibile,
rappresentata in una forma pubblica, a partire da
elementi sparsi, non strutturati, contraddittori o
apparentemente tali.
7. Il/la docente
● Il suo ruolo non è quello del trasmettitore, ma nemmeno
quello del tutor che sovraintende alle attività di
programmazione.
● Il/la docente è la guida, che apre la discussione, aiuta a
vagliare le ipotesi, suggerisce parallelismi e
approfondimenti.
● Il/la docente deve, naturalmente, avere un'ampia competenza
sulla lingua (sulle lingue) e sulla glottodidattica, ma anche
sulla programmazione.
● Deve essere in grado di proporre delle tecniche alternative, di
spiegarne i vantaggi e gli svantaggi.
8. Obiezione 1
● "Queste discussioni e questi ragionamenti si
sarebbe potuti fare tranquillamente senza un
computer, magari usando carta e matita".
Ma senza uno strumento pratico per costruire un
modello funzionante (un automa) non è possibile
sperimentare davvero quel modello.
Senza sperimentazione diretta, la lingua viene
presentata come un proprietà di qualcun altro –
mentre è patrimonio di tutti.
9. Obiezione 2
● "Queste discussioni e questi ragionamenti si
sarebbe potuti fare utilizzando un programmino
già fatto da qualche docente volenteroso."
Una cosa è costruire un modello, un'altra è
utilizzarlo senza sapere come è fatto dentro.
Si può, e si deve, discutere sul punto di partenza e
di arrivo del processo di costruzione: non si può
partire da zero e non si può pretendere di costruire
un programma perfetto.
10. L'ambiente
● Non è stato usato un ambiente visuale (come Scratch o Snap!) proprio
per facilitare la lettura del codice sorgente, il suo commento, la sua
modifica, il riuso di parti.
● Il codice presentato è scritto con Kojo, un ambiente didattico basato sul
linguaggio funzionale Scala e ricco di strumenti interessanti, tra cui un
sottoinsieme di istruzioni logo-like per muovere un robot sullo schermo.
http://www.kogics.net/sf:kojo
http://www.scala-lang.org/
http://minimalprocedure.pragmas.org/writings/kojo-scala-appunti/kojo-scal
a-appunti.html
11.
12. Concetti generali
● Grammatica e vocabolario (regole e fatti)
● Fonetica e pragmatica
● Automa linguistico
● Conoscenze (base di)
● Algoritmi
● Modello
● Categorizzazione
● Eccezioni
● ...
13. Concetti computazionali
● Funzione e catene di funzioni
● Classe
● Oggetto
● Lista
● Stringhe e sottostringhe
● Mappatura di funzioni
● For comprenhension
● Match
● Ricorsione
14. Versioni
● 4 versioni diverse, ognuna delle quali estende
l'obbiettivo della precedente, o generalizza la
strategia per il suo raggiungimento
● Versione 0: articolo maschile indeterminativo; la
conoscenza è espressa nella forma di un
vocabolario esplicito nome← →articolo
● Il programma è in grado di cercare la soluzione
(già pronta) in un elenco
15. Versione 0
// vocabolario:
val vocabolario = Map
(
"gnomo"->"lo",
"serpente"->"un",
"squalo"->"uno",
"albero"->"un"
)
val nome = "gnomo"
val risultato =
vocabolario.get(nome)
risultato match {
case Some(r) =>
println(r + " " + nome)
case None =>
println("Boh!")
}
16. Oltre gli elenchi: versione 1
● Si discutono i limiti della versione precedente
(è realizzabile? Come? Esiste, o può esistere,
un elenco completo?)
● Si prova a cambiare approccio: si costruisce
una grammatica.
● Si definiscono i possibili casi in funzione
dell'iniziale del nome (vocale, semivocale,
consonante, gruppi di consonanti)
17. Il progetto
● Si creano delle strutture di informazioni semplici
(delle liste) per i tipi di articoli, per i tipi di lettere.
● Si definiscono delle regole: inizia per vocale, inizia
per "vocale strana", inizia per consonante, inizia
per "consonante strana"
● A queste regole vengono agganciati gli articoli
indeterminativi corretti
● Resta da vedere come fare per insegnare al
programma a riconoscere le iniziali delle parole
18. Gli strumenti
● Per categorizzare le parole, si possono
confrontare le loro iniziali con la lista delle
lettere che abbiamo definito sopra
● Vengono usati tre costrutti del linguaggio:
startsWith, che verifica se una parola inizia
con una lettera, filter, che permette di
applicare un filtro ad una lista e isEmpty che
permette di controllare se il risultato è vuoto.
19. Le conoscenze
● Le categorie sono espresse come liste
semplici:
val artInDetList = List("un","uno")
val consonantiNormaliList = List
("b","c","d","f","g","h","l","m","n","p","q","r","s","
t","v")val consonantiStraneList = List
("z","gn","pn","ps","sb","sc","sf","sg","sl","sm","sn"
,"sp","sq","st","sv")
val vocNormaliList = List("a","e","i","o","u")
val vocStraneList = List("ia","ie","io","iu")
20. Le regole
● Le regole sono espresse come funzioni:
def iniziaPerVocale (nome: String) : Boolean = {
!vocNormaliList.filter(
nome.startsWith(_)
).isEmpty
}
21. Le versioni
● La versione 2 prende in esame anche gli articoli
determinativi
● La versione 3 prende in esame il genere e l'elisione
● Il codice diventa sempre più complesso e sono
introdotti nuovi costrutti (match, map,
foldLeft) e nuovi concetti (confronto,
applicazione di una funzione, ricorsione)
● Le versioni complete dei codici sorgenti sono
disponibili sotto licenza GPL 3.0
22. Le discussioni
● Più importanti del codice sono le discussioni
che accompagnano l'inizio della scrittura del
codice e la sua valutazione finale
● Sono discussioni che partono tanto dalla lingua
naturale che da quella artificiale
● Si possono indicare alcune piste, che però sta al
docente esplorare insieme alla sua classe, in
funzione della sua sensibilità, della sua
preparazione, dei suoi obiettivi
23. Suggerimenti
● Perché è così importante l'iniziale di una parola? Quanto sono frequenti le
parole che iniziano per vocale? E che significa "parola di genere femminile?
● Perché l'allitterazione è evitata in alcune lingue, ma non in altre simili? E perché
invece in poesia è considerata una tecnica efficace?
● Che differenza c'è tra un errore in un programma e un errore in un testo scritto
in un linguaggio naturale? Anche lì ci sono errori di ortografia, di sintassi, di
struttura. Quali sono quelli più gravi? Che significa, per un errore, essere
"grave"?
● Quanto è importante la leggibilità? Che impatto ha sulla "vita" di un testo, sul
suo passare da un autore ad un altro? E cosa implica la modifica di un testo
scritto da altri? E' la stessa cosa se parliamo di romanzi, articoli di Wikipedia o
di programmi?
● Si può tradurre il programma scritto in altri linguaggi? In tutti? Le lingue naturali
sono come quelle artificiali? Tutto si può tradurre?
24. Altri linguaggi
● Lo stesso programma si poteva scrivere in altri linguaggi,
più o meno semplici da imparare a usare, più o meno adatti
(anche in Scratch :-) )
● Qui vengono presentati altri due esempi, uno in
LibreLogo (interprete Logo scritto in Python che gira
"dentro" LibreOffice Writer) e uno in Prolog (linguaggio per
la programmazione logica).
● Ognuno può scegliere il linguaggio più adatto alla sua
situazione, o più congeniale; oppure può confrontare le
maniere diverse di affrontare l'obiettivo e i problemi che si
incontrano sulla strada
25. LibreLogo: un frammento
TO inizia_consonante :parola
:consonanti =
[“b”,“c”,“d”,“f”,“g”,“h”,“l”,“m”,“n”,“p”,“q”,“r”,“s”,“t
”,“v”]
:iniziale = trova_iniziale(:parola,0)
FOR :lettera IN :consonanti [
IF (:iniziale == :lettera)[ OUTPUT TRUE ]
]
OUTPUT FALSE
END
26. Prolog: un frammento
inizia_per_consonante_normale(Parola) :-
/* inizia con consonante seguita da vocale ? */
atom_chars(Parola,Lista_caratteri),
[Iniziale|Seconda] = Lista_caratteri,
consonanti(consonanti_normali,Lista_consonanti),
member(Iniziale,Lista_consonanti),
vocali(vocali_normali,Lista_vocali),
member(Seconda,Lista_vocali).
27. Sviluppi
● Si possono immaginare, oltre a modifiche e
personalizzazioni, infiniti sviluppi
● Altri casi simili (aggettivi dimostrativi)
● Altre lingue romanze
● Lingue immaginarie
● ...
28. Riferimenti
Alcuni testi pubblicati venticinque anni fa possono essere ancora utili (ammesso che si riesca a
trovarli). Per esempio:
G.Casadei, P.Cuppini, A. Palareti, Informatica per le discipline umanistiche. Applicazioni
didattiche del Prolog, Bologna, Zanichelli, 1989.
V.Midoro, Il filo di Arianna - Introduzione al Prolog, Torino, SEI, 1987.
Sui tre linguaggi utilizzati si possono leggere alcune introduzioni in Italiano:
Kojo/Scala (Massimo Ghisalberti):
http://minimalprocedure.pragmas.org/writings/kojo-scala-appunti/kojo-scala-appunti.html
LibreLogo (Andreas Formiconi)
http://iamarf.ch/unifi/Piccolo-manuale-LibreLogo.pdf
Prolog (Stefano Penge)
http://www.lynxlab.com/staff/steve/public/cma/prolog_intro_tutorial.pdf
29. Conclusioni
● Quello che mi interessava di più era presentare in maniera il più
possibile concreta una risposta alla domanda iniziale: quali
(pos)sono (essere) gli obiettivi del coding?
● Quella qui presentata è un'attività che non ha per scopo
l'introduzione del pensiero computazionale, ma la riflessione
sulla lingua, la formulazione di ipotesi e la loro
sperimentazione.
● Sono convinto che questo approccio si possa adottare in tanti
campi diversi. Sono tutti modi di mostrare l'utilità enorme che
potrebbe avere l'utilizzo di uno strumento di programmazione
adatto per migliorare i processi di apprendimento di gruppo.