Edit this page Backlinks This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== Exercise sheet I solution ====== <note tip> Unde nu e specificat explicit, alfabetul este $ \{a, b\}$. </note> 1. Definiți câte un AFD pentru limbajul șirurilor care conțin: 1.a. cel puțin doi $ b$ 1.b. exact 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. 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 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> Extra 0-uri la început sunt ok; 101, 0101, 00000101 etc. fac toate parte din limbaj. </note> 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 $ *$). Demonstrați că pentru orice expresie regulată $ E$ care nu conține Kleene star: $\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.