Un automa linguistico

29
E perché non un'automa? automa un uno un' CONSONANTI VOCALI MASCHILE FEMMINILE } Stefano Penge Creative Commons 3.0 Attribuzione – Non Commerciale – Condividi allo stesso modo https://creativecommons.org/licenses/by-nc-sa/3.0/it/legalcode

Transcript of Un automa linguistico

E perché nonun'automa?

automaun

uno

un'

CONSONANTIVOCALI

MASCHILEFEMMINILE

}

Stefano PengeCreative Commons 3.0 Attribuzione – Non Commerciale – Condividi allo stesso modo

https://creativecommons.org/licenses/by-nc-sa/3.0/it/legalcode

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

Quali sono gli obiettivi del "coding"

1. Quello di sviluppare il Computational Thinking2. Quello di preparare le nuove generazioni ai nuovi lavori 3. Quello di far costruire ai ragazzi delle storie in maniera alternativa alla scrittura4. Quello di vaccinare i giovani contro lo strapotere delle multinazionali ICT5. Quello di dare ad ognuno le competenze minime per scriversi un programma per risolvere i propri problemi6. Quello di affrontare la didattica di qualsiasi disciplina in maniera costruttivista

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.

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.

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.

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.

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.

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.

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-scala-appunti.html

Concetti generali

● Grammatica e vocabolario (regole e fatti)● Fonetica e pragmatica ● Automa linguistico● Conoscenze (base di)● Algoritmi ● Modello● Categorizzazione● Eccezioni● ...

Concetti computazionali

● Funzione e catene di funzioni● Classe● Oggetto● Lista● Stringhe e sottostringhe● Mappatura di funzioni● For comprenhension● Match● Ricorsione

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

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!")

}

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)

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

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.

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")

Le regole

● Le regole sono espresse come funzioni:def iniziaPerVocale (nome: String) : Boolean = {

!vocNormaliList.filter(

nome.startsWith(_)

).isEmpty

}

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

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

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?

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

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

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).

Sviluppi

● Si possono immaginare, oltre a modifiche e personalizzazioni, infiniti sviluppi

● Altri casi simili (aggettivi dimostrativi)● Altre lingue romanze● Lingue immaginarie● ...

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

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.