Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lfa:exercise-sheet-1-solution [2021/01/11 17:43]
pdmatei
lfa:exercise-sheet-1-solution [2021/01/18 16:24] (current)
pdmatei
Line 19: Line 19:
 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 25: 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 30: 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 |}}
 +