Premessa
Ciao! Se è la prima volta che capiti su questo sito, ti consiglio di consultare la pagina principale di questo Giardino Digitale per scoprire meglio cos’è e come navigarlo.
Lo stato di questa nota è al momento: 🟡 Incompleta.
Quando pensiamo alla parola linguaggio, pensiamo normalmente a qualcosa che serve agli esseri umani per comunicare: l’italiano, l’inglese o la lingua dei segni. Un linguaggio è quindi un sistema che ci permette di costruire espressioni e di attribuire loro un significato.
Una lingua naturale, ossia una di quelle usate nella vita di tutti i giorni (come l’italiano), è estremamente complessa: non comprende soltanto un insieme di parole, ma anche regole grammaticali, eccezioni, ambiguità, contesto, significati impliciti e moltissimi altri fenomeni.
Per esempio, una persona capisce immediatamente che
Il gatto mangia il topo.
è una frase grammaticalmente ben formata, mentre
Gatto il topo mangia il.
non lo è.
Un essere umano può leggere una frase e utilizzare la propria conoscenza linguistica per stabilire se abbia senso. Un computer, invece, non possiede intuitivamente il concetto di “frase corretta”. Se vogliamo che possa elaborare un linguaggio, dobbiamo fornirgli una descrizione precisa e non ambigua delle sue regole, in modo che sia possibile stabilire meccanicamente quali espressioni sono ammesse e quali no.
È proprio da questa idea che nasce la teoria dei linguaggi formali, in cui il termine formale indica qualcosa che è stabilito da regole oggettive e ben chiare, non soggette a possibili interpretazioni come nel caso dei linguaggi naturali.
Definizione: teoria dei linguaggi formali
La teoria dei linguaggi formali è un ramo della matematica applicata che studia i linguaggi formali e le loro proprietà, utili in logica, informatica e linguistica.
1 - Introduzione ai linguaggi formali
Così come per i linguaggi naturali alla base di tutto ci sono le lettere dell’alfabeto con cui costruiamo le parole, anche i linguaggi formali hanno alla propria base i simboli di un alfabeto con cui possiamo costruire stringhe.
Partiamo quindi da questi concetti fondamentali per arrivare pian piano alla definizione di linguaggio formale.
1.1 - Simboli e alfabeti
Definizione: simbolo
Un simbolo (o carattere) è un oggetto matematico considerato come un’unità indivisibile all’interno di un linguaggio formale.
Esempi di simboli
Un simbolo può essere qualsiasi cosa vogliamo: i simboli più intuibili sono per esempio le lettere minuscole e maiuscole dell’alfabeto latino o le cifre decimali .
I simboli però possono essere anche altri tipi di caratteri, come il trattino basso o anche figure geometriche come e e, perché no, anche intere parole stesse possono essere considerate come simboli, per esempio le parole chiave e .
Definizione: alfabeto
Esempi di alfabeti
Ecco un po’ di esempi di alfabeti:
- è l’alfabeto delle cifre binarie, i cui unici simboli sono e .
- è l’alfabeto delle cifre decimali.
- è l’alfabeto latino.
Ricordiamo che gli alfabeti sono a tutti gli effetti degli insiemi, quindi possiamo farci delle operazioni, come per esempio l’unione. Abbiamo quindi che
è l’alfabeto che possiamo usare per rappresentare i numeri con la virgola, oppure
è l’alfabeto che possiamo usare per gli identificatori in C.
1.2 - Stringhe
Gli alfabeti possono essere usati per creare stringhe.
Definizione: stringa
Una stringa particolare è quella vuota.
Definizione: stringa vuota
1.2.1 - Operazioni e nozioni sulle stringhe
Definizione: stringhe uguali
Esempio di stringhe non uguali
Definizione: lunghezza di una stringa
Esempi di lunghezze di stringhe
Abbiamo per esempio che la stringa ha lunghezza , mentre la stringa vuota ha lunghezza .
Definizione: concatenazione di due stringhe
Esempio di concatenazione di stringhe
Date le stringhe e , la loro concatenazione è .
Proprietà: neutralità della concatenazione rispetto alla stringa vuota
La stringa vuota è l’elemento neutro della concatenazione: infatti, presa una qualsiasi stringa , la loro concatenazione o produce sempre .
Proprietà: associatività della concatenazione
La concatenazione è associativa, cioè date tre stringhe , e vale
Osservazione: non commutatività della concatenazione
La concatenazione non è commutativa, infatti date due stringhe e abbiamo che genericamente
eccetto nel caso in cui almeno una delle due è la stringa vuota (perché è l’elemento neutro della concatenazione) o in cui le due stringhe sono uguali.
Definizione: prefisso di una stringa
Definizione: suffisso di una stringa
Esempio di prefisso e suffisso di una stringa
Osservazione: una stringa è prefisso e suffisso di se stessa
Definizione: inversa di una stringa
Esempio di inversa di una stringa
Definizione: stringa palindroma
Esempi di stringhe palindrome
Un esempio di stringa palindroma è , la cui inversa è sempre . Anche la stringa vuota è considerata palindroma.
Definizione: potenza -esima di una stringa
Data una stringa , la sua potenza -esima (con ) è la stringa ottenuta concatenando per volte:
^definizione-potenza-n-esima-di-una-stringa
1.3 - Linguaggi formali
Ora possiamo finalmente definire cos’è un linguaggio formale.
Definizione: linguaggio formale
Esempi di linguaggi formali
Dato l’alfabeto delle cifre binarie, un possibile linguaggio formale su è
Un altro possibile linguaggio è , formato unicamente dai simboli dell’alfabeto.
Notazione: rappresentazione per caratteristica di un linguaggio
Esattamente come avviene per gli insiemi, anche i linguaggi possono essere rappresentati per caratteristica: per esempio,
indica il linguaggio composto dalle stringhe di di lunghezza dispari, oppure
indica il linguaggio delle stringhe composte da un numero arbitrario di seguite da un numero arbitrario di .
Definizione: linguaggio vuoto
Il linguaggio vuoto è un linguaggio contenente zero stringhe ed è quindi un insieme vuoto.
Attenzione: linguaggio vuoto diverso da linguaggio con stringa vuota
Il linguaggio vuoto, corrispondente a un insieme vuoto , e un linguaggio composto dalla sola stringa vuota non sono la stessa cosa, perché mentre il primo non ha elementi, il secondo ha un solo elemento che è :
1.3.1 - Operazioni su linguaggi
Osservazione: operazioni insiemistiche sui linguaggi
Dal momento che i linguaggi sono insiemi, anche su di essi possono essere applicate le operazioni insiemistiche dell’unione , intersezione e differenza .
Definizione: potenza -esima di un alfabeto
Dato un alfabeto , la sua potenza -esima (con ) è il linguaggio costituito da tutte le stringhe su di lunghezza :
In particolare, .
Esempio di potenza -esima di un alfabeto
Dato l’alfabeto , la sua potenza seconda è il linguaggio
Proposizione: cardinalità della potenza -esima di un alfabeto
Dato un alfabeto finito , con , e dato un , la cardinalità della sua potenza -esima è:
Dimostrazione: cardinalità della potenza -esima di un alfabeto
Per definizione, è l’insieme di tutte le stringhe su di lunghezza formate da simboli appartenenti a e, quindi, per costruire una stringa di lunghezza è necessario scegliere un simbolo di per ciascuna delle posizioni della stringa.
Poiché per ipotesi, per la prima posizione possiamo scegliere tra simboli dell’alfabeto, per la seconda posizione stessa cosa, e così via fino alla -esima posizione. Per il principio fondamentale del conteggio, il numero totale di stringhe ottenibili è quindi:
Pertanto:
Per , si ha e quindi:
Definizione: chiusura di Kleene su un alfabeto
Dato un alfabeto , la sua chiusura di Kleene è il linguaggio formato da tutte le stringhe su , inclusa quella vuota . Formalmente, è l’unione di tutte le potenze -esime di :
Esempio di chiusura di Kleene su un alfabeto
Dato l’alfabeto , la sua chiusura di Kleene è
Definizione: chiusura transitiva su un alfabeto
Dato un alfabeto . la sua chiusura transitiva è il linguaggio formato da tutte le stringhe su , eccetto quella vuota . Formalmente, è l’unione di tutte le potenze -esime di eccetto :
o, in alternativa,
Esercizio sulle chiusure sugli alfabeti
Dato l’alfabeto , elenca dieci stringhe del linguaggio
Soluzione dell'esercizio sulle chiusure sugli alfabeti
Il linguaggio è formato dalla differenza tra la chiusura transitiva e la chiusura di Kleene .
In particolare, la chiusura transitiva indica l’insieme di tutte le stringhe su , eccetto quella vuota , mentre la chiusura di Kleene indica l’insieme di tutte le stringhe su compresa quella vuota .
Quindi, facendo la differenza tra (cioè tutte le stringhe formate dai simboli , o ) e (cioè tutte le stringhe formate dai simboli o ), otteniamo le stringhe che contengono il simbolo almeno una volta:
Ora possiamo “ri-definire” l’operazione insiemistica del complemento, applicando questo concetto ai linguaggi formali.
Definizione: complemento di un linguaggio
Dato un linguaggio su un alfabeto , il suo complemento è il linguaggio ottenuto dalla differenza tra la chiusura di Kleene e stesso:
Definizione: concatenazione di due linguaggi
Dati due linguaggi e , la loro concatenazione è il linguaggio ottenuto concatenando ogni stringa con ogni stringa :
Esempio di concatenazione di due linguaggi
Dati i linguaggi e , la loro concatenazione è
Proprietà: associatività della concatenazione di linguaggi
La concatenazione è associativa, cioè dati tre linguaggi , e vale
Osservazione: non commutatività della concatenazione di linguaggi
La concatenazione non è commutativa, infatti dati due linguaggi e abbiamo che genericamente
eccetto in particolari casi, ad esempio quando almeno uno dei due è il linguaggio vuoto, oppure quando i due linguaggi coincidono.
Proprietà: assorbimento della concatenazione rispetto al linguaggio vuoto
Il linguaggio vuoto è un elemento assorbente della concatenazione: infatti, preso un qualsiasi linguaggio , la loro concatenazione o produce sempre il linguaggio vuoto .
Infatti, per la definizione di concatenazione, abbiamo che
ma, poiché il linguaggio vuoto non contiene alcuna stringa, non esiste nessuna stringa tale che . Di conseguenza, non esistono stringhe concatenabili e l’insieme risultante non contiene alcun elemento: da qui l’insieme vuoto. Stesso discorso per .
Proprietà: neutralità della concatenazione rispetto al linguaggio contenente la stringa vuota
Il linguaggio , costituito dalla sola stringa vuota, è l’elemento neutro della concatenazione dei linguaggi: infatti, preso un qualsiasi linguaggio , la sua concatenazione con , sia sia , produce sempre .
Esercizio 1 sulla concatenazione di linguaggi
Dato l’alfabeto , elenca dieci stringhe del linguaggio
Soluzione dell'esercizio 1 sulla concatenazione di linguaggi
Il linguaggio è formato dalla concatenazione di e .
Il linguaggio indica l’unione delle potenze seconde e terze di , ossia tutte le stringhe di lunghezza o su , quindi
Concatenando queste cinque stringhe di con , otteniamo
ed ecco dieci possibili stringhe di .
Definizione: potenza -esima di un linguaggio
Dato un linguaggio , la sua potenza -esima (con ) è il linguaggio ottenuto concatenando per volte:
Esempio di potenza -esima di un linguaggio
Dato il linguaggio , la sua potenza seconda è il linguaggio
2 - Approcci per la descrizione di linguaggi
Come abbiamo visto, possiamo descrivere un linguaggio formale attraverso le stringhe che lo compongono. Solitamente, ai fini dello studio, i linguaggi davvero interessanti sono quelli contenenti un numero infinito di stringhe, ma non è possibile descriverli semplicemente elencandole tutte (come per esempio fanno i vocabolari che elencano tutte le parole di una lingua).
Occorre quindi un approccio finito per descrivere un linguaggio infinito: potremmo per esempio trovare un modo meccanico per dire se una stringa è “accettabile” all’interno di un linguaggio o meno.
Fonti
- 🏫 Corso di Laurea in Informatica (
L-31 R) presso l’Università di Torino:
- Corso di Linguaggi Formali e Traduttori (
INF0344), A.A. 2026-27 (pagina Moodle):
- Prof. Jeremy James Sproston, slide del corso: