Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ariel
Sugli avvisi in bacheca abbiamo il link per le lezioni del martedì e del
giovedì. Le slide e le registrazioni le troviamo in “Contenuti > Lezioni e
materiali didattici”.
Appunti in formato PDF e lezioni dell’anno scorso. Abbiamo anche la
sezione “Esercizi svolti” con 3 temi d’esame svolti.
Su “Informazioni sul corso” abbiamo gli appelli e le modalità d’esame
(no parziali).
Com’è fatto l’esame?
Prova scritta + prova orale (raramente, a discrezione del docente).
Allo scritto potranno esserci domande aperte di teoria.
Per accedere all’esame bisogna essere iscritti al SIFA (chiedere alla
segreteria didattica).
Su Ariel abbiamo il programma totale e lezione per lezione. Sotto
“informazioni del corso” abbiamo anche le dispense del corso.
Esempi positivi:
- compilatori = traduzione dei programmi con la creazione di un
eseguibile ;
- interpreti = per l’esecuzione dei programmi prendendo i
programmi e mandandoli in esecuzione .
Esempi negativi:
- traduzione di linguaggi naturali, molto sconveniente dato che
esso può essere diviso in linguaggio parlato (rappresentato da un
segnale continuo) e in linguaggio scritto (con caratteri divisi da
spaziatura).
Il linguaggio naturale è molto vasto, ma se prendiamo sottolinguaggi
(esempio, messaggi delle stazioni ferroviarie) diventa più semplice
analizzarli.
Per l’intero linguaggio abbiamo un problema di ambiguità (ad esempio
pèsca e pésca).
Per trattarlo dobbiamo risolvere questo problema.
Per specificare un linguaggio ho bisogno di un sistema formale:
- Sistemi generativi, formati da vocaboli e regole che producono le
“grammatiche” ;
- Sistemi riconoscitivi, formati da macchine a stati finiti che
producono gli “automi” .
Altra visione
Possiamo pensare a un linguaggio come un problema:
Linguaggio formale = Problema di decisione con risposta SI/NO
1) Concetti base della teoria dei linguaggi.
Elementi della teoria della calcolabilità:
- Linguaggi ricorsivi ;
- Linguaggi ricorsivamente enumerabili ;
- Esistenza di un problema non trattabile ;
- Grammatiche = classificazione di Chomsky .
2) Linguaggi regolari:
- G di tipo 3 ;
- Automi a stati finiti ;
- Espressioni regolari ;
- Minimizzazione di automi ;
- Non determinismo .
3) Linguaggi acontestuali:
- G di tipo 2 ;
- Automi a pila ;
- Ambiguità ;
- Pumping lemma .
Parola Lunghezza
ω |ω|
Esempio
001011 |001011|=6
Qual’è la lunghezza di ε ?
|ε| = 0
*
Σ = insieme delle parole su Σ compresa ε
+
Σ = insieme delle parole su Σ esclusa ε
+ *
Σ = Σ − {ε}
Scomposizione di parole
Esempio:
“incatenare”
Prefisso
Fattore
Suffisso
*
Definizione formale: dati 𝑤, 𝑥 ∈ Σ
- Prefisso
Data 𝑤, 𝑥 è prefisso di 𝑤?
Si dice che 𝑥 è prefisso di 𝑤 quando 𝑤 = 𝑥𝑦 per una qualche parola 𝑦
*
con 𝑦 ∈ Σ .
- Suffisso
Data 𝑤, 𝑥 è suffisso di 𝑤?
Si dice che 𝑥 è suffisso di 𝑤 quando 𝑤 = 𝑦𝑥 per una qualche parola 𝑦
*
con 𝑦 ∈ Σ .
- Fattore
Si dice che 𝑥 è fattore di 𝑤 quando 𝑤 = 𝑦𝑥𝑧 per delle date parole 𝑦, 𝑧 con
*
𝑦, 𝑧 ∈ Σ .
Ci sono delle parole che possono essere contemporaneamente prefisso,
suffisso e fattore di 𝑤?
- ε parola vuota, può essere sia prefisso, suffisso e fattore di 𝑤 ;
- 𝑤 parola stessa, può essere sia prefisso, suffisso e fattore di se
stesso (𝑤) .
*
I linguaggi 𝐿 ⊆ Σ si dividono in finiti e infiniti, i quali possono
determinare la cardinalità.
Esercizi
1) 𝐴 = numeri binari escluso lo 0 = parole binarie con prefisso 1
*
-𝐴 = 1{0, 1} ;
*
-𝐵 = 0{0, 1} ;
*
-𝐶 = {0, 1} 0 ;
* *
𝐴 ∪ 𝐵 = 1{0, 1} ∪ 0{0, 1}
* *
𝐴 ∪ 𝐵 è uguale a Σ , {0, 1} ??
+ +
ε non appartiene né a 𝐴 né a 𝐵, quindi 𝐴 ∪ 𝐵 = Σ = {0, 1}
𝐴 ∩ 𝐵 =⊘
* * *
𝐴 ∪ 𝐶 = 1{0, 1} ∪ {0, 1} 0 = 1{0, 1} 0
𝑐 *
𝐴 = 𝐵 ∪ {ε} = 0{0, 1} ∪ {ε}
* 𝑛 *
2) 𝐴 = 𝑎 = {𝑎 | 𝑛 ∈ ℵ} = {𝑎}
𝑐
𝐴 = ?
Con Σ = {𝑎}
𝑐 *
𝐴 = {𝑤 ∈ {𝑎} | 𝑤 ∉ 𝐴} =⊘
* 𝑐
Se 𝐴 = Σ allora 𝐴 =⊘
Con Σ = {𝑎, 𝑏}
𝑐
𝐴 = {𝑡𝑢𝑡𝑡𝑒 𝑙𝑒 𝑝𝑎𝑟𝑜𝑙𝑒 𝑐ℎ𝑒 ℎ𝑎𝑛𝑛𝑜 𝑎𝑙𝑚𝑒𝑛𝑜 𝑢𝑛𝑎 𝑏}
* *
{𝑎, 𝑏} \{𝑎}
* *
Proviamo con 𝑏{𝑎, 𝑏} ∪ {𝑎, 𝑏} così escludiamo “𝑎𝑏𝑎”
* *
Per risolvere usiamo {𝑎, 𝑏} 𝑏{𝑎, 𝑏} parole che contengono almeno una 𝑏
Lezione del 10 Marzo 2022
Esercizio
+ *
𝐿 =? 𝐿 \{ε}
*
(In teoria no, dovrebbe essere 𝐿 meno il linguaggio con la parola vuota.
Esercizi
1) 𝐴 = {𝑚𝑜, 𝑠𝑒}
𝐵 = {𝑟𝑎, 𝑟𝑒}
𝐴 · 𝐵 = {𝑚𝑜𝑟𝑎, 𝑚𝑜𝑟𝑒, 𝑠𝑒𝑟𝑎, 𝑠𝑒𝑟𝑒}
𝐵 · 𝐴 = {𝑟𝑎𝑚𝑜, 𝑟𝑎𝑠𝑒, 𝑟𝑒𝑚𝑜, 𝑟𝑒𝑠𝑒}
𝐴 · 𝐵 ≠ 𝐵 · 𝐴 il prodotto di due linguaggi non è commutativo perchè
neanche il prodotto di due parole lo è (giustapposizione).
2) Numeri binari:
*
1{0, 1}
*
𝐴 = {1} e 𝐵 = {0, 1}
Il linguaggio 𝐴 contiene solo il simbolo 1 mentre il linguaggio 𝐵 contiene
tutte le parole del linguaggio.
* *
𝐴 · 𝐵 = {1}{0, 1} = 1{0, 1} (la seconda formula è un abuso di notazione)
Così otteniamo i numeri binari.
3) 𝐿 = {𝑎, 𝑏}
𝑘 *
𝐿 = 𝐿 · 𝐿 · 𝐿 · ... · 𝐿 = {𝑤 ∈ {𝑎, 𝑏} | |𝑤| = 𝑘}
𝑘
Concatenazione delle parole del linguaggio data una potenza 𝐿 , ad
3 𝑘
esempio data 𝐿 , 𝑎𝑏𝑎, 𝑎𝑎𝑎, 𝑎𝑎𝑏, 𝑒𝑐𝑐... appartengono a 𝐿 , mentre ad
𝑘
esempio ε, 𝑎, 𝑏𝑎, 𝑎𝑏 non appartengono a 𝐿 .
*
Σ =? 𝑖𝑛𝑠𝑖𝑒𝑚𝑒 𝑑𝑒𝑙𝑙𝑒 𝑝𝑎𝑟𝑜𝑙𝑒 𝑠𝑢 Σ 𝑐𝑜𝑚𝑝𝑟𝑒𝑠𝑎 ε
Inizialmente lo abbiamo considerato come dogma.
∞
* 𝑘
Consideriamo la precedente chiusura di Kleene, Σ = ⋃ Σ
𝑘=0
𝑘
Σ = parole su Σ con lunghezza 𝑘, lo abbiamo già fatto con il nostro
esempio 𝐿 = {𝑎, 𝑏} , il quale rappresentava un alfabeto. Quindi le
chiusure di Kleene funzionano anche sui Σ alfabeti.
𝑘 𝑘 𝑘 𝑘
= Σ ∪ Σ ∪ Σ ∪ ... ∪ Σ ∪ ...
2 𝑘
({ε} ∪ {𝑤 ∈ Σ | |𝑤| = 1} ∪ {𝑤 ∈ Σ | |𝑤| = 2} ∪ ... ∪ {𝑤 ∈ Σ | |𝑤| = 𝑘} ∪ ...)
Quindi l’uguaglianza è vera!!
Esercizi
- 𝐴 = {𝑏𝑏} Σ = {𝑏}
* 2𝑛
𝐴 = {𝑤 ∈ {𝑏} | |𝑤| = 2𝑛, 𝑛 ≥ 0} = {𝑏 | 𝑛 ∈ ℵ}
- 𝐴 = {𝑏𝑏, 𝑏}
*
(𝐴 , linguaggio formato dalle parole composte dalle parole del
linguaggio di 𝐴, in qualsiasi ordine con una lunghezza finita)
* * + +
𝐴 = {𝑏} e 𝐴 = {𝑏}
Osservazione:
*
Consideriamo una parola appartenente a 𝐴 , ad esempio 𝑏𝑏𝑏, la
domanda da farci è: “In quanti modi posso scomporre la parola con le
parole del linguaggio {𝑏𝑏, 𝑏}?”
Infatti è uguale a “𝑏 · 𝑏 · 𝑏” , “𝑏𝑏 · 𝑏” , “𝑏 · 𝑏𝑏”
Decomposizione in 𝐴
+
Se una parola in 𝐴 ammette più scomposizioni per la stessa parola,
allora il linguaggio non sarà un codice.
Concetto di codice
Possiamo costruire dei codici come dei linguaggi formali, soprattutto
*
utilizzando il + della chiusura di Kleene (quindi 𝐿 ). Per avere un codice
ho bisogno di una proprietà fondamentale, cioè se dato un linguaggio
+
𝐴 , una qualsiasi parola in 𝐴 possiede un, ed un solo, modo per essere
scomposta.
Un codice è, e deve essere un linguaggio finito.
Definizione
Un linguaggio 𝐿 è un codice quando:
+
Ogni parola in 𝐿 è decomponibile in un unico modo in parole di 𝐿.
Esempio:
𝐿 = {𝑎𝑎, 𝑎𝑏, 𝑏}
E’ un codice
Prendiamo ad esempio
+
𝑎𝑏|𝑎𝑎|𝑏|𝑎𝑎|𝑎𝑏 ∈ 𝐿
Questa parola può essere decomposta in un unico modo attraverso il
nostro linguaggio, quindi 𝐿 è un codice.
Definizione
𝐿 è un codice Prefisso o Istantaneo quando:
- è un codice ;
- ogni parola di 𝐿 non è prefisso di altre parole di 𝐿 .
Esempi
{𝑎𝑎, 𝑎𝑏, 𝑏} è un codice prefisso
{0, 01} non è un codice prefisso, dato che la parola “0” è prefisso della
parola “01”
Esempio negativo
𝐿 = {𝑎, 𝑏, 𝑎𝑏}
+
𝑎𝑏𝑎𝑏 ∈ 𝐿
Può essere scomposta come:
- 𝑎 · 𝑏 · 𝑎 · 𝑏;
- 𝑎𝑏 · 𝑎𝑏 ;
- 𝑎 · 𝑏 · 𝑎𝑏 ;
- 𝑎𝑏 · 𝑎 · 𝑏 .
Quindi non è un codice
Esempio positivo
𝐿 = {𝑎𝑎, 𝑎𝑏, 𝑏}
+
𝑎𝑏|𝑎𝑎|𝑏|𝑏 ∈ 𝐿
𝐿 è un codice
Esempio negativo
𝐿 = {0, 01}
Codice non prefisso siccome "0" è prefisso di "01"
Esempio positivo
𝐿 = {𝑎𝑎, 𝑎𝑏, 𝑏} ogni sua parola non è prefisso di nessun’altra
Fatto:
Ad ogni 𝐿 è associato il problema 𝑃𝐿
* *
Linguaggio 𝐿 = {𝑤 ∈ Σ | 𝑃(𝑤) = 1}⇔ Problema 𝑃𝐿 con Input: 𝑤 ∈ Σ e
Output: 𝑤 soddisfa la proprietà 𝑃? SI / NO (Problema di decisione)
Esempi
Consideriamo 𝐼 = 𝑙𝑖𝑛𝑔𝑢𝑎𝑔𝑔𝑖𝑜 𝑑𝑒𝑔𝑙𝑖 𝑖𝑛𝑑𝑖𝑟𝑖𝑧𝑧𝑖 𝑖𝑛𝑡𝑒𝑟𝑛𝑒𝑡
* *
= {𝑥 ∈ {0, 1, . } | 𝑥 = 𝑥1. 𝑥2. 𝑥3. 𝑥4 𝑑𝑜𝑣𝑒 𝑥𝑖 ∈ {0, 1} ∧ |𝑥𝑖| = 8}
Software in rete si chiedono se un indirizzo è corretto, cioè se 𝑥 ∈ 𝐼 ⇒
Trovare un sistema riconoscitivo per 𝐼.
Altro esempio
Linguaggio 𝑃 = 𝑙𝑖𝑛𝑔𝑢𝑎𝑔𝑔𝑖𝑜 𝑑𝑒𝑙𝑙𝑒 𝑝𝑎𝑠𝑠𝑤𝑜𝑟𝑑 𝑑𝑖 𝑢𝑛 𝑠𝑖𝑡𝑜 𝑤𝑒𝑏
* *
= {𝑤 ∈ {𝑎, ... , 𝑧, 𝐴, ... , 𝑍, 0, 1, ... , 9} | |𝑤| = 8 ∧ ∃𝑖 : 𝑥𝑖 ∈ {𝐴, ... , 𝑍} ∧
*
∃𝑗 : 𝑥𝑗 ∈ {0, 1, ... , 9} }
Si richiede che queste password vengano generate in maniera
automatica, o sistematica ⇒ Trovare un sistema generativo per 𝑃
Esempio
Problema: calcolare la parità dei numeri binari positivi.
*
Quindi la parità di stringhe della forma 𝑥 ∈ 1{0, 1}
Programma
*
𝑏𝑖𝑛 − 𝑝𝑎𝑟𝑖𝑡à (𝑥 = 𝑥1𝑥2... 𝑥𝑛 ∈ {0, 1} ) (cifre del numero binario 𝑥)
{𝑖𝑓(𝑥1 = 1) 𝑡ℎ𝑒𝑛 𝑟𝑒𝑡𝑢𝑟𝑛 ¬𝑥𝑛 ;
𝑙𝑜𝑜𝑝 ;
}
{
1 se 𝑥 è binario pari
↑ se 𝑥 non è binario
{
*
1 se 𝑥 ∈ 1{0, 1} 0
𝐹𝑣(𝑥) = *
0 se 𝑥 ∈ 1{0, 1} 1 ∪ {1}
*
⊥ se 𝑥 ∈ 0{0, 1} ∪ {ε}
*
𝐹𝑣: {0, 1} → {0, 1, ⊥}
Associazione Input/Output
Lezione del 17 Marzo 2022
Definizione
La funzione caratteristica di 𝐿 è:
{
1 se 𝑥 ∈ 𝐿
χ𝐿(𝑥) =
0 se 𝑥 ∉ 𝐿
Definizione
Un linguaggio 𝐿 è detto ricorsivo quando esiste un algoritmo 𝑤 tale che:
{
1 se 𝑥 ∈ 𝐿
𝐹𝑤(𝑥) =
0 se 𝑥 ∉ 𝐿
Inoltre
Se 𝐿 è ricorsivo allora:
- 𝑃𝐿 è detto decidibile (possiamo associare la parola “ricorsivo”,
proprietà che appartiene al linguaggio, con “decidibile”, proprietà
che appartiene al problema del linguaggio) ;
- 𝐿 ammette un sistema riconoscitivo (parliamo di un sistema
formale per riconoscere gli elementi) .
Esempi
Problemi decidibili:
- numeri pari ;
- numeri primi ;
Linguaggi ricorsivi:
* *
- 𝑎𝑏 ;
𝑛 𝑛
- {𝑎 𝑏 | 𝑛 > 0} .
Definizione
Un linguaggio 𝐿 è ricorsivamente enumerabile quando esiste una
procedura 𝑤 tale che:
{
1 se 𝑥 ∈ 𝐿
𝐹𝑤(𝑥) =
↑ se 𝑥 ∉ 𝐿
Relazione:
L’insieme dei linguaggi ricorsivi è un sottoinsieme dei linguaggi
ricorsivamente enumerabili. Dire che è ricorsivamente enumerabile
significa che l’algoritmo ha anche uno stato (o meglio “ramo”) di loop.
Teorema
Se 𝐿 è ricorsivo ⇒ 𝐿 è ricorsivamente enumerabile
Dimostrazione
Per ipotesi esiste un algoritmo 𝐴 per 𝐿:
devo dimostrare l’esistenza di una procedura 𝑃 :
(prendendo l’algoritmo precedente e peggiorarlo nel ramo 0)
Procedura 𝑃(𝑥):
{
𝑦 = 𝐴(𝑥); //𝐴 𝑒𝑠𝑖𝑠𝑡𝑒 𝑝𝑒𝑟𝑐ℎè 𝐿 è 𝑟𝑖𝑐𝑜𝑟𝑠𝑖𝑣𝑜
𝑖𝑓(𝑦 == 1) 𝑡ℎ𝑒𝑛 𝑟𝑒𝑡𝑢𝑟𝑛 (1) ;
𝑙𝑜𝑜𝑝 ;
}
Dimostrazione di correttezza
𝑥 ∈ 𝐿 ⇒ 𝐴(𝑥) = 1 ⇒ 𝑦 = 1 ⇒ 𝑃(𝑥) = 1
𝑥 ∉ 𝐿 ⇒ 𝐴(𝑥) = 0 ⇒ 𝑦 = 0 ⇒ 𝑃(𝑥) ↑
segue che 𝐿 è ricorsivamente enumerabile
Teorema
𝑐
Se 𝑙 è ricorsivo ⇒ 𝐿 è ricorsivo
(se so riconoscere un linguaggio, so riconoscere anche cosa non è di
quel linguaggio)
Dimostrazione
Per ipotesi ho:
𝑐
devo quindi costruire un algoritmo 𝐴' per 𝐿
{
𝐹𝑤(𝑥) se 𝑤 è un
*
𝐹𝑢(𝑤 $ 𝑥, 𝑒𝑛𝑡𝑟𝑎𝑚𝑏𝑖 ∈ {0, 1} ) = programma
⊥ altrimenti
{
1 se 𝑥 ∈ 𝐿
χ𝐿(𝑥) =
0 se 𝑥 ∉ 𝐿
Problemi decidibili, grazie ai quali riesco a discriminare le parole
che appartengono al linguaggio da quelle che non gli
appartengono.
- Un linguaggio si dice Ricorsivamente Enumerabile (𝐿) quando
esiste una procedura implementata da un programma 𝑤 tale che:
{
1 se 𝑥 ∈ 𝐿
𝐹𝑤(𝑥) =
↑ se 𝑥 ∉ 𝐿
*
Interprete: è un programma “𝑢” ∈ {0, 1}
Input: passiamo la coppia (programma, dato)
Output: il risultato del programma su quel determinato dato
{
𝐹𝑤(𝑥) quando 𝑤 è un programma
𝐹𝑢(𝑤$𝑥) =
⊥ altrimenti
*
Dove 𝑢 è l’interprete, 𝑤 è il programma, 𝑥 è il dato e 𝑤$𝑥 ∈ {0, 1}
Definiamo il linguaggio 𝐷
*
𝐷 = {𝑥 ∈ {0, 1} | 𝐹𝑢(𝑥$𝑥) ↓}
*
Insieme delle parole su {0, 1} che passate sia come dato che come
programma all’interprete fanno in modo che esso termini.
*
𝑥$𝑥 ∈ {0, 1} è quindi lecito passarlo ad 𝑢 interprete.
𝐷 è detto linguaggio dell’arresto ristretto (perchè testa solo 𝑥$𝑥).
𝐶 *
𝐷 = {𝑥 ∈ {0, 1} | 𝐹𝑢(𝑥$𝑥) ↑}
Teorema
1) 𝐷 è un linguaggio Ricorsivamente Enumerabile ;
2) 𝐷 non è ricorsivo ;
𝐶
3) 𝐷 non è ricorsivamente enumerabile.
{
1 se 𝑥 ∈ 𝐷 ∗
𝐹𝑃(𝑥) =
↑ se 𝑥 ∉ 𝐷 •
∗ quando 𝐹𝑢(𝑥$𝑥) ↓
• quando 𝐹𝑢(𝑥$𝑥) ↑
*
Posso costruire la seguente procedura 𝑅𝐼𝐶𝑁𝑈𝑀(𝑥 ∈ {0, 1} )
{
𝑦 = 𝐹𝑢(𝑥$𝑥) ; \\ istruzione eseguibile, dato che "𝑢" esiste
sempre e quindi posso richiamarlo
𝑟𝑒𝑡𝑢𝑟𝑛 (1) ;
}
(Non termina se 𝐹𝑢(𝑥$𝑥) non termina)
𝑅𝐼𝐶𝑁𝑈𝑀 è proprio la procedura 𝑃 che cercavamo.
Dimostrazione di correttezza di 𝑅𝐼𝐶𝑁𝑈𝑀:
- 𝑥 ∈ 𝐷 ⇒ 𝐹𝑢(𝑥$𝑥) ↓⇒ viene eseguita l’istruzione
𝑦 = (𝑑𝑖 𝑎𝑠𝑠𝑒𝑔𝑛𝑎𝑚𝑒𝑛𝑡𝑜) ⇒ 𝑟𝑒𝑡𝑢𝑟𝑛(1) ⇒ 𝑅𝐼𝐶𝑁𝑈𝑀(𝑥) = 1 GIUSTO!!
- 𝑥 ∉ 𝐷 ⇒ 𝐹𝑢(𝑥$𝑥) ↑⇒ 𝑅𝐼𝐶𝑁𝑈𝑀 va in loop all’istruzione
𝑦 = (𝑑𝑖 𝑎𝑠𝑠𝑒𝑔𝑛𝑎𝑚𝑒𝑛𝑡𝑜) ⇒ 𝑅𝐼𝐶𝑁𝑈𝑀(𝑥) =↑ GIUSTO!!
𝑅𝐼𝐶𝑁𝑈𝑀(𝑥) è la procedura 𝑃 che cercavamo che mostra che 𝐷 è un
linguaggio Ricorsivamente Enumerabile.
Idea
Adesso prendo 𝑥
Teorema
𝐴 non è ricorsivo
Dimostrazione per assurdo
Suppongo 𝐴 Ricorsivo e pertanto esiste 𝑦 :
Allora posso costruire un programma che chiameremo 𝐴𝑆𝑆𝑈𝑅𝐷𝑂𝐶(𝑥)
*
𝑥 ∈ {0, 1} → 𝑥$𝑥 → 𝑦(𝑥$𝑥) → 1 se 𝐹𝑢(𝑥$𝑥) ↓ quindi se 𝑥 ∈ 𝐷 e 0 se 𝐹𝑢(𝑥$𝑥) ↑
quindi se 𝑥 ∈ 𝐷
*
Programma 𝐴𝑆𝑆𝑈𝑅𝐷𝑂𝐶(𝑥 ∈ {0, 1} )
{
𝑖𝑓 𝑥$𝑥 ∈ 𝐴 𝑡ℎ𝑒𝑛 𝑟𝑒𝑡𝑢𝑟𝑛 (1) ;
𝑒𝑙𝑠𝑒 𝑟𝑒𝑡𝑢𝑟𝑛 (0) ;
}
Cosa fa 𝐴𝑆𝑆𝑈𝑅𝐷𝑂𝐶(𝑥) ?
Se 𝑥 ∈ 𝐷 ⇒ 𝐹𝑢(𝑥$𝑥) ↓⇒ 𝑥$𝑥 ∈ 𝐴 ⇒ 𝐴𝑆𝑆𝑈𝑅𝐷𝑂𝐶(𝑥) = 1 ;
Se 𝑥 ∉ 𝐷 ⇒ 𝐹𝑢(𝑥$𝑥) ↑⇒ 𝑥$𝑥 ∉ 𝐴 ⇒ 𝐴𝑆𝑆𝑈𝑅𝐷𝑂𝐶(𝑥) = 0 .
Il test 𝑥$𝑥 ∈ 𝐴 però è fattibile solo nel momento in cui 𝐴 sia ricorsivo.
𝐴𝑆𝑆𝑈𝑅𝐷𝑂𝐶 è un algoritmo per 𝐷 ⇒ assurdo ⇒ 𝐷 non è ricorsivo ⇒ anche 𝐴
non è ricorsivo.
Il problema dell’arresto è indecidibile e indipendente dalla tecnologia.
Esempio:
< 𝑠𝑜𝑝𝑝𝑟𝑒𝑠𝑠𝑖𝑜𝑛𝑒 >⇒ 𝐼𝑙 𝑡𝑟𝑒𝑛𝑜 𝑆 < 𝑛𝑢𝑚 > 𝑑𝑒𝑙𝑙𝑒 < 𝑜𝑟𝑎𝑟𝑖𝑜 > è 𝑠𝑜𝑝𝑝𝑟𝑒𝑠𝑠𝑜
⇒ 𝐼𝑙 𝑡𝑟𝑒𝑛𝑜 𝑆6 𝑑𝑒𝑙𝑙𝑒 < 𝑜𝑟𝑎𝑟𝑖𝑜 > è 𝑠𝑜𝑝𝑝𝑟𝑒𝑠𝑠𝑜
*
⇒ 𝐼𝑙 𝑡𝑟𝑒𝑛𝑜 𝑆6 𝑑𝑒𝑙𝑙𝑒 < 𝑜𝑟𝑒 > 𝑒 < 𝑚𝑖𝑛𝑢𝑡𝑖 > è 𝑠𝑜𝑝𝑝𝑟𝑒𝑠𝑠𝑜 ⇒
𝐼𝑙 𝑡𝑟𝑒𝑛𝑜 𝑆6 𝑑𝑒𝑙𝑙𝑒 10 𝑒 20 è 𝑠𝑜𝑝𝑝𝑟𝑒𝑠𝑠𝑜
Questa è una derivazione per la generazione di una frase degli annunci
ferroviari.
Formalizziamo
Definizione:
Una grammatica è una quadrupla:
𝐺 = (Σ, 𝑀, 𝑆, 𝑃) dove
- Σ insieme finito dei simboli terminali ;
- 𝑀 insieme dei <... > metasimboli con Σ ∩ 𝑀 =⊘ ;
- 𝑆 è un simbolo in 𝑀 , 𝑆 ∈ 𝑀 ed è l’Assioma (start symbol) ;
- 𝑃 è l’insieme finito delle regole di produzione .
Definizione
Il linguaggio generato da 𝐺 è:
* *
𝐿(𝐺) = {𝑤 ∈ Σ | 𝑆⇒ 𝑤}
(Tutte le parole generate dall’assioma principale)
Osservazioni:
● Un linguaggio può ammettere più grammatiche che lo generano ;
● Due grammatiche 𝐺1 e 𝐺2 si dicono equivalenti se 𝐿(𝐺1) = 𝐿(𝐺2) .
Esempi
Esempio 1.
𝐺 = ({𝑎}, {𝑆}, 𝑆, {𝑆 → 𝑎𝑆 𝑆 → 𝑎})
𝐿(𝐺)?
𝑆⇒𝑎
* 𝑛−1 𝑛
𝑆 ⇒ 𝑎𝑆 ⇒ 𝑎𝑎𝑆 ⇒ 𝑎𝑎𝑎𝑆⇒ 𝑎 𝑆⇒𝑎
+
𝐿(𝐺) = 𝑎
Esempio 2.
2𝑛
Se 𝐿 = {𝑎 | 𝑛 ≥ 1}
Qui possiamo derivare due grammatiche
𝐺1
𝑆 → 𝑎𝑎
𝑆 → 𝑎𝑎𝑆
𝐺2
𝑆 → 𝑎𝐴
𝐴 → 𝑎𝑆
𝐴→𝑎
𝐺1 e 𝐺2 sono equivalenti
Esempio 3.
𝑛 𝑛
𝐿 = {𝑎 𝑏 | 𝑛 > 0}
𝑆 → 𝑎𝑏
𝑆 → 𝑎𝑆𝑏
𝑛−1 𝑛−1 𝑛 𝑛
𝑆 ⇒ 𝑎𝑆𝑏 ⇒ 𝑎𝑎𝑆𝑏𝑏 ⇒ 𝑎 𝑆𝑏 ⇒𝑎 𝑏
Esempio 4.
Σ = {0, 1}
𝑟 +
Palindrome: 𝑃 = {𝑤𝑤 | 𝑤 ∈ {0, 1} }
𝑤 = 𝑤1𝑤2... 𝑤𝑛
𝑤𝑟 = 𝑤𝑛... 𝑤2𝑤1
Regole:
𝑆 → 00 𝑆 → 11 𝑆 → 0𝑆0 𝑆 → 1𝑆1
Domanda:
Tutti i linguaggi formali ammettono una grammatica?
Non tutti, infatti abbiamo il seguente teorema
Teorema
𝐿 è ricorsivamente enumerabile ⇔ 𝐿 è generato da 𝐺
Dimostrazione (solo ⇐)
Data la grammatica 𝐺 per 𝐿 posso costruire una procedura di 𝑤 tale che
{
1 se 𝑥 ∈ 𝐿
𝐹𝑤(𝑥) =
↑ se 𝑥 ∉ 𝐿
Definizioni:
𝐹𝑖 = {𝑝𝑎𝑟𝑜𝑙𝑒 𝑑𝑖 𝑠𝑖𝑚𝑏𝑜𝑙𝑖 𝑡𝑒𝑟𝑚𝑖𝑛𝑎𝑙𝑖 𝑒 𝑣𝑎𝑟𝑖𝑎𝑏𝑖𝑙𝑖 𝑜𝑡𝑡𝑒𝑛𝑢𝑡𝑒 𝑑𝑎 𝑆 𝑖𝑛 "𝑖" 𝑝𝑎𝑠𝑠𝑖 𝑑𝑖 𝑑𝑒𝑟𝑖𝑣𝑎𝑧𝑖𝑜𝑛𝑒}
𝑇𝑖 = {𝑝𝑎𝑟𝑜𝑙𝑒 𝑑𝑖 𝑠𝑜𝑙𝑖 𝑠𝑖𝑚𝑏𝑜𝑙𝑖 𝑡𝑒𝑟𝑚𝑖𝑛𝑎𝑙𝑖 𝑜𝑡𝑡𝑒𝑛𝑢𝑡𝑒 𝑑𝑎 𝑆 𝑖𝑛 "𝑖" 𝑝𝑎𝑠𝑠𝑖 𝑑𝑖 𝑑𝑒𝑟𝑖𝑣𝑎𝑧𝑖𝑜𝑛𝑒}
Nota : 𝑇𝑖 ⊆ 𝐹𝑖
(Quelle con variabili e simboli terminali sono contenute in 𝐹𝑖 mentre
quelle con solo simboli terminali 𝑇𝑖)
Fatto: 𝐿(𝐺) = ⋃ 𝑇𝑖
𝑖
Infatti:
*
1) 𝑥 ∈ 𝐿(𝐺) ⇒ ℎ𝑜 𝑆⇒ 𝑥 ⇒ ∃ 𝑖 : 𝑖 è il numero di passi di derivazione in
*
𝑆 ⇒ 𝑥 ⇒ 𝑥 ∈ 𝑇𝑖 ⇒ 𝑥 ∈ ⋃ 𝑇𝑖 (𝐿(𝐺) ⊆ ⋃ 𝑇𝑖);
𝑖 𝑖
*
2) 𝑥 ∈ ⋃ 𝑇𝑖 ⇒ ∃ 𝑖 : 𝑥 ∈ 𝑇𝑖 ⇒ ℎ𝑜 𝑆 ⇒ 𝑥 in “𝑖” di derivazione
𝑖
*
⇒ ℎ𝑜 𝑆 ⇒ 𝑥 ⇒ 𝑥 ∈ 𝐿(𝐺) (⋃ 𝑇𝑖 ⊆ 𝐿(𝐺)) .
𝑖
Formalizzo 𝐹𝑖 e 𝑇𝑖 :
*
𝐹𝑖 = {γ ∈ (Σ ∪ 𝑀) | η ⇒ γ 𝑒 η ∈ 𝐹𝑖−1} (formalizzazione ricorsiva)
*
𝑇𝑖 = {𝑥 ∈ Σ | 𝑥 ∈ 𝐹𝑖}
di 𝐿(𝐺) = ⋃ 𝑇𝑖
𝑖
𝐸𝐿𝐸𝑁𝐶𝐴 stampa:
𝑇1
𝑇2
𝑇3
...
*
Procedura 𝐸𝐿𝐸𝑁𝐶𝐴() ← 𝑥 ∈ Σ
{
𝐺 = (Σ, 𝑀, 𝑃, 𝑆) ; // fisso 𝐺
𝐹𝑜 = {𝑆} ;
𝑖 = 1;
𝑤ℎ𝑖𝑙𝑒(𝑖 > 0) 𝑑𝑜
{
𝐹𝑖 = 𝐶𝑜𝑠𝑡𝑟𝑢𝑖𝑠𝑐𝑖𝐹(𝐹𝑖−1, 𝐺) ;
𝑇𝑖 = 𝐶𝑜𝑠𝑡𝑟𝑢𝑖𝑠𝑐𝑖𝑇(𝐹𝑖, 𝐺) ;
𝑂𝑢𝑡𝑝𝑢𝑡(𝑇𝑖) ;
𝑖 = 𝑖 + 1;
}
}
Funzioni di 𝐸𝐿𝐸𝑁𝐶𝐴 :
𝐶𝑜𝑠𝑡𝑟𝑢𝑖𝑠𝑐𝑖𝐹 (𝐹𝑖−1 , 𝐺)
{
𝐹𝑖 =⊘ ;
𝑓𝑜𝑟 𝑒𝑎𝑐ℎ η ∈ 𝐹𝑖−1 𝑑𝑜
𝑓𝑜𝑟 𝑒𝑎𝑐ℎ α → β ∈ 𝑃 𝑑𝑜
*
𝑓𝑜𝑟 𝑒𝑎𝑐ℎ 𝑥, 𝑦 ∈ (Σ ∪ 𝑀) : η = 𝑥α𝑦 𝑑𝑜
𝐹𝑖 = 𝐹𝑖 ∪ {𝑥β𝑦} ;
𝑟𝑒𝑡𝑢𝑟𝑛 (𝐹𝑖) ;
}
𝐶𝑜𝑠𝑡𝑟𝑢𝑖𝑠𝑐𝑖𝑇 (𝐹𝑖 , 𝐺)
{
𝑇𝑖 =⊘ ;
𝑓𝑜𝑟 𝑒𝑎𝑐ℎ 𝑤 ∈ 𝐹𝑖 𝑑𝑜
*
𝑖𝑓(𝑤 ∈ Σ ) 𝑡ℎ𝑒𝑛
𝑇𝑖 = 𝑇𝑖 ∪ {𝑤} ;
𝑟𝑒𝑡𝑢𝑟𝑛 (𝑇𝑖) ;
}
2 modifica :
Sostituisco 𝑂𝑢𝑡𝑝𝑢𝑡(𝑇𝑖) con 𝑖𝑓(𝑥 ∈ 𝑇𝑖) 𝑡ℎ𝑒𝑛 𝑟𝑒𝑡𝑢𝑟𝑛 (1) ;
Grammatica di 𝐺 :
Σ = {0, 1, (, ), ∧, ∨}
𝑀 = {𝐸}
𝐸
𝑃 = {𝐸 → 0, 𝐸 → 1, 𝐸 → (𝐸 ∧ 𝐸), 𝐸 → (𝐸 ∨ 𝐸)}
𝑤 = (0 ∧ (1 ∨ 0)) ∈ 𝐿
*
𝐸 ⇒ (𝐸 ∧ 𝐸) ⇒ (0 ∧ 𝐸) ⇒ (0 ∧ (𝐸 ∨ 𝐸))⇒ (0 ∧ (1 ∨ 0))
Definizione
Un linguaggio si dice di tipo 𝑘 se ammette una grammatica di tipo 𝑘
(0, 1, 2, 3).
Definizione
*
𝑅𝑘 = {𝐿 ∈ Σ | 𝐿 è 𝑑𝑒𝑙 𝑡𝑖𝑝𝑜 𝑘} (classi di linguaggi di tipo 𝑘, ce ne sono 4)
𝑅3 = linguaggi regolari
𝑅2 = linguaggi liberi da contesto
𝑅1 = linguaggi definiti da contesto
𝑅0 = linguaggi ricorsivamente enumerabili
Documenti XML
Documenti composti da “testo” e “tag”. Il testo può essere arbitrario
mentre il tag deve rispettare alcune regole.
Tag= marcatore di testo che consente di dargli informazioni semantiche.
Esempio
< 𝑟𝑢𝑏𝑟𝑖𝑐𝑎 >
< 𝑛𝑜𝑚𝑒 > 𝑉𝑒𝑟𝑑𝑖 < /𝑛𝑜𝑚𝑒 >
< 𝑡𝑒𝑙𝑒𝑓𝑜𝑛𝑜 > 02487251 < /𝑡𝑒𝑙𝑒𝑓𝑜𝑛𝑜 >
< 𝑡𝑒𝑙𝑒𝑓𝑜𝑛𝑜 > 349501234 < /𝑡𝑒𝑙𝑒𝑓𝑜𝑛𝑜 >
< 𝑛𝑜𝑚𝑒 > 𝑅𝑜𝑠𝑠𝑖 < /𝑛𝑜𝑚𝑒 >
< 𝑡𝑒𝑙𝑒𝑓𝑜𝑛𝑜 > 04517677 < /𝑡𝑒𝑙𝑒𝑓𝑜𝑛𝑜 >
< /𝑟𝑢𝑏𝑟𝑖𝑐𝑎 >
< 𝑟𝑢𝑏𝑟𝑖𝑐𝑎 >< /𝑟𝑢𝑏𝑟𝑖𝑐𝑎 > indicano inizio e fine della rubrica, per ogni tag
aperto <... > ci deve essere un tag chiuso corrispondente < /... >
Formalizziamo le regole
Tag aperto: < 𝑡 >: 𝑡
Tag chiuso:< /𝑡 >: 𝑡
Condizioni che un documento deve soddisfare sono:
1) Deve esistere un unico tag che contiene tutto il documento 𝑠 ... 𝑠
nell’esempio avevamo 𝑟𝑢𝑏𝑟𝑖𝑐𝑎 ... 𝑟𝑢𝑏𝑟𝑖𝑐𝑎 ;
2) Ogni tag aperto deve essere seguito dal corrispondente chiuso ;
3) I tag devono essere innestati correttamente (𝑥 ... 𝑦 ... 𝑦 ... 𝑥).
Definizione
Un documento per il quale valgono le condizioni 1, 2, 3 si dice “corretto”.
DTD = definisce come i tag possono essere innestati tra di loro
Esempio:
Nel documento “rubrica” il tag < 𝑡𝑒𝑙 > non può stare dentro al tag
< 𝑛𝑜𝑚𝑒 >.
Definizione
Un documento XML è valido secondo un certo DTD se è generato da
quel DTD (grammatica di tipo 2). Le regole di un DTD sono della forma:
𝐴 → 𝑎𝑅𝑎𝑎 dove 𝑅𝑎 = espressione di variabili con le operazioni
+ (𝑢𝑛𝑖𝑜𝑛𝑒), ·, *
Creiamo un DTD:
*
𝑆 → 𝑠𝐶 𝑠 < 𝑠𝑡𝑢𝑑𝑒𝑛𝑡𝑖 >
*
𝐶 → 𝑐𝑀𝑁(𝐸𝑉) 𝑐 < 𝑐𝑢𝑟𝑟𝑖𝑐𝑢𝑙𝑢𝑚 >
𝑀 → 𝑚𝑚 < 𝑚𝑎𝑡𝑟𝑖𝑐𝑜𝑙𝑎 >
𝑁 → 𝑛𝑛 < 𝑛𝑜𝑚𝑒 >
𝐸 → 𝑒𝑒 < 𝑒𝑠𝑎𝑚𝑒 >
𝑉 → 𝑣𝑣 < 𝑣𝑜𝑡𝑜 >
Anche questo DTD è della forma 𝐴 → 𝑎𝑅𝑎𝑎
Teorema sugli 𝑅𝑘 :
𝑅3 ⊂ 𝑅2 ⊂ 𝑅1 ⊂ 𝑅0
Correttezza di 𝑤:
𝑥 ∈ 𝐿(𝐺) ⇒ esiste una derivazione in 𝐺
𝑆 ⇒ 𝑧1 ⇒ 𝑧2 ⇒ ... ⇒ 𝑧𝑘 ⇒ 𝑥 tale che
per ogni 𝑖 abbiamo che |𝑧𝑖| ≤ |𝑧𝑖+1| , |𝑧𝑖| ≤ |𝑥| e 𝑧𝑖 ∈ 𝑉𝑥 inoltre abbiamo che
𝐹𝑤(𝑥) = 1
𝑥 ∉ 𝐿(𝐺) ⇒ 𝐹𝑤(𝑥) = 0
Teorema sugli 𝑅𝑘
𝑅3 ⊂ 𝑅2 ⊂ 𝑅1 ⊂ 𝑅0 continua a valere grazie al FATTO 𝐼𝐼
Teorema 𝑅1 ⊆ 𝑅𝑖𝑐𝑜𝑟𝑠𝑖𝑣𝑖
Continua a valere perchè la frase (𝑆) preserva la lunghezza non
decrescente delle derivazioni.
Posso passare dalla forma (𝑖) a (𝑖𝑖) eliminando le regole della forma
𝐴 → σ.
- Introduco una variabile 𝑋 ;
- Per ogni regola 𝐴 → σ introduco 𝐴 → σ𝑋 e 𝑋 → ε ;
- Cancello le regole del tipo 𝐴 → σ .
⇐ ) Facile perchè 𝑥 = 𝑦 = σ
⇒ ) Trasformazione da mostrare
Esempio
𝐴 → 𝑎𝑏𝑐𝐵 con 𝑎, 𝑏, 𝑐 ∈ Σ simboli terminali
Prendo 𝑋 = 𝑏𝑐𝐵
𝐴 → 𝑎𝑋 𝑋 → 𝑏𝑐𝐵
Prendo 𝑌 = 𝑐𝐵
𝑋 → 𝑏𝑌 𝑌 → 𝑐𝐵
Abbiamo trovato regole 𝐴 → 𝑥𝐵 con |𝑥| > 0 rendendole 𝐴 → σ𝐵
*
Per le regole della forma 𝐴 → 𝑦 con 𝑦 ∈ Σ utilizziamo la stessa tecnica
Ad esempio
𝐴 → 𝑎𝑏𝑐 con 𝑎, 𝑏, 𝑐 ∈ Σ lettere terminali
Prendo 𝑋 = 𝑏𝑐
𝐴 → 𝑎𝑋 𝑋 → 𝑏𝑐
Prendo 𝑌 = 𝑐
𝑋 → 𝑏𝑌 𝑌→𝑐
In dettaglio:
● In ogni istante di tempo 𝑡 l’automa si trova in un particolare stato.
Inizialmente 𝐴 si trova in uno stato iniziale 𝑞0 ;
● In funzione del simbolo letto e dello stato attuale 𝐴 cambia stato,
quindi chiameremo δ la funzione di transizione:
○ δ(𝑞 , σ) = stato prossimo di 𝐴 essendo in 𝑞 e leggendo σ ;
● Una volta letta l’intera parola 𝑤 , 𝐴 raggiunge uno stato 𝑝 e l’uscita
dipende da 𝑝:
○ λ(𝑝) = 0 o 1 se 𝑝 è uno stato finale, funzione λ di uscita.
Formalizziamo:
Definizione
Un automa a stati finiti è una tupla
𝐴 =< Σ , 𝑄 , 𝑞0 , δ, λ (𝑙𝑎 𝑞𝑢𝑎𝑙𝑒 𝑐𝑖 𝑑𝑎𝑟à 𝑢𝑛 𝑖𝑛𝑠𝑖𝑒𝑚𝑒 𝑑𝑖 𝑠𝑡𝑎𝑡𝑖 𝑓𝑖𝑛𝑎𝑙𝑖 𝐹) >
Dove:
Σ = alfabeto di input
𝑄 = insieme degli stati (se 𝑄 è finito allora 𝐴 è a stati finiti)
𝑞0 = stato iniziale di partenza
δ = funzione di transizione
δ: 𝑄 × Σ → 𝑄
λ = funzione di uscita
λ: 𝑄 → {0 , 1}
oppure
𝐹 ⊆ 𝑄 stati finali o accettanti
Osservazione:
- Data λ posso avere 𝐹 come 𝐹 = {𝑞 ∈ 𝑄 | λ(𝑞) = 1} ;
- Dato 𝐹 posso avere λ come λ(𝑝) = 1 se 𝑝 ∈ 𝐹 mentre sarà = 0 se
𝑝∉𝐹
Rappresentazioni di δ:
Esempio:
𝑄 = {𝑞0 , 𝑞1}
Σ = {𝑎 , 𝑏}
𝑞0 iniziale
𝐹 = {𝑞0}
δ 𝑎 𝑏
𝑞0 𝑞1 𝑞0
𝑞1 𝑞0 𝑞1
{
*
δ (𝑞 , ε) = 𝑞
* *
δ (𝑞 , 𝑤σ) = δ(δ (𝑞 , 𝑤) , σ)
*
dove 𝑤 ∈ Σ e σ ∈ Σ
Stati particolari
● Stato trappola: 𝑞 è uno stato trappola se vale che
∀σ ∈ Σ ⇒ δ(𝑞 , σ) = 𝑞 e 𝑞 ∉ 𝐹 (di solito assorbe le parole rifiutate) ;
● Stato osservabile: 𝑝 è uno stato osservabile se
* *
∃𝑤 ∈ Σ : δ (𝑞0 , 𝑤) = 𝑝 (è osservabile se è raggiungibile dallo stato
iniziale) .
Esempio:
Si può notare che 𝑞1 è uno stato osservabile grazie ad "𝑎" es è anche
uno stato trappola perchè non esce da 𝑞1 e non è uno stato finale.
Lo stato 𝑞0 è osservabile partendo sempre da 𝑞0 con la parola "𝑏" o con
la parola vuota ε (δ(𝑞 , ε) = 𝑞) , ma non è uno stato trappola perchè è
finale e con "𝑎" vado in 𝑞1.
Lo stato 𝑞2 è non osservabile perchè da 𝑞0 non è raggiungibile (questo
stato si può eliminare).
Definizione
Stati indistinguibili
* * *
𝑞 e 𝑝 si dicono indistinguibili quando ∀𝑤 ∈ Σ : λ(δ (𝑞 , 𝑊)) = λ(δ (𝑝 , 𝑤))
Stati distinguibili
* * *
𝑞 e 𝑝 si dicono distinguibili quando ∃𝑤 ∈ Σ : λ(δ (𝑞 , 𝑊)) ≠ λ(δ (𝑝 , 𝑤))
(quindi sono distinti per almeno una parola).
Notazione
𝑞 ≈ 𝑝 indistinguibili
𝑞 𝑛𝑜𝑡 ≈ 𝑝 distinguibili
Esempio
non posso eliminare alcuno stato
*
𝐿(𝐴) = {𝑎, 𝑏} 𝑎
(nello stati finale entrano le frecce etichettate con "𝑎")
(tutte le frecce etichettate con "𝑏" mi portano in stati che non
appartengono a 𝐹)
𝑄/ ≈= {𝑠0 , 𝑠1}
𝐴≈ =<
Σ = {𝑎, 𝑏}
𝑄/ ≈= {𝑠0 , 𝑠1}
[𝑞0]≈ = 𝑠0 stato iniziale
δ≈ da costruire
𝐹≈ = {𝑠1}
>
Definiamo δ≈ :
δ≈ 𝑎 𝑏
𝑠0 𝑠1 𝑠0
𝑠1 𝑠1 𝑠0
*
𝐿(𝐴≈) = {𝑎, 𝑏} 𝑎
𝐴≈ è equivalente ad 𝐴 ma cambia il numero di stati 𝐴 = 3 stati e 𝐴≈ = 2
stati.
Nella prossima lezione vedremo stati minimi e massimi per un automa.
Punto 1
Automa massimo: 𝐺𝐿
Desideriamo che quando leggo una parola l'automa mi porti in uno
stato diverso. L’idea è: per ogni parola in input raggiungo uno stato
diverso.
*
∀𝑤, 𝑤' ∈ Σ δ(𝑞0 , 𝑤) ≠ δ(𝑞0 , 𝑤') ⇒ 𝑄 = Σ (ogni parola ha il suo stato)
Inoltre, per non perdere stati, tutti gli elementi di 𝑄 devono essere
osservabili.
∀𝑞 ∈ 𝑄 ∃𝑤 : 𝑞 = δ(𝑞0 , 𝑤)
(definizione di stato osservabile)
Definizione
*
𝐺𝐿 =< Σ , 𝑄 = Σ , [ε] , δ𝐺 , 𝐹𝐺 >
𝐿 𝐿
dove
[ε] etichetta dello stato iniziale come la parola vuota ε
δ𝐺 ([𝑤] , σ) = [𝑤σ]
𝐿
𝐹𝐺 = {[𝑤] ∈ 𝑄 : 𝑤 ∈ 𝐿}
𝐿
Prima tecnica:
Teorema
𝐺𝐿≈ è l’automa minimo per 𝐿. Cioè 𝐺𝐿≈ = 𝑀𝐿 .
Quindi devo mostrare che se ho un automa 𝐴 per 𝐿 allora |𝐴| ≥ |𝐺𝐿≈|
(numero di stati di 𝐴 è maggiore del numero di stati di 𝐺𝐿≈ ).
Per prima cosa mostriamo un fatto.
FATTO: gli stati distinguibili in 𝐺𝐿≈ sono stati distinti in 𝐴. Infatti siano [𝑥]
*
e [𝑦] due stati di 𝐺𝐿 distinguibili in esso, cioè: [𝑥] 𝑛𝑜𝑡 ≈ [𝑦] ⇒ ∃𝑤 ∈ Σ :
Allora in 𝐴:
δ(𝑞0 , 𝑥) ≠ δ(𝑞0 , 𝑦) altrimenti
Seconda tecnica:
Teorema
Sia 𝐴 un automa a stati finiti per 𝐿 tale che gli stati di 𝐴 siano:
- tutti osservabili ;
- tutti distinguibili .
Allora 𝐴 è minimo per 𝐿.
Corollario
𝐴≈ è minimo per 𝐿 se 𝐴 ha tutti gli stati osservabili.
Dimostrazione del teorema
Siano {𝑞1 , 𝑞2 , ... , 𝑞𝑛} gli stati di 𝐴 (dove 𝑞1 sarà lo stato iniziale).
Vale che:
- sono tutti osservabili ;
- sono tutti distinguibili .
Sono osservabili:
Allora esistono parole {𝑤1 , 𝑤2 , ... , 𝑤𝑛} tale che ∀𝑖 𝑞𝑖 = δ(𝑞1 , 𝑤𝑖).
Sono distinguibili:
Allora esistono parole 𝑥𝑖𝑗 che distinguono gli stati
Sia 𝐴' un automa per 𝐿 con meno stati di 𝐴 (meno di 𝑛 numero di 𝐴).
(tecnica per assurdo)
Diamo in input ad 𝐴' le parole {𝑤1 , 𝑤2 , ... , 𝑤𝑛} (parole date in precedenza
ad 𝐴) si ha
Dato che ho meno stati, due parole raggiungono lo stesso stato dato
che |𝐴'| ≤ 𝑛
Secondo il principio della piccionaia (se abbiamo più piccioni che
gabbie avremo almeno una gabbia con due piccioni).
Siano 𝑤𝑖 e 𝑤𝑗 queste parole che mi portano nello stesso stato. In 𝐴'
dunque accade che:
Così ottengo che 𝑤𝑖𝑥𝑖𝑗 e 𝑥𝑗𝑥𝑖𝑗 sono entrambe ∈ 𝐿 o ∉ 𝐿 quindi 𝐴' non
riconosce parole in 𝐿 (Assurdo!!!) e infine non esiste in automa in 𝐿 con
meno stati di 𝐴
Algoritmi
1. E’ possibile confrontare gli stati seguendo un ordine casuale ;
2. Devo applicare un algoritmo sui confronti ben preciso .
𝑛 𝑚
Costruzione di 𝐺𝐿≈ per 𝐿 = {𝑎 𝑏 | 𝑎, 𝑚 > 0} con correzioni secondo
l’algoritmo
Applicazione dell’algoritmo. Visite:
● [ε] resta ;
● [𝑎] :
○ [𝑎] 𝑛𝑜𝑡 ≈ [ε] a causa della parola "𝑏" (partendo da [𝑎] , "𝑏"
viene accettata ma non accade il viceversa);
● [𝑏] :
○ [𝑏] 𝑛𝑜𝑡 ≈ [ε] a causa della parola "𝑎𝑏" (partendo da [ε] , "𝑎𝑏"
viene accettata ma non accade il viceversa);
○ [𝑏] 𝑛𝑜𝑡 ≈ [𝑎] a causa della parola "𝑏" (partendo da [𝑎] , "𝑏"
viene accettata ma non accade il viceversa) ;
● [𝑎𝑎] :
○ [𝑎𝑎] 𝑛𝑜𝑡 ≈ [ε] a causa della parola "𝑏" (partendo da [𝑎𝑎] , "𝑏"
viene accettata ma non accade il viceversa) ;
○ [𝑎𝑎] ≈ [𝑎] indistinguibile perchè le parole lette da entrambi
gli stati vengono rifiutate o accettate allo stesso modo,
quindi cancello lo stato ed il suo sottoramo e collego l’arco
allo stato indistinguibile precedente ;
● [𝑎𝑏] :
○ è inutile confrontare uno stato finale con gli stati non finali,
dato che ci sarà sempre la parola "ε" a differenziarli ;
● [𝑏𝑎] e [𝑏𝑏] :
○ sono due stati che vengono rifiutati perchè partono da [𝑏] ,
sono indistinguibili da [𝑏] quindi essi possono essere
eliminati e i loro archi spostati verso di esso ;
● [𝑎𝑏𝑎] :
○ [𝑎𝑏𝑎] viene rifiutata a prescindere, quindi è indistinguibile da
[𝑏] (stesso procedimento di prima) ;
● [𝑎𝑏𝑏] :
○ stato indistinguibile con [𝑎𝑏] (in quanto finale) e in quanto
con "𝑏" le parole vengono accettate mentre con "𝑎" vengono
rifiutate in entrambi gli stati .
𝑛 𝑛
Costruzione di 𝐺𝐿≈ per {𝑎 𝑏 | 𝑛 > 0}
(Sono stati rimossi gli stati trappola, e quindi abbiamo solo i cammini
per gli stati terminali)
𝑛 𝑛
Da questo grafico capisco che 𝐺𝐿≈ ha stati infiniti e quindi 𝑎 𝑏 non è
regolare. Avremo quindi un ramo infinito con "𝑎" ed un ramo infinito con
"𝑏".
FATTO
𝑛 𝑛
𝑎 𝑏 non è regolare
Dimostrazione
𝑛 𝑛
- L’automa minimo 𝐺𝐿≈ per 𝑎 𝑏 ha infiniti stati ;
𝑛 𝑛
- Allora 𝑎 𝑏 non ammette un automa a stati finiti ;
- vista l’equivalenza tra automi finiti e grammatiche di tipo 3, esso
non è regolare.
Lezione del 5 Maggio 2022
Teorema
𝐿 è generato da 𝐺 di tipo 3 ⇔ 𝐿 è riconosciuto da 𝐴 a stati finiti
Dimostrazione 1
Da 𝐴 ricavo 𝐺
Sia 𝐴 = (Σ , 𝑄 , 𝑞0 , δ , 𝐹), posso definire
𝐺 = (𝑇 = Σ (insieme dei simboli terminali)
𝑉 = 𝑄 (insieme delle variabili)
𝑆 = 𝑞0 (assioma)
𝑃 (regole di produzione) :
- 𝑞 → ε ⇔ 𝑞 ∈ 𝐹 (per ogni stato finale dell’automa) ;
- 𝑞 → σ𝑝 ⇔ δ(𝑞, σ) = 𝑝 (posso mettere una regola di questo tipo se e
solo se dando σ a 𝑞 ottengo 𝑝, quindi nel diagramma degli stati,
per ogni arco possiamo inserire una regola di questo tipo).)
da 𝐴 ricavo 𝐺 di tipo 3:
𝑇 = {𝑎 , 𝑏} , 𝑉 = {𝑞0 , 𝑞1} , l’assioma è 𝑞0 ,
𝑃={
● 𝑞1 → ε ;
● 𝑞0 → 𝑎𝑞0 ;
● 𝑞0 → 𝑏𝑞1 ;
● 𝑞1 → 𝑏𝑞1 ;
● 𝑞1 → 𝑎𝑞0.
}
esempio
𝑎 𝑏 𝑏
𝑞0→ 𝑞0→ 𝑞1→ 𝑞1 (𝐴)
𝑞0 ⇒ 𝑎𝑞0 ⇒ 𝑎𝑏𝑞1 ⇒ 𝑎𝑏𝑏𝑞1 ⇒ 𝑎𝑏𝑏 (𝐺)
Dimostrazione 2
Da 𝐺 di tipo 3 ad 𝐴:
- si inverte la costruzione precedente ;
- ma 𝐺 deve essere nel formato:
- 𝐴→ε;
- 𝐴 → σ𝐵 ;
Data 𝐺 =< 𝑇 (𝑞𝑢𝑒𝑙𝑙𝑜 𝑐ℎ𝑒 𝑝𝑟𝑖𝑚𝑎 𝑐ℎ𝑖𝑎𝑚𝑎𝑣𝑎𝑚𝑜 Σ), 𝑉 , 𝑆 , 𝑃 > definisco 𝐴:
𝐴 = (Σ = 𝑇 simboli terminali
𝑄 = 𝑉 variabili
𝑞0 = 𝑆 assioma
δ è così definita:
δ(𝐴 , σ) = 𝐵 ⇔ 𝐴 → σ𝐵
𝐹 = {𝐴 | 𝐴 → ε ∈ 𝑃}
)
Esempio:
𝐺 = (𝑇 = {𝑎 , 𝑏} , 𝑉 = {𝑞1 , 𝑞2 , 𝑞0} , 𝑆 = {𝑞0} , 𝑃 =
{𝑞0 → 𝑎𝑞1 , 𝑞1 → 𝑎𝑞1 , 𝑞1 → 𝑏𝑞1 , 𝑞1 → 𝑏𝑞2 , 𝑞2 → ε} )
δ(𝑞1 , 𝑏) = ? = 𝑞1 𝑜 𝑞2 ?
NOTA: δ non può essere più considerata una funzione, quindi 𝐴 non è
un automa DETERMINISTICO (DFA) ma è NON DETERMINISTICO (NFA)
Interpretazione:
𝐴 sceglie non determinatamente di transitare σ in 𝑞1 o in 𝑞2
Osservazione:
Data una parola 𝑤 in input ad 𝐴 , è possibile che induca più di un
cammino possibile
Esempio
Dove 𝑇 è uno stato trappola
Definizione
Linguaggio riconosciuto da un 𝑁𝐹𝐴: 𝐴
● 𝑤 è accettata se ammette un cammino che porta in uno stato
finale ;
● il linguaggio riconosciuto è dato dalle parole che soddisfano il
criterio di accettazione.
𝐿(𝐷𝐹𝐴) = 𝐿(𝑁𝐹𝐴)
Semplici applicazioni:
● con un 𝐷𝐹𝐴 riconosco facilmente una parola ;
● con un 𝑁𝐹𝐴 riconosco testi che contengono una certa parola.
Esempio:
Teorema
Per ogni 𝐿 riconosciuto da un 𝑁𝐹𝐴 esiste un 𝐷𝐹𝐴 che lo riconosce (è
equivalente)
Corollario
𝑅3 = 𝐿(𝑁𝐹𝐴) = 𝐿(𝐷𝐹𝐴)
Esercizio
Input: 1 0 1 0
Viene accettata
*
Nota: Data 𝑤 ∈ Σ il percorso nel 𝐷𝐹𝐴 indotto da 𝑤 simula tutti i cammini
possibili di 𝑤 nell’𝑁𝐹𝐴
𝐸𝑅 denota Linguaggio
⊘ ⊘
ε {ε}
σ {σ}
𝑝+𝑞 𝐿𝑝 ∪ 𝐿𝑞
𝑝·𝑞 𝐿𝑝 · 𝐿𝑞
* *
𝑝 𝐿𝑝
Esempi:
* *
- (𝑎 + 𝑏) 𝑎 denota {𝑎 , 𝑏} {𝑎} ;
*
- 𝐺𝑜𝑜𝑜 𝑔𝑙𝑒 denota {𝐺𝑜𝑜𝑔𝑙𝑒 , 𝐺𝑜𝑜𝑜𝑔𝑙𝑒 , 𝐺𝑜𝑜𝑜𝑜𝑔𝑙𝑒 , ...}
- Identificatori di variabili, devono rispettare una serie di regole, in
questo caso abbiamo scelto la regola “non si può iniziare il nome
della variabile con una cifra”
*
(𝐴 , 𝐵 , ... , 𝑎 , ... , 𝑧)(𝐴 , 𝐵 , ... , 𝑍 , 𝑎 , ... , 𝑧 , 0 , ... , 9) (con “,”=”+”) ;
* 2
- Importo in euro > 0 (1 + 2 +... + 9)(0 + 1 +... + 9) , (0 + 1 +... + 9) .
Teorema di Kleene
𝐿 è denotato da una ER ⇔ 𝐿 è riconosciuto da un 𝐷𝐹𝐴
(Dimostrazione costruttiva)
Dimostrazione 1
Data un'espressione regolare, creiamo un automa a stati finiti
deterministico che riconosce tale linguaggio, attraverso una
dimostrazione per induzione.
𝐿 denotato da ER ⇒ 𝐿 ammette un 𝐷𝐹𝐴
Tecnica: per induzione
Caso base
Esistono 𝐷𝐹𝐴 per ER base
Adesso creiamo 𝐺2
𝐺2 = (Σ , 𝑉' ∪ 𝑉'' , 𝑆' , 𝑃'\{𝐴 → ε | 𝐴 ∈ 𝑉'} ∪ 𝑃'' ∪ {𝐴 → 𝑆'' | 𝐴 → ε ∈ 𝑃'})
𝐺2 è di tipo 3?
Si!
*
3) Costruisco 𝐺3 per 𝐿(𝐺')
∞
𝑖 +
𝐿(𝐺') = ⋃ 𝐿(𝐺') = {ε} ∪ 𝐿(𝐺')
𝑖=0
Esempio:
Vediamo subito che 𝑞2 sia uno stato trappola e che grazie a 𝑞1 per far si
che si accetti una parola abbiamo bisogno che quando compare una
𝑎 , compaia al suo seguito un’altra 𝑎 . Se ci fosse una 𝑏 in mezzo
finiremmo in uno stato trappola.
Non è facile, di base, elaborare un’espressione regolare dai seguenti
stati. A questo automa associamo 3 stati, uno per stato (il quale diventa
lo stato iniziale).
Il linguaggio che verrà riconosciuto da 𝑞2 stato trappola sarà il
linguaggio vuoto ⊘ , però noi per trovarlo useremo una serie di
procedimenti automatici.
● Adesso cerchiamo di esprimere ogni linguaggio in funzione degli
altri.
Per ottenere una ER per 𝑋0 cerco di esprimerla in funzione delle altre.
Esempio
Posso esprimere 𝑤 come σ𝑧 dato che ε non può appartenere a 𝑋1 (dato
che non è finale). Questo σ può essere sia 𝑎 , sia 𝑏.
In generale:
𝑋𝑖 = +σ∈Σ σ𝑋𝑗 (𝑡𝑎𝑙𝑒 𝑐ℎ𝑒 δ(𝑞𝑖 , σ) = 𝑞𝑗) [+ ε (𝑠𝑜𝑙𝑜 𝑠𝑒 𝑞𝑖 ∈ 𝐹)]
Il primo simbolo è una sommatoria, con un simbolo all’inizio con il
linguaggio corrispondente allo stato raggiunto con il suddetto simbolo,
ed infine abbiamo un + ε solo se lo stato iniziale è uno stato finale.
{
𝑋0 = 𝑎𝑋1 + 𝑏𝑋0 + ε
𝑋1 = 𝑎𝑋0 + 𝑏𝑋2
𝑋2 = 𝑎𝑋2 + 𝑏𝑋2
● Si ricava un sistema con 𝑘 + 1 (numero di stati di 𝐴) equazioni e
𝑘 + 1 incognite 𝑋𝑖 ;
● Per risolvere il problema devo ricorrere a equazioni del tipo:
𝑋 = 𝐴𝑋 + 𝐵 (𝑋 è l’incognita mentre 𝐴 e 𝐵 sono linguaggi) la cui
*
soluzione è 𝑋 = 𝐴 𝐵 , se ε ∉ 𝐴 allora la soluzione è unica mentre se
*
ε ∈ 𝐴 allora 𝐴 𝐵 è la minima soluzione.
Problema dell’ambiguità
Esempio in italiano:
“Il prof. dice lo studente è un asino.”
Se letta in maniera diversa possiamo intuire che il professore sia un
asino (dipende tutto dalla punteggiatura e dalla pronuncia).
Se viene letta senza entrambe non si capisce chi dei due sia un asino.
Definizione di 𝐺 ambigua:
Una grammatica è ambigua quando genera una parola ambigua, cioè
quando la parola ammette due alberi di derivazione diversi.
Nota: l’albero di derivazione dà significato alla parola (il concetto sta in
un albero che descrive la derivazione della parola, sulle foglie abbiamo
la parola, i nodi sono i metasimboli, i sottoalberi sono definiti da regole
di produzione e come radice abbiamo l’assioma).
Esempio di 𝐺 ambigua:
Grammatica per un linguaggio di programmazione “giocattolo” (atti alla
didattica).
𝑃 → 𝑖(𝑥) 𝐶 𝑜(𝑥)
Simbolo iniziale 𝑃 di programma che produce 𝑖(𝑥) input, 𝐶 comando e
𝑜(𝑥) output. In questi programmi abbiamo solo la variabile 𝑥.
𝐶 → 𝐴|𝐼|𝐸
I comandi possibili sono 3:
1) 𝐴 di assegnamento ;
2) 𝐼 comando 𝐼𝑓() 𝑇ℎ𝑒𝑛() senza 𝐸𝑙𝑠𝑒, quindi esegue un comando
verificando la condizione, nel caso sia falsa non accade nulla ;
3) 𝐸 comando 𝐼𝑓() 𝑇ℎ𝑒𝑛() 𝐸𝑙𝑠𝑒() con due comandi a seconda dei casi
possibili.
𝐴 → 𝑥 =− 1 · 𝑥
Abbiamo la sostituzione 𝑥 =− 1 · 𝑥 , quindi viene cambiato il segno alla
variabile e viene assegnata ad essa.
𝐼 → 𝑖𝑓(𝑇) 𝐶
In questo comando 𝑇 ha la funzione di “Test”
𝐸 → 𝑖𝑓(𝑇) 𝐶 𝑒𝑙𝑠𝑒 𝐶
In quest’altro caso abbiamo due comandi a seconda dei casi.
𝑇→𝑥 < 0
Unico test possibile
𝐺 genera la seguente parola: (programmino)
𝑖(𝑥) 𝑖𝑓(𝑥 < 0) 𝑖𝑓(𝑥 < 0) 𝑥 =− 1𝑥 𝑒𝑙𝑠𝑒 𝑥 =− 1𝑥 𝑜(𝑥)
La quale ammette due alberi di derivazione per due programmi
differenti α e β .
Programma α
Programma β
Definizione
Una grammatica 𝐺 è non ambigua se ogni parola generata non è
ambigua.
Osservazione
A volte è possibile disambiguare una grammatica.
Nel nostro caso possiamo usare una convenzione:
“L’else è associato all’if più vicino”.
A volte no!
Definizione
Un linguaggio si dice “Inerentemente ambiguo” quando ogni 𝐺 che lo
genera è ambigua.
Esempio:
𝑖 𝑗 𝑘
{𝑎 𝑏 𝑐 | 𝑖 = 𝑗 𝑜 𝑗 = 𝑘}
Nota: è di tipo 2
Idea:
𝑛 𝑛 𝑛
𝑎 𝑏 𝑐 ammetterà due alberi di derivazione diversi.
Non c'è modo di trovare una grammatica per generare una grammatica
con regole di produzione diverse e non ambigua.
Domanda:
Un linguaggio regolare può essere inerentemente ambiguo?
Risposta:
NO
Dimostrazione
Ad ogni 𝐿 regolare corrisponde un 𝐷𝐹𝐴. Da tale 𝐷𝐹𝐴 si ricava una 𝐺 di
tipo 3 che è non ambigua.
Derivazioni leftmost
Dato un albero di derivazioni (con più derivazioni associate), attraverso
questo metodo di derivazione viene espanso per primo il metasimbolo
più a sinistra.
Esempio
𝑎𝑏𝑏𝐴𝑎𝐵𝐶
Espandiamo prima 𝐴 poi 𝐵 e infine 𝐶 (se 𝐴 contiene altri metasimboli
espandiamo quello più a sinistra al proprio interno).
Ad ogni albero di derivazione è associata un'unica derivazione leftmost,
quindi si può in qualche modo eludere l’ambiguità.
𝐴 → 𝐵𝐶 𝐴 → σ𝑊
𝐴→σ
𝐴, 𝐵, 𝐶 ∈ 𝑉 𝐴∈𝑉
σ∈𝑇 σ∈𝑇
*
𝑊 ∈𝑉
Esempio
𝐺 =< {𝑥 , 𝑦 , + , ( , )} , {𝐸} , 𝑃 , 𝐸 > dove
𝑃 = {𝐸 → (𝐸 + 𝐸) | 𝑥 | 𝑦}
Ricaviamo FNC e FNG
FNG:
𝐸 → 𝑥 ok
𝐸 → 𝑦 ok
𝐸 → (𝐸 + 𝐸) NO!!!
𝐸 → (𝐸𝑃𝐸𝐷 ok
𝑃 → + ok
𝐷 →) ok
FNC:
𝐸 → 𝑥 ok
𝐸 → 𝑦 ok
𝐸 → (𝐸 + 𝐸) NO!!!
𝐶 → ( ok
𝑃 → + ok
𝐷 →) ok
𝐸 → 𝐶𝐸𝑃𝐸𝐷 NO!!!
𝑋 → 𝐶𝐸 ok
𝑌 → 𝑃𝐸 ok
𝐸 → 𝑋𝑌𝐷 NO!!!
𝑍 → 𝑋𝑌 ok
𝐸 → 𝑍𝐷 ok
Riconoscitori a pila
Automi a pila per i linguaggi di tipo 2.
Sono un dispositivo composto da 2 parti hardware, nella prima
abbiamo la parola da controllare inserita in un nastro di input simbolo
per simbolo. Questo nastro è suddiviso in celle con in ognuna un
simbolo appartenente all’alfabeto di input Σ. Su questo nastro abbiamo
anche una testina di lettura che scandisce la parola e si sposta tra i
simboli.
Notazione:
Disegnare la pila se possibile e descriverne il contenuto.
POP
Formalizzo:
𝑃𝑈𝑆𝐻(𝑃 , 𝑋) = 𝑋𝑃
L'immagine di questa funzione è la pila modificata con a capo
l’elemento rimosso. Come variabili abbiamo la pila e l’elemento più in
alto.
𝑃𝑂𝑃(𝑃) = 𝑊 se 𝑃 = 𝑋𝑊 mentre 𝑃𝑂𝑃(𝑃) =⊥ se 𝑃 = ε
Come variabili abbiamo solo la pila. L’immagine è ciò che rimane dalla
pila dopo l’estrazione, è 𝑤 se nella pila avevamo il carattere 𝑥 seguito da
una serie di caratteri 𝑤, mentre l’operazione non va a buon fine se la
pila era vuota.
ISEMPTY
Formalizzo:
𝑇𝑂𝑃(𝑃) = 𝑋 se 𝑃 = 𝑋𝑊 mentre 𝑇𝑂𝑃(𝑃) =⊥ se 𝑃 = ε
Prende come variabile la pila e restituisce l’elemento più in alto. Se la
pila è vuota non va a buon fine.
𝐼𝑆𝐸𝑀𝑃𝑇𝑌(𝑃) = 1 se 𝑃 = ε mentre 𝐼𝑆𝐸𝑀𝑃𝑇𝑌(𝑃) = 0 se 𝑃 ≠ ε
Prende in input una pila e restituisce 1 se essa è vuota, mentre
restituisce 0 se non lo è.
Abbiamo la pila iniziale, una volta inseriti man mano i simboli della
parola del nastro la pila viene modificata in tutti i modi possibili
secondo la funzione δ. Possiamo considerare le pile secondo i “livelli” ,
cioè il numero di simboli inseriti. Il modo in cui cambiano le pile è
attraverso una scelta non deterministica.
La computazione secondo la parola è una delle pile del livello finale.
La parola 𝑥1𝑥2... 𝑥𝑛 è accettata oppure no?
Criterio di accettazione
La parola 𝑥 si dice accettata se nel grafo di computazione di 𝑥 esiste un
cammino che partendo dalla pila 𝑆 mi porta ad una pila vuota (ε).
Controlleremo tramite ISEMPTY.
Formalizzo:
Configurazione
𝑃𝐼𝐿𝐴 · 𝐼𝑁𝑃𝑈𝑇 (parte di input ancora da leggere)
Esempi
𝑆 · 𝑥 configurazione iniziale
ε · ε configurazione finale accettante (finale perchè ho ε al posto di 𝑥 e
accettante perchè ho ε al posto di 𝑆)
Passo di computazione
Configurazione | − configurazione successiva
Scriveremo:
𝑋𝑊 · σ𝑤| − Υ𝑊 · 𝑤 ⇔ Υ ∈ δ(𝑋 , σ)
Linguaggio riconosciuto da 𝐴
* *
𝐿(𝐴) = {𝑥 ∈ Σ | 𝑆 · 𝑥| − ε · ε}
dove
*
| − è: zero o più passi di derivazione
Esempio:
𝑅
Linguaggio: 𝑤𝑤 ← palindrome
𝑤 = 𝑤1𝑤2... 𝑤𝑛
𝑅
𝑤 = 𝑤𝑛𝑤𝑛−1... 𝑤1
es: 𝑎𝑏𝑏𝑏𝑏𝑎
Idea:
Quando raggiungo la metà della parola, confronto la seconda con i
simboli nella pila cancellandoli man mano.
Problema:
Come riconoscere il centro della parola in input?
Risposta:
Si usa il non determinismo
δ 𝑎 𝑏
𝑆 {𝑆𝐴 , 𝐴} {𝑆𝐵 , 𝐵}
𝐴 ε -
𝐵 - ε
Domanda:
Qual’è la classe dei linguaggi riconosciuti dai riconoscitori a pila?
Risposta:
I linguaggi di tipo 2.
Attenzione:
Il modello dei riconoscitori a pila deve essere NON DETERMINISTICO:
*
𝐾 *
δ: 𝐾 × Σ → 2 e non 𝐾 |
Infatti:
Teorema
𝐿 è generato da 𝐺 di tipo 2 ⇔ 𝐿 è riconosciuto da un riconoscitore a pila.
Lo stesso vale per gli automi a pila, con un riconoscitore a stati che
muove la testina di input cambiando ogni volta lo stato corrente, alla
fine il riconoscitore può decidere di accettare o a pila vuota o
controllando se lo stato raggiunto sia finale.
La dimostrazione di questo teorema è costruttiva in entrambi i sensi.
Dimostrazione 1
Da 𝐴 riconoscitore a pila a 𝐺 di tipo 2
Sia 𝐴 = (Σ , 𝐾 , 𝑆𝐴 , δ) posso costruire 𝐺 di tipo 2:
𝐺 = (𝑇 = Σ
𝑉=𝐾
𝑆 = 𝑆𝐴
𝑃 contiene la regola:
𝑋 → σ𝑊 ⇔ 𝑊 ∈ δ(𝑋 , σ)
)
Esempio:
𝑅
𝐿 = 𝑤𝑤 su Σ = {𝑎 , 𝑏}
𝐴 = ({𝑎 , 𝑏} , {𝐴 , 𝐵 , 𝑆} , 𝑆 , δ)
dove
δ 𝑎 𝑏
𝑆 {𝑆𝐴 , 𝐴} {𝑆𝐵 , 𝐵}
𝐴 ε -
𝐵 - ε
𝐺 = (𝑇 = {𝑎 , 𝑏}
𝑉 = {𝐴 , 𝐵 , 𝑆}
𝑆 è l’assioma
𝑃 = {𝑆 → 𝑎𝑆𝐴 , 𝑆 → 𝑎𝐴 , 𝑆 → 𝑏𝑆𝐵 , 𝑆 → 𝑏𝐵 , 𝐴 → 𝑎 , 𝐵 → 𝑏}
)
La 𝐺 ottenuta è la forma normale di Greibach di:
𝑆 → 𝑎𝑆𝑎 , 𝑆 → 𝑎𝑎 , 𝑆 → 𝑏𝑆𝑏 , 𝑆 → 𝑏𝑏
Dimostrazione 2
Da 𝐺 di tipo 2 ad 𝐴 riconoscitori a pila.
Avendo una 𝐺 di tipo 2 dobbiamo per prima cosa trasformarla in forma
normale di Greibach:
𝐺 → 𝐺' = (𝑇 , 𝑉 , 𝑆𝐺' , 𝑃).
Costruisco 𝐴 = (Σ = 𝑇
𝐾=𝑉
𝑆 = 𝑆𝐺'
δ così definita:
δ(𝑋 , σ) = {𝑊 | 𝑋 → σ𝑊 ∈ 𝑃}
)
Esempio
𝑛 𝑛
𝐿 = {𝑎 𝑏 | 𝑛 > 0}
𝐺 per 𝐿 : 𝑆 → 𝑎𝑆𝑏 , 𝑆 → 𝑎𝑏
Trasformo 𝐺 in 𝐺' di Greibach:
𝑆 → 𝑎𝑆𝑏 diventa:
𝑆 → 𝑎𝑆𝐵 e 𝐵 → 𝑏
𝑆 → 𝑎𝑏 diventa:
𝑆 → 𝑎𝐵 con la regola 𝐵 → 𝑏 già esistente
Definisco
𝐴 = ({𝑎 , 𝑏} , {𝑆 , 𝐵} , 𝑆 , δ)
dove
δ 𝑎 𝑏
𝑆 {𝑆𝐵 , 𝐵} -
𝐵 - ε
𝑛 𝑛
Attenzione: non è il miglior riconoscitore per 𝑎 𝑏 (dato che quello che
abbiamo trovato è non deterministico), infatti ne esiste uno
deterministico:
𝐴' = ({𝑎 , 𝑏} , {𝑆 , 𝐴 , 𝐵} , 𝑆 , δ) dove
δ 𝑎 𝑏
𝑆 𝐴 -
𝐴 𝐴𝐵 ε
𝐵 - ε
Note:
𝐴 in cima:
sono nella prima metà e inserisco in cima una 𝐵
𝐵 in cima:
sono nella seconda metà e cancello le 𝐵 dalla pila
Esempio: 𝑎𝑎𝑎𝑏𝑏𝑏
Osservazione:
senza il simbolo 𝐴 , 𝑎𝑎𝑎𝑏𝑏𝑎𝑏𝑏 verrebbe accettata!
𝑛 𝑛
#𝑎 = #𝑏 ma non nel formato 𝑎 𝑏
Riassumendo:
Dimostrazione, idea
𝐿 ∈ 𝑅3 → esiste 𝐴 𝐷𝐹𝐴 → simulo 𝐴 usando la pila: metto lo stato nella pila*
*”ISEMPTY” viene sostituito da “ISFINALSTATE”!
Alberi binari
Forma normale di Chomsky
𝐴 → 𝐵𝐶
𝐴→σ
si hanno alberi di derivazione binari
es: 𝑆 → 𝐴𝐵 𝑆 → 𝐶𝐵 𝐶 → 𝐴𝑆 𝐴 → 𝑎 𝐵 → 𝑏
Relazione:
𝑛 = numero di foglie
ℎ = altezza
In generale ho:
ℎ
𝑛 ≤ 2 da cui:
𝑙𝑜𝑔𝑛 ≤ ℎ
Questa relazione ci servirà per dimostrare la correttezza del PUMPING
LEMMA
Pumping Lemma
Strumento utile per dimostrare che i linguaggi non sono di una
determinata grammatica. Ne abbiamo uno per linguaggi regolari ed
uno per i linguaggi liberi da contesto. Vedremo solo quelli per i
linguaggi di tipo 2.
Esprime una condizione necessaria (non sufficiente, quindi non
possiamo dire che 𝐿 sia di tipo 2 ma possiamo verificare che non lo sia)
per i linguaggi di tipo 2.
Nota:
- 𝐿 non soddisfa il lemma ⇒ 𝐿 non è di tipo 2 ;
- 𝐿 soddisfa il lemma ⇒ 𝐿 può essere di tipo 2 (non certo).
Enunciato
Per ogni 𝐿 di tipo 2 esiste una costante 𝐻 > 0 tale che:
per ogni 𝑧 ∈ 𝐿 con |𝑧| > 𝐻 esiste una scomposizione in
𝑢𝑣𝑤𝑥𝑦 = 𝑧 (scompone la parola di una certa lunghezza del linguaggio in
5 fattori con 𝑤 fattore centrale)
che soddisfa:
1) |𝑣𝑥| ≥ 1 (se prendo il secondo ed il penultimo fattore e li metto
vicini essi devono avere lunghezza ≥ 1 , quindi almeno uno dei
due è un simbolo) ;
2) |𝑣𝑤𝑥| ≤ 𝐻 (la lunghezza della parte centrale della scomposizione
deve essere minore o uguale ad 𝐻) ;
𝑘 𝑘
3) ∀ 𝑘 > 0 𝑢𝑣 𝑤𝑥 𝑦 ∈ 𝐿 (abbiamo tante parole simili nella seguente
forma nel linguaggio) .
Dimostrazione
Per dimostrarlo prendiamo ogni frase e dettaglio dell’enunciato e
vediamo le implicazioni.
- “Per 𝐿 di tipo 2 esiste 𝐻 > 0” ;
Se 𝐿 è di tipo 2 allora ammette una 𝐺 in forma normalizzata di Chomsky.
ℎ+1
Fisso quindi 𝐻 = 2 dove ℎ = numero di variabili in 𝐺.
- “per ogni 𝑧 ∈ 𝐿 tale che |𝑧| > 𝐻” ;
Dato che 𝐿 è di tipo 2, allora 𝑧 viene creato da un albero binario e quindi
segue le regole descritte nella lezione precedente:
𝑛 = numero di foglie
ℎ = altezza
ℎ
𝑛 ≤ 2 da cui:
𝑙𝑜𝑔𝑛 ≤ ℎ
Quindi:
* * *
𝑆⇒ 𝑢𝐴𝑦 𝐴⇒ 𝑣𝐴𝑥 𝐴⇒ 𝑤
Caso 𝑘 = 0 :
devo mostrare che 𝑢𝑤𝑦 ∈ 𝐿
* *
𝑆⇒ 𝑢𝐴𝑦⇒ 𝑢𝑤𝑦
Caso 𝑘 > 0
devo mostrare che 𝑢𝑣𝑣... 𝑣𝑤𝑥𝑥... 𝑥𝑦 ∈ 𝐿 (𝑣 e 𝑥 si ripetono 𝑘 volte)
* * * * * 𝑘 𝑘 * 𝑘 𝑘
𝑆⇒ 𝑢𝐴𝑦⇒ 𝑢𝑣𝐴𝑥𝑦⇒ 𝑢𝑣𝑣𝐴𝑥𝑦⇒ ... ⇒ 𝑢𝑣 𝐴𝑥 𝑦⇒ 𝑢𝑣 𝑤𝑥 𝑦