Sunteți pe pagina 1din 3

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.

5.1. Ipoteza lumii nchise


Un mod de soluionare a problemei de mai sus const n
utilizarea unei reguli speciale de inferen, numit ipoteza lumii
nchise, conform creia se accept, c dac un predicat nu este o
consecin logic a unui program, atunci se consider c negaia
lui este consecin. De obicei, negaia unui predicat n Prolog se
noteaz, de exemplu,
not(floare(stejar)).
Se utilizeaz not/1 pentru a deosebi aceast negaie de negaia
clasic notat cu non.
n exemplul precedent, aplicnd aceast regul, se face
concluzia c not(floare(stejar)) este o consecin logic, n timp
ce floare(stejar) nu e consecin logic a programului. Cu alte
cuvinte, dac nu este posibil demonstrarea unui predicat de
baz, negaia acestui predicat se consider adevrat.

5.2. Negaia prin eec


Negaia prin eec este termenul utilizat pentru negaia, ce
se bazeaz pe ipoteza lumii nchise, implementat n Prolog.
Astfel, ntrebarea
?-not(Subscop)
reuete, dac scopul Subscop eueaz. Predicatul not/1 este un
predicat predefinit n mai multe sisteme Prolog. El are n calitate
de argument un subscop pe care l evalueaz i ntoarce valoarea
de adevr. Dac subscopul reuete, rezultatul este eec, iar dac
subscopul eueaz, rezultatul reuete. De aici i provine
denumirea de negaie prin eec.
S menionm, c predicatul not/1 poate fi modelat cu
ajutorul asocierii !,fail, dac el lipsete n sistem. i anume:
not(Subscop):-Subscop,!,fail.
not(_).
Predicatul not(Subscop), ce realizeaz ipoteza lumii nchise,
termin cu succes, dac Subscop eueaz i eueaz, n caz
contrar. n aceast definiie, dac Subscop reuete, conjuncia
subscopurilor !,fail face, n primul rnd (!/0), s fie abandonat
ncercarea de a satisface a doua clauz i, n al doilea rnd
(fail/0), provoac un eec al acestei clauze, deci, i a predicatului
n ntregime. Adic, scopul not(Subscop) reuete, dac i numai
dac Subscop nu poate fi satisfcut.
Exist o mulime de probleme puin studiate, ce in de
logica negaiei prin eec. Iat doar cteva exemple ce ne arat c
utilizarea negaiei e delicat. Considerm un program ce const
dintr-o singur clauz
egal(X,X).
i s observm rspunsurile la ntrebrile ce urmeaz.

Astfel, dac sistemul Prolog rspunde la o ntrebare no,


aceasta nu atest falsitatea ei, ci atest numai c ntrebarea dat
nu este demonstrabil cu faptele i regulile prezente n program.
Deci, la ntrebarea

?-not(egal(a,b))
yes

?-floare(stejar)

Rspunsurile sunt raionale. Dar dac sunt formulate


ntrebrile

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

Predicatul not/1 poate fi folosit nu numai n ntrebri, dar


i n corpul clauzelor. Revenim la unul din programele
precedente, n care se definea predicatul sora_lui(X,Y) i care
genera o problem simpl: orice femeie este sor sie nsi ?.
Modificm programul precum urmeaz:
femeie(maria).
femeie(eliza).
femeie(emilia).
parinti(emilia, maria, paul).
parinti(andrei, maria, paul).
parinti(eliza, maria, paul).
egal(X,X).
sora_lui(X,Y):not(egal(X,Y)),
femeie(X),
parinti(X,M,T),
parinti(Y,M,T).
i formulm cteva ntrebri:

not(apartine(X,[a,b,c])) eueaz i, prin urmare, variabila X e


eliberat.

5.3. Capcanele regulilor


implicite
Tierea roie n programarea logic deseori presupune
existena unor subscopuri implicite. Folosirea predicatului !/0
pentru funcionarea implicit a intrat deja n clasica programrii
logice. Vom arta n baza a dou exemple simple, c e mai bine
uneori de recurs la alte forme logice de descriere cu ajutorul
predicatului not/1, dect la redarea implicit a subscopurilor n
clauze.
Fie, de exemplu, clauzele
paritatea(X,impar):-impar(X),!.
paritatea(X,par).
mpreun cu o definiie a predicatului impar/1.
ntrebarea

?-sora_lui(eliza,emilia)
yes

?-paritatea(7,X)
X=impar

?-sora_lui(X,emilia)
no

reuete, utilizndu-se prima clauz. Dar presupunem, c prima


clauz eueaz din cauza unui subscop din definiia predicatului
impar/1 sau din alt cauz. Atunci ntrebarea se unific cu a
doua clauz i se obine rspunsul X=par. Acesta nu este un
comportament dorit. Soluia const n utilizarea predicatului
not/1, care red o mai mare expresivitate faptului c nu este
nevoie de definiia unui predicat par/1.

?-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).

domeniu concret pot fi mult mai multe dect numrul faptelor


pozitive. De exemplu, la ntrebarea

handicap(ionescu).

vom obine rspunsul

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)

Acest no denot c aa fapt nu exist n baza de fapte, dar nu c


lcrmioarele nu sunt flori.
n aa situaii, dac considerm incomplete cunotinele
exprimate de baza de date, se adopt ipoteza lumii deschise.
Ultima, contrar celei precedente, presupune adevrate toate
datele prezente. Mai exact, sunt reprezentate explicit toate
faptele, fie pozitive, fie negative, iar celelalte rmase, implicit se
consider necunoscute.
n acord cu ipoteza lumii deschise o ntrebare poate avea
una din urmtoarele valori de adevr: adevrat, fals, necunoscut.
Dac o ntrebare este evaluat ca necunoscut, programul poate
face aciuni speciale, cum ar fi consultarea altor surse de
cunotine. Implicit Prologul se conduce de ipoteza lumii
nchise. Un program trebuie descris explicit pentru ca s
funcioneze conform ipotezei lumii deschise.
Iat un exemplu simplu ce funcioneaz n acord cu
ipoteza lumii deschise. Rspunsul poate fi unul din cele trei
valori de adevr. Faptele false sunt explicit declarate n program.
Ele au forma fals(C). Dac un fapt nu poate fi determinat c este
adevrat sau fals, el e considerat necunoscut.
demonstrare(C):C,
write(**adevarat),nl,!.
demonstrare(C):fals(C),
write(**fals),nl,!.
demonstrare(C):not(C),
not(fals(C)),
write(**necunoscut),nl,!.
tata_lui(ion, vasile).
fals(tata_lui(_, ion)).
?-demonstrare(tata_lui(ana, vasile))
**necunoscut
?-demonstrare(tata_lui(ion, vasile))
**adevarat
?-demonstrare(tata_lui(ion, X))
**adevarat
X=vasile
?-demonstrare(tata_lui(maria,ion))
**fals

Acest exemplu ne arat nu numai cum predicatul not/1


poate mbunti un program, dar i ct e de complex utilizarea
predicatului !/0 i ce capcane ne poate ntinde.

5.4. Ipoteza lumii deschise


Negaia prin eec poate fi vzut ca o adugare implicit
la predicatele din program a tuturor negaiilor lor. n majoritatea
cazurilor nu este posibil adugarea explicit a negaiilor ntr-o
baz de fapte, cnd numrul de fapte negative despre un
Vitalie Cotelea

26

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