Documente Academic
Documente Profesional
Documente Cultură
Capitol 5
Capitol 5
Negaia
Aici se trateaz problema reprezentrii informaiei
negative, se introduce noiunea de negaie prin eec i se
consider diverse capcane logice ale implementrii negaiei n
Prolog. Nu va fi argumentat teoretic de ce nu poate fi dedus o
informaie negativ dintr-un program. Vom confirma aceast
afirmaie doar printr-un exemplu. Fie un program const din
urmtoarele fapte:
floare(trandafir).
floare(narcis).
arbore(stejar).
arbore(plop).
Scopul non floare(stejar) nu este o consecin logic a
programului de mai sus, aa cum nu este consecin logic i
scopul floare(stejar). Aici non s-a utilizat n sensul clasic al
operatorului de negaie, care semnific c propoziia asupra
creia el se aplic este negat.
?-not(egal(a,b))
yes
?-floare(stejar)
se obine rspunsul
no
i atunci, bazndu-ne pe ipoteza lumii nchise, la ntrebarea
?-not(floare(stejar))
se obine rspunsul
yes
Vitalie Cotelea
?-not(egal(a,a))
no
?-egal(X,a), not(egal(X,b))
X=a
?-not(egal(X,b)), egal(X,a)
no
atunci rspunsul la a doua ntrebare este derutant. El, ns, are
explicaie. Predicatul egal(X,b) reuete i unific X cu b i deci,
not(egal(X,b)) eueaz.
24
?-sora_lui(eliza,emilia)
yes
?-paritatea(7,X)
X=impar
?-sora_lui(X,emilia)
no
?-sora_lui(X,Y)
no
Rspunsurile neateptate provin din faptul c predicatul
sora_lui/2 conine argumente variabile. Pentru ca predicatul s
dea rspunsuri bune n toate cazurile, e necesar, cnd se ajunge
la not(egal(X,Y)), ca variabilele s fie instaniate. Deci, o
versiune corect a predicatului sora_lui/2 poate fi
sora_lui(X,Y):femeie(X),
parinti(X,M,T),
parinti(Y,M,T),
not(egal(X,Y)).
Predicatul not/1 nu corespunde n totul negaiei logice.
Astfel, ntr-o baz vid de fapte not/1 al unui predicat poate da n
calitate de rspuns yes, dac Prologul nu gsete faptele n baza
de fapte. Conform ipotezei lumii nchise, dac faptul nu este
definit adevrat, atunci el este considerat fals chiar dac lipsete
n baza de fapte.
Trebuie de asemenea s se in cont c o dubl negaie
nu ntotdeauna e identic absenei negaiei. Astfel, de exemplu,
pentru predicatul apartine/2 avem
?-apartine(X,[a,b,c])
X=a;
X=b;
X=c
n schimb
?-not(not(apartine(X,[a,b,c])))
eueaz.
Ce se petrece n acest caz? Se tie, c dac un scop
eueaz, atunci variabilele sale devin neinstaniate. Deoarece
apartine(X,[a,b,c])
reuete
cu
unificarea
X/a,
paritatea(X,impar):-impar(X),!.
paritatea(X,par):-not(impar(X)).
S examinm, acum, un program ce descrie plata
pensiilor. Predicatul pensie(Persoana,Pensie) definete tipul de
pensie prescris unei persoane.
pensie(X,handicap):-handicap(X).
pensie(X,batranete):depasit_65(X),platit(X).
pensie(X,indemnizatii):-depasit_65(X).
handicap(ionescu).
depasit_65(ionescu).
depasit_65(munteanu).
depasit_65(vasilache).
platit(ionescu).
platit(munteanu).
Prima clauz afirm c unei persoane cu handicap i este
stabilit o pensie pentru handicap. A doua clauz susine c
persoanei ce a depit vrsta de 65 ani i se fixeaz o pensie de
btrnee, dac, bineneles, ea a fcut o perioad de timp
depuneri n fondul de pensii corespunztor. Aceast condiie e
reprezentat de predicatul platit/1. Persoanelor ce au depit
vrsta de 65 ani li se vor plti indemnizaii pentru btrnee,
chiar dac nu au completat vre-un fond de pensii.
S lrgim acest program cu o clauz, care ne spune, c
persoana care nu face parte nici dintr-o categorie, nu va primi
nimic. Soluia va consta n adugarea predicatului !/0 n fiecare
din cele trei reguli i a faptului implicit
pensie(X,nimic).
Atunci programul va arta astfel:
pensie(X,handicap):-handicap(X),!.
Vitalie Cotelea
25
pensie(X,batranete):depasit_65(X),platit(X),!.
pensie(X,indemnizatii):-depasit_65(X),!.
pensie(X,nimic).
handicap(ionescu).
depasit_65(ionescu).
depasit_65(munteanu).
depasit_65(vasilache).
no
platit(ionescu).
platit(munteanu).
Trebuie de menionat, c programul funcioneaz corect
cnd e vorba de fixarea pensiei unei persoane, de exemplu
?-pensie(ionescu,X)
Dar, n general, programul nu este corect. Rspunsul la
ntrebarea de mai jos confirm acest lucru.
?-pensie(ionescu,nimic)
yes
De asemenea, la ntrebarea ce urmeaz obinem numai
un singur rspuns, care tot nu corespunde realitii.
?-pensie(X,batranete)
X=ionescu
Aici tierile au mpiedicat cutarea tuturor soluiilor. O
ieire din aceast situaie poate fi introducerea unui predicat nou
stabilit(X,Y), care este adevrat, dac persoanei X i este stabilit
pensia Y. Predicatul se definete cu ajutorul a dou reguli.
stabilit(X,Y):-pensie(X,Y).
stabilit(X,nimic):-not(pensie(X,_)).
Aceste dou clauze trebuie adugate la prima variant a
programului
stabilit(X,Y):-pensie(X,Y).
stabilit(X,nimic):-not(pensie(X,_)).
pensie(X,handicap):-handicap(X).
pensie(X,batranete):depasit_65(X),platit(X).
pensie(X,indemnizatii):-depasit_65(X).
handicap(ionescu).
depasit_65(ionescu).
depasit_65(munteanu).
depasit_65(vasilache).
platit(ionescu).
platit(munteanu).
Programul astfel obinut are toate calitile pozitive ale
variantei a doua, dar e liber de toate dezavantajele lui enumerate
mai sus.
?-floare(lacramioare)
26