Professional Documents
Culture Documents
~~~~~~~~~~~~~~~~
A.Definitii:
-----------In cele ce urmeaza notam cu & pe lambda (cuvantul vid).
1. AFD: A = (Q, V, d, q0, F), unde:
Q, V, F multimi finite nevide
(stari, alfabet, respectiv stari finale)
q0 apartine lui Q (starea initiala)
F inclusa in Q
d : Q x V --o--> Q functie partiala (functia de tranzitie)
Extindem d la d': Q x V* --o--> Q definita prin:
d'(q,&) = q
d'(q,xa) = d(d'(q,x),a)
(q in Q, x in V*, a in V)
Limbajul acceptat de A este urmatoarea submultime a lui V*:
L(A) = {x in V* | d'(q0,x) in F}
2. AFN: A = (Q, V, d, q0, F), unde:
Q, V, q0, F ca mai sus
d : Q x V ----> P(Q) functie (functia de tranzitie)
Extindem d la d': Q x V* ----> P(Q) definita prin:
d'(q,&) = {q}
d'(q,xa) = {p in Q | exista r in d'(q,x) a.i. p in d(r,a))
(adica reuniunea multimilor d(r,a) pentru r in d'(q,x))
(q in Q, x in V*, a in V)
Limbajul acceptat de A este urmatoarea submultime a lui V*:
L(A) = {x in V* | d'(q0,x) intersectat cu F e nevida}
3. AFNL: A = (Q, V, d, q0, F), unde:
Q, V, q0, F ca mai sus
d : Q x (V U {&}) ----> P(Q) functie (functia de tranzitie)
Pentru q in Q definim submultimea lui Q:
<q> = {p in Q | exista s0, ..., sk in Q (k>=0) a.i.
s0=q, sk=p, s(i+1) in d(si,&) pentru 0 <= i < k}
Pentru P inclus in Q definim urmatoarea submultime a lui Q:
<P> = {}, daca P vida
<P> = reuniunea multimilor <q> pentru q in P, daca P nevida
Extindem d la d': Q x V* ----> P(Q) definita prin:
d'(q,&) = <q>
d'(q,ax) = {p in Q | exista r in <q> si s in <d(r,a)> a.i.
p in d'(s,x)}
(q in Q, x in V*, a in V)
Limbajul acceptat de A este urmatoarea submultime a lui V*:
L(A) = {x in V* | d'(q0,x) intersectat cu F e nevida}
B.Sugestii de implementare:
--------------------------1. AFD in C++ cu metode de setare/consultare/recunoastere a unui cuvant si
functii de citire si afisare:
class AFD{
int nrstari;
~AFN();
int getnrstari();
int setnrstari(int pns);
int estefinala(int s);
int setfinala(int s);
int gettranzitie(int s, unsigned c, int d);
// ret. 1 daca din (s,c) exista tranzitie in d si 0 daca nu exista;
int settranzitie(int s, unsigned c, int d);
int recunoaste(char const *cuv);
// ret. 1 daca AFN recunoaste cuvantul cuv, 0 daca nu-l recunoaste
// si -1 in caz de eroare;
};
Functii de citire/afisare/recunoastere:
int citeste(AFN &a); // citire interactiva; ret. 1=succes,0=esec
void afisaza(AFN &a); // afisare;
int recunoaste(AFN &a, char *s); // ret. 1=recunoscut, 0=nerecunoscut/blocat
/**************************************************************************/
3. AFNL in C++ cu metode de setare/consultare/recunoastere a unui cuvant si
functii de citire si afisare:
class AFNL{
int nrstari;
// nr. de stari; starea initiala este 0;
unsigned char *finala;
// vector caracteristic al starilor finale
unsigned char *buftranzitie;
// tranzitiile;
// daca din (s,c) exista tranzitie in d (nu e neaparat singura tranzitie
// din (s,c)), atunci notand x = s*nrstari*257 + d*257 + c,
// bitul x%8 din buftranzitie[x/8] este 1, altfel este 0;
// c=256 tine loc de lambda (pentru lambda-tranzitii);
public:
AFNL();
~AFNL();
int getnrstari();
int setnrstari(int pns);
int estefinala(int s);
int setfinala(int s);
int gettranzitie(int s, unsigned c, int d);
// ret. 1 daca din (s,c) exista tranzitie in d si 0 daca nu exista;
// c este litera obisnuita din alfabetul de intrare, 0 <= c <= 255;
int gettranzitie(int s, int d);
// ret. 1 daca din s exista lambda-tranzitie in d si 0 daca nu exista;
int settranzitie(int s, unsigned c, int d);
// incarca in automat tranzitia (s,c) -> d, 0 <= c <= 255;
// ret. 1=succes, 0=esec;
int settranzitie(int s, int d);
// incarca in automat lambda-tranzitia din s in d;
// ret. 1=succes, 0=esec;
int recunoaste(char const *cuv);
};
Functii de citire/afisare/recunoastere: