840 likes | 1.03k Views
Alfabeti, Stringhe e Linguaggi Def: un insieme è una collezione non ordinata di oggetti o elementi Gli insiemi sono scritti tra { }. Gli elementi sono inseriti tra le parentesi Def: Per ogni insieme S, “w є S” indica che w è un elemento di S
E N D
Alfabeti, Stringhe e Linguaggi Def: un insieme è una collezione non ordinata di oggetti o elementi Gli insiemi sono scritti tra { }. Gli elementi sono inseriti tra le parentesi Def: Per ogni insieme S, “w є S” indica che w è un elemento di S Nota: Notazione di insiemi per specificare un’insieme A = { x | x є R, f(x) = 0} R è insieme dei numeri reali, f è una qualche funzione
Insiemi Es: {a, b, c} ha elementi a, b, c. {a, b, c} e {b, c, b, a, a} sono lo stesso insieme. Ordine e ridondanza non contano. {a} ha elemento a. {a} ed a sono coSe diverse. {a} è l’insieme che contiene solo elemento a. L’insieme degli interi è Z = {. . . ,.-2,-.1, 0, 1, 2, . . .}. L’insieme degli interi non negativi è Z+ = {0, 1, 2, 3, . . .}.
Insiemi Es: L’insieme dei numeri pari è {0, 2, 4, 6, 8, 10, 12, . . .} = { 2n | n = 0, 1, 2, . . . }. L’insieme dei pari positivi è {2, 4, 6, 8, 10, 12, . . .} = { 2n | n = 1, 2, 3, . . . }. L’insieme dei numeri dispari è {1, 3, 5, 7, 9, 11, 13, . . .} = { 2n+1 | n = 0, 1, 2, . . . }. Es: Se A = { 2n | n = 0, 1, 2, . . . }, allora 4 є A, ma 5 non in A.
Alfabeti Un alfabeto è un insieme finito di elementi fondamentali (chiamati lettere o simboli) Es: L’alfabeto delle lettere romane minuscole è S={ a, b, c, . . . , z }. Es: L’alfabeto delle cifre arabe è S={ 0, 1, 2, . . . , 9 }.
stringa Def:Una stringa su un alfabeto è una sequenza finitadi simboli dell’ alfabeto. Es: cat, food, c, babbz sono stringhe sull’ alfabeto A={a, b, c, . . . , z}. 0131 è una stringa sull’ alfabeto B={0, 1, 2, . . . , 9}.
Lunghezza di una stringa Def: per ogni stringa s, la lunghezza di s è il numero di simboli in s. La lunghezza di s è denotata con lunghezza(s) o |s|. Es: lunghezza(mom) = |mom| = 3. Def: la stringa vuota e è la stringa contenente nessun simbolo, |e| = 0.
Kleene Star Def: Dato alfabeto S, sia S* l’insieme di tutte le possibili stringhe su S. Es: S={a, b}, allora S* = { e, a, b, aa, ab, ba, bb, aaa, aab, aba, abb, . . . }.
Concatenazione Def: Date due stringhe u e v, la concatenazione di u e v è la stringa uv. Es: u = abb e v = ab, allora uv = abbab e vu = ababb. u = e e v = ab, allora uv = ab. u = bb e v = e, allora uv = bb. u = e e v = e, allora uv = e; cioè ee=e
Def: per stringa w, definiamo wn per n > 0 induttivamente: w0 = e; wn+1 = wnw per ogni n > 0. Es: w = cat, allora w0 = e, w1 = cat, w2 = catcat, w3 = catcatcat, ... Es:Dato simbolo a a3 = aaa a0 = e
Sottostringa Def: Data stringa s, una sottostringa di s è una qualsiasi parte di simboli consecutivi della stringa s. cioè, w è una sottostringa di s se esistono stringhe x e y (eventualmente vuote) tali che s = xwy. Es: Stringa 472 ha sottostringhe e, 4, 7, 2, 47, 72, 472. 42 non è sottostringa di 472.
Linguaggi Def: Un Linguaggio formale (Linguaggio) è un insieme di stringhe su un alfabeto. Es: Linguaggi per computer, quali C o C++ o Java, sono linguaggi permali con alfabeto A = {a, b, . . . , z, A, B, . . . , Z, ,0, 1, 2, . . . , 9, >, <, =, +, -, *, /, (, ), ., ,, &, !, %, |, ’, ", :, ;,ˆ, {, }, @, #, \, ?}. Le regole della sintassi definiscono le regole del linguaggio. L’insieme di nomi validi di variabili in C++ è un Linguaggio formale .
Esempi di Linguaggi 1. alfabeto A={x}. Linguaggio L = { e, x, xx, xxx, xxxx, . . . }= { xn | n = 0, 1, 2, 3 . . . } Nota: x0 = e, quindi stringa vuota in L 2. alfabeto A={x}. Linguaggio L = { x, xxx, xxxxx, xxxxxxx, . . . }={ x2n+1 | n = 0, 1, 2, 3, . . . } 3. alfabeto A={0, 1, 2, . . . , 9}. Linguaggio L = { qualsiasi stringa che non inizia con “0”} = { e, 1, 2, 3, . . . , 9, 10, 11, . . . }
Esempi di Linguaggi • Es: Sia A={a, b}, definiamo Linguaggio L formato • da tutte le stringhe che iniziano con a seguita da 0 o più b; • Cioè L = { a, ab, abb, abbb, . . . }= { abn | n = 0, 1, 2, . . . }. • Def: l’ insieme vuotof è l’ insieme contenente nessun elemento. • Nota: • e non in f • non è uguale a {e} poichè f non ha elementi.
Insiemi: Relazioni ed Operazioni Def:Se S e T sono insiemi, allora S T (S è sottoinsieme di T) se w S implica w T. Cioè ogni elemento di S è anche un elemento T. Es: S = { ab, ba }, T = { ab, ba, aaa } allora S T ma T S. S = { ba, ab } e T = { aa, ba } allora S T e T S.
Insiemi uguali Def:insiemi S e T, sono uguali (S = T), Se S T e T S. Es: Sia S = { ab, ba } e T = { ba, ab }. allora S T e T S. quindi S = T. Sia S = { ab, ba } e T = { ba, ab, aaa }, allora S T, ma T S. Quindi S T.
Unione Def: Dati due insiemi S e T, la loro unione è S U T = {w | w S o w T } S U T contiene tutti gli elementi in S oppure in T (o in entrambi). Es: S = { ab, bb } e T = { aa, bb, a }, allora S U T = { ab, bb, aa, a }. S = { a, ba } e T = f, allora S U T = S. S = { a, ba } e T = { e }, allora S U T= { e, a, ba }.
Intersezione Def: Dati due insiemi S e T, la loro Intersezione è S ∩ T = {w | w S e w T }, S ∩ T consiste degli elementi sia di S che di T. Def: insiemi S e T sono disgiunti se S ∩ T = f. Es: Sia S = { ab, bb } e T = { aa, bb, a }, allora S ∩ T = { bb }. Sia S = { ab, bb } e T = { aa, ba, a }, allora S ∩ T = f, quindi S e T sono disgiunti
Sottrazione Def:Dati 2 insiemi S e T, S -T = {w | w S, w T }. Es: Sia S = { a, b, bb, bbb } e T = { a, bb, bab } allora S -T = { b, bbb }. Sia S = { ab, ba } e T = { ab, ba } allora S -T = f.
Complemento Def: Dato insieme S, il suo complemento è C(S)= {w | w S }. C(S) è l’ insieme di tutti gli elementi considerati che non sono in S. Es: Sia S l’ insieme delle stringhe su alfabeto {a, b} che iniziano con il simbolo b. allora C(S) è insieme stringhe su {a, b} che non iniziano con b, C(S) NON è l’ insieme stringhe su {a, b} che iniziano con a (es. stringa vuota e)
Concatenazione Def: Dati 2 insiemi S e T di stringhe, la concatenazione (o prodotto) di S e T è ST = { uv | u S, v T }. Nota: ST è l’ insieme di stringhe che possono essere divise in 2 parti: la prima parte è in S e la seconda parte è in T. Es: S = { a, aa } e T = { e, a, ba }, allora ST = { a, aa, aba, aaa, aaba }, TS = { a, aa, aaa, baa, baaa }. aba ST, ma aba TS. ST TS
Cardinalità Def: La cardinalità |S| di S è il numero di elementi in S. Es: Sia S = { ab, bb } e T = { an | n > 1 }, allora |S| = 2 e |T| = ∞. Se S = f , allora |S| = 0.
InsiemiFiniti ed Infiniti Def: Un insieme S è finito se |S| < ∞. Se S non è finito, allora S è infinito. Es: Sia S = { ab, bb }, allora S è finito. Sia T = { an | n > 1 }. allora T è infinito. Fatto: Se S e T sono disgiunti (cioè S ∩ T = vuoto.), allora |S U T| = |S|+|T|. Fatto: Se S e T sono tali che |S ∩ T| < ∞, allora |S U T| = |S|+|T| - |S ∩ T|.
Sequenze e tuple Def: sequenza di oggetti è una lista di questi oggetti in qualche ordine. ordine e ridondanza sono importanti in una sequenza (non in un insieme). Def: sequenze finite sono dette tuple. A k-tupla ha k elementi nella sequenza. Es: (4, 2, 7) è a 3-tupla o tripla (9, 23) è a 2-tupla o coppia.
Prodotto Cartesiano Def: Dati due insiemi A e B, il prodotto Cartesiano è l’ insieme di coppie A × B = { (x, y) | x A, y B }. Es: Sia A = { a, ba, bb } e B = { e, ba }, allora A × B = { (a, e), (a, ba), (ba, e), (ba, ba), (bb, e), (bb, ba) }. per Es, la coppia (a, ba) in A × B. B × A = { (e, a), (e, ba), (e, bb), (ba, a), (ba, ba), (ba, bb) }. Nota (ba, a) B × A, ma (ba, a) non in A × B, Quindi B × A A × B. Nota che la Concatenazione A B = { a, aba, ba, baba, bb, bbba } A × B.
Nota: |A × B| = |A| |B|. Perchè? Nota: Possiamo anche definire prodotto cartesiano di più di 2 insiemi. Def: prodotto cartesiano di k insiemi A1,A2, . . . , Ak è l’ insieme di k-tuple A1 × A2 × … ×Ak = { (x1, x2, . . . , xk) | xi Ai per i = 1, 2, . . . , k }
Es: Sia A1 = { ab, ba, bbb }, A2 = { a, bb }, A3 = { ab, b }. allora A1 × A2 × A3 = { (ab, a, ab), (ab, a, b), (ab, bb, ab), (ab, bb, b), (ba, a, ab), (ba, a, b), (ba, bb, ab), (ba, bb, b), (bbb, a, ab), (bbb, a, b), (bbb, bb, ab), (bbb, bb, b) }.
Insieme potenza Def: per ogni insieme S, l’ insieme potenza P(S) è P(S) = {A | A in S }. L’ insieme potenza di S è l’ insieme di tutti possibili sottoinsiemi di S. Es: Se S = { a, bb }, allora P(S) = { f, {a}, {bb}, {a, bb} }. Fatto: Se|S| < ∞, allora |P(S)| = 2|S| Cioè , ci sono 2|S| differenti sottoinsiemi di S. Perchè?
Chiusura Def:Dato insieme S di stringhe, sia S0 = { e }, e Sk = {w1 w2 … wk | wi in S, i = 1, 2, . . . , k }= =S . S . … . S, k volte, per k > 1. Nota: Sk è insieme di stringhe ottenute concatenando k stringhe di S, con possibili ripetizioni. Nota che S1 = S. Es: Se S = {a, bb}, allora S0 = {e}, S1 = {a, bb}, S2 = {aa, abb, bba, bbbb}, S3 = {aaa, aabb, abba, abbbb, bbaa, bbabb, bbbba, bbbbbb}.
ChiusuraKleene Star Def:la Chiusura(Kleene star) di un insieme di stringhe S è S*= S0U S1U S2U S3U … . Nota: S* è l’ insieme di tutte le stringhe ottenute concatenando zero o più stringhe di S, dove possiamo usare la stessa stringa più volte. S.*= {w1 w2 … wk | k > 0 e wi in S per tutti i = 1, 2, . . . , k }, Dove w1 w2 … wk per k = 0 è la stringa vuota.
Es: Se S = { ba, a }, allora S* = { e, a, aa, ba, aaa, aba, baa, aaaa, aaba, . . . }. Se w in S., puo’ bb essere una sottostringa di w? Es:Se A={ a, b }, allora A* = { e, a, b, aa, ab, ba, bb, aaa, aab, aba, . . . }, tutte possibili stringhe su alfabeto A. Es:Se S = f, allora S* = { e }. Es:Se S = { e }, allora S* = { e }.
S** S** è (S*)*, l'insieme di stringhe formate concatenando stringhe di S* Fatto: S** = S* per ogni insieme S di stringhe.
S+ Def: Se S è qualche insieme di stringhe, allora S+ è l'insieme di tutte le stringhe ottenute concatenando una o più stringhe di S. Es: Se S={ x }, allora S+ = { x, xx, xxx, . . . }.
Inverso di stringhe Def:per ogni stringa w, l'inverso di w, scritto reverse(w) o wR, è la stessa stringa di simboli scritta in ordine inverso . Se w = w1 w2 … wn, dove ogni wi è un simbolo, allora wR= wn wn-1 … w1. Es: (cat)R = tac e eR = e. per xxx in L1={xn | n = 1, 2, 3, . . .}, reverse(xxx) = xxx L1 Sia L3 l'insieme di stringhe su {0, 1, 2, . . . , 9} tali che il primo simbolo non è 0. Nota che 10 in L3, ma (10)R = 01 non in L3. quindi , L3 è non chiuso per l’inverso.
Grafi Def: Un grafo orientato G=(V,E) è composto da un insieme V di nodi (o vertici) ed un insieme E di archi. In grafo G che contiene nodi i e j, la coppia (i, j) in E rappresenta arco da nodo i a nodo j. Es per il grafo disegnato, V = {1, 2, 3}, E = { (1, 2), (1, 3), (2, 3), (3, 2), (3, 3) }, G = ({1, 2, 3}, { (1, 2), (1, 3), (2, 3), (3, 2), (3, 3) } ).
AUTOMI • Introduciamo ora un modello semplice di calcolatore avente una quantità finita di memoria • E’ noto come macchina a stati finiti o automa finito . • Idea di base del funzionamento: • Input= stringa su un alfabeto • Legge i simboli di w da sinistra a destra. • Dopo aver letto l’ultimo simbolo, l’automa indica se accetta • o rifiuta la stringa • Utili per progettare compilatori.
Automa finito deterministico (DFA) Es: DFA con alfabeto A={a, b}: q1, q2, q3 soni gli stati. q1 è lo stato start (ha freccia entrante da esterno) q2 è uno stato accetta (disegnato con doppio cerchio)
archi dicono come muoversi quando l’automa si trova in uno stato e simbolo di A è letto . Dopo aver letto l’ultimo simbolo: Se DFA è in uno stato accetta, allora stringa è accettata, altrimenti è rifiutata . Nell’esempio: abaa è accettata aba è rifiutata e è rifiutata
Def di DFA formale Def: A automa finito deterministico (DFA) è 5-tupla M = (Q,A, f, q1, F), dove 1. Q è insieme finito di stati. 2. A è alfabeto, e il DFA processa stringhe su A. 3. f : Q × A -> Q è la funzione di transizione. 4. q1 Q è lo stato start. 5. F (sottoinsieme di Q) è l'insieme di stati accetta (o stati finali). Nota:DFA chiamato anche semplicemente automa finito (FA).
Funzione di transizione di DFA funzione di transizione f : Q × A -> Q : per ogni stato e per ogni simbolo di input, la funzione f dice in quale stato spostarsi. Cioè, f(r, a) è lo stato che il DFA occupa quando è in stato r e legge a , per ogni coppia formata da uno stato r in Q ed un simbolo a in A. Esiste esattamente un arco uscente da r con label a quindi la macchina è deterministica.
Es di DFA M = (Q,A, f, q1, F) con Q = {q1, q2, q3} A={a, b} f è descritta da q1 è lo stato start F = {q2}.
Come un DFA Computa • DFA riceve in input stringhe di simboli di alfabeto A. • DFA inizia in stato start. • DFA legge la stringa un simbolo alla volta, partendo da sinistra • il simboli letto determina la sequenza di stati visitati. • Processo termina dopo che l’ultimo simbolo input è stato letto . • Dopo letto intera stringa input: • Se DFA termina in stato accetta, allora stringa è accettata • altrimenti , è rifiutata .
Definizione formale • Sia M = (Q,A, f, q0, F) un DFA. • Considera stringa w = w1w2 · · ·wn su A., doveogni wi in A. • M accetta w se esiste sequenza di stati r0, r1, . . . , rn in Q • tali che • r0 = q0 (primo stato della sequenza è quello iniziale) • rn in F (ultimo stato in sequenza è uno stato accetta) • f(ri-1, wi) = ri , per ogni i = 1, 2, . . . , n (sequenza di stati corrisponde a transizioni valide per la stringa w).
Linguaggio della Machina • Def:Se A è l'insieme di tutte le stringhe che la machina M accetta, allora si dice che • A è il Linguaggio della machina M, e • M riconosce (o accetta) A. • Scriviamo anche L(M) = A. • Def:Un Linguaggio è regolare se è riconosciuto da qualche DFA.
Es: Si consideri il seguente DFA M1 con alfabeto A={0, 1} : 010110 è accettata , ma 0101 è rifiutata . L(M1) è il Linguaggio di stringhe su A in cui il numero totale di 1 è dispari. Esercizio: dare DFA che riconosce il Linguaggio di stringhe su A con numero pari di 1’s
Es:DFA M2 con alfabeto A={0, 1} : Nota: L(M2) è Linguaggio su A che ha lunghezza 1, cioè L(M2) = {w in A | |w| = 1} Si ricordi che C(L(M2)), il complemento di L(M2), è l'insieme di stringhe su A che non sono in L(M2). Domanda: DFA che riconosce C(L(M2))?
Es: Si consideri il seguente DFA M3 con alfabeto A={0, 1} L(M3) è il Linguaggio su A che non ha lunghezza 1, Più di uno stato accetta. Stato start anche stato accetta. In generale, DFA accetta e sse lo stato start è anche stato accetta.
DFA per Complemento In generale, Dati DFA M per Linguaggio L, possiamo costruire DFA M’ per C(A) da M rendendo tutti gli stati accetta in M in stato non-accept in M’, rendendo tutti stati non-accetta in M in stati accetta in M’, Più formalmente, Se Linguaggio L su alfabeto A ha un DFA M = (Q, A, f, q1, F ). allora, DFA per il complemento di L è M = (Q, A, f, q1, Q- F ). Esercizio: Perchè funziona?
Es: Si consideri il seguente DFA M4 con alfabeto A={a, b} : L(M4) è il Linguaggio di stringhe su A che terminano con bb, cioè L(M4) = {w in A | w = sbb per qualche stringa s}
Es: Si consideri il seguente DFA M5 con alfabeto A={a, b} L(M5) = {w | w = saa o w = sbb per qualche stringa s}.
Si consideri il seguente DFA M6 con alfabeto A={a,b} Accetta tutte le possibili stringhe su A, cioè L(M6) = A* In generale, ogni DFA in cui tutti stati sono stato accetta riconosce il linguaggio A*