Strumenti per la Definizione della Sintassi dei Linguaggi di Programmazione 1

Documenti analoghi
Linguaggi di Programmazione Corso C. Parte n.5 Automi a Stati Finiti. Nicola Fanizzi

Linguaggi di Programmazione e Compilatori I Appello del 9/7/2004

Trasduttori a Stati Finiti

Automi a stati finiti

, x 2. , x 3. è un equazione nella quale le incognite appaiono solo con esponente 1, ossia del tipo:

2 x = 64 (1) L esponente (x) a cui elevare la base (2) per ottenere il numero 64 è detto logaritmo (logaritmo in base 2 di 64), indicato così:

Esercizi di Informatica Teorica

Esercizi di Informatica Teorica Pumping lemma e proprietà di

acuradi Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1

CORSO ZERO DI MATEMATICA

POTENZA CON ESPONENTE REALE

Integrale Improprio. f(x) dx =: Osserviamo che questa definizione ha senso dal momento che per ogni y è ben definito l integrale b

a cura di Luca Cabibbo e Walter Didimo

Equazioni. Definizioni e concetti generali. Incognita: Lettera (di solito X) alla quale e possibile sostituire dei valori numerici

Corso di Automi e Linguaggi Formali Gennaio- Marzo 2003

Laurea triennale in Scienze della Natura a.a. 2009/2010. Regole di Calcolo

Automi e Linguaggi Formali

11. Rango di una matrice.

1 Espressioni polinomiali

1 Equazioni e disequazioni di secondo grado

a cura di Luca Cabibbo e Walter Didimo

acuradi Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1

5.4 Il teorema fondamentale del calcolo integrale

Capitolo 6. Integrali di funzioni di una variabile

11. Rango di una matrice.

Non Determinismo. Dipartimento di Elettronica e Informazione Politecnico di Milano. 21 marzo 2017

UNITA 13. GLI ESPONENZIALI

Calcolo integrale in due e più variabili

Introduzione alle disequazioni algebriche

SPAZI VETTORIALI. 1. Spazi e sottospazi vettoriali

Algoritmi e Complessità

B8. Equazioni di secondo grado

SUGLI INSIEMI. 1.Insiemi e operazioni su di essi

2 Generalità sulle matrici

13 - Integrali Impropri

Scheda per il recupero 2

Determinanti e caratteristica di una matrice (M.S. Bernabei & H. Thaler

{ 1, 2,3, 4,5,6,7,8,9,10,11,12, }

C PITOLO 2. nalisi Lessicale

{ 3 x y=4. { x=2. Sistemi di equazioni

corrispondenza dal piano in sé, che ad ogni punto P del piano fa corrispondere il punto P' in

fattibile con le tecniche elementari che imparerai in seguito. Ad esempio il polinomio

Integrali impropri in R

Corso di Analisi: Algebra di Base. 4^ Lezione. Radicali. Proprietà dei radicali. Equazioni irrazionali. Disequazioni irrazionali. Allegato Esercizi.

Esponenziali e logaritmi

7. Derivate Definizione 1

La scomposizione in fattori dei polinomi

Integrali dipendenti da un parametro e derivazione sotto il segno di integrale.

acuradi Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1

Minimi quadrati e problemi di distanza minima

Matematica II. Un sistema lineare è un sistema di m equazioni lineari (cioè di primo grado) in n incognite x 1,, x n :

stringhe sull alfabeto Σ in cui a a b si alternano, iniziando da a e terminando con b.

ESERCIZIO DI ASD DEL 27 APRILE 2009

Il calcolo letterale

FONDAMENTI DI PROGRAMMAZIONE (A,B,C,D) Appello del 25/06/2002 Soluzioni proposte

- Appunti di Matematica 1 Licei Umanistici - - I polinomi - Polinomi

RAPPRESENTAZIONE GRAFICA DELLA PARABOLA a ( ) { } f con, è la parabola di equazione y = ax + bx + c. Vogliamo disegnarla. 2

Prova scritta del 28 febbraio Risultati

Linguaggi e Traduttori Tempo: 2 ore

Anno 2. Potenze di un radicale e razionalizzazione

Vediamo quindi l elenco dei limiti fondamentali, il cui risultato daremo per noto d ora in avanti e lo utilizzeremo ogni volta che sarà necessario.

3. Funzioni iniettive, suriettive e biiettive (Ref p.14)

FUNZIONI CONTINUE A TRATTI E LORO INTEGRALI

George Boole ( )

Si noti che da questa definizione segue che il punto C è il punto medio del segmento PP'. Figura 1

Note del corso di Laboratorio di Programmazione e Calcolo: Integrazione numerica

APPENDICE B. Sintesi Modulare (Modular Synthesis)

Il calcolo letterale

Il calcolo letterale

INTEGRAL IMPROPRI. C.d.L in Fisica Lecce, a.a. 2011/ Le definizioni... pag Criteri di integrabilità... pag Esercizi... pag.

SOLUZIONE PROBLEMA 1. Punto 1 Osserviamo anzitutto che la funzione

LINGUAGGI FORMALI Esercizi

Esercizi svolti Limiti. Prof. Chirizzi Marco.

Problemi 24/11/ ) = n=

a cura di Luca Cabibbo e Walter Didimo

Integrali su intervalli illimitati Criteri di convergenza 1 Integrali di funzioni non limitate Criteri di convergenza 2 Altri integrali impropri

Il lavoro di una forza

Unità Didattica N 3 Le inequazioni. Unità Didattica N 3 Le inequazioni

Osserviamo che per trovare le costanti A e B possiamo anche ragionare così: se moltiplichiamo l equazione x + 1 (x + 2)(x + 3) = A.

(da dimostrare); (da dimostrare).

Esercizi di Informatica Teorica

Appunti di Matematica 1 - I polinomi - Polinomi. I vari monomi che compongono il polinomio si chiamano termini del polinomio.

Richiami sui vettori. A.1 Segmenti orientati e vettori

Integrali definiti (nel senso di Riemann)

Capitolo 5. Integrali. 5.1 Integrali di funzioni a gradinata

1 Integrale delle funzioni a scala

Corso di Modelli Matematici in Biologia Esame del 22 Gennaio 2018

Sistemi di equazioni algebriche lineari. Una equazione algebrica lineare in n incognite si presenta nella forma:...

Equazioni 1 grado. Definizioni Classificazione Risoluzione Esercizi

Funzioni razionali fratte

Integrali de niti. Il problema del calcolo di aree ci porterà alla de nizione di integrale de nito.

CALCOLO NUMERICO. Francesca Mazzia. Integrazione. Dipartimento Interuniversitario di Matematica. Università di Bari

Strumenti Matematici per la Fisica

Lezioni di Ricerca Operativa. Corso di Laurea in Informatica ed Informatica Applicata. Università di Salerno. Lezione n 3

Appunti di Matematica 1 - Numeri razionali - I numeri razionali. Le frazioni

Esercizi. q a b s s Tabella delle transizioni di D 0

Unità 3 Metodi particolari per il calcolo di reti

Lezione 1 Insiemi e numeri

Integrali impropri di funzioni di una variabile

Transcript:

Strumenti per l Definizione dell Sintssi dei Linguggi di Progrmmzione 1 Docente: Luc Tesei Scuol di Scienze e Tecnologie Università di Cmerino Anno Accdemico 2012/2013 1 Queste note intendono coprire gli rgomenti dell prim prte del modulo di Progrmmzione 2012/2013, corso di Progrmmzione + Lbortorio, corso di Lure in Informtic, Università di Cmerino, sede di Cmerino. Alcuni esempi sono trtti dl libro Compilers: Principles, Techniques, nd Tools di Alfred V. Aho, Rvi Sethi e Jeffrey D. Ullmn, Addison-Wesley Pub

2

Indice 1 Linguggi formli 5 1.1 Stringhe e linguggi....................... 5 1.2 Operzioni sulle stringhe..................... 6 1.3 Operzioni sui linguggi..................... 7 1.4 Espressioni su insiemi...................... 8 2 Automi stti finiti 11 2.1 Automi non deterministici.................... 11 2.2 Automi finiti deterministici................... 15 2.3 Costruzione dei sottoinsiemi................... 16 2.4 Minimizzzione di un DFA.................... 20 2.5 Progettzione di un utom................... 21 3 Induzione e ricorsione 27 3.1 Ricorsione............................. 27 3.2 Costruzione induttiv...................... 28 3.3 Chimte ricorsive........................ 30 3.4 Definizioni per induzione..................... 36 3.4.1 Espressioni regolri.................... 36 3.5 Rgionmento induttivo..................... 39 4 Grmmtiche libere dl contesto 43 4.1 Grmmtiche libere dl contesto................ 44 4.2 Alberi di derivzione....................... 46 4.3 Scrittur di grmmtiche.................... 51 4.4 Ambiguità............................. 54 4.5 Associtività e precedenz degli opertori........... 56 3

4 INDICE

Cpitolo 1 Linguggi formli Comincimo con lcune nozioni di bse sui linguggi formli. Nei cpitoli successivi vedremo diversi formlismi per specificrli e trtteremo nche dell loro potenz espressiv. 1.1 Stringhe e linguggi Introducimo lcune convenzioni che servirnno d qui in poi. I termini lfbeto o clsse di crtteri denotno un qulsisi insieme finito di simboli. Ad esempio l insieme {0,1} è l lfbeto binrio. ASCII e Unicode sono esempi di lfbeti molto utilizzti nei computer. In genere useremo Σ (o in lcuni testi ed esercizi Λ) per denotre un lfbeto. Un string su un lfbeto è un sequenz finit di simboli presi dll lfbeto. Nell mbito dell teori dei linguggi i termini prol o frse sono sinonimi di string. Stringhe generiche verrnno nel seguito indicte con le vribili s,s,s,...,s 0,s 1,s 2,... oppure x,y,z,w,...,x,x,...,x 0,x 1,... L lunghezz di un string s verrà indict con s ed è il numero di simboli che costituiscono l sequenz s. Ad esempio, bnn è un string lung 6. L string vuot è denott con ǫ (o, in lcuni testi ed esercizi, λ) e h lunghezz 0. Ess è un strzione mtemtic che serve denotre un string tutti gli effetti, m che non contiene nessun crttere. L string vuot è utile e comod in molte definizioni ed è necessri per definire le stringhe, i linguggi e le loro operzioni come lgebre che hnno un loro teori mtemtic. I seguenti sono ltri termini usti frequentemente nel contesto delle stringhe e dei linguggi, con le reltive definizioni: Prefisso di s Un string ottenut togliendo zero o più simboli dll fine di s. Es. bn è prefisso di bnn. Suffisso di s Un string ottenut togliendo zero o più simboli dll test di e. Es. nn è suffisso di bnn. 5

6 CAPITOLO 1. LINGUAGGI FORMALI Sottostring di s Un string ottenut togliendo d s si un suo suffisso che un suo prefisso. Es. n è un sottostring di bnn. Si noti che ogni prefisso o suffisso di s è nche un sottostring di s (m non è vero il contrrio). Si noti nche che s stess è nche suo prefisso, suffisso e sottostring. Prefisso, suffisso e sottostring propri di s Un qulsisi string non vuot x che si, rispettivmente, un prefisso, un suffisso o un sottostring di s e tle che s x. Sottosequenz di s Un qulsisi string ottenut cncellndo zero o più crtteri, non necessrimente contigui, d s. Es. b è un sottosequenz di bnn. Il termine linguggio denot un qulsisi insieme (finito o infinito) di stringhe su un certo lfbeto fissto Σ. Quest definizione è molto generle: d esempio l insieme vuoto ( o {}) è un linguggio (chimto linguggio vuoto) secondo quest definizione. Un ltro linguggio prticolre è il linguggio {ǫ} (o {λ}), che contiene un sol string, l string vuot. Altri esempi possono essere: tutti i progrmmi Pscl sinttticmente ben formti o ddirittur tutte le frsi in itlino che sono grmmticlmente corrette. Tuttvi c è subito d notre che quest ultimo linguggio è molto difficile d definire precismente, mentre ltri linguggi non bnli possono essere definiti mtemticmente (come fremo noi con i linguggi di progrmmzione trmite le grmmtiche). Come ultim cos si noti che l definizione che bbimo dto non richiede che si ssocito nessun significto prticolre lle stringhe del linguggio. L disciplin che si occup dei metodi per dre significto lle stringhe di un linguggio viene chimt generlmente semntic. Vedremo uno di questi metodi nell second prte del corso. 1.2 Operzioni sulle stringhe Definimo un operzione fondmentle tr stringhe. Se x e y sono due stringhe, llor l conctenzione di x ed y, scritt come x y 1, è un string ottenut ttccndo y in fondo x. Es. x = buon e y = giorno x y = buongiorno. L conctenzione può essere vist come l nlogo del prodotto nell mbito delle stringhe. L elemento neutro per l conctenzione è l string vuot: ǫ s = s ǫ = s per ogni string s. Se pensimo ll conctenzione come d un prodotto, possimo definire l nlogo dell elevmento potenz come segue: s 0 = ǫ per ogni string s s i = s s i 1 per ogni string s e per ogni i > 0 1 Come per l moltipliczione fr numeri spesso il viene omesso.

1.3. OPERAZIONI SUI LINGUAGGI 7 Ad esempio otto 0 = ǫ, otto 1 = otto, otto 2 = ottootto, otto 3 = ottoottootto. Si noti, inoltre, che nche un singol letter è un string (lung 1) e quindi l elevmento potenz può essere usto nche in espressioni del tipo n. Specificndo il vlore di n ottenimo un string di tutte lung n: 0 = ǫ, 1 =, 2 =, 3 =,... 1.3 Operzioni sui linguggi Ci sono diverse importnti operzioni che possono essere pplicte i linguggi. Per qunto rigurd questo corso ci limiteremo considerre le seguenti: Unione L 1 L 2 = {s s L 1 o s L 2 } Conctenzione L 1 L 2 = {s 1 s 2 s 1 L 1 e s 2 L 2 } 2 Esponenzizione L 0 = {ǫ}, L i = L L i 1 se i > 0 Chiusur (o stell) di Kleene L = i=0 Li = L 0 L 1 L 2 L 3 Chiusur (o stell) positiv di Kleene L + = i=1 Li Esempio 1.1 Si L l insieme {A,B,...,Z,,b,...,z} e D l insieme {0,1,...,9}. L e D possono essere visti in due modi: come lfbeti finiti o come linguggi (finiti) composti d prole che sono tutte lunghe un crttere. Vedimo lcuni linguggi che possono essere definiti prtire d L e D trmite le operzioni che bbimo ppen introdotto: L D è l insieme delle lettere e delle cifre LD è l insieme di tutte le stringhe di lunghezz 2 formte d un letter seguit d un cifr L 4 contiene tutte le stringhe di lunghezz 4 che sono formte d lettere L è un insieme infinito di stringhe ognun delle quli h un lunghezz finit ed è compost d lettere. Questo linguggio contiene, per definizione, nche l string vuot ǫ. L(L D) è l insieme di tutte le stringhe di lunghezz strettmente mggiore di 0, che inizino con un letter e sono composte, dopo l prim letter, d cifre o lettere. D + è l insieme di tutte le stringhe di cifre formte d lmeno un cifr 2 Anche qui il è spesso omesso.

8 CAPITOLO 1. LINGUAGGI FORMALI Si noti che l stell di Kleene, in entrmbe le sue versioni, può, e lo srà spesso, essere pplict d lfbeti. Inftti gli lfbeti possono essere visti come linguggi molto semplici: insiemi finiti di stringhe di lunghezz 1. In questi csi, secondo l definizione, dto in generle un certo lfbeto non vuoto Σ, Σ rppresent tutte le stringhe di lunghezz finit, compres quell vuot, che si possono formre usndo i simboli di Σ. Σ è sempre un insieme infinito, m che contiene prole di lunghezz finit. Inoltre Σ + = Σ {ǫ}. Esempio 1.2 Si Σ = {0,1}. Si h che Σ = {ǫ,0,1,00,01,10,11,000,001,010,011,100,...} Σ + = {0,1,00,01,10,11,000,001,010,011,100,101,...} Si or Σ = {,b,c}. Si h che Σ = {ǫ,,b,c,,b,c,b,bb,bc,c,cb,cc,,b,c,b,bb,bc,...} Σ + = {,b,c,,b,c,b,bb,bc,c,cb,cc,,b,c,b,bb,bc,...} Trmite queste nuove nozioni possimo dre un definizione più precis di linguggio. Definizione 1.3 (Linguggio) Dto un lfbeto non vuoto Σ, un linguggio su Σ è un qulsisi sottoinsieme di Σ : L Σ. Abbimo già visto i linguggi bnli e {ǫ}. Un ltro linguggio bnle su Σ è Σ. 1.4 Espressioni su insiemi In quest sezione vedimo un modo per specificre mtemticmente lcuni linguggi formli. Questo tipo di notzione srà presente in tutto il corso. Un modo bnle di scrivere un linguggio è semplicemente quello di elencre le stringhe che lo compongono fr prentesi grffe. Questo metodo però è molto limitto, inftti può essere usto solo per scrivere linguggi finiti, cioè che contengono un numero finito di stringhe. In questo corso i linguggi che useremo sono invece qusi sempre infiniti. Il mezzo più generle per dre un specific precis di molti linguggi infiniti è rppresentto dlle espressioni su insiemi. Questo tipo di notzione è nturle poiché, effettivmente, i linguggi formli non sono ltro che insiemi di stringhe. Un espressione su insiemi non è ltro che l clssic notzione ust per rppresentre nliticmente gli elementi di un insieme:

1.4. ESPRESSIONI SU INSIEMI 9 {x U P(x)} doveu èununiversodioggetti dtoprioriep unpredicto, unproprietà, che crtterizz tutti e soli gli elementi che fnno prte dell insieme (cioè quegli x per cui P(x) è vero). Nel contesto dei linguggi formli l universo U è sempre Σ, dove Σ è l lfbeto dl qule si prendono i simboli per formre le prole del linguggio che si st definendo. Poiché Σ è spesso specificto preliminrmente e chiro dl contesto, spesso l universo viene sottinteso e l scrittur divent {x P(x)}. L proprietà P può venire specifict tutt dopo il simbolo, nche se spesso, specilmente nel cmpo dell definizione di linguggi, l struttur delle prole viene specifict przilmente nche prim del simbolo. Per specificre l struttur possimo usre i simboli di Σ, le operzioni su stringhe, le espressioni regolri (vedi Sezione 3.4.1), le operzioni sui linguggi e diverse vribili. Vedimo diversi esempi che illustrno i diversi modi di usre queste notzioni. L = { n bc n > 0} In questo cso inferimo che Σ = {,b,c} e che le prole del linguggio sono tutte quelle che inizino con un sequenz di lung lmeno 1 (n > 0) e che poi continuno esttmente con un b seguit d un c. Esempi di prole del linguggio: bc,bc,bc,bc,... Esempi di prole che non pprtengono l linguggio: ǫ,bc,bc,,b,... L = { n b c n n 0} In questo cso bbimo usto nche l espressione regolre b che è equivlente l linguggio {b} (vedi Sezione 3.4.1). Il significto dei due esponenti n è quello usule, cioè che in tutte le prole il numero di e di c deve essere lo stesso e mggiore o ugule zero (n 0). All interno delle e delle c c è un sequenz di b lung nche zero ({b} contiene sempre ǫ). Esempi di prole nel linguggio: ǫ (qundo n = 0 e b = ǫ), c,cc,bc,bcc,bbbbbcc,b,bccc,... Esempi di prole che non pprtengono l linguggio: b, bcc, bc, bbbccc, bccc,... L = { n (bb) m c k n,m 0,k > 0} Questo linguggio potrebbe essere scritto nche come (bb) c +3 o come { b 2m c k m 0,k > 0}. Le vribili n,m e k non sono legte l un ll ltr d nessun vincolo. Esempi di prole: bbc,bbc,c,ccc,bbbbccc,... 3 In tutti questi csi, e nche nel seguito, l sterisco e il +, opertori delle espressioni regolri (Sezione 3.4.1), vnno sempre intesi come l stell di Kleene o il + sul linguggio che contiene solo l string bse: (bb) = {bb}, c + = {c} +

10 CAPITOLO 1. LINGUAGGI FORMALI L = { n b m c k n,m > 0,k = m+n} In questo cso le vribili n,m,k sono interdipendenti. Il vincolo k = m+n indic che l somm fr il numero di e il numero di b deve essere ugule l numero di c in ogni prol del linguggio. Esempi: bbbccccc, bcc, bbbbbcccccc,... Esempi di prole non del linguggio: c,bc,bb,cc,... L 1 = { n bc + n > 0} L = {dx n x L 1,n 0} Qui bbimo ustoun sottolinguggio L 1 perdefinireun ltro linguggio principle L. Il linguggio L h prole che comincino con un d seguit d un qulsisi prol del linguggio L 1 seguit su volt d un sequenz di nche vuot. Si noti che l vribile n in L 1 e quell in L non hnno nessun rpporto tr di loro, poiché hnno scope diverso, cioè il loro significto è circoscritto ll interno delle prentesi grffe di ognun delle due espressioni insiemistiche che le usno. Esempi: dbcccc, dbc, dbccc,... Non pprtenenti: ǫ, dbc, db, bc,... L = {s 1 ds 2 s k d k > 0,s i {,b,c} i {1,...,k}} Abbimo usto, in questo esempio, un sequenz numert di vribili che denotno stringhe (s i ) ognun delle quli può essere un string qulunque di un ltro linguggio, {,b,c} (potevmo usre nche un sottolinguggio come nell esempio precedente). Dto che k > 0 llor ll fine di ogni s i deve essere presente un d. Esempi di stringhe pprtenenti: bbcd, d, dddd, cdbbdbcbdbcd,... Esempi di stringhe non pprtenenti: bcc, bcdbc,... Infine, vedremo che spesso i linguggi che specificheremo sono divisi per csi, cioè il linguggio che voglimo descrivere risult dll unione di diversi linguggi componenti ognuno dei quli rppresent un cso. In questo cso è sufficiente utilizzre l normle unione insiemistic. Ad esempio: L = { n bc n > 0} {b n c n 0} {d + (c b) m m > 0} Si noti che l n del primo insieme e l n del secondo, ncor un volt, non hnno nessun rpporto: un qulsisi potrebbe essere rinomint senz cmbire il linguggio definito. Si noti inoltre che nell ultimo insieme bbimo usto l or delle espressioni regolri 4. Esempi di stringhe: bc,bc,c,dc,ddb,... 4 (c b) indic o un c o un b (vedi Sezione 3.4.1).

Cpitolo 2 Automi stti finiti In questo cpitolo definimo gli utomi stti finiti non deterministici e deterministici. Essi sono dei riconoscitori di stringhe di un certo linguggio. Dopo l definizione degli utomi vedremo un lgoritmo importnte: l costruzione dei sottoinsiemi per trsformre un utom non deterministico in deterministico. 2.1 Automi non deterministici Definimo l clsse degli utomi finiti non deterministici NFA (dll inglese Non-deterministic Finite Automt). Un NFA può essere specificto grficmente trmite un grfo diretto 1 in cui i nodi, disegnti come cerchi, vengono chimti stti (generlmente numerti), le frecce etichettte sono trnsizioni, lo stto inizile è il nodo che h un frecci entrnte (con opzionlmente scritto strt) e gli stti finli sono i nodi che hnno un doppi cerchitur. Ogni frecci deve essere etichettt d un simbolo di un lfbeto finito Σ o d un insieme di simboli di Σ. Le trnsizioni di quest ultimo tipo sono un bbrevizione che denot un insieme di trnsizioni, tutte con l stess sorgente e l stess destinzione, etichettte ognun con un simbolo diverso dell insieme. UnesempiodiNFAsitrovinFigur2.1. L utomh4stti: {0,1,2,3}, Σ = {,b}, lo stto inizile è 0 e l unico stto finle è lo stto 3. Le frecce rppresentno le trnsizioni: d esempio l frecci etichettt {, b} che prte dllo stto 0 e v nello stto 0 rppresent due trnsizioni: un etichettt con, l ltr con b, tli che entrmbe che prtono d 0 e ritornno in 0 (questo tipo di trnsizioni vengono chimte nche self-loop). Esiste un ltr trnsizione uscente dllo stto 0 ed etichettt con, m è divers dll precedente poiché lo stto di destinzione è 1. 1 Cioè un digrmm formto d diversi punti o nodi collegti d frecce. Se il grfo non è diretto llor i nodi sono collegti d semplici linee. 11

12 CAPITOLO 2. AUTOMI A STATI FINITI strt b b 0 1 2 3 {,b} Figur 2.1: Un NFA. Più formlmente possimo definire gli NFA nel modo seguente. Si Σ un lfbeto finito. Definizione 2.1 (NFA) Un NFA su Σ è un tupl S,Σ,move,s 0,F dove: S è un insieme finito di stti Σ è l lfbeto dei simboli s 0 S è lo stto inizile F S è l insieme degli stti di ccettzione o stti finli move:(s Σ) (S) è un funzione che specific per ogni stto s e per ogni simbolo x di Σ le trnsizioni etichettte x dllo stto s d un insieme, nche vuoto, di stti di destinzione (c è un trnsizione per ogni stto di destinzione). Il simbolo (S), usto nell definizione, rppresent l operzione di powerset su un insieme S. Tle operzione restituisce un insieme contenente tutti i sottoinsiemi di S. Ad esempio: ({,b}) = {{},{},{b},{,b}}. Nell utom in Figur 2.1 S è l insieme {0,1,2,3}, Σ = {,b}, lo stto inizile è 0 e l unico stto finle è 3 (F = {3}). Le trnsizioni indicno che move(0, ) = {0, 1}. Inoltre move(0, b) = {0}, move(1, ) = {}, move(1,b) = {2}, move(2,) = {}, move(2,b) = {3} e move(3,) = move(3,b) = {}. Un NFA può riconoscere le stringhe di un certo linguggio. Per chirire in qule modo un NFA ccett un string definimo l nozione di cmmino etichettto. Definizione 2.2 (Cmmino etichettto) Si N = S,Σ,move,s 0,F un NFA. Un cmmino etichettto di lunghezz k 0 su N è un sequenz x s 0 x 1 x 2 x k 1 0 s1 s2 sk 1 s k dove: s 0 è lo stto inizile i {0,1,...,k 1}. s i+1 move(s i,x i )

2.1. AUTOMI NON DETERMINISTICI 13 L string x 0 x 1 x k 1 si chim string ssocit l cmmino ed è in generle un string di Σ. Se k = 0 llor il cmmino è costituito solo dllo stto inizile e l string ssocit è l string vuot ǫ. Si noti che un cmmino di lunghezz k consiste di un sequenz di k+1 stti dell utom ed h un string ssocit lung k. Definizione 2.3 (String ccettt) Si N = S,Σ,move,s 0,F un NFA. Un string α Σ è ccettt dll utom N se e solo se esiste un x cmmino etichettto s 0 x 1 x 2 x k 1 0 s1 s2 sk 1 s k su N tle che α è l string ssocit l cmmino e lo stto s k è uno stto finle (in formule s k F α = x 0 x 1 x k 1 ). Se lo stto inizile è nche di ccettzione llor nche l string vuot ǫ è ccettt dll utom. Possimo or introdurre l nozione di linguggio ccettto dll utom. Definizione 2.4 (Linguggio ccettto) Si N = S,Σ,move,s 0,F un NFA. Il linguggio ccettto dll utom è l insieme L(N) = {α Σ α è ccettt d N} Esempio 2.5 Considerimo l utom in Figur 2.1. 0 0 1 2 b 3 b è un cmmino etichettto l cui string ssocit è bb. Lo stto in cui il cmmino termin, 3, è nche uno stto finle e quindi quest string è ccettt dll utom. Essendo l utom non deterministico, tuttvi, esiste un ltro cmmino etichettto con l string precedente: 0 0 0 0 b 0 b in questo cso lo stto 0 non è finle e quindi questo cmmino non port ll ccettzione dell string. Si noti che, comunque, l definizione richiede che ci si lmeno un cmmino etichettto che termin in uno stto finle per determinre se l string ssocit è ccettt o no. Considerimo l string bb per l qule esistono due cmmini etichettti: 0 0 0 b 0 0 b 0 0 0 b 1 2 b nessuno dei due cmmini è di ccettzione e quindi l string non è ccettt. Considerimo invece l string bc. In questo cso non esiste nessun cmmino etichettto che h quest string ssocit. Quindi sicurmente non è ccettt. Fcendo ltri esempi e considerndo l struttur dell utom è fcile convincersi che il linguggio ccettto è {sbb s {,b} }

14 CAPITOLO 2. AUTOMI A STATI FINITI strt 0 1 b b 2 c Figur 2.2: Un NFA. L costruzione di un cmmino etichettto per un dt string può essere vist come un lgoritmo di riconoscimento di stringhe. Ad esempio, supponimo che voglimo controllre se l string b f prte del linguggio ccettto dll utom di Figur 2.2. Prtimo dllo stto inizile e mntenimo un insieme di stti correnti. All inizio questo insieme è {0} dto che 0 è l unico stto in cui mi posso trovre ll inizio mentre sto cercndo di costruire un cmmino etichettto per l string b. Considerimo or il primo simbolo dell string:. A questo punto gurdimo quli sono gli stti in cui possimo ndre seguendo un trnsizione etichettt uscente d uno qulsisi degli stti correnti. L insieme degli stti che posso rggiungere con l prim è {0,1} poichè dllo stto 0 ci sono due trnsizioni uscenti etichettte con (move(0, ) = {0, 1}). Questo è il nuovo insieme di stti correnti. Eliminimo il primo simbolo dll string in esme e considerimo quello seguente: b. Aprtiredogni sttoin{0,1} controllimo inqulistti posso ndre seguendo trnsizioni etichettte con b. Si h che move(0,b) = {0,2} e move(1,b) = {}. Il nuovo insieme di stti correnti srà quindi {0,2}. Eliminimo il simbolo b e pssimo l successivo e ultimo:. Dto che move(0,) = {0,1} e move(2,) = {}, si h che il nuovo insieme degli stti correnti è {0,1}. A questo punto l string di input è stt lett tutt e non ci rimne che controllre se nell insieme di stti correnti si presente lmeno uno stto finle. Questo è vero poiché 1 è finle e quindi possimo concludere che l string b è ccettt dll utom. Un cmmino etichettto che port ll ccettzione dell string è il seguente: 0 0 0 b 1 Considerimo invece l string c. A prtire d uno degli stti in {0} possimo rrivre, con un, nell insieme di stti {0, 1}. Eliminimo l prim e considerimo l c seguente. A questo punto si h che move(0,c) =

2.2. AUTOMI FINITI DETERMINISTICI 15 {} e move(1, c) = {}. Entrmbi sono vuoti. In un situzione come quest l utom si dice bloccto poiché non può ndre vnti costruire cmmini possibili per tutto l input. Ricordndo l definizione di string ccettt vedimo che in questo cso non esiste nessun cmmino etichettto per l string e che quindi l utom non ccett. Procedendo con ltre prove si può inferire che il linguggio ccettto dll utom in Figur 2.2 è {s n s {,b},n > 0} {sbc n s {,b},n 0} 2.2 Automi finiti deterministici L definizione di utom che bbimo dto è quell più generle, cioè quell di utom non deterministico. Dimo or un crtterizzzione degli utomi deterministici DFA (Deterministic Finite Automt). Definizione 2.6 (Autom deterministico) Un utom finito deterministico (DFA) è un tupl S,Σ,move,s 0,F dove: S è un insieme finito di stti. Σ è un lfbeto finito di simboli. move:(s Σ) {{}} {{s} s S} è un funzione di trnsizione tle che per ogni stto s S e per ogni simbolo x Σ l insieme degli stti move(s,x) o è vuoto oppure contiene un solo stto. s 0 S è lo stto inizile. F S è l insieme degli stti finli. Si noti che l unic differenz con l definizione di NFA è sull funzione di trnsizione move. Detto prole un utom è deterministico se d ogni stto non escono mi due trnsizioni etichettte con lo stesso simbolo. L nozione di cmmino etichettto e di ccettzione per un DFA è nlog quell di un NFA. Dto che in un DFA, dto uno stto e un simbolo, è possibile l più un trnsizione etichettt con quel simbolo, si h che per ogni string ccettt d un DFA esiste un unico cmmino etichettto con l string e che termin in uno stto finle. L lgoritmo di riconoscimento di un dt string è ugule quello di un NFA, m in questo cso d ogni psso l insieme degli stti correnti contiene uno ed un solo stto. Esempio 2.7 Considerimo l utom disegnto in Figur 2.3. Esso è un utom deterministico che ccett lo stesso linguggio dell utom di Figur 2.1, cioè {s bb s {,b} }. L unico cmmino di ccettzione per l string bb è

16 CAPITOLO 2. AUTOMI A STATI FINITI b b 0 b b 1 2 3 Figur 2.3: Un utom deterministico. 0 1 1 2 b 3 b Il cmmino di ccettzione per l string bbb è: 0 1 2 b 1 1 2 b 3 b Nel cso degli utomi deterministici determinre se un string è ccettt o no è più semplice. Si possono verificre solo due csi: 1. L string non h nessun cmmino etichettto corrispondente. In questo cso non è ccettt. 2. L string h un cmmino etichettto e sppimo che è l unico. Bst gurdre l ultimo stto di tle cmmino: se è di ccettzione llor l string è ccettt, ltrimenti no. 2.3 Costruzione dei sottoinsiemi Gli utomi deterministici e quelli non deterministici hnno lo stesso potere espressivo. Questo signific che se un linguggio può essere ccettto d un NFA llor esiste nche un DFA che lo ccett, e vicevers. E chiro che l lgoritmo di riconoscimento di un cert string di un DFA è più immedito poichè non bisogn tener trcci di un insieme di stti (il cmmino di ccettzione, se esiste, è unico). D ltr prte, d un punto di vist di progettzione, il non determinismo rende più fcile scrivere un utom e/o determinre che tipo di linguggio ccett, oltre permettere di scrivere utomi più concisi. Bst d esempio gurdre i due utomi delle Figure 2.1 e 2.3 che ccettno lo stesso linguggio. Il primo è non deterministico nello stto 0 e specific in mnier nturle che si possono riconoscere o b in qulsisi numero ed ordine prim di pssre d un string finle obbligtori bb. Il secondo invece deve esplicitre un sort di bcktrcking, cioè gli stti devono tenere trcci dei vri csi possibili: l prim che incontr potrebbe

2.3. COSTRUZIONE DEI SOTTOINSIEMI 17 essere quell dell string finle obbligtori e quindi l utom entr nello stto 1. Se il simbolo seguente non è un b llor l utom continu ciclre nello stto 1. Nello stto 2, se il simbolo seguente non è l ultim b l utom ritorn nello stto 1 d spettre di leggere un ltr possibile cndidt d essere il primo simbolo dell string finle obbligtori. Infine nello stto 3 l utom deve ritornre nello stto 0 o 1 se ci sono ncor simboli b o, rispettivmente. Questo perchè i simboli letti precedentemente potrebbero essere il prefisso di un string che poi terminerà con l string finle obbligtori. In quest sezione formlizzimo un lgoritmo noto come costruzione dei sottoinsiemi (subset construction) che serve per costruire, prtire d un NFA dto, un DFA equivlente che simul il non determinismo, m è deterministico. Per specificre l lgoritmo useremo uno pseudo-codice in cui le strutture dti vere e proprie non srnno specificte (in ogni cso non è difficile implementre questi lgoritmi in un linguggio di progrmmzione: bst definire le opportune strutture dti e le vrie funzioni/procedure che specifichimo). Algoritmo 2.1 (Subset construction) Costruzione di un DFA prtire d un NFA. Linguggio: Pseudocodice. Input: Un utom non deterministico N. Output: Un utom deterministico equivlente D. Si {s 0 } l unico stto non mrcto di DSttes; while c e uno stto non mrcto T in DSttes do begin mrc T; for ech simbolo di input x Σ do begin U := move(t,x); if U non e in DSttes then begin ggiungi U, non mrcto, DSttes; end Dtrn(T,x) := U; end end lo stto inizile di D e {s 0 } gli stti finli di D sono tutti quelli che contengono lmeno uno stto finle di N

18 CAPITOLO 2. AUTOMI A STATI FINITI L lgoritmo è uno dei clssici lgoritmi di clcolo di un punto fisso (il clcolo di un insieme definito induttivmente) e h l proprietà di terminre sempre in un numero finito di pssi. In prtic prtimo d un insieme di stti DSttes contenente solo uno stto inizile non mrcto. Ad ogni psso selezionimo uno stto non mrcto d DSttes e ne clcolimo le trnsizioni uscenti ggiungendo DSttes, non mrcti, eventuli nuovi stti trovti. Prim o poi, dto che il numero di stti possibili è finito (il numero di elementi di (S) è 2 S, cioè due elevto l numero di elementi di S, che sono gli stti dell utom N e sono in numero finito per definizione) non ci srnno più stti non mrcti d considerre e l lgoritmo terminerà. Esso costruisce l funzione di trnsizione Dtrn simulndo, ttrverso insiemi di stti di N, i comportmenti di N in prllelo dovuti l non determinismo. All interno dell lgoritmo viene utilizzt l funzione move, che specifichimo mtemticmente: move:( (S) Σ) (S) tle che move(t,x) = s T move(s,x) In prtic si mettono in uno stesso insieme tutti gli stti rggiungibili con uno stesso simbolo x prtire d uno stto qulunque di T. Esempio 2.8 Considerimo come utom N di prtenz quello in Figur 2.1. Il linguggio ccettto, come sppimo, è {s bb s {,b} }. Applichimo l lgoritmo dell costruzione dei sottoinsiemi e trovimo il DFA D equivlente. Lo stto inizile di D è per definizione {0} poiché 0 è lo stto inizile di N. Chimimo questo insieme, per convenienz, A. A è il primo stto non mrcto che f prte di DSttes. All prim iterzione selezionimo per forz lo stto A e lo mrchimo. Clcolimo: move(a,) = {0,1} Chimimo questo nuovo stto B = {0,1} move(a,b) = {0} = A Con un b ritornimo nello stto inizile e con un ndimo un uno stto nuovo B (non si trov ttulmente in DSttes) che, seguendo l lgoritmo, v inserito non mrcto in DSttes. In generle, un funzione di trnsizione di un NFA o di un DFA può essere rppresentt, oltre che grficmente come bbimo visto, nche con un tbell in cui le righe sono gli stti e le colonne sono i simboli dell lfbeto. L cell d un rig T e d un colonn x dell tbell è l insieme di stti che risult d move(t,x).

2.3. COSTRUZIONE DEI SOTTOINSIEMI 19 L tbell che rppresent l prte di Dtrn clcolt fino questo punto è l seguente: Stto b Mrcto A = {0} B A Si B = {0, 1} No Procedimo scegliendo uno stto non mrcto. Anche quest volt l scelt obbligt è B e clcolimo: move(b,) = {0,1} = B move(b,b) = {0,2} Chimimo questo nuovo stto C = {0,2} Anche quest volt per il simbolo non è stto generto nessuno stto nuovo, mentre per b è stto generto il nuovo stto C che inserimo non mrcto in DSttes. L tbell przilmente costruit fino questo punto è l seguente: Stto b Mrcto A = {0} B A Si B = {0, 1} B C Si C = {0, 2} No Continundo d pplicre l lgoritmo si rriv generre un ulteriore stto D = {0,3} dopodiché non si generno più nuovi stti e l lgoritmo termin. L tbell finle è l seguente: Stto b Mrcto A = {0} B A Si B = {0, 1} B C Si C = {0, 2} B D Si D = {0, 3} B A Si L unico stto finle è D poiché è l unico che contiene uno stto finle di N, cioè 3. L utom è disegnto in Figur 2.4. Si noti che questo è lo stesso utom di Figur 2.3 meno di ridenominzione degli stti (0=A, 1=B, 2=C, 3=D). Per concludere osservimo che in tutte le cselle dell tbell dell esempio bbimo ottenuto un insieme di stti d inserire. Tuttvi questo non

20 CAPITOLO 2. AUTOMI A STATI FINITI b b b b A B C D Figur 2.4: L utom deterministico risultnte dll costruzione dei sottoinsiemi. si verific sempre: se ottenimo, per un cert csell, move(t, x) = {} llor signific che nell utom risultnte D, prtire dllo stto T, non c è nessun trnsizione uscente etichettt con x. Grficmente questo signific che non c è nessun frecci uscente d T con etichett x. Nell rppresentzione con un tbell si inserisce l insieme vuoto {} o si lsci l entrt vuot. 2.4 Minimizzzione di un DFA L fcilità di simulzione di un DFA rispetto quell di un NFA è compenst dl ftto che il DFA in genere h un numero mggiore di stti. È lecito chiedersi, in quest ottic, se è possibile, dto in certo DFA, trovrne uno equivlente, m che bbi un numero minore di stti. L rispost è sì, ed esiste un lgoritmo che trov un DFA equivlente d un DFA dto e tle che l utom risultto h un numero minimo di stti. Qui minimo si riferisce gli stti necessri per poter ccettre il linguggio ccettto dll utom di prtenz. Inoltre si h che l utom minimo è unico meno di rinominre gli stti (in ltre prole se trovo due utomi minimi esiste sempre un funzione bigettiv fr gli stti dei due che rispett tutte le trnsizioni). In questo corso non vedimo questo lgoritmo, m è bene spere che esiste l nozione di minimlità e di equivlenz di stti. Si osservi d esempio l utom deterministico di Figur 2.5. È fcile convincersi che nche questo utomccett illinguggio{s bb s {,b} }comequellorisultntedll costruzione dei sottoinsiemi in Figur 2.4. Il numero di stti di quest ultimo, però, è minore del numero di stti dell ltro. L lgoritmo di minimizzzione, prtendo dll utom con più stti, vrebbe riconosciuto che gli stti A e C sono equivlenti e li vrebbe unificti in un unico stto fornendo inoltre l dimostrzione, per come è costruito, che l utom di Figur 2.4 è minimo.

2.5. PROGETTAZIONE DI UN AUTOMA 21 b C b b strt A B b D b E Figur 2.5: Un utom deterministico per {s bb s {,b} }. 2.5 Progettzione di un utom In molti esercizi viene richiesto di scrivere un utom che ccetti un certo linguggio dto. Il linguggio può essere stto specificto si in mnier formle (con un espressione su insiemi o con un espressione regolre, Sezione 3.4.1) oppure in mnier informle trmite un descrizione prole e con l usilio di esempi. In entrmbi i csi, se si vuole ffrontre il problem prtendo col piede giusto, è bene ssicurrsi di ver cpito esttmente che tipo di linguggio viene richiesto. Se questo è vero si è sicurmente in grdo di scrivere lcune stringhe del linguggio e, soprttutto, di individure i csi prticolri : le stringhe più corte, quelle più nomle, quelle che hnno un struttur precis che si ripete, ecc. Qundo si è sicuri di ver compreso il linguggio si può pssre l progetto dell utom. In quest fse bisogn cercre di trovre un modo di combinre gli strumenti che ci dà l teori degli utomi per ottenere le stringhe richieste. A ben gurdre gli strumenti sono molto semplici: stti, trnsizioni con cui consentire o impedire (non mettendo l trnsizione) cmmini, stti di ccettzione e un form molto semplice di ricorsione che ci permette di iterre delle trnsizioni su un certo stto o su un certo ciclo di stti. Lprimcosdfreècercre ditrovreunlgoritmo concuisivogliono ccettre tutte e sole le stringhe del linguggio. Un errore tipico è quello di preoccuprsi di fr ccettre ll utom tutte le stringhe del linguggio e

22 CAPITOLO 2. AUTOMI A STATI FINITI non preoccuprsi di non fre ccettre stringhe che non sono nel linguggio. Un ltro errore tipico è quello di costruire l utom seguendo lcuni esempi di stringhe e non l definizione di tutto il linguggio: in questo cso l utom risultnte di solito ccett tutte le stringhe di esempio, m non ne ccett ltre che sono comunque nel linguggio. Per evitre questi problemi è bene seguire un metodologi che guidi ll soluzione. L prim rccomndzione di quest metodologi è quell di prtire dgli stti per elborre un lgoritmo. Gli stti di un utom possono strrre qulunque tipo di informzione, qulunque livello di dettglio. Si può decidere, quindi, di rppresentre con uno stto un qulsisi situzione. Dopo questo primo psso, tenendo ben presente i diversi significti che si sono dti i diversi stti dell utom, si rccomnd di pssre scrivere le trnsizioni tr di essi in mnier coerente con l logic dell lgoritmo che si è pensto. Il tocco finle è riconoscere gli stti di ccettzione. Fccimo lcuni esempi clssici per illustrre quest metodologi. Si consideri il seguente problem: costruire un utom che ccetti tutte e sole le stringhe di {0,1} che hnno un numero pri di occorrenze del simbolo 1. Per prim cos riflettimo sul linguggio. Zero è d considerrsi numero pri e quindi sicurmente l utom deve ccettre tutte le stringhe che contengono zero occorrenze del simbolo 1, cioè che contengono solo simboli 0. In prticolre può ccettre nche l string vuot ǫ poiché quest contiene sicurmente zero occorrenze del simbolo 1. Delle stringhe che invece contengono qulche simbolo 1 osservimo subito che non ci import come sono dislocti questi 1 ll interno dell stess. In prticolre, essi potrebbero essere tutti ttccti oppure occorrere qu e là fr diversi simboli 0 messi picere. Non è questo che ci interess: ci interess l prità del numero delle loro occorrenze. Avendo, in questo modo, inqudrto per bene il linguggio possimo pssre cercre un lgoritmo per l ccettzione delle stringhe descritte. Il ftto che le occorrenze del simbolo 0 non influenzno l nostr decisione sull ccettzione o no dell string ci induce pensre che sicurmente, in qulsisi stto si trovi l utom, possimo inserire un trnsizione uscente etichettt con 0. Questo signific che l ver logic dell utom deve essere bst solo sulle occorrenze dei simboli 1. Mettimoci nei pnni dell utom che riceve un string in ingresso e deve decidere se ccettrl o no. Pensimo ll lgoritmo che potrebbe seguire. Possimo pensre che ll prim occorrenz di un simbolo 1 l utom deve ricordre quest informzione in un certo stto poiché questo signific che, per il momento, c è un numero dispri (1) di occorrenze di simboli 1. Quindi, se l string si conclude qui, o l limite dopo lcune occorrenze del simbolo 0, non possimo ccettrl. Comunque l string potrebbe non essere termint e quindi l utom deve poter continure gurdre i prossimi simboli in ingresso.

2.5. PROGETTAZIONE DI UN AUTOMA 23 Ad un eventule occorrenz successiv di un simbolo 1 l utom dovrà di nuovo ricordre l cos poiché, se dopo l prim occorrenz il numero di simboli 1 er dispri, or il numero di simboli 1 è pri e quindi, llo stto ttule delle cose, l string può essere ccettt. Dobbimo fre in modo che questo vveng se l string si conclude qui oppure se si conclude dopo un certo numero di occorrenze di soli simboli 0. Se l string continu, questo punto, ci ritrovimo nell situzione inizile: se rriv un simbolo 1 bisogn cmbire stto e ricordre che ttulmente l string non può essere ccettt. E se rriv un 1 successivmente l utom deve di nuovo cmbire lo stto e ricordre che ttulmente l string può essere ccettt. A questo punto è chir l logic dell lgoritmo: si oscill tr i due stti fino qundo l string non termin e quel punto si gurd lo stto in cui si è per decidere se ccettre o no. Formlizzimo quest ide con gli strumenti che ci dnno gli utomi. Innnzitutto, ll luce dell nostr ide, definimo due stti p e d. Lo stto p ricord l informzione: fino questo momento l string di ingresso contiene un numero pri di simboli 1 mentre lo stto d ricord l informzione: fino questo momento l string di ingresso contiene un numero dispri di simboli 1. All inizio, qundo l utom non h ncor letto nessun simbolo dell string in ingresso, vle l enuncito ssocito llo stto p poiché zero occorrenze di 1 sono un numero pri. Pertnto p è il cndidto perfetto per essere lo stto inizile dell utom. Pssimo definire le trnsizioni fr questi stti stndo bene ttenti preservre l logic degli stessi, cioè fre in modo che l informzione d essi ssocit rimng sempre ver. Esminimo l situzione stto per stto. Considerimo lo stto p e mettimoci nei pnni dell utom che legge il primo simbolo dell string che gli è rimst d nlizzre. Assumimo per costruzione che l informzione ssocit llo stto si ver e impegnmoci scrivere le trnsizioni in modo tle che resti ver. Siccome l lfbeto Σ è l insieme {0,1} l utom può prevedere zero, un o più 2 trnsizioni uscenti dllo stto d etichettte con 0 o 1. Considerimo il simbolo 0. Abbimo detto che l occorrenz di tle simbolo non cmbi niente rispetto ll logic degli stti. In prticolre, in questo cso, si vede benissimo che l informzione ssocit p, cioè fino questo momento l string di ingresso contiene un numero pri di simboli 1, non è influenzt dll occorrenz ttule di un simbolo 0, che comunque può occorrere libermente. Pertnto ci srà un trnsizione uscente d p etichettt con 0 e lo stto di destinzione deve essere per forz p stesso! Diversmente, inftti, l utom dovrebbe ndre in d sserendo erronemen- 2 Ad esempio se l utom è non deterministico.

24 CAPITOLO 2. AUTOMI A STATI FINITI 1 p d 0 1 0 Figur 2.6: L utom costruito per riconoscere stringhe con prità di 1. te di ver letto un numero dispri di 1. Non c è bisogno di ltre trnsizioni etichettte con 0. Considerimo il simbolo 1. Sppimo che nche 1 può occorrere libermente in qulsisi punto dell string in ingresso, m ogni volt che occorre lo stto dell utom deve cmbire. Stimo ssumendo di trovrci nello stto p e quindi, con l trnsizione etichettt 1, dobbimo ndre in d. Si noti che l logic degli stti è rispettt perché l informzione ssocit llo stto d è ver dopo l esecuzione di quest trnsizione (questo perché noi stimo ssumendo che l informzione ssocit p si ver prim dell trnsizione). Per qunto rigurd lo stto p non ci sono ltre considerzioni d fre. Per lo stto d si fnno gli stessi rgionmenti considerndo, però, che quest volt si prte dll ssunzione che sino stti letti un numero dispri di 1. Quindi, ll occorrenz di 0, come in p, l utom non cmbi stto, m ll occorrenz di 1 l utom deve ritornre in p per preservre l logic degli stti. Rimngono solo d definire, questo punto, gli stti finli. È chiro che in questo utom l unico stto che può essere considerto di ccettzione è p. Questo perché l consegn dice che l utom deve ccettre solo le stringhe con un numero pri di 1 e p è proprio lo stto in cui questo è sempre vero. Si noti che, in generle, ssegnre uno stto s come di ccettzione non implic che un utom che si trov in s non poss continure leggere un string in ingresso e continure quindi costruire un cmmino. È essenzile invece ccertrsi che se l utom si ferm in uno stto di ccettzione llor l string lett fino quel momento si sempre un string del linguggio ssegnto. Nel nostro esempio questo è vero perchè unvolt che l utom è entrto nello stto p l string lett fino quel momento può essere sicurmente ccettt. L string inoltre può continure con diverse occorrenze di simboli 0 e rimnere sempre un string del linguggio ssegnto. Solo leggendo un 1 si cmbi stto e si potrà ccettre l string solo se proseguendo, ll fine, si ritornerà in p. L utom che bbimo costruito è rffigurto in Figur 2.6.

2.5. PROGETTAZIONE DI UN AUTOMA 25 0 0 0 i 1 0 1 1 Figur 2.7: L utom costruito per stringhe senz 1 consecutivi. Fccimo un ltro esempio. Supponimo di voler scrivere un utom che ccetti il linguggio, sempre sull lfbeto {0, 1}, di tutte le stringhe che non contengono mi due simboli 1 consecutivi. Di nuovo ci v bene qulunque string di soli simboli 0 e quindi nche l string vuot. Per qunto rigurd i simboli 1 essi di nuovo possono occorrere in qulunque posizione, m mi due volte di seguito. Per poter relizzre questo vincolo possimo pensre di ricordre negli stti qul è l ultimo simbolo che è stto letto nell string di ingresso. Essendoci solo due simboli, creimo due stti: lo stto 0 che ricord l informzione: l ultimo simbolo letto è 0 e lo stto 1 cui è ssocit l informzione: l ultimo simbolo letto è 1. Come stto inizile, però, nessuno dei due v bene poiché entrmbi presuppongono che ci si un simbolo letto precedentemente. Non c è problem: possimo crere tutti gli stti che voglimo e quindi ne creimo uno, chimimolo i, che serve solo fre d stto inizile. Adesso costruimo le trnsizioni di conseguenz. Dllo stto inizile i prtirà un trnsizione etichettt con 0 verso lo stto 0 e un etichettt con 1 verso lo stto 1. In questo modo l informzione sugli stti divent ver l primopssodell utom. Fccimo inoltre in modoche nonci si l possibilità di ritornre nello stto i (questo perché l bbimo costruito solo come stto inizile e un uso diverso potrebbe confondere l nostr progettzione). Nello stto 0 non ci sono vincoli su qule simbolo può occorrere. Ciò signific che c è un trnsizione uscente etichettt con 0 ed un etichettt con 1. Per rispettre l logic degli stti, ovvimente, l prim deve ritornre nello stto 0 mentre l second deve ndre nello stto 1. Nello stto 1 bisogn esprimere il vincolo ssegnto dl linguggio. In generle sppimo che un utom ccett un string se e solo se riesce costruire per ess lmeno un cmmino che termin in uno stto di ccettzione. Pertnto bbimo due modi per non fre ccettre un string d un utom: fre in modo che tutti i suoi cmmini terminino in uno stto

26 CAPITOLO 2. AUTOMI A STATI FINITI non di ccettzione oppure impedire l costruzione di un cmmino per l string. In questo cso utilizzimo l second possibilità: semplicemente impedimo ll utom di costruire cmmini per stringhe che hnno due simboli 1 consecutivi. Per fr questo bst non mettere nessun trnsizione uscente dllo stto 1 etichettt con 1. Per il simbolo 0 invece inserimo l trnsizione uscente e, per rispettre l logic degli stti, quest trnsizione deve ritornre nello stto 0. Mnc solo l specific degli stti finli. In questo cso qulunque string che bbi un cmmino sull utom v bene poiché bbimo escluso tutte e sole le stringhe non ccettbili impedendo ll utom di costruire cmmini per esse. Quindi tutti gli stti sono di ccettzione. L utom è disegnto in Figur 2.7. Si noti che, d un punto di vist di ottimizzzione, lo stto i è inutile poiché perfettmente equivlente llo stto 0. Pertnto srebbe possibile scrivere un utom per lo stesso linguggio con soli due stti. Non essendo stto richiesto un utom minimo non ci dobbimo preoccupre di questo spetto. L utom con lo stto inizile i in più v benissimo.

Cpitolo 3 Induzione e ricorsione In questo cpitolo introducimo due nozioni centrli per questo corso e per l informtic in generle. 3.1 Ricorsione L induzione e l ricorsione sono due concetti strettmente legti. Un definizione viene dett ricorsiv se l oggetto che si vuole definire compre nche nell espressionechedovrebbedefinirlo. Èchirocheun espressionedelgenere deve essere dt molto ccurtmente, poiché può definire effettivmente qulcos solo nel cso in cui suggerisce un costruzione induttiv. L esempio clssico di definizione ricorsiv è quell dell definizione dell funzione fttorile. L funzione fttorile ftt deve prendere un certo numero nturle n e restituire il numero risultnte dll moltipliczione di tutti inumerid1n(ncompreso). Quindi, desempio,ftt(4) = 1 2 3 4 = 24. Nel cso in cui n si ugule zero l definizione introduce per convenzione che ftt(0) = 1. Questo risult comodo per dre le definizioni e rispett nche certe logiche in tluni contesti mtemtici. L funzione ftt è spesso definit in questo modo: { 1 se n = 0 ftt(n) = n ftt(n 1) se n > 0 Si cpisce subito, semplicemente leggendo il testo, che l definizione è ricorsiv: destr dell equzione compre il simbolo ftt che è proprio l oggetto che stimo definendo. M llor come è possibile che quest definizione si ben post? In effetti quest equzione potrebbe non vere nessun soluzione (cioè potrebbe non esistere nessun funzione mtemtic fr numeri nturli che, sostituit ftt nell equzione, rend ver l uguglinz). Però in questo cso un soluzione c è e possimo clcolrl costruttivmente! Questo ccde tutte le volte che si dà un definizione ricorsiv corrett. 27

28 CAPITOLO 3. INDUZIONE E RICORSIONE Per convincersi dell bontà dell definizione bst seguirne l semplice logic: se dobbimo clcolre il fttorile di zero sppimo che esso è sempre 1 per convenzione. Invece, se n è mggiore di zero, il suo fttorile è l moltipliczione di n per n 1, per n 2, e così vi fino 1 (che, non cso, è nche il fttorile di zero). M il risultto di n 1 n 2 1 è esttmente il fttorile di n 1. Cosicché bst semplicemente dire che per clcolre il fttorile di n bst moltiplicre n per il fttorile di n 1. A questo punto possimo spingerci oltre quest considerzione intuitiv e cercre di cpire esttmente come l definizione funzioni e vedere precismente ciò che viene definito. In ltre prole cerchimo di descrivere rigorosmente in che modo l soluzione, cioè l funzione ftt, può essere clcolt. 3.2 Costruzione induttiv Lo strumento che possimo utilizzre per trovre l soluzione che ci interess è l induzione o costruzione, che dir si vogli. Un definizione ricorsiv corrett contiene sempre lmeno un cso bse. Un cso bse rppresent un punto di prtenz per inizire un costruzione. Nturlmente possono esserci più csi bse, nel qul cso bbimo un insieme di punti di prtenz. Un cso bse si riconosce fcilmente: nell su definizione non viene usto l oggetto che si st definendo, m viene dto direttmente un risultto. Nel nostro cso c è un unico cso bse che ci dice che qundodobbimo clcolre il fttorile di zero, l rispost è 1. Per comodità rppresentimo l funzione ftt che voglimo clcolre come un insieme di coppie di numeri nturli. Ogni coppi (n,m) in questo insieme rppresent il ftto che ftt(n) = m. Per vere l nostr soluzione dobbimo ottenere un insieme in cui ci si un e un sol coppi (n,m) per tutti gli n nturli. Nturlmente questo è un insieme infinito, m vedremo che il ftto che si definito induttivmente ci dà l possibilità di clcolrlo in mnier incrementle esttmente fino l punto che ci serve in prtic (cioè clcolre il fttorile di un certo numero n dto). Ogni costruzione induttiv prte di csi bse e procede per pssi successivi costruendo soluzioni przili che diventno sempre più grndi d ogni psso. Nel nostro esempio bbimo un solo cso bse che ci dice che l coppi (0, 1) deve essere inclus nell insieme che rppresent l funzione ftt poiché dice chirmente che ftt(0) = 1. Quindi l primo psso, senz ver ftto niente di più che leggere l definizione e trovre i csi bse bbimo clcolto l soluzione przile {(0,1)} Entrimo desso nell logic del cosiddetto psso induttivo o psso di costruzione. Innnzitutto dobbimo formlmente riconsiderre i csi bse e

3.2. COSTRUZIONE INDUTTIVA 29 considerre l soluzione przile ottenut nel psso precedente (c è sempre lmeno un psso precedente questo). L soluzione przile che bbimo ttulmente è {(0, 1)} che coincide con l informzione ottenut dl cso bse e che, bbimo detto, indic ftt(0) = 1. Dobbimo quindi gurdre i csi induttivi dell definizione. Nel nostro esempio bbimo solo un cso induttivo che ci dice che ftt(n) = n ftt(n 1). Come possimo utilizzre quest informzione vendo disposizione l nostr soluzione przile? Attulmente conoscimo solo ftt(0) e possimo quindi concludere, sostituendo nell definizione n con il vlore 1, un sol cos in più: cioè che ftt(1) = 1 ftt(1 1) = 1 ftt(0) = 1 1 = 1. E quindi l nostr soluzione przile è umentt! Attulmente è l insieme {(0,1),(1,1)} Il psso induttivo deve essere ripetuto fino che non si giunge ll soluzione totle. Nel nostro cso sppimo che l soluzione è un insieme infinito e che quindi c è bisogno di un numero infinito di pssi per rrivrci. Questo non succede sempre: se l oggetto che si st definendo ricorsivmente è finito llor prim o poi l soluzione przile smette di crescere d ogni psso. In ltre prole si rriv d un cert soluzione przile per cui, pplicndo i pssi induttivi in tutti i modi possibili, non si ottiene nessun nuov informzione. Ciò signific che quell prticolre soluzione przile è l soluzione finle che stvmo cercndo 1. Fccimo ncor lcuni pssi induttivi. A prtire d {(0, 1),(1, 1)} possimo inferire di nuovo si l coppi (0,1) dl cso bse si l coppi (1,1) dll coppi (0, 1). Questo, però, non ument l soluzione przile. Dll coppi(1, 1) viene invece fuori qulcos di nuovo: ftt(2) = 2 ftt(2 1) = 2 ftt(1) = 2 1 = 2. L nuov soluzione przile è {(0,1),(1,1),(2,2)} Al psso successivo si può rigenerre tutt l soluzione przile che vevmo più un nuovo elemento, prtire dll coppi (2,2): ftt(3) = 3 ftt(3 1) = 3 ftt(2) = 3 2 = 6. L nuov soluzione przile è {(0,1),(1,1),(2,2),(3,6)} Ci si può fcilmente convincere che ndndo vnti meccnicmente in questomododogni pssoggiungimo sempreesolo uncoppinuov (n+ 1,(n+1) m) se l psso precedente vevmo ggiunto l coppi (n,m). L soluzione finle si trov dopo un numero infinito di pssi. Esiste un teori mtemtic che ssicur che ess esiste. Questo però solo se l definizione è 1 L teori mtemtic che descrive tutto questo processo ci dice che l soluzione che si trov si nel cso finito che in quello infinito è quell minim. Potrebbero cioè, in certi csi, esistere ltre soluzioni.

30 CAPITOLO 3. INDUZIONE E RICORSIONE dt in mnier corrett, in modo cioè d suggerire un processo costruttivo crescente nlogo quello che bbimo visto. Vedimo un esempio in cui il processo costruttivo viene specificto in mnier errt: { 1 se n = 0 foo(n) = n foo(n+1) se n > 0 Osservimo l definizione ricorsiv dell funzione foo. Qule processo di costruzione suggerisce? Possimo provre prtire come per ftt dll coppi (0,1) che viene dt dl cso bse. Nel psso induttivo però non simo in grdo di dedurre niente di nuovo dll soluzione przile {(0, 1)}: per ottenere foo(1) inftti dovremmo conoscere già un coppi (2, m), che invece non c è! Quindi dobbimo subito fermrci e dichirre che il mssimo che bbimo potuto ricvre è foo(0) = 1. L obiettivo di definire un funzione foo per tutti i numeri nturli non è stto rggiunto. Quello che bbimo definito è un funzione przile che dà un vlore solo per zero. 3.3 Chimte ricorsive Nturlmente possimo scrivere un progrmm che clcol l funzione ftt per ogni numero nturle. Bst fr eseguire l progrmm l costruzione che bbimo visto fino d rrivre d ottenere l coppi (n,ftt(n)). Tuttvi, il processo che bbimo descritto risult molto inefficiente: d ogni psso si devono riclcolre molte cose che già si sono clcolte precedentemente. In reltà bsterebbe clcolre ogni volt solo l coppi nuov! Vedimo quindi un modo più efficiente di pplicre le definizioni ricorsive. Le definizioni ricorsive, oltre ll interpretzione costruttiv che bbimo descritto finor, hnno sempre nche un ltr possibile interpretzione che possimo chimre dll lto verso il bsso. Nell interpretzione costruttiv inftti noi prtimo dl bsso (di csi bse) per costruire psso dopo psso un qulcos che, ll fine, diventerà l oggetto definito induttivmente. In molti csi però, come d esempio per il cso del fttorile in cui l obiettivo è essere cpci di clcolre un vlore prtire d un dto numero n, è conveniente dottre un visione divers in cui l definizione ricorsiv suggerisce un scomposizione in problemi più piccoli. Cerchimo di spiegre questo modo di vedere dottndo sempre l esempio del fttorile. Considerimo l stess definizione di ftt dt sopr come il punto di prtenz di un lgoritmo che debb risolvere il problem di clcolre il fttorile di un certo numero n dto in input. Quli sono i pssi dell lgoritmo suggeriti dll definizione? Provimo fre un esempio ponendo l input n = 3. Per cpire bene in che modo possimo fre il clcolo, e in che modo viene poi ftto effettivmente di progrmmi eseguibili, dobbimo pensre