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 18:04]
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 51: Line 69:
 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. 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[|E_1E_2|E_1|E_2|]. 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 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[|E_1\cup E_2| |E_1|E_2|]. 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.+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 |}}
 +