Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
lfa:exercise-sheet-1-solution [2021/01/11 17:42] pdmatei |
lfa:exercise-sheet-1-solution [2021/01/18 16:24] (current) pdmatei |
||
---|---|---|---|
Line 12: | Line 12: | ||
1.c. cel mult doi $ b$ | 1.c. cel mult doi $ b$ | ||
+ | |||
+ | **//Solutie//**: | ||
+ | |||
+ | {{ :lfa:sheet-solutions.jpg?600 |}} | ||
2. Scrieți un AFD peste alfabetul $ \{0, 1\}$, care recunoaște reprezentări binare ale numerelor divizibile cu 5. | 2. Scrieți un AFD peste alfabetul $ \{0, 1\}$, care recunoaște reprezentări binare ale numerelor divizibile cu 5. | ||
E.g. 0, 101, 1010, 1111, ... | E.g. 0, 101, 1010, 1111, ... | ||
+ | |||
+ | **//Solutie//**: | ||
+ | |||
+ | In primul rand, sa presupunem ca AFD-ul citeste numarul incepand cu bitul cel mai semnificativ ($math[w=1010] codifica numarul 10). Cum multimea sirurilor care codifica (astfel) numere divizibile cu 5 nu are un pattern vizibil imediat, vom construi un AFD in care fiecare stare reprezinta //restul impartirii numarului respectiv// la 5. Cum orice numar natural are una din formele: $math[5k], $math[5k+1], $math[5k+2], $math[5k+3], $math[5k+4], vom avea 5 astfel de stari, iar starea finala va corespunde lui $math[5k]. | ||
+ | |||
+ | Observatia cheie este ca valoarea $math[k] nu influenteaza in nici un fel tranzitiile intre aceste stari: | ||
+ | * Sa presupunem suntem in starea $math[q], iar numarul citit pana la pasul curent este $math[n = 5k+r] | ||
+ | * Daca urmatorul bit citit (cel mai nesemnificativ citit pana la pasul curent) este $math[b] (0 sau 1), atunci input-ul codifica valoarea $math[2*n + b] care este egala cu $math[10k + 2r + b]. | ||
+ | * Asadar, daca dupa k tranzitii, restul impartirii inputului la 5 este $math[r], dupa citirea unui nou bit, restul impartiri inputului la 5 este $math[(2r + b)] MOD $math[5]. | ||
+ | |||
+ | Urmarind aceasta observatie putem construi, iterativ, AFD-ul ilustrat in ''Fig. 3'': | ||
+ | * din starea initiala, citirea unui zero nu influenteaza restul (numarul binar ''0000...0'' este codificarea lui 0); citirea unui 1 produce un numar a carui impartire la 5 este 1 | ||
+ | * din starea $math[\vdots 1], daca citim zero, (cei 2 biti sunt ''10''), restul impartirii numarului la 5 este 2, iar daca citim 1 (cei doi biti sunt ''11''), restul impartirii numarului la 5 este 3 | ||
+ | * in mod similar, daca din starea $math[\vdots 2] citim 0 (cei trei biti sunt ''100''), restul impartirii numarului la 5 este 4, iar daca citim 1, numarul se divide cu 5. | ||
+ | |||
+ | {{ :lfa:sheet-solutions-1.jpg?600 |}} | ||
+ | |||
+ | |||
<note tip> | <note tip> | ||
Line 21: | Line 43: | ||
3. Demonstrați că pentru orice $ \varepsilon$-AFN, există un $ \varepsilon$-AFN echivalent cu o singură stare finală. | 3. Demonstrați că pentru orice $ \varepsilon$-AFN, există un $ \varepsilon$-AFN echivalent cu o singură stare finală. | ||
+ | |||
+ | **//Solutie//**: | ||
+ | |||
+ | Fie $math[N=(K,\Sigma, \Delta, q_0, F)] un $ \varepsilon$-AFN. Construim un $ \varepsilon$-AFN echivalent $math[N'] adaugand cate o epsilon-tranzitie de la fiecare stare finala a lui $math[N] la starea finala unica a lui $math[N']. Mai exact, $math[N=(K',\Sigma, \Delta', q_0, F')] unde: | ||
+ | * $math[K' = K \cup {q_f}] unde $math[q_f] este starea finala unica a lui $math[N'] | ||
+ | * $math[F' = {q_f}] | ||
+ | * $math[\Delta' = \Delta \cup \{(q,\epsilon,q_f \mid q \in F\}] - adaugam cate o epsilon tranzitie de la fiecare stare finala $math[q] a lui $math[N] la $math[q_f]. | ||
+ | |||
+ | Ramane de demonstrat ca automatul cu o stare finala construit astfel este intr-adevar echivalent cu cel initial, adica cele doua accepta acelasi limbaj: $math[L(N) = L(N')]. Propozitia de demonstrat este: | ||
+ | |||
+ | $math[(q_0,w) \vdash_N^* (q, \epsilon) \mid q \in F \iff (q_0,w) \vdash_{N'}^* (q_f, \epsilon)]. Propozitia rezulta imediat, fara a fi necesara inductia structurala, din constructia lui $math[N']. | ||
4. Considerați lungimea $ |E|$ unei Expresii Regulate $ E$ ca fiind numărul de simboluri din ea, fără eventuale paranteze (doar simboluri din alfabet, $ \varepsilon$, $ \emptyset$, $ \cup$ și $ *$). | 4. Considerați lungimea $ |E|$ unei Expresii Regulate $ E$ ca fiind numărul de simboluri din ea, fără eventuale paranteze (doar simboluri din alfabet, $ \varepsilon$, $ \emptyset$, $ \cup$ și $ *$). | ||
Line 26: | Line 59: | ||
$\begin{equation} |E| \ge \max_{w \in L(E)}{|w|}\end{equation}$ | $\begin{equation} |E| \ge \max_{w \in L(E)}{|w|}\end{equation}$ | ||
+ | |||
+ | **//Solutie//**: | ||
+ | Proprietatea poate fi demonstrata prin inductie structurala, dupa pasii de constructie ai $math[E] (exceptand cazul $math[*]): | ||
+ | |||
+ | Caz de baza 1: $math[E = \emptyset]. Cum $math[L(\emptyset) = \emptyset], propozitia este trivial adevarata. | ||
+ | |||
+ | Caz de baza 2: $math[E = \epsilon]. $math[L(\epsilon) = \{\epsilon\}] iar $math[|\epsilon|=0] (lungimea cuvantului vid este 0), in timp ce, conform definitiei, $math[|E=\epsilon|=1] (lungimea expresiei regulate $math[\epsilon] este 1), iar proprietatea este adevarata. | ||
+ | |||
+ | Caz de baza 3: $math[E = c] unde $math[c \in \Sigma]. Atat dimensiunea cuvantului $math[c] cat si a expresiei regulate $math[c] sunt 1, asadar proprietatea este adevarata. | ||
+ | |||
+ | Pas de inductie 1: $math[E = E_1E_2] (concatenare). Conform definitiei: $math[ \mid E_1E_2\mid = \mid E_1\mid + \mid E_2\mid]. In acelasi timp, $math[L(E_1E_2) = L(E_1)L(E_2)], asadar lungimea maxima a unui cuvant din $math[L(E_1E_2)] este suma lungimilor maxime ale cuvintelor din $math[L(E_1)] respectiv $math[L(E_2)]. Proprietatea rezulta imediat, aplicand ipoteza inductiva pentru $math[E_1] respectiv $math[E_2]. | ||
+ | |||
+ | Pas de inductie 2: $math[E = E_1 \cup E_2] (reuniune). Conform definitiei: $math[ \mid E_1E_2\mid = \mid E_1\mid + \mid E_2\mid]. In acelasi timp, $math[L(E_1\cup E_2) = L(E_1)\cup L(E_2)], asadar lungimea maxima a unui cuvant din $math[L(E_1\cup E_2)] este **maximul** dintre lungimile maxime ale cuvintelor din $math[L(E_1)] respectiv $math[L(E_2)]. Din nou, aplicand ipoteza inductiva pentru $math[E_1] respectiv $math[E_2], proprietatea este adevarata. | ||
+ | |||
5. Câte limbaje //distincte// pot fi recunoscute de un AFD cu 2 stări? Justificați. | 5. Câte limbaje //distincte// pot fi recunoscute de un AFD cu 2 stări? Justificați. | ||
+ | |||
+ | **//Solutie//**: | ||
+ | |||
+ | Daca AFD-ul nu contine stari finale, sau daca ambele stari sunt finale, limbajele acceptate sunt $math[\emptyset] respectiv $math[\Sigma^*], indiferent de structura AFD-ului. Avem prin urmare 2 limbaje identificate. | ||
+ | |||
+ | Vom considera in continuare AFD-uri cu o stare finala. Din punct de vedere al tranzitiilor, acestea pot avea urmatoarele tipuri (forme), prezentate in figura de mai jos. Numele efectiv al fiecarei stari nu este relevant, ci doar calitatea fiecareia de a fi initiala/finala. Vom numara in continuare limbajele posibile pentru fiecare tip de AFD: | ||
+ | * **type A**: Oricare ar fi starile initiala/finala, limbajele acceptate sunt tot $math[\emptyset] respectiv $math[\Sigma^*], numarate deja anterior. | ||
+ | * **type B**: | ||
+ | * daca starea initiala coincide cu cea finala si este cea din stanga, avem 2 limbaje posibile (in functie de simbolul de pe tranzitia reflexiva) | ||
+ | * daca starea initiala coincide cu cea finala si este cea din dreapta, limbajul este $math[\Sigma^*], indiferent de tranzitii, limbaj numarat deja. | ||
+ | * daca starea initiala este cea din stanga iar cea finala este cea din dreapta, avem 2 limbaje posibile | ||
+ | * daca starea initiala este cea din dreapta iar cea finala este cea din stanga, AFD-ul nu are o stare finala accesibila, prin urmare limbajul este $math[\emptyset], numarat deja | ||
+ | * **type C**: structura este simetrica, prin urmare este suficient sa contabilizam doua cazuri: | ||
+ | * starile initiala si finala coincid, caz in care avem 4 limbaje posibile, in functie de simbolii tranzitiilor | ||
+ | * starile initiala si finala nu coincid, caz in care avem alte 4 limbaje posibile | ||
+ | * **type D**: si aceasta structura e simetrica, in plus alegerea simbolilor pe tranzitii nu mai influenteaza limbajul acceptat, prin urmare, avem din nou doua cazuri: | ||
+ | * starile initiala si finala nu coincid: 1 limbaj | ||
+ | * starile initiala si finala coincid: 1 limbaj | ||
+ | * **type E**: Doar simbolii tranzitiilor starii din stanga influenteaza limbajul, deci avem doua posibilitati, inmultit cu cele 4 posibile combinatii de stari initiale/finale, deci 8 limbaje | ||
+ | * **type F**: Simbolii tranzitiilor nu afecteaza limbajul, iar cele 4 combinatii de stari initiale/finale genereaza limbajele $math[\Sigma^*], $math[\{\epsilon\}], $math[\emptyset], $math[\Sigma^+], din care doar doua nu au mai fost intalnite. | ||
+ | Insumand, peste cele 6 tipuri, obtinem un total de: $math[2 + 4 + 8 + 2 + 8 + 2= 26] limbaje diferite. | ||
+ | |||
+ | |||
+ | {{ :lfa:sheet-solutions-2.jpg?500 |}} | ||
+ |