Sunteți pe pagina 1din 11

Decidabilitate

Construcia algoritmilor ridic o ntrebare fundamental: problema poate fi


rezolvat prin algoritmi eficieni sau asemenea algoritmi nu exist? Rspunsul poate
evita cutarea imposibilului i poate sugera alternative de rezolvare. n cele ce
urmeaz sunt discutate, din perspectiva calculabilitii, noiuni elementare de teoria
mulimilor i se introduce conceptul esenial de decidabilitate. Se arat c exist clase
mari de probleme care nu pot fi rezolvate cu calculatorul.

D.1 Decidabilitate
O mulime A este echipotent cu o mulime B dac exist f:AB, bijectiv.
O mulime infinit A este numrabil dac A este echipotent cu mulimea
numerelor naturale . O numerotare a mulimii A este o funcie bijectiv a: A,
astfel nct a(n) =def an, iar A = {ak | k}. Echivalent, o mulime este
numrabil dac exist o numerotare a sa.
Spunem c o mulime infinit i numrabil este -numrabil, iar o mulime
infinit i nenumrabil este -nenumrabil.
Propoziia D.1 O submulime infinit a unei mulimi -numrabile este numrabil.
Fie A -numrabil i B A. Exist numerotarea A = {ak | k } Construim
numerotarea:
b0 = aj, j = min{k | ak B}
bi = aj, j = min{k | ak B\

U {bq} },

i 1

q <i

Propoziia D.2 Fie A -nenumrabil, iar B o mulime -numrabil, astfel


nct xB xA. Atunci xA xB (altfel spus A\B sau BA).
Presupunem c teorema nu este adevrat, deci xA xB, adic xA
xB. Atunci A=B, iar A este -numrabil. Imposibil.

Propoziia D.3 Mulimea Hom(,) (a funciilor din n ) este -nenumrabil.


Alegem e1 e2 dou elemente din . Presupunem c este echipotent cu
Hom(,). Atunci, exist f: Hom(,), bijectiv. Notm fe funcia f(e) din
Hom(,) i construim mulimea (nevid) A = {e | fe(e) = e1}.

Cristian Giumale/Note de curs

Alegem din Hom(,) funcia g = fx astfel nct: g(e) =

e2 dac e A
e1 dac e A

Pentru x A:

g(x) = e2, conform definiiei funciei g;


g(x) = fx(x) = e1, conform definiiei mulimii A. Imposibil.

Pentru x A:

g(x) = e1, conform definiiei funciei g;


g(x) = fx(x) e1, conform definiiei mulimii A. Imposibil.

Rezult c funcia g nu poate fi numerotat i deci funcia f nu este surjectiv.


nseamn c nu este echipotent cu Hom(,).

Definiia D.1 Numim i,j mulimea programelor avnd ca intrare un tuplu din
i ca ieire un tuplu din

. Considerm c orice program Pi,j este

executabil n sens Turing: exist o main de calcul Turing care, pentru intrri valide,
calculeaz n timp finit ieirile programului. Convenim ca pentru un tuplu de intrare
invalid programul s nu se termine. Scriem (x) = , dac nu se termin pentru
tuplul x i P(x) = r, dac P se termin cu rezultatul r pentru datele x.
n ceea ce privete maina care execut programele, o s o imaginm ca
main virtual, caracteristic unui limbaj de programare imperativ, de exemplu un
limbaj asemntor cu C. Perspectiva pragmatic este corect deoarece, teoretic,
astfel de maini de calcul pot fi reduse la maini Turing.
Propoziia D.4 Mulimea i,j este numrabil.
Programele din i,j pot fi privite ca iruri de lungime finit, iruri formate cu
simbolurile unui alfabet finit . Notm *= U j j mulimea irurilor cu simboluri din ,
unde 0={}, fiind irul vid, iar j= {wx | wj-1, x}, pentru j1. Mulimea *
este -numrabil, pentru c putem construi numerotarea:
w0 =
wj = minlex{w *\

U {w k} },

j > 0,

k <j

unde minlex(M) desemneaz irul cel mai mic n ordine lexicografic din M. Fie
i,j* mulimea irurilor ce codific programe din i,j. Conform propoziiei (D.1)
mulimea i,j este numrabil. Conform echipotenei dintre i,j i i,j, rezult c
i,j este numrabil.
Definiia D.2 O funcie f: este calculabil (n sens Turing) dac exist
cel puin un program 1,1 astfel nct:
f(x), pentru x dom(f)
(x) =
, pentru x dom(f)

Cristian Giumale/Note de curs

Teza Church-Turing. Orice funcie efectiv calculabil este Turing-calculabil.


Teza stabilete o relaie dintre dou concepte diferite.
Primul concept se refer la calculabilitate efectiv i este de natur filozofic.
Se accept c o funcie este efectiv calculabil dac exist un algoritm care
calculeaz valoarea funciei pentru orice parametru din domeniul de definiie al
acesteia. Prin algoritm se nelege aici un proces de calcul finit (care folosete
reprezentri finite ale datelor i se termin dup o perioad finit de timp), bine definit
(prelucrrile sunt specificate neambiguu nct pot fi executate mecanic) i concluziv
(care produce un rezultat neambiguu ce reprezint valoarea funciei). Deoarece nsi
natura procesului de calcul este o chestiune filozofic, fiind deasupra modului n care
noi percepem diversele cazuri particulare de efectuare a unui asemenea proces,
noiunea de calculabilitate efectiv rmne vag.
Al doilea concept se refer la calculabilitate n sens Turing, deci la un proces de
calcul care poate fi efectuat de ctre o main de calcul particular, anume maina
Turing. Conceptul este exact, demonstrndu-se c mulimea funciilor parial-recursive
este chiar mulimea funciilor Turing-calculabile.
Teza Church-Turing susine, fr a demonstra, c orice proces de calcul efectiv
poate fi redus la unul specific unei maini Turing. Cu alte cuvinte, teza susine c
Turing-calculabilitatea este universal i, implicit, c funciile efectiv calculabile sunt
cele recursive. Dei teza nu a fost demonstrat, exist suport teoretic consistent care
pledeaz n favoarea ei. Bunoar, s-au inventat maini abstracte de calcul aparent
diferite din perspectiva modului n care este imaginat procesul de calcul,
demonstrndu-se echivalena lor cu maina Turing.
Conform tezei Church-Turing admitem c orice funcie efectiv calculabil este
recursiv. Astfel, putem defini intuitiv o funcie recursiv ca fiind programabil i,
reciproc, putem susine c orice program calculeaz o funcie recursiv.
Definiia D.3 O funcie f: este recursiv dac este efectiv calculabil.
Cu alte cuvinte, exist cel puin un program PP1,1 care calculeaz f. Notm cu Fr
mulimea funciilor recursive din Hom(,).
Propoziia D.5 Mulimea Fr este -numrabil.
Construim numerotarea:

f0 = funcia calculat de programul cu indicele P0;


fj, j > 0, este funcia calculat de programul cu indicele cel mai mic din
mulimea P1,1\ {P 1,1 | P calculeaz fk, k < j}

Propoziia D.6 Exist n Hom(,) funcii care nu sunt recursive, deci nu sunt
programabile (nu sunt calculabile, indiferent de maina de calcul folosit).
Demonstraia rezult direct din propoziiile (D.2), (D.3) i (D.5). Ca exemplu de
funcie necalculabil considerm funcia total

Cristian Giumale/Note de curs

f: , f(n) =

1+Pn(n), dac Pn(n) se termin


0, dac Pn(n) =

unde Pn este programul de indice n din mulimea 1,1. S presupunem c fFr.


Atunci, conform definiiei, exist un program Pm 1,1 care calculeaz f. Pentru c f
este total, Pm se termin pentru orice x , deci i pentru m. Conform definiiei lui f,
rezult Pm(m) = 1 + Pm(m). Imposibil.
Propoziia (D.6) subliniaz, indirect, limita puterii de expresie a limbajelor de
programare. Indiferent de limbaj, exist probleme care nu pot fi rezolvate mecanic,
folosind o main de calcul, una dintre aceste probleme fiind deciderea terminrii
programelor. Din acest punct de vedere, propoziia (D.6) merit o analiz mai
nuanat.
Clasa funciilor recursive este divizat n funcii primitiv-recursive i funcii
parial-recursive, clasa funciilor primitiv-recursive fiind inclus n clasa funciilor
parial-recursive. Funciile primitiv-recursive sunt totale, astfel nct un program care
calculeaz o asemenea funcie se termin pentru orice n. n schimb, programul
care calculeaz o funcie parial-recursiv f se termin doar n punctele ndom(f).
Demonstraia propoziiei (D.6) se bazeaz tocmai pe totalitatea funciei f, funcie care
decide terminarea programelor din P1,1. Conform demonstraiei, f nu poate fi total i
deci nu poate fi primitiv-recursiv. Dac dom(f) este restrns la mulimea indiciilor n
astfel nct Pn(n) se termin, atunci f devine efectiv-calculabil. ntr-adevr,
programul R(n){return 1+Pn(n);} se termin dac Pn(n) se termin. Mai mult,
dac m este indicele programului R, atunci mdom(f) pentru a avea R(m)= Pm(m)=.
Funcia f este parial-recursiv i poate verifica doar terminarea programelor Pn(n)
care se termin. Dac dom(f) ar fi cunoscut apriori, funcia f ar fi banal. Cum
domeniul dom(f) nu este cunoscut apriori nu putem ti dac R(n) se termin i
spunem c f semi-decide terminarea programelor din P1,1. Prin urmare, propoziia
(D.6) poate fi nuanat n forma "nu exist nici o funcie recursiv care decide
terminarea programelor" sau n forma propoziiei (D.6').
Propoziia D.6'
Terminarea programelor este semi-decidabil. Pentru
demonstraie, vezi exemplul D.2 referitor la definiia D.6.
n urma analizei de mai sus, putem observa c o submulime A poate fi
cunoscut n dou moduri aparte: fie prin intermediul unei funcii recursive totale sau,
echivalent, folosind un program care decide dac un element x aparine sau nu
mulimii A, fie prin intermediul unei funcii parial-recursive cu domeniul A sau,
echivalent, folosind un program care se termin doar dac xA.
Definiia D.4 O submulime A este recursiv dac exist o funcie recursiv
total f: , astfel nct, pentru orice n :
1, dac n A
f(n) =
0, dac n A

Cristian Giumale/Note de curs

Orice submulime finit A este recursiv: A este numrabil i putem construi


lesne un program care decide apartenena unui element oarecare n la A, program
bazat pe operaia de comparare a numerelor.
P(n) {
for(i=0; i < card(A); i++) if(n = Ai) return 1;
return 0;
}

Programul de mai sus nu poate fi generalizat pentru o mulime finit cu orice tip
de elemente. Bunoar, dac elementele mulimii A sunt funcii, egalitatea funciilor nu
poate fi decis mecanic. Prin urmare, nu orice mulime finit este recursiv.
Definiia D.5 O submulime A este recursiv-numrabil dac (alternativ):
a) Exist o funcie recursiv, f:

cu dom(f)=A.

b) Exist un program Q0,1 care la fiecare apel calculeaz un element din A.


Q este un generator al mulimii A.
Propoziia D.7 Alternativele (a) i (b) din definiia (D.5) sunt echivalente.
Cazul 1: (a) (b). Deoarece fFr rezult c exist un program P1,1 care
calculeaz f. P se termin doar pentru valorile din mulimea A. Folosind P, construim
generatorul Q dup cum urmeaz, considernd c variabilele A i n sunt statice, adic
i pstreaz valoarea ntre apelurile programului.
Q(){
static A = , n = 0; // variabile cu valori nevolatile
while(1) {
for(m=0; m n; m++)
if(m A P(m) se termin n n uniti de timp)A)
{A = A {m}; return m;}
n++;
}
}

Cazul 1: (b) (a). Presupunem c exist un generator Q al lui A. Construim


programul:
P(n){
static A = ;
while(1)
if(nA) return 1; else A = A {Q()};
}

Evident, P se termin cu rezultatul 1 doar pentru valorile ce sunt generate de


Q, deci pentru valorile din A. Dac nA, n nu este generat de Q i programul P(n) nu
se termin. Conform definiiilor (D.2) i (D.3), programul P calculeaz o funcie
recursiv cu domeniul A

Cristian Giumale/Note de curs


Propoziia D.8 O submulime recursiv A este recursiv-numrabil.

Fie A o submulime recursiv din . Exist o funcie total recursiv f: ,


deci un program P care calculeaz f, astfel nct A = {n | P(n)=1}. Construim
generatorul lui A:
Q(){
static A = ;
for(n = 0;; n++)
if(nA P(n) = 1) {A = A {n}; return n;}}
}

Evident, Q produce toate valorile n pentru care P(n)=1, deci chiar mulimea A.
Propoziia D.9 Fie A o submulime recursiv-numrabil i B= \A recursivnumrabil. Atunci A este recursiv.
Cazul A finit este banal, pentru c orice mulime finit cu elemente din este
recursiv. Fie A infinit, iar QA i QB generatorii mulimilor A i, respectiv, B. Pentru c A
i B sunt infinite, orice apel al generatorilor QA i QB se termin n timp finit cu elemente
din cele dou mulimi. Construim programul P1,1
P(x){
static A = , B = ;
while(1) {
if(x A) return 1;
if(x B) return 0;
A = A {QA()};
B = B {QB()};
}
}

Programul P se termin pentru c toate elementele din A i B vor fi generate.


Deci P corespunde unei funcii recursive totale care decide dac n este n A.
Propoziia D.10 Exist submulimi din care:
1. sunt recursive;
2. sunt recursiv-numrabile, dar nu sunt recursive;
3. nu sunt recursive i nici recursiv-numrabile.
1. Mulimea numerelor prime este recursiv. Se poate construi lesne un
program care testeaz apartenena nPrime pentru orice n.
2. Mulimea A = {n | Pn(n) se termin}, unde Pn este programul de indice n
din mulimea 1,1, este recursiv-numrabil, dar nu este recursiv.
A este recursiv-numrabil. S artm c exist un generator Q pentru
elementele din A.

Cristian Giumale/Note de curs

Q(){
static A = , n = 0;
while(1) {
for(m=0; m n; m++)
if(Pm(m) se termin n n uniti de timp m A)
{A = A {m}; return m;}
n++;
}
}
A nu este recursiv. Presupunem c A este recursiv. Atunci exist o funcie
recursiv total i, deci, un program R1,1 astfel nct R(n) = 1+Pn(n), dac nA, i
R(n) = 0, dac nA.

Deoarece 1,1 este numrabil (conform teoremei 3.4), exist m astfel nct
R=Pm. Programul R se termin pentru orice valoare din , inclusiv pentru m. Deci m A.
Avem R(m) = Pm(m) = 1 + Pm(m). Imposibil.
3. Fie mulimea B = \A, unde A este mulimea de la punctul (b). B nu este
recursiv i nici recursiv-numrabil.
S presupunem c B este recursiv-numrabil. Atunci, conform propoziiei (D.9)
A este recursiv. Imposibil. S presupunem c B este recursiv. Atunci conform
propoziiei (D.8) este recursiv-numrabil. Imposibil.
Definiia D.6 Fie T: {0,1} un predicat i MT ={n | T(n)=1} mulimea de
adevr a lui T. Predicatul T caracterizeaz o proprietate Prop a elementelor din .

T este decidabil (proprietatea Prop este decidabil) dac MT este recursiv;


T este semi-decidabil (proprietatea Prop este semi-decidabil) dac MT este

recursiv-numrabil i nerecursiv;
T este nedecidabil (proprietatea Prop este nedecidabil) dac MT nu este
recursiv i nici recursiv-numrabil.

Exemplul D.1 Predicatul T:Grafuri {0,1}, care testeaz dac un graf finit
este aciclic este decidabil, programul de test constnd ntr-o parcurgere banal a
grafului.
Exemplul D.2 S demonstrm propoziia (3.6'), artnd c predicatul T care
testeaz dac un program oarecare PnP1,1 se termin pentru o valoare fixat x
este semi-decidabil.
Notm MT mulimea corespunztoare programelor care se termin n x.
Conform exemplului din propoziia (3.6) tim c MT nu este recursiv. S artm c
este recursiv-numrabil.
Construim generatorul Q:

Cristian Giumale/Note de curs


Q() {
static MT=, t=0;
while(1) {
for(n=0; nt; n++)
if(nMT Pn(x) se termin n t uniti de timp)
{ MT= MT{n}; return n;}
t++;
}
}

La fiecare apel, generatorul rentoarce indicele unui program din P1,1 care se
termin pentru x. Rezult c predicatul T este semi-decidabil.
Exemplul D.3 Rezolvarea unei probleme poate fi imaginat ca un proces de
navigare ntr-un spaiu S=(Stri,Tranziii) al strilor problemei, ca cel din figura
3.1. Atunci cnd navigm ntr-un astfel de spaiu dorim s urmm o cale care, plecnd
din starea curent s, duce n mod cert spre o soluie.
Traiectorie de rezolvare

stare
iniial

Figura 3.1 Navigare n spaiul de stare al unei probleme


Navigarea poate fi realizat cu ajutorul unui predicat T:Tranziii{0,1} care
determin ce arc (s,?) trebuie urmat. Dac predicatul este decidabil atunci putem
merge direct spre soluie. Dac predicatul este semi-decidabil atunci o variant ar fi s
folosim un generator QT de arce din MTTranziii, arce ce duc spre soluie, spernd
s obinem un asemenea arc ce pleac din starea curent s.
avans_navigare(s) {
static MT = ;
while(1) {
if ((u,v) MT u=s) return (s,v);
MT = MT {QT()};
}
}

ntr-o alt variant, mai practic, putem folosi o euristic pentru a evalua arcul
aparent cel mai promitor, fr a ne mai baza pe predicatul al crui calcul s-ar putea
s nu se termine ntr-un timp msurabil. Astfel de probleme apar n domeniul
inteligenei artificiale.

Cristian Giumale/Note de curs

Exemplul D.4 Un sistem de rescriere (sau sistem semi-Thue, dup numele


matematicianului norvegian Axel Thue) const dintr-un alfabet finit i o mulime finit
de reguli de rescriere R={u::=v | u,v*}. O regul u::=v arat c irul finit u,
format cu simboluri din , poate fi rescris n forma v. Spunem c irul y* este
derivabil din irul x* dac exist o succesiune de reguli care aplicate ncepnd cu
x produc irul y. De exemplu, pentru ={a,b,c} i R={a::=bab, c::=aca, a::=c},
exist derivarea ac a::=bab babc c::=aca babaca a::=c bcbccc.
Fie problema: s se decid dac un ir oarecare y poate fi derivat dintr-un ir
oarecare x, conform unui sistem de rescriere dat. Predicatul care decide proprietatea
este semi-decidabil i, implicit, problema este semidecidabil. Similar, exist probleme
nedecidabile referitoare la proprietile gramaticillor independente de context. Astfel,
dac L(G1) i L(G2) sunt limbajele generate de gramaticile independente de context
G1 i G2, atunci testul L(G1) L(G2)= este semi-decidabil.

Teorema lui Rice


Un caz particular de nerezolvabilitate mecanic const n probarea
proprietilor extensionale nebanale ale programelor, problem de decizie aflat la
baza multor aplicaii practice. Pentru simplitate, discuia de mai jos este focalizat
asupra programelor 1,1 cu o singur intrare i un singur rezultat din .
O proprietate a programelor este privit ca mulime a programelor (sau a
indicilor programelor) care satisfac respectiva proprietate. De exemplu, proprietatea
Pow2 =def {P1,1 | (n P(n)=n2)}

se poate citi: un program P1,1 are proprietatea Pow2, sau alternativ PPow2, dac
P(n) calculeaz n2.
S notm P=Q echivalena computaional a programelor P i Q, anume pentru
aceleai date de intrare programele fie produc aceleai rezultate fie nu se termin.
Definiia D.7 O proprietate Prop a programelor 1,1 este extensional
nebanal dac:
1. Nebanalitate: Prop i Prop 1,1.
2. Extensionalitate: pentru oricare programe P1,1 i Q1,1, astfel nct
P=Q, exist dubla implicaie PProp QProp. Cu alte cuvinte, dac un
program P are proprietatea Prop atunci orice program echivalent cu P are
proprietatea Prop.
Conform nebanalitii, proprietatea caracterizeaz o submulime proprie nevid
a programelor. Extensionalitatea reflect comportarea programelor independent de
factori intensionali cum ar fi timpul execuiei programului, numrul de instruciuni din
textul programului etc. Extensionalitatea se refer strict la relaia funcional P(i)=r
calculat de program. De exemplu, proprietatea Pow2 este extensional nebanal.

10

Cristian Giumale/Note de curs

Teorema D.1 (Rice). Orice proprietate extensional nebanal a programelor nu


este decidabil.
Demonstraia se bazeaz pe stabilirea unei corespondene ntre terminarea
programelor i verificarea unei proprieti nebanale extensionale, astfel nct, dac
proprietatea este decidabil1 atunci terminarea programelor este decidabil.
Fie Prop o proprietate oarecare, extensional nebanal, a programelor 1,1.
S presupunem c Prop este decidabil.
Fie nonstop1,1 un program care nu se termin pentru orice n, anume
n nonstop(n)=. De exemplu,
nonstop(n) {while(1); return n;}.

Pentru c Prop este extensional nebanal, nonstop poate fie s aparin lui
Prop, fie s nu aparin lui Prop. Din acest punct de vedere, alegerea lui nonstop
poate s par bizar. Aparent, n cazul nonstopProp, mulimea programelor P1,1
este divizat n dou submulimi: Prop=P={PP1,1 | (n P(n)=)}, ce conine
doar programele echivalente computaional cu nonstop i care prin extensionalitate
satisfac Prop, i programele din P1,1\P care se termin pentru cel puin o valoare
din i, nefiind echivalente cu nonstop, nu satisfac Prop.
Observaia de mai sus nu este corect. ntr-adevr, dac Prop =def {PP1,1 |
m P(m) P(m)=f(m)}, unde f(m) desemneaz o valoare ce depinde de m,
atunci n afara programelor din P n Prop sunt i acele programe din P1,1 care
calculeaz valori conforme cu f, inclusiv programele care calculeaz funcia f:.
Prin urmare, alegerea programului nonstop ca baz a demonstraiei nu afecteaz
generalitatea acesteia.
Caz 1. nonstopProp
Datorit extensionalitii lui Prop, toate programele echivalente computaional
cu nonstop sunt n Prop. De asemenea, datorit nebanalitii, exist cel puin un
program Q1,1 astfel nct QProp i, implicit, Qnonstop, deci Q se termin pentru
cel puin o valoare din .
Fie P1,1 un program oarecare. S artm c deciderea terminrii P(x),
pentru x fixat, se reduce la decidabilitatea lui Prop. Construim programul:
R(n){P(x); return Q(n);}

1 O proprietate Prop este decidabil dac exist un program Test


Prop1,1 care se

termin pentru orice n astfel nct TestProp(n)=1 dac programul Pn din P1,1 este n
rop i TestProp(n)=0 dac Pnrop.

Cristian Giumale/Note de curs

11

Dac P(x) se termin atunci R(n)=Q(n), eventual R(n)=Q(n)=. Dac P(x) nu


se termin atunci R(n) nu se termin pentru orice n. Prin urmare, exist
echivalena computaional:
nonstop, dac P(x)=
R = {
Q, dac P(x)

Dar, datorit extensionalitii proprietii Prop, echivalena R=nonstop impune


RProp, iar echivalena R=Q impune RProp. Prin urmare, dac RProp atunci P(x)
nu se termin i, reciproc, dac RProp atunci P(x) se termin.
Caz 2. nonstopProp.
Atunci nonstop Prop , unde Prop = 1,1\Prop. n acest caz, folosind un
raionament similar cu cel de la cazul (1) se ajunge la concluzia c dac R Prop
atunci P(x) nu se termin i, reciproc, dac RProp atunci P(x) se termin.
n ambele cazuri rezult c dac Prop este decidabil atunci terminarea P(x)
este decidabil. Imposibil, conform propoziiei (D.6'). Deci, ipoteza conform creia
Prop este decidabil nu poate fi adevrat.
Teorema lui Rice are implicaii practice imediate. Bunoar, echivalena
programelor, care se reduce la verificarea proprietii P(n)=f(n), unde f este o
funcie care descrie comportarea dorit a programului, este nedecidabil. Prin urmare,
o aplicaie care selecteaz un program dintr-o bibliotec de programe folosind
exclusiv codul programului i specificaia ce formeaz cheia de cutare este
nerealizabil, n cazul general. De asemenea, o problem de genul "s se verifice
dac modulul de program M poate funciona corect pentru datele D", unde M i D sunt
alese la ntmplare, este nedecidabil doar pe baza analizei mecanice a codului
modulului. Este necesar o informaie explicit care, pentru fiecare modul M, s indice
datele ce pot fi prelucrate i, eventual, alte particulariti ale modulului.

S-ar putea să vă placă și