Sunteți pe pagina 1din 300

1

FLORENTINA HRISTEA
MARIA FLORINA BALCAN






ASPECTE ALE CUTRII I
REPREZENTRII CUNOTINELOR
N INTELIGENA ARTIFICIAL









EDITURA UNIVERSITII DIN BUCURETI
2004


2
























3
CUVNT NAINTE

Lucrarea de fa reprezint un suport al cursului de inteligen
artificial, precum i al seminarului corespunztor, pe care cele dou
autoare le in studenilor din anul al patrulea, secia Matematic -
Informatic a Facultii de Matematic i Informatic - Universitatea din
Bucureti. n egal msur, ne adresm studenilor seciei Informatic,
precum i celor de la cursurile postuniversitare de specializare n
informatic ai aceleiai faculti, care studiaz aceast disciplin.
Dei i propune, n primul rnd, s realizeze o introducere n
domeniul inteligenei artificiale, lucrarea poate constitui, de asemenea,
suportul unui curs special (opional) axat pe principalele aspecte ale
cutrii i reprezentrii cunotinelor, cu special referire la sistemele
expert i la implementarea acestora n limbajul Prolog.
Una dintre cele mai importante concluzii la care s-a ajuns, dup
scurgerea primelor trei decade de activitate n domeniul inteligenei
artificiale, este aceea c inteligena presupune cunoatere. Aceast
concepie va influena cel mai mult tehnicile specifice domeniului, care,
n marea lor majoritate, folosesc pentru implementarea inteligenei
cunotine reprezentate n mod explicit i algoritmi de cutare. Pn la
urm, se poate spune c o tehnic a inteligenei artificiale este o metod
de exploatare i de valorificare a cunotinelor, care, la rndul lor, trebuie
reprezentate ntr-un anumit mod, i anume conform unor cerine puse n
eviden pe parcursul acestui curs.


4
Structurat n cinci capitole i o anex, lucrarea de fa urmrete
aspectele de baz referitoare la cutare (ca tehnic de rezolvare a
problemelor ce exploreaz n mod sistematic un spaiu de stri ale
problemei) i la reprezentarea cunotinelor. Exemplul clasic de problem
de cutare prezentat n cadrul acestui curs este acela al jocurilor.
Principala aplicaie fundamental a problematicii reprezentrii
cunotinelor n inteligena artificial, pe care o prezentm aici, se refer
la sistemele expert i la implementarea acestora n limbajul Prolog.
Departe de a pretinde c epuizeaz aspectele legate de problematica
reprezentrii cunotinelor, lucrarea se oprete asupra ctorva dintre cele
mai importante sisteme de reprezentare a cunotinelor, i anume:
sistemele bazate pe reguli, structurile de tip slot-and-filler, reelele
semantice i cadrele. Ultimul capitol, intitulat Raionament statistic, i
propune s ntregeasc imaginea referitoare la tehnicile de reprezentare a
cunotinelor, ocupndu-se de dou tipuri de abordri statistice pentru
sisteme de raionament incert (factorii de certitudine n sistemele bazate
pe reguli i, respectiv, reelele Bayesiene).
Nu n ultimul rnd, considerm lucrarea util i prin numeroasele
exemple de programe pe care le ofer i a cror existen este apreciat
de noi ca fiind indispensabil n vederea unei nelegeri aprofundate a
tematicii abordate.
Ndjduim c aceast lucrare i va ajuta pe studenii notri, i nu
numai pe ei, s se apropie cu interes de un domeniu att de vast, i, n
acelai timp, de fascinant, cum este cel al inteligenei artificiale.

Autoarele


5
CAPITOLUL 1
CONSIDERAII PRELIMINARE


Inteligena artificial poate fi privit ca fiind o tiin sui-generis
al crei obiect de studiu l constituie modul de programare a
calculatoarelor n vederea svririi unor operaiuni pe care, deocamdat,
oamenii le efectueaz mai bine. Conform acestei definiii primare,
simplificate (i care nu este general acceptat) putem gndi inteligena
artificial ca fiind acel domeniu al informaticii care se ocup de
automatizarea comportamentului inteligent.
O asemenea definiie
1
privete inteligena artificial ca fiind un
domeniu al informaticii i, prin urmare, se bazeaz pe principii teoretice
i practice ale acesteia, cum ar fi:
structurile de date folosite n reprezentarea cunotinelor;
algoritmii necesari pentru aplicarea cunotinelor;
limbajele i tehnicile de programare folosite la implementarea
acestor algoritmi.
n acelai timp, aa cum se arat n [9], definiia pe care o
comentm aici este deficitar prin faptul c nsui conceptul de
inteligen nu este foarte bine neles i precizat. Astfel, problema
definirii domeniului inteligenei artificiale devine, pn la urm, una a
definirii conceptului nsui de inteligen. Ea presupune ridicarea unor
ntrebri de tipul: Ce se ntmpl atunci cnd intervine nvarea? Ce este

1
Vezi i [11], s.v. artificial intelligence, p. 37.


6
creativitatea? Ce este intuiia? Cum sunt reprezentate cunotinele n
esutul nervos al unei fiine vii? Este necesar ca un program de calculator
inteligent s fie modelat n conformitate cu ceea ce se cunoate despre
inteligena uman sau este suficient o abordare strict inginereasc a
problemei? Este posibil s se achiziioneze inteligen pe un calculator
sau o entitate inteligent necesit bogia senzaiilor i a experienei care
nu pot fi gsite dect n existena biologic? Toate aceste ntrebri arat
legtura inteligenei artificiale cu alte domenii, cum ar fi, n primul rnd,
filozofia. n acelai timp, toate aceste ntrebri deschise, care nu au nc
rspuns, au ajutat la conturarea problemelor i a soluiilor, a meto-
dologiilor care constituie miezul inteligenei artificiale moderne.
Inteligena artificial, o disciplin nc tnr (prin comparaie cu altele,
cum ar fi matematica sau fizica) ale crei structur, scopuri, preocupri i
metode sunt mai puin clar definite dect cele ale unor discipline mult
mai mature, pune la dispoziie instrumente unice i puternice necesare
tocmai n explorarea unor asemenea ntrebri.

1.1. Domeniul inteligenei artificiale. Definiii i un scurt istoric

Domeniul inteligenei artificiale i propune nelegerea entitilor
inteligente. Dar, spre deosebire de filozofie i psihologie, care i propun,
mai mult sau mai puin, acelai lucru, inteligena artificial urmrete, n
plus, construirea unor asemenea entiti. Ea are drept scop apariia unor
calculatoare care s aib o inteligen de nivel uman sau chiar mai bun.
Aa cum se arat n [9], exist mai multe definiii ale domeniului.
Acestea variaz de-a lungul a dou mari dimensiuni. Prima dimensiune


7
este aceea a procesului de gndire i a raionamentului. Cea de-a doua
adreseaz comportamentul (behavior). De asemenea, unele definiii
msoar succesul n termenii performanei umane, n timp ce altele l
msoar relativ la un concept ideal de inteligen, pe care l vom numi
raiune. Iat cteva definiii ale domeniului inteligenei artificiale, date
conform acestor clasificri i preluate de noi din [9]:
definiii care se concentreaz asupra procesului de gndire i a
raionamentului i care msoar succesul n termenii performanei
umane Automatizarea activitilor pe care le asociem cu gndirea
uman, activiti cum ar fi luarea deciziilor, rezolvarea problemelor,
nvarea(Bellman, 1978);
definiii care adreseaz comportamentul i care msoar succesul n
termenii performanei umane Arta de a crea maini care ndeplinesc
funcii ce necesit inteligen atunci cnd sunt ndeplinite de ctre
oameni (Kurzweil, 1990);
definiii care se concentreaz asupra procesului de gndire i a
raionamentului i care msoar succesul n termenii unui concept ideal
de inteligen, anume acela al raiunii Studiul facultilor mintale
prin intermediul modelelor computaionale (Charniak i McDermott,
1985); Studiul calculelor care fac posibile percepia, raionamentul i
aciunea (Winston, 1992);
definiii care adreseaz comportamentul i care msoar succesul n
termenii raiunii Un domeniu de studiu care caut s explice i s
emuleze comportamentul inteligent n termenii unor procese
computaionale (Schalkoff, 1990); Acea ramur a informaticii care se
ocup de automatizarea comportamentului inteligent (Luger i
Stubblefield, 1993).


8
Aceste definiii pot fi grupate n patru mari categorii (care indic
i patru eluri majore urmrite n inteligena artificial):
sisteme care gndesc ca i fiinele umane;
sisteme care se comport ca i fiinele umane;
sisteme care gndesc raional;
sisteme care se comport raional.
n acelai timp, aceast varietate de definiii ne face s tragem cel
puin dou concluzii clare, i anume: cercettori diferii gndesc n mod
diferit despre inteligena artificial, care apare ca o tiin inter-
disciplinar, n care ii aduc contribuia filozofi, psihologi, lingviti,
matematicieni, informaticieni i ingineri.
Prima lucrare recunoscut astzi ca fiind de inteligen artificial
aparine lui Warren McCulloch i Walter Pitts (1943). Acetia s-au bazat
pe trei surse i au conceput un model de neuroni artificiali. Cele trei surse
utilizate au fost: cunotinele despre fiziologia i funciile de baz ale
neuronilor n creier; analiza formal a logicii propoziionale datorate lui
Russel i Whitehead; teoria despre calcul a lui Turing. O alt figur
extrem de influent n inteligena artificial este cea a lui John McCarthy,
de la Princeton. Dup absolvire, McCarthy se mut la Dartmouth
College, care va deveni locul oficial n care s-a nscut domeniul. De
altfel, n timpul workshop-ului organizat la Dartmouth, n vara anului
1956, se hotrte i adoptarea, pentru noul domeniu, a numelui propus
de McCarthy: cel de inteligen artificial.
Un an istoric n evoluia domeniului este 1958, an n care
McCarthy se mut de la Dartmouth la MIT (Massachusetts Institute of
Technology). Aici el aduce trei contribuii vitale, toate n acelai


9
an: 1958. McCarthy definete acum limbajul de nivel nalt LISP, care
urma s devin limbajul de programare dominant n inteligena artificial
i, mpreun cu colegii de la MIT, introduce conceptul de partajare
(time-sharing). Tot n 1958 el public articolul intitulat Programs with
Common Sense (Programe cu bun sim) n care descrie un program
ipotetic, numit Advice Taker, care poate fi privit ca reprezentnd
primul sistem complet de inteligen artificial. Programul era proiectat
s foloseasc cunotine pentru a cuta soluii la probleme. Dar, spre
deosebire de programele de pn atunci, acesta ncorpora cunotine
generale despre lume. (Spre exemplu, un grup de axiome simple ddeau
programului posibilitatea s genereze un plan pentru a se merge cu
maina la aeroport i a se prinde un avion). Programul era conceput n aa
fel nct s poat accepta noi axiome pe parcurs. Prin urmare, i se
permitea s dobndeasc competen n noi domenii, fr a fi
reprogramat. Acest program ncorpora principiile de baz ale
reprezentrii cunotinelor i ale raionamentului, i anume:
este necesar s dispunem de o reprezentare formal a lumii i a
felului n care aciunile unui agent afecteaz lumea;
este necesar s putem manipula aceste reprezentri cu ajutorul
unor procese deductive.
O mare parte a acestui articol rmne relevant i astzi. ncepnd din
1958, McCarthy, mpreun cu colegul su de la MIT Marvin Minsky, au
petrecut ani ntregi numai n ncercarea de a defini domeniul inteligenei
artificiale.
n timpul primului deceniu de cercetri n inteligena artificial
concepia legat de rezolvarea problemelor era aceea a unui mecanism de


10
cutare cu scop general, care ncerca s lege laolalt pai elementari de
raionament pentru a gsi soluii complete. Astfel de abordri au fost
numite metode slabe, ntruct ele folosesc informaii slabe asupra
domeniului. S-a artat c, pentru domenii complexe, performana
acestora este slab. Dar discuiile de nceput asupra domeniului s-au
concentrat mai degrab asupra reprezentrii problemelor dect asupra
reprezentrii cunotinelor. Accentul s-a pus pe formularea problemei
care trebuie rezolvat i nu pe formularea resurselor care sunt disponibile
programului. Cercettorii i-au dat ulterior seama c sistemele de
inteligen artificial aveau nevoie de cunotine din categoria celor din
urm, dup efectuarea a dou tipuri de cercetri, i anume: nelegerea
limbajului natural uman i proiectarea aa-numitelor sisteme expert
(cunoscute i sub denumirea de sisteme bazate pe cunotine), adic a
unor sisteme care puteau egala i, n unele cazuri (sarcini de mai mic
anvergur i precis definite), depi performanele experilor umani.
n perioada 1969-1979 apar i se dezvolt sistemele expert, asupra
crora ne vom opri i n cursul de fa. Caracteristica major a sistemelor
expert este aceea c ele se bazeaz pe cunotinele unui expert uman n
domeniul care este studiat; mai exact, pe cunotinele expertului uman
asupra strategiilor de rezolvare a problemelor tipice unui domeniu.
Astfel, la baza sistemelor expert se afl utilizarea n rezolvarea
problemelor a unor mari cantiti de cunotine specifice domeniului.
Tocmai de aceea reprezentarea cunotinelor este att de important n
inteligena artificial.
Tot n perioada 1969-1979, numrul mare de aplicaii referitoare
la problemele lumii reale a determinat creterea cererii de scheme de


11
reprezentare a cunotinelor. Au fost astfel dezvoltate diferite limbaje de
reprezentare. Unele dintre ele se bazau pe logic
2
, cum este cazul
limbajului Prolog
3
, extrem de popular n Europa.
Referindu-ne la un istoric al domeniului, vom mai nota faptul c
n perioada 1980-1988 n inteligena artificial ncepe s se lucreze la
nivel industrial. Tot n aceast perioad, n care inteligena artificial
devine industrie, ea ii propune noi eluri ambiioase, cum ar fi acela al
nelegerii limbajului natural.
ncepnd din 1987 i pn n prezent, cu precdere n ultimii ani,
att coninutul, ct i metodologia de cercetare n inteligena artificial au
suferit o serie de schimbri. Astfel, se caut aplicaii din lumea real, se
construiete pe teoriile existente, dar, mai ales, cercettorii se bazeaz
mult mai mult pe teoreme riguroase i mai puin dect pn acum pe
intuiie. Spre exemplu, domeniul recunoaterii limbajului a ajuns s fie
dominat de aa-numitele hidden Markov models (HMM-uri)
4
. La
rndul lor, modelele grafice (care includ, printre altele, reelele
Bayesiene, discutate n ultimul capitol al cursului de fa) au devenit

2
Limbajele programrii logice sunt limbaje declarative. Un limbaj de programare
declarativ scutete programatorul de a mai meniona procedura exact pe care trebuie s
o execute calculatorul pentru a realiza o funcie. Programatorii folosesc limbajul pentru
a descrie o mulime de fapte i de relaii astfel nct utilizatorul s poat interoga apoi
sistemul pentru a obine un anumit rezultat. (Aceasta reprezint o deosebire esenial
fa de un limbaj procedural, adic un limbaj care solicit programatorului s specifice
procedura pe care trebuie s o urmeze calculatorul pentru a executa o funcie).
3
Prolog reprezint o prescurtare de la Programming n logic. Este un limbaj conceput
pentru programarea logic (deci un limbaj declarativ). A fost elaborat n cursul anilor
1970 n Europa (mai ales n Frana i Scoia), iar primul compilator de Prolog a fost
creat n 1972 de ctre Philippe Roussel, la Universitatea din Marsilia. Prologul este un
limbaj compilat, care utilizeaz, n locul relaiilor matematice, relaii logice ntre
mulimi de date.
4
HMM-urile (lanurile Markov ascunse) sunt generate de un proces de antrenare
(training) pe un mare corpus de date provenind din vorbirea real.


12
extrem de importante pentru inteligena artificial. n general, putem
spune c domeniul inteligenei artificiale se bazeaz pe teorii matematice
riguroase din ce n ce mai mult.

1.2. Subdomenii ale inteligenei artificiale

Principalele subdomenii ale inteligenei artificiale sunt
considerate a fi [9] urmtoarele:
jocurile (bazate pe cutarea efectuat ntr-un spaiu de stri ale
problemei);
raionamentul automat i demonstrarea teoremelor (bazate pe
rigoarea i generalitatea logicii matematice. Este cea mai veche ramur a
inteligenei artificiale i cea care nregistreaz cel mai mare succes.
Cercetarea n domeniul demonstrrii automate a teoremelor a dus la
formalizarea algoritmilor de cutare i la dezvoltarea unor limbaje de
reprezentare formal, cum ar fi calculul predicatelor i limbajul pentru
programare logic Prolog).
sistemele expert (care pun n eviden importana cunotinelor
specifice unui domeniu).
nelegerea limbajului natural i modelarea semantic (Carac-
teristica de baz a oricrui sistem de nelegere a limbajului natural o
constituie reprezentarea sensului propoziiilor ntr-un anumit limbaj de
reprezentare astfel nct aceasta s poat fi utilizat n prelucrri
ulterioare).
planificarea i robotica (Pe scurt, planificarea presupune exis-


13
tena unui robot capabil s execute anumite aciuni atomice, cum ar fi
deplasarea ntr-o camer plin cu obstacole).
nvarea automat (datorit creia se realizeaz adaptarea la
noi circumstane, precum i detectarea i extrapolarea unor abloane -
patterns. nvarea se realizeaz, spre exemplu, prin intermediul
aa-numitelor reele neurale
5
. O asemenea reea reprezint un tip de
sistem de inteligen artificial modelat dup neuronii -celulele nervoase-
dintr-un sistem nervos biologic, n ncercarea de a simula modul n care
creierul prelucreaz informaiile, nva sau i aduce aminte
6
).
Toate aceste subdomenii ale inteligenei artificiale au anumite
trsturi n comun [9], i anume:
O concentrare asupra problemelor care nu rspund la soluii
algoritmice; din aceast cauz tehnica de rezolvare a problemelor
specific inteligenei artificiale este aceea de a se baza pe o cutare
euristic
7
.
Inteligena artificial rezolv probleme folosind i informaie
inexact, care lipsete sau care nu este complet definit i utilizeaz for-
malisme de reprezentare ce constituie pentru programator o compensaie
fa de aceste probleme.
Inteligena artificial folosete raionamente asupra trsturilor
calitative semnificative ale unei situaii.
Inteligena artificial folosete, n rezolvarea problemelor, mari

5
Este acceptat i termenul de reea neuronal.
6
Vezi i [11], s.v. neural network, p. 348 i s.v. artificial neural network, p. 37.
7
Prin euristic se nelege o metod de dirijare sau optimizare a procesului de rezolvare
a unei probleme, pe baza unor reguli derivate din experiena, intuiia sau inspiraia
programatorului. Euristica este de nenlocuit n cazul unor probleme deosebit de
complexe, cum ar fi, spre exemplu, jocul de ah. Vezi i [11], s.v. heuristic, p. 247.


14
cantiti de cunotine specifice domeniului investigat.
Majoritatea tehnicilor din inteligena artificial folosesc pentru
implementarea inteligenei cunotine reprezentate n mod explicit i
algoritmi de cutare. n inteligena artificial exist dou abordri
majore complet diferite ale problematicii domeniului: cea simbolic i
cea conecionist. ntr-o abordare simbolic cunotinele vor fi
reprezentate n mod simbolic. O abordare total diferit -cea conecionist-
este aceea care urmrete s construiasc programe inteligente folosind
modele care fac un paralelism cu structura neuronilor din creierul uman.
Cursul de faa va folosi prima dintre abordrile amintite, n cadrul
creia
reprezentarea cunotinelor adreseaz problema reprezentrii
ntr-un limbaj formal, adic un limbaj adecvat pentru prelucrarea
ulterioar de ctre un calculator, a ntregii game de cunotine
necesare comportamentului inteligent;
cutarea este o tehnic de rezolvare a problemelor care
exploreaz n mod sistematic un spaiu de stri ale problemei,
adic de stadii succesive i alternative n procesul de rezolvare a
acesteia. (Exemple de stri ale problemei pot fi configuraiile
diferite ale tablei de ah n cadrul unui joc sau paii intermediari
ntr-un proces de raionament).

1.3. Tehnici ale inteligenei artificiale

Dup scurgerea primelor trei decade de activitate n domeniul
inteligenei artificiale, s-a tras concluzia c inteligena presupune


15
cunoatere. Aceasta este probabil cea mai important concluzie la care
s-a ajuns i ea influeneaz cel mai mult tehnicile specifice domeniului.
Aa cum s-a mai artat, majoritatea tehnicilor din inteligena artificial
folosesc pentru implementarea inteligenei cunotine reprezentate n mod
explicit i algoritmi de cutare. Pn la urm, se poate spune [9] c
o tehnic a inteligenei artificiale este o metod de exploatare i
valorificare a cunotinelor, care, la rndul lor, ar trebui reprezentate ntr-
un anumit mod, i anume conform urmtoarelor cerine [9]:
Cunotinele trebuie s nglobeze generalizri. Cu alte cuvinte,
nu este necesar reprezentarea separat a fiecrei situaii n parte. n
schimb, situaiile care au n comun proprieti importante pot fi grupate
laolalt. Dac cunotinele nu ar avea aceast proprietate, ar fi nevoie de
foarte mult memorie i de multe operaii de actualizare. Prin urmare, o
mulime de informaii care nu posed aceast proprietate nu va reprezenta
cunotine, ci date.
Cunotinele trebuie s poat fi nelese de ctre oamenii care le
furnizeaz. Dei, pentru majoritatea programelor, nucleul de date poate fi
achiziionat n mod automat, n multe domenii ale inteligenei artificiale
este necesar ca majoritatea cunotinelor pe care un program trebuie s le
aib s fie furnizate de oameni, n termeni care s poat fi nelei de
ctre acetia.
Cunotinele trebuie s poat fi uor modificate pentru a se corec-
ta erori i pentru a reflecta att schimbrile din lumea nconjurtoare, ct
i schimbrile din percepia i imaginea noastr despre aceasta.
Cunotinele trebuie s poat fi folosite n foarte multe situaii,
chiar dac uneori duc lips de acuratee i nu sunt complete.


16
Cunotinele trebuie s poat fi folosite astfel nct s ajute la
ngustarea gamei de posibiliti care trebuie luate n consideraie.
Legat de aceast problematic, vom mai nota aici doar urmtorul
fapt: cunoaterea are anumite proprieti, care in de
Completivitate (Cunoaterea este ntotdeauna incomplet. Cuno-
tinele ncorporate ntr-un sistem software al inteligenei artificiale
referitor la o anumit aplicaie sunt ntotdeauna mult mai puin complete
dect ceea ce se cunoate despre aplicaia respectiv).
Obiectivitate (Cunoaterea poate fi obiectiv sau subiectiv; este
necesar s se fac o distincie ntre fapte i preri. Acestea din urm
trebuie asociate agenilor).
Certitudine (Cunoaterea poate fi cert sau incert; tocmai de
aceea teoria probabilitilor joac un rol esenial n multe sisteme ale
inteligenei artificiale).
Formalizare (Cunotinele pot fi sau nu uor de formalizat prin
intermediul unui limbaj simbolic. Oamenii opereaz adesea ntr-o
manier aproximativ, acordndu-i o marj de eroare. Aceeai posi-
bilitate ar trebui s o aib i sistemele inteligente, dar acestea beneficiaz
numai de cunotinele explicite care le-au fost furnizate. Agenii umani se
bazeaz foarte mult pe experien. Sistemele trebuie s beneficieze i ele
de formalizarea experienei).
Aa cum s-a mai amintit, comportamentul inteligent presupune
cunoatere. O ipotez interesant este aceea a lui Matt Ginsberg, care
afirm c aciunea inteligent poate fi redus la cutare. Dei inteligena
n mod cert nu coincide i nu poate fi redus la cutare, aceasta este o
ipotez atractiv, ntruct: cutarea poate fi uor neleas, este uor de


17
automatizat, uor de gestionat etc. De asemenea, cunotinele forma-
lizate sunt uor de utilizat n cutare.
Cutarea este o traversare sistematic a unui spaiu de soluii
posibile ale unei probleme. Un spaiu de cutare este de obicei un graf
(sau, mai exact, un arbore) n care un nod desemneaz o soluie parial,
iar o muchie reprezint un pas n construirea unei soluii. Scopul cutrii
poate fi acela de
a gsi un drum n graf de la un nod iniial la un nod-scop (cu alte
cuvinte, de la o situaie iniial la una final);
a gsi un nod-scop.
Exemplul clasic de problem de cutare care va fi prezentat n cadrul
acestui curs este acela al jocurilor. Este ns interesant de analizat i alte
aplicaii ale cutrii, cum ar fi analiza sintactic a unei propoziii, privit
ca problem de cutare esenial n subdomeniul procesrii limbajului
natural.

1.4. Un exemplu de problem tipic n inteligena artificial

Un exemplu de problem tipic tratat de inteligena artificial, pe
care o vom descrie n cele ce urmeaz, l constituie problema furnizrii
rspunsului la ntrebri (Question Answering).

Problema: Se citete de la tastatur text ntr-un limbaj natural
(spre exemplu n limba englez) i apoi se rspunde unor ntrebri
referitoare la acel text, formulate tot n englez.



18
Observaie: n cazul unei astfel de probleme este mai greu de
precizat care este rspunsul corect. Oferim, n acest sens,
urmtorul exemplu
8
:

Exemplul nr. 1
Presupunem c textul reprezentnd input-ul este dat de unica
propoziie
Russia massed troops on the Czech border.
Corespunztor unui astfel de input este posibil existena ambelor
dialoguri care urmeaz. Aceste dialoguri au reprezentat efectiv output-ul
programului numit POLITICS (Carbonell, 1980):

Dialogul nr. 1
Q: Why did Russia do this?
A: Because Russia thought that it could take political control of
Czechoslovakia by sending troops.
Q: What should the United States do?
A: The United States should intervene militarily.
Dialogul nr. 2
Q: Why did Russia do this?
A: Because Russia wanted to increase its political influence over
Czechoslovakia.
Q: What should the United States do?
A: The United States should denounce the Russian action in the United
Nations.

8
Exemplele din acest subcapitol au fost preluate din [8], iar cel de-al doilea a fost
adaptat de noi pentru limba romn.


19
n programul POLITICS rspunsurile au fost construite lund n
consideraie att textul reprezentnd input-ul, ct i un model separat
referitor la concepiile i aciunile diverselor entiti politice, inclusiv cele
ale fostei Uniuni Sovietice. ntre cele dou dialoguri acest model a fost
schimbat. Atunci cnd modelul se schimb i rspunsurile sistemului se
schimb. Astfel, primul dialog a fost produs de programul POLITICS
atunci cnd i s-a dat acestuia un model care corespunde concepiilor unui
conservator american. Cel de-al doilea a fost produs atunci cnd i s-a dat
un model care corespunde concepiilor unui liberal american. Prin
urmare, n acest caz este foarte greu de spus ce nseamn un rspuns
corect. Acest lucru depinde de model.
O problem din aceeai categorie, care utilizeaz n rezolvare
tehnici specifice inteligenei artificiale, este cea prezentat n

Exemplul nr.2
Fie textul de intrare:
Maria s-a dus s cumpere un palton nou. A gsit unul rou care i-a
plcut mult. Cnd l-a adus acas, a descoperit c merge perfect cu
rochia ei preferat.
Dorim s stabilim un algoritm prin care programul s rspund
urmtoarelor ntrebri:
I1: Ce s-a dus s cumpere Maria?
I2: Ce a gsit Maria care i-a plcut?
I3: A cumprat Maria ceva?




20
Programul nr. 1

Acest program mai nti convertete textul de intrare
(reprezentnd input-ul) ntr-o form structurat intern care i propune
s capteze sensul propoziiilor. De asemenea, convertete ntrebrile n
acelai format. Programul gsete rspunsurile fcnd corespondena
dintre cele dou forme structurate.

Structuri de date folosite n program:
CunostinteRomana - conine o descriere a cuvintelor, gramaticii
i a interpretrilor semantice adecvate a unei submulimi din limb (n
acest caz limba romn), suficient de mari i de semnificative, care s
poat acoperi textele de intrare pe care sistemul urmeaz s le primeasc.
Aceste cunotine referitoare la limb sunt folosite att pentru a face
corespondena dintre textele de intrare i o form intern, orientat ctre
sens, precum i dintre o asemenea form i limba recunoscut de sistem.
Problema stabilirii unei asemenea baze de cunotine pentru o limb este
foarte complicat i de ea se ocup subdomeniul procesrii limbajului
natural.
InputText - reprezint textul de intrare n format caracter.
TextStructurat - este o reprezentare structurat a coninutului
textului de intrare. Aceast structur i propune s capteze cunotinele
cele mai importante coninute n text, independent de modul exact n care
aceste cunotine au fost formulate n limba respectiv. Unele lucruri care
nu au fost explicitate n acea limb (spre exemplu la cine se refer
pronumele din text) vor fi explicitate n aceast form. Reprezentarea


21
cunotinelor n acest mod este o chestiune esenial n toate programele
inteligenei artificiale. Exist trei familii importante de asemenea sisteme
de reprezentare a cunotinelor:
reguli de producie (de forma dac x, atunci y);
structuri de tip slot-and-filler (multe reprezentri folosesc
perechi de tipul atribut-valoare, numite sloturi: engl. slots;
atributele reprezint denumirile sloturilor: slot names, iar
valorile sunt cele care umplu aceste sloturi: slot fillers;
vezi, de asemenea, p. 176 i Fig. 4.2).
instruciuni n form matematic (de tipul celor dintr-un
sistem logic).
Sistemul de reprezentare a cunotinelor ales de noi n acest
exemplu este o structur de tip slot-and-filler. n acest sistem, de pild,
propozitia
Ea a gsit unul rou care i-a plcut mult.
se poate reprezenta n felul urmtor:
Eveniment1
instantiere: A gasi
timp: Trecut
agent: Maria
obiect: Lucru1
Lucru1
instantiere: Palton
culoare: Rosu
Eveniment2
instantiere: A place
timp: Trecut
element modificator: Mult
obiect: Lucru1


22
Aceasta este o descriere simplificat a coninutului propoziiei. Ea nu este
foarte explicit cu privire la relaiile temporale (timpul a fost marcat doar
ca fiind trecut). Una dintre ideile cheie ale unei astfel de reprezentri
este aceea c sensul entitilor din reprezentare deriv din legtura,
conexiunile lor cu alte entiti. De aceea, n reprezentare exist i alte
entiti, corespunztoare unor concepte pe care programul le cunotea
nainte de a citi aceast propoziie - Maria, palton (conceptul general de
palton).
InputIntrebare - reprezint ntrebarea care constituie o parte a
input-ului, n format caracter.
StructIntrebare - este o reprezentare structurat a coninutului
ntrebrii puse de utilizator. (Structura este aceeai cu cea folosit pentru
a reprezenta coninutul textului care constituie input-ul).

Algoritmul:
Convertete InputText n form structurat utiliznd cunotinele
coninute n CunostinteRomana. Aceast operaie s-ar putea s
presupun luarea n consideraie a diferite poteniale structuri, din variate
motive, spre exemplu datorit faptului c multe cuvinte dintr-o limb pot
fi ambigue. De asemenea, anumite structuri gramaticale pot fi ambigue,
n procesul comunicrii pronumele pot avea diferii antecedeni etc.
Dup convertirea textului de intrare n form structurat, pentru a
rspunde la o ntrebare, se execut urmtorii pai:
1. Se convertete ntrebarea n form structurat, folosind din nou
cunotinele coninute n structura de date CunostinteRomana. Se
folosete un marcator special n cadrul structurii pentru a indica acea


23
parte a structurii care ar trebui ntoars ca rspuns. Acest marcator va
corespunde adesea cu ocurena unui cuvnt care indic o ntrebare n
cadrul propoziiei (cuvnt de tipul cine sau ce). Felul exact n care se
efectueaz aceast marcare depinde de forma aleas pentru a reprezenta
TextStructurat. Atunci cnd, n reprezentare, se folosete o structur de
tipul slot-and-filler, ca aici, un marcator special poate fi plasat n unul
sau mai multe sloturi. Dac se folosete un sistem logic, marcatorii vor
aprea ca variabile n cadrul formulelor logice care reprezint ntrebarea.
2. Se opune aceast form structurat celei din
TextStructurat. (Se mperecheaz cele dou forme).
3. Se ntorc ca rspuns acele pri ale textului care se potrivesc
cu segmentul cerut din ntrebare.

Iat rspunsurile obinute n cazul nostru, adic atunci cnd
sistemului i se pun cele trei ntrebri luate n consideraie n Exemplul
nr. 2:
I1: Rspunsul direct la ntrebare este un palton nou.
I2: Rspunsul direct la ntrebare este un palton rou.
I3: La aceast ntrebare nu se poate rspunde, ntruct n text nu exist
un rspuns direct la ea.

Observaii:
1. n aceast abordare se poate rspunde la majoritatea ntrebrilor
pentru care rspunsul este coninut n text. Preul pltit este timpul
petrecut pentru a cuta n diversele baze de cunotine (cum ar fi
CunostinteRomana, TextStructurat).


24
2. Este necesar o abordare mai complex, adic mai bogat n
cunotine, ntruct programul nu poate produce un rspuns la a treia
ntrebare. El poate rspunde numai la primele dou ntrebri fr a avea
cunotine suplimentare despre magazine sau paltoane. Prin urmare,
rezult c nu este suficient extragerea unei reprezentri structurate a
sensului textului care reprezint input-ul. Sunt necesare cunotine
suplimentare, aa cum se va vedea cu ocazia studierii celui de-al doilea
program pe care l propunem aici.
3. Problema producerii unei baze de cunotine pentru o limb (de
tipul CunostinteRomana) este extrem de complicat i de complex. De
rezolvarea ei se ocup subdomeniul inteligenei artificiale numit
procesarea limbajului natural. Pe de alt parte, cunotinele referitoare la
o limb dat nu sunt suficiente pentru a face ca un program s
construiasc tipul de reprezentri structurate discutate aici. Sunt necesare
cunotine suplimentare despre universul cu care opereaz textul dat.
Astfel de cunotine faciliteaz dezambiguizarea lexical i sintactic,
precum i atribuirea corect de antecedente pronumelor. Spre exemplu,
n textul
Maria s-a ndreptat spre vnztoare. Ea a ntrebat unde se afl raionul
de jucrii.
nu este posibil ca programul s determine la cine se refer pronumele ea
fr a deine cunotine generale referitoare la rolurile clientului i
respectiv ale vnztorului ntr-un magazin.





25
Programul nr. 2
(care exemplific ce se nelege prin tehnic a inteligenei artificiale)

Acest program convertete textul de intrare ntr-o form
structurat care conine sensurile propoziiilor din text i apoi combin
aceast form cu alte forme structurate, care descriu cunotine prealabile
despre obiectele i situaiile la care se refer textul. Programul rspunde
la ntrebri folosind aceast structur de cunotine extins.

Structuri de date folosite n program:
ModelulLumii - este o reprezentare structurat a cunotinelor
asupra lumii (universului) din fundal. Aceast structur conine
cunotine despre obiecte, aciuni i situaii care sunt descrise n textul de
intrare. Ea este folosit pentru a construi TextIntegrat plecnd de la
textul de intrare. Figura care urmeaz ilustreaz un exemplu de structur
ce reprezint cunotinele sistemului legate de mersul la cumprturi.
Asemenea cunotine memorate legate de evenimente stereotipe formeaz
un script
9
. Fig. 1.1 ne arat un script pentru cumprturi:

9
Un script este o structur care descrie o secven stereotip de evenimente, ntr-un
anumit context. Astfel, scripturile i propun s reprezinte cunotine despre succesiuni
comune de evenimente (i.e. evenimente care nu intervin n mod izolat). Informaii
despre succesiuni tipice de evenimente, aa cum sunt ele reprezentate n scripturi, pot fi
folositoare n interpretarea unei succesiuni particulare de evenimente, care este
observat la un moment dat.
Un script const dintr-o mulime de sloturi. Asociat fiecrui slot se gsete o
informaie despre tipurile de valori pe care le poate conine, precum i o valoare
implicit, care poate fi folosit atunci cnd nu este disponibil nici o alt informaie.
Scripturile sunt utile deoarece, n lumea real, exist anumite abloane dup care
evenimentele se produc. Aceste abloane se nasc datorit relaiilor cauzale care intervin
ntre evenimente. Evenimentele descrise ntr-un script formeaz un uria lan cauzal.
nceputul lanului este mulimea condiiilor de intrare care fac posibil producerea
primelor evenimente ale scriptului. Sfritul lanului este mulimea rezultatelor care pot


26
1. C intr n L

2. C ncepe s se uite n jur


3. C caut un anume M 4. C caut orice M interesant

5. C cere ajutor lui S


6.


7. C gsete M 8. C nu reuete s gseasc M


9. C prsete L 10. C cumpr M 11. C prsete L 12. Mergi la pasul 2

13. C prsete L

14. C ia M
Fig. 1.1

face posibil producerea unor evenimente sau a unor lanuri de evenimente ulterioare. n
cadrul lanului, evenimentele sunt conectate att la evenimente anterioare, care le-au
fcut posibile, ct i la evenimente ulterioare, a cror producere o nlesnesc.
Dac se tie c un anumit script este adecvat ntr-o situaie dat, atunci el poate fi
foarte util n prezicerea producerii unor evenimente care nu au fost menionate n mod
explicit. Scripturile sunt, de asemenea, utile n indicarea felului n care evenimente care
au fost menionate sunt legate unele de altele.


27
Notaia folosit aici este simplificat n raport cu cea din literatura
existent, de dragul simplitii i al nelegerii ct mai clare a noiunii de
script. Astfel, notaia cu prim descrie un obiect de acelai tip ca cea
fr prim, cele dou simboluri (dintre care unul cu prim) putndu-se
referi sau nu la obiecte identice. n exemplul nostru, de pild, M este un
palton, iar M un palton rou. Ramificaiile din figur descriu drumuri
alternative prin script.
CunostinteLimba - la fel ca n Programul nr. 1.
InputText - textul de intrare n format caracter.
TextIntegrat - o reprezentare structurat a cunotinelor coninute
n textul de intrare (similar cu descrierea structurat din Programul nr.1),
dar care acum este combinat cu alte cunotine, nrudite, din fundal.
InputIntrebare - ntrebarea care constituie o parte a input-ului,
n format caracter.
StructIntrebare - o reprezentare structurat a ntrebrii utili-
zatorului.

Algoritmul:
Convertete InputText n form structurat folosind att
cunotinele coninute n CunostinteLimba, ct i pe cele coninute n
ModelulLumii. (Numrul structurilor posibile va fi mai mare acum dect
n programul anterior, pentru c sunt folosite mult mai multe cunotine.
Unele posibiliti vor fi ns eliminate prin filtrarea lor cu ajutorul
cunotinelor suplimentare).
Dup convertirea textului de intrare n form structurat, pentru a
rspunde la o ntrebare, se execut urmtorii pai:


28
1. Convertete ntrebarea n form structurat, ca i n Progra-
mul 1, dar folosete, atunci cnd este necesar, ModelulLumii, pentru a
rezolva diversele ambiguiti care pot interveni.
2. mperecheaz aceast form cu cea din TextIntegrat.
3. ntoarce ca rspuns acele pri din text care se potrivesc cu
segmentul de ntrebare cerut.

Iat rspunsurile obinute acum n cazul nostru, adic atunci cnd
sistemului i se pun cele trei ntrebri luate n consideraie n Exemplul
nr. 2:
I1: La fel ca n Programul nr.1.
I2: La fel ca n Programul nr.1.
I3: Acum se poate rspunde la cea de-a treia ntrebare. Scriptul referitor
la cumprturi este instaniat pentru acest text i, din cauza ultimei
propoziii (Cnd l-a adus acas), drumul prin pasul 14 al scriptului
este cel folosit n formarea reprezentrii acestui text. Atunci cnd scriptul
este instaniat, M este limitat la structura reprezentnd paltonul rou
(deoarece scriptul ne spune c M este ceea ce se duce acas, iar textul
afirm c acas a fost dus un palton rou). Dup ce scriptul a fost
instaniat, TextIntegrat conine o serie de evenimente care provin din
script, dar care nu sunt descrise n textul original, inclusiv evenimentul
Maria cumpr un palton rou (de la pasul 10 al scriptului). n acest
fel, folosirea textului integrat ca baz pentru obinerea rspunsurilor la
ntrebri permite programului s rspund, la cea de-a treia ntrebare:
Ea a cumprat un palton rou.



29
Observaii:
1. Acest program este mai puternic dect primul, ntruct el
exploateaz mai multe cunotine. Programul exploateaz ceea ce
reprezint o tehnic clasic a inteligenei artificiale.
2. Chiar i tehnicile exploatate n acest program nu sunt adecvate
pentru a rspunde tuturor ntrebrilor. Cel mai important lucru care i
lipsete acestui program este un mecanism general de inferen, care s
poat fi folosit atunci cnd rspunsul cerut nu este coninut n mod
explicit nici chiar n TextIntegrat, dar decurge n mod logic din
cunotinele incluse acolo. Spre exemplu, fiind dat textul
Duminic dimineaa Maria s-a dus la cumprturi. Fratele ei a ncercat
s o sune atunci, dar nu a putut s-o gseasc.
ar trebui s se poat rspunde la ntrebarea
De ce nu a putut fratele Mariei s o gseasc?
prin rspunsul
Pentru c ea nu era acas.
Dar, pentru a obine un asemenea rspuns, este necesar s se cunoasc
faptul c cineva nu poate fi n dou locuri n acelai timp i apoi s se
foloseasc acest fapt pentru a trage concluzia c Maria nu ar fi putut fi
acas deoarece era la cumprturi.
Problema inferenei a fost n mod temporar evitat prin
construirea lui TextIntegrat, care avea unele inferene incluse n el. Dar
acestea nu sunt suficiente i, cum nu este posibil s se anticipeze toate
inferenele normale i posibile, anumite subdomenii ale inteligenei
artificiale se ocup de furnizarea unui mecanism general de inferen.



30
Concluzie:
Programul nr. 2 reprezint un exemplu pentru a susine faptul c
o procedur eficient de rspunsuri la ntrebri trebuie s se
bazeze n mod solid pe cunotine i pe exploatarea
computaional a acelor cunotine. De altfel, nsui scopul
tehnicilor inteligenei artificiale este acela de a putea susine o
folosire eficient a cunotinelor.





















31
CAPITOLUL 2
TEHNICI DE CUTARE


Un agent este orice entitate care poate fi privit ca percepnd
mediul nconjurtor prin senzori i ca acionnd asupra acestui mediu
prin efectori.
n cazul unui agent uman, acesta are anumite organe (ochi, urechi
etc.) pe post de senzori i anumite pri ale corpului (mini, picioare, gur
etc.) pe post de efectori. Exist i ageni roboi, caz n care, spre exemplu,
efectorii sunt nlocuii cu diferite motoare. n general, prin efector se
nelege un muchi, o gland etc. capabil s rspund unui stimul, n
special unui impuls nervos.
Aa cum se afirm n [9], menirea inteligenei artificiale este s
proiecteze un program agent, i anume o funcie care implementeaz un
agent ce realizeaz transformarea de la percepii la aciuni.
Agenii inteligeni au, n mare, acelai schelet, ceea ce nseamn
ca accept percepii din mediul nconjurtor i genereaz aciuni. Cele
mai facile programe agent au o form foarte simpl. Fiecare astfel de
program folosete nite structuri de date interne care vor fi actualizate pe
msur ce intervin noi percepii. Asupra acestor structuri de date se
opereaz prin procedurile de luare de decizii ale agentului. Aceste
proceduri genereaz alegerea unei aciuni, alegere care este transmis
arhitecturii (hardware-ului) pentru a fi executat.


32
n cele ce urmeaz, vom arta cum un agent poate aciona prin
stabilirea unor eluri sau scopuri i vom lua n consideraie secvena de
aciuni care ar putea duce la ndeplinirea acestor scopuri.
Conform [9], un scop i o mulime de modaliti de atingere a
acestuia formeaz o problem, iar explorarea a ceea ce pot face aceste
modaliti de atingere a scopului constituie procesul de cutare.
n continuare, urmnd calea din [9], ne propunem s descriem un
anumit tip de agent bazat pe scopuri, numit agent rezolvator de
probleme. Agenii rezolvatori de probleme decid ce trebuie fcut prin
gsirea unor secvene de aciuni care conduc la nite stri convenabile.
Agentul trebuie s-i formuleze o viziune adecvat asupra problemei pe
care o va rezolva. Tipul de problem care rezult din procesul de
formulare va depinde de cunotinele aflate la ndemna agentului. n
principal, este important dac el cunoate starea curent i rezultatele
aciunilor.
Agenii cu care vom lucra vor adopta un scop i vor urmri
satisfacerea lui.

2.1. Rezolvarea problemelor prin intermediul cutrii

n procesul de rezolvare a problemelor, formularea scopului,
bazat pe situaia curent, reprezint primul pas.
Vom considera un scop ca fiind o mulime de stri ale
universului, i anume acele stri n care scopul este satisfcut. Aciunile
pot fi privite ca genernd tranziii ntre stri ale universului. Agentul va
trebui s afle care aciuni l vor conduce la o stare n care scopul este


33
satisfcut. nainte de a face asta el trebuie s decid ce tipuri de aciuni i
de stri s ia n consideraie.
Procesul decizional cu privire la aciunile i strile ce trebuie luate
n consideraie reprezint formularea problemei. Formularea problemei
urmeaz dup formularea scopului.
Un agent care va avea la dispoziie mai multe opiuni imediate va
decide ce s fac examinnd mai nti diferite secvene de aciuni
posibile, care conduc la stri de valori necunoscute, urmnd ca, n urma
acestei examinri, s o aleag pe cea mai bun. Procesul de examinare a
unei astfel de succesiuni de aciuni se numete cutare. Un algoritm de
cutare primete ca input o problem i ntoarce ca output o soluie sub
forma unei succesiuni de aciuni.
Odat cu gsirea unei soluii, aciunile recomandate de aceasta pot
fi duse la ndeplinire. Aceasta este faza de execuie. Prin urmare, agentul
formuleaz, caut i execut. Dup formularea unui scop i a unei
probleme de rezolvat, agentul cheam o procedur de cutare pentru a o
rezolva. El folosete apoi soluia pentru a-l ghida n aciunile sale,
executnd ceea ce i recomand soluia ca fiind urmtoarea aciune de
ndeplinit i apoi nltur acest pas din succesiunea de aciuni. Odat ce
soluia a fost executat, agentul va gsi un nou scop.
Iat o funcie, preluat de noi din [9], care implementeaz un
agent rezolvator de probleme simplu:

function AGENT_REZOLVATOR_DE_PROBLEME(p) return o aciune
inputs: p, o percepie
static: s, o secven de aciuni, iniial vid


34
stare, o descriere a strii curente a lumii (universului)
g, un scop, iniial vid
problem, o formulare a unei probleme
stare ACTUALIZEAZ_STARE(stare, p)
if s este vid then
g FORMULEAZ_SCOP(stare)
problem FORMULEAZ_PROBLEM(stare, g)
s CAUT(problem)
aciune RECOMANDARE(s, stare)
s REST(s, stare)
return aciune

n cele ce urmeaz nu vom discuta amnunte despre funciile
ACTUALIZEAZ_STARE i FORMULEAZ_SCOP, ci ne vom
concentra asupra procesului de formulare a problemei i ne vom ocupa
de diferite versiuni ale funciei CAUT. Funcia RECOMANDARE nu
face dect s preia prima dintre aciunile secvenei de aciuni, iar funcia
REST ntoarce restul.

2.1.1. Tipuri de probleme

Exist patru tipuri de probleme [9], fundamental diferite:
probleme cu o unic stare, probleme cu stri multiple, probleme de
contingen i probleme de explorare:
1. Atunci cnd senzorii agentului i furnizeaz acestuia suficient
informaie pentru ca el s i dea seama exact n ce stare se afl (spunem
c universul i este accesibil) i atunci cnd el tie n mod exact ce


35
realizeaz fiecare dintre aciunile sale, el poate calcula n mod exact n ce
stare se va afla dup orice secven de aciuni. Acesta este cazul cel mai
simplu, numit problem cu o singur stare.
2. S presupunem c agentul cunoate toate efectele aciunilor
sale, dar are acces limitat la starea universului. Spre exemplu, ntr-un caz
extrem, s-ar putea ca el s nu aib nici un fel de senzori. n acest caz, el
deine numai o informaie de tipul: tie c starea sa iniial este una din
mulimea de stri {1, 2, 3, 4, 5, 6, 7, 8}. Cu toate acestea, agentul se
poate descurca destul de bine, deoarece cunoate efectele aciunilor sale.
Spre exemplu, poate calcula c o anumit aciune l va duce n una din
strile {2, 4, 6, 8}. n concluzie, atunci cnd universul nu este n
ntregime accesibil, agentul trebuie s fac raionamente referitoare la
mulimi de stri n care ar putea ajunge, nu la stri unice. Aceasta se
numete o problem cu stri multiple.
3. Rezolvarea anumitor probleme (n special n lumea fizic,
real) necesit aciunea senzorilor chiar n faza de execuie. Atunci cnd
nu exist o secven de aciuni fixat care s garanteze o soluie a
problemei, agentul va trebui s calculeze un ntreg arbore de aciuni, nu
numai o unic secven de aciuni. n general, fiecare ramur a arborelui
se ocup de o posibil contingen ce ar putea s apar. Din acest motiv,
numim acest gen de probleme - probleme de contingen
10
. Multe
probleme din lumea real sunt probleme de contingen deoarece
predicia exact este imposibil. (Mersul pe strad sau condusul mainii
reprezint, n lumea real, probleme de contingen). Rezolvarea
problemelor de contingen necesit algoritmi extrem de compleci. De

10
Aici contingen are sensul de ntmplare.


36
aceea, n cadrul acestui curs, ne vom ocupa numai de problemele cu o
singur stare i cu stri multiple, care pot fi rezolvate utiliznd tehnici de
cutare similare. Vom lua deci n consideraie numai cazuri n care
o soluie garantat const dintr-o unic secven de aciuni.
4. Un agent poate s nu aib nici o informaie despre efectele
aciunilor sale. Aceasta este sarcina cea mai grea a unui agent inteligent,
identic cu problemele pe care le au nou-nscuii. n acest caz, agentul
trebuie s experimenteze, descoperind n mod gradual efectele aciunilor
sale, precum i ce fel de stri exist. Aceasta este tot o cutare, dar una n
lumea real, nu n cadrul unui model. O aciune efectuat n lumea real
i nu n cadrul unui model poate fi extrem de periculoas pentru un agent
ignorant. Dac agentul supravieuiete, el nva o hart a mediului
nconjurtor, pe care apoi o poate folosi pentru a rezolva probleme
ulterioare. Aceasta este aa-numita problem de explorare.

2.1.2. Probleme i soluii corect definite

Probleme cu o singur stare

Elementele de baz ale definirii unei probleme sunt strile i
aciunile. Pentru a descrie strile i aciunile, din punct de vedere formal,
este nevoie de urmtoarele elemente [9]:
Starea iniial n care agentul tie c se afl.
Mulimea aciunilor posibile disponibile agentului. Termenul de
operator este folosit pentru a desemna descrierea unei aciuni, prin
specificarea strii n care se va ajunge ca urmare a ndeplinirii aciunii


37
respective, atunci cnd ne aflm ntr-o anumit stare. (O formulare
alternativ folosete o funcie succesor S. Fiind dat o anumit stare x,
S(x) ntoarce mulimea strilor n care se poate ajunge din x, printr-o
unic aciune).
Spaiul de stri al unei probleme reprezint mulimea tuturor st-
rilor n care se poate ajunge plecnd din starea iniial, prin intermediul
oricrei secvene de aciuni.
Un drum n spaiul de stri este orice secven de aciuni care con-
duce de la o stare la alta.
Testul scop este testul pe care un agent l poate aplica unei singu-
re descrieri de stare pentru a determina dac ea este o stare de tip scop,
adic o stare n care scopul este atins (sau realizat). Uneori exist o
mulime explicit de stri scop posibile i testul efectuat nu face dect s
verifice dac s-a ajuns n una dintre ele. Alteori, scopul este specificat
printr-o proprietate abstract i nu prin enumerarea unei mulimi de stri.
De exemplu, n ah, scopul este s se ajung la o stare numit ah mat,
n care regele adversarului poate fi capturat la urmtoarea mutare, orice
ar face adversarul. S-ar putea ntmpla ca o soluie s fie preferabil
alteia, chiar dac amndou ating scopul. Spre exemplu, pot fi preferate
drumuri cu mai puine aciuni sau cu aciuni mai puin costisitoare.
Funcia de cost a unui drum este o funcie care atribuie un cost
unui drum. Ea este adeseori notat prin g. Vom considera costul unui
drum ca fiind suma costurilor aciunilor individuale care compun drumul.
mpreun starea iniial, mulimea operatorilor, testul scop i
funcia de cost a unui drum definesc o problem.


38
Tipul de dat prin care putem reprezenta o problem este deci
urmtorul [9]:

tip_de_dat PROBLEM
componente: STARE_INIIAL, OPERATORI, TEST_SCOP,
FUNCIE_COST_DRUM

Instanieri ale acestui tip de dat vor reprezenta input-ul
algoritmilor de cutare. Output-ul unui algoritm de cutare este soluia,
adic un drum de la starea iniial la o stare care satisface testul scop.

Probleme cu stri multiple

Pentru definirea unei astfel de probleme trebuie specificate:
o mulime de stri iniiale;
o mulime de operatori care indic, n cazul fiecrei aciuni, muli-
mea strilor n care se ajunge plecnd de la orice stare dat;
un test scop (la fel ca la problema cu o singur stare);
funcia de cost a unui drum (la fel ca la problema cu o singur sta-
re).
Un operator se aplic unei mulimi de stri prin reunirea
rezultatelor aplicrii operatorului fiecrei stri din mulime. Aici un drum
leag mulimi de stri, iar o soluie este un drum care conduce la o
mulime de stri, dintre care toate sunt stri scop. Spaiul de stri este aici
nlocuit de spaiul mulimii de stri.




39
Un exemplu. Problema misionarilor i canibalilor

Problema este celebr n inteligena artificial deoarece ea a
constituit subiectul primului articol care a abordat chestiunea formulrii
problemelor dintr-un punct de vedere analitic (Amarel, 1968).
Vom considera aceast problem ntr-un caz particular, atunci
cnd numrul misionarilor este acelai cu cel al canibalilor, i anume egal
cu trei, iar barca dispune de un numr de dou locuri. n acest caz,
problema se formuleaz astfel:
Pe malul stng al unei ape se gsesc trei misionari i trei
canibali. Acetia urmeaz s treac apa, avnd la dispoziie o barc cu
dou locuri. Se tie c, dac pe unul dintre maluri numrul de canibali
este mai mare dect numrul de misionari, atunci misionarii de pe acel
mal sunt mncai de canibali. Se cere determinarea unei variante de
trecere a apei fr ca misionarii s fie mncai de canibali, dac aceasta
exist.
Pentru a formaliza problema, la primul pas ea trebuie
abstractizat, prin ndeprtarea tuturor detaliilor care nu au relevan
asupra soluiei.
Urmtorul pas este acela de a decide care este mulimea de
operatori corect. Se tie c operatorii vor presupune transportarea a una
sau doua persoane de-a lungul rului ntr-o barc. Trebuie s decidem
dac este necesar o stare care s reprezinte momentul n care ei se afl n
barc sau numai acele momente n care ei ajung pe partea cealalt a
rului. Deoarece barca poate transporta maximum dou persoane, nu se
pune problema ca n ea numrul de misionari s fie mai mic dect


40
numrul de canibali. Prin urmare, numai capetele unei traversri sunt
importante.
Pasul urmtor realizeaz o abstractizare asupra indivizilor. Din
punctul de vedere al soluiei, atunci cnd un canibal trebuie s se urce n
barc, nu conteaz care dintre ei este acesta ( de exemplu cum l cheam).
Orice permutare a celor trei misionari sau a celor trei canibali conduce la
acelai rezultat.
Toate aceste consideraii duc la urmtoarea definiie formal a
problemei:
Stri: o stare const dintr-o secven ordonat de trei numere re-
prezentnd numrul de misionari, de canibali i de brci, care se afl pe
malul rului. Starea de pornire (iniial) este (3,3,1).
Operatori: din fiecare stare, posibilii operatori trebuie s ia fie un
misionar, fie un canibal, fie doi misionari, fie doi canibali, fie cte unul
din fiecare i s i transporte cu barca. Prin urmare, exist cel mult cinci
operatori, dei majoritii strilor le corespund mai puini operatori,
intruct trebuie evitate strile interzise. (Observaie: Dac am fi ales s
distingem ntre indivizi, n loc de cinci operatori ar fi existat 27).
Testul scop: s se ajung n starea (0,0,0).
Costul drumului: este dat de numrul de traversri.
Acest spaiu al strilor este suficient de mic pentru ca problema s
fie una trivial pentru calculator.

Un aspect deosebit de important l constituie msurarea
performanei n rezolvarea de probleme. Astfel, eficacitatea unei cutri


41
poate fi msurat n cel puin trei moduri, i anume conform urmtoarelor
criterii de baz:
- dac se gsete o soluie;
- dac s-a gsit o soluie bun (adic o soluie cu un cost sczut al
drumului);
- care este costul cutrii
11
asociat timpului calculator i memoriei
necesare pentru a gsi o soluie.

2.1.3. Cutarea soluiilor i generarea secvenelor de aciuni

Rezolvarea unei probleme ncepe cu starea iniial. Primul pas
este acela de a testa dac starea iniial este o stare scop. Dac nu, se iau
n consideraie i alte stri. Acest lucru se realizeaz aplicnd operatorii
asupra strii curente i, n consecin, genernd o mulime de stri.
Procesul poart denumirea de extinderea strii. Atunci cnd se genereaz
mai multe posibiliti, trebuie fcut o alegere relativ la cea care va fi
luat n consideraie n continuare, aceasta fiind esena cutrii. Alegerea
referitoare la care dintre stri trebuie extins prima este determinat de
strategia de cutare.
Procesul de cutare construiete un arbore de cutare, a crui
rdcin este un nod de cutare corespunznd strii iniiale. La fiecare
pas, algoritmul de cutare alege un nod-frunz pentru a-l extinde.
Algoritmul de cutare general este urmtorul [9]:


11
Costul total al unei cutri se definete ca fiind suma dintre costul drumului
corespunztor i costul respectivei cutri.


42
function CUTARE_GENERAL(problem, strategie)
return soluie sau eec
iniializeaz arborele de cutare folosind starea iniial a lui problem
ciclu do
if nu exist candidai pentru extindere
then return eec
alege un nod-frunz pentru extindere conform lui strategie
if nodul conine o stare scop
then return soluia corespunztoare
else extinde nodul i adaug nodurile rezultate arborelui de
cutare
end


Este important s facem distincia ntre spaiul strilor i arborele
de cutare. Spre exemplu, ntr-o problem de cutare a unui drum pe o
hart, pot exista doar 20 de stri n spaiul strilor, cte una pentru fiecare
ora. Dar exist un numr infinit de drumuri n acest spaiu de stri. Prin
urmare, arborele de cutare are un numr infinit de noduri. Evident, un
bun algoritm de cutare trebuie s evite urmarea unor asemenea drumuri.

2.1.4. Structuri de date pentru arbori de cutare

Exist numeroase moduri de a reprezenta nodurile. n general, se
consider c un nod este o structur de date cu cinci componente:
- starea din spaiul de stri creia i corespunde nodul;
- nodul din arborele de cutare care a generat acest nod (nodul printe);
- operatorul care a fost aplicat pentru a se genera nodul;


43
- numrul de noduri aflate pe drumul de la rdcin la acest nod
(adncimea nodului);
- costul drumului de la starea iniial la acest nod.
Este important distincia ntre noduri i stri. Astfel, un nod este
o structur de date folosit pentru a reprezenta arborele de cutare
corespunztor unei anumite realizri a unei probleme, generat de un
anumit algoritm. O stare reprezint ns o configuraie a lumii
nconjurtoare. De aceea, nodurile au adncimi i prini, iar strile nu le
au. Mai mult, este posibil ca dou noduri diferite s conin aceeai stare,
dac acea stare este generat prin intermediul a dou secvene de aciuni
diferite. Funcia EXTINDERE va fi responsabil pentru determinarea
fiecrei componente a nodului pe care l genereaz.
Este necesar, de asemenea, reprezentarea coleciei de noduri care
ateapt pentru a fi extinse. Aceast colecie de noduri poart denumirea
de frontier. Cea mai simpl reprezentare ar fi aceea a unei mulimi de
noduri, iar strategia de cutare ar fi o funcie care selecteaz, din aceast
mulime, urmtorul nod ce trebuie extins. Dei din punct de vedere
conceptual aceast cale este una direct, din punct de vedere
computaional ea poate fi foarte scump, pentru c funcia strategie ar
trebui s se uite la fiecare element al mulimii pentru a-l alege pe cel
mai bun. De aceea, vom presupune c aceast colecie de noduri este
implementat ca o coad.
Operaiile definite pe o coad vor fi urmtoarele:
- CREEAZ_COADA(Elemente) - creeaz o coad cu elementele date;
- GOL?(Coada) - ntoarce true numai dac nu mai exist elemente n
coad;


44
- NLTUR_DIN_FA(Coada) - nltur elementul din fa al cozii
i l transmite napoi (return);
- COADA_FN(Elemente, Coada) - insereaz o mulime de elemente n
coad. Diferite feluri de funcii de acest tip produc algoritmi de cutare
diferii.
Cu aceste definiii, putem da o descriere mai formal a
algoritmului general de cutare, conform [9]:

function CUTARE_GENERAL(problem,COADA_FN) return
o soluie sau eec
noduri CREEAZ_COADA(CREEAZ_NOD(STARE_INIIAL
[problem]))
ciclu do
if noduri este vid
then return eec
nod NLTUR_DIN_FA(noduri)
if TEST_SCOP[problem] aplicat lui STARE(nod) are succes
then return nod
noduri COADA_FN(noduri, EXTINDERE(nod, OPERATORI
[problem]))
end








45
2.1.5. Evaluarea strategiilor de cutare

Strategiile de cutare se evalueaz conform urmtoarelor patru
criterii:
Completitudine: dac, atunci cnd o soluie exist, strategia dat
garanteaz gsirea acesteia;
Complexitate a timpului: durata de timp pentru gsirea unei
soluii;
Complexitate a spaiului: necesitile de memorie pentru
efectuarea cutrii;
Optimalitate: atunci cnd exist mai multe soluii, strategia dat
s o gseasc pe cea mai de calitate dintre ele.

2.2. Cutarea neinformat

Termenul de cutare neinformat desemneaz faptul c o
strategie de acest tip nu deine nici o informaie despre numrul de pai
sau despre costul drumului de la starea curent la scop. Tot ceea ce se
poate face este s se disting o stare-scop de o stare care nu este scop.
Cutarea neinformat se mai numete i cutarea oarb.
S considerm, de pild, problema gsirii unui drum de la Arad la
Bucureti, avnd n fa o hart. De la starea iniial, Arad, exist trei
aciuni care conduc la trei noi stri: Sibiu, Timioara i Zerind. O cutare
neinformat nu are nici o preferin ntre cele trei variante. Un agent mai
inteligent va observa ns c scopul, Bucureti, se afl la sud-est de Arad
i c numai Sibiu este n aceast direcie, care reprezint, probabil, cea


46
mai bun alegere. Strategiile care folosesc asemenea consideraii se
numesc strategii de cutare informat sau strategii de cutare euristic.
Cutarea neinformat este mai puin eficient dect cea informat.
Cutarea neinformat este ns important deoarece exist foarte multe
probleme pentru care nu este disponibil nici o informaie suplimentar.
n cele ce urmeaz, vom aborda mai multe strategii de cutare
neinformat, acestea deosebindu-se ntre ele prin ordinea n care
nodurile sunt extinse.

2.2.1. Cutarea de tip breadth-first

Strategia de cutare de tip breadth-first extinde mai nti nodul
rdcin. Apoi se extind toate nodurile generate de nodul rdcin, apoi
succesorii lor i aa mai departe. n general, toate nodurile aflate la
adncimea d n arborele de cutare sunt extinse naintea nodurilor aflate
la adncimea d+1. Spunem ca aceasta este o cutare n lime.
Cutarea de tip breadth-first poate fi implementat chemnd
algoritmul general de cutare, CUTARE_GENERAL, cu o funcie
COADA_FN care plaseaz strile nou generate la sfritul cozii, dup
toate strile generate anterior.
Strategia breadth-first este foarte sistematic deoarece ia n
consideraie toate drumurile de lungime 1, apoi pe cele de lungime 2 etc.,
aa cum se arat n Fig. 2.1. Dac exist o soluie, este sigur c aceast
metod o va gsi, iar dac exist mai multe soluii, cutarea de tip
breadth-first va gsi ntotdeauna mai nti soluia cel mai puin adnc.



47





Fig. 2.1

n termenii celor patru criterii de evaluare a strategiilor de cutare,
cea de tip breadth-first este complet i este optim cu condiia ca costul
drumului s fie o funcie descresctoare de adncimea nodului. Aceast
condiie este de obicei satisfcut numai atunci cnd toi operatorii au
acelai cost.

2.2.1.1. Algoritmul de cutare breadth-first

Presupunnd c a fost specificat o mulime de reguli care descriu
aciunile sau operatorii disponibili, algoritmul de cutare breadth-first
se definete dup cum urmeaz:

Algoritmul 2.1
1. Creeaz o variabil numit LISTA_NODURI i seteaz-o la
starea iniial.
2. Pn cnd este gsit o stare-scop sau pn cnd
LISTA_NODURI devine vid, execut:
2.1. nltur primul element din LISTA_NODURI i numete-l
E. Dac LISTA_NODURI a fost vid, STOP.
2.2. Pentru fiecare mod n care fiecare regul se potrivete cu


48
starea descris n E, execut:
2.2.1. Aplic regula pentru a genera o nou stare.
2.2.2. Dac noua stare este o stare-scop, ntoarce aceas-
t stare i STOP.
2.2.3. Altfel, adaug noua stare la sfritul lui LIS-
TA_NODURI.


2.2.1.2. Implementare n Prolog

Pentru a programa n Prolog strategia de cutare breadth-first,
trebuie meninut n memorie o mulime de noduri candidate alternative.
Aceast mulime de candidai reprezint marginea de jos a arborelui de
cutare, aflat n continu cretere (frontiera). Totui, aceast mulime de
noduri nu este suficient dac se dorete i extragerea unui drum-soluie
n urma procesului de cutare. Prin urmare, n loc de a menine o mulime
de noduri candidate, vom menine o mulime de drumuri candidate
12
.
Este util, pentru programarea n Prolog, o anumit reprezentare a
mulimii de drumuri candidate, i anume: mulimea va fi reprezentat ca
o list de drumuri, iar fiecare drum va fi o list de noduri n ordine
invers. Capul listei va fi, prin urmare, nodul cel mai recent generat, iar
ultimul element al listei va fi nodul de nceput al cutrii.
Cutarea este nceput cu o mulime de candidai avnd un singur
element:
[[NodIniial]].

12
Implementarea n Prolog a strategiei breadth-first propus aici este preluat din [1].


49
Fiind dat o mulime de drumuri candidate, cutarea de tip breadth-first
se desfoar astfel:
dac primul drum conine un nod-scop pe post de cap, atunci
acesta este o soluie a problemei;
altfel, nltur primul drum din mulimea de candidai i
genereaz toate extensiile de un pas ale acestui drum, adugnd
aceast mulime de extensii la sfritul mulimii de candidai.
Execut apoi cutarea de tip breadth-first asupra mulimii astfel
actualizate.
Vom considera un exemplu n care nodul a este nodul de start, f
i j sunt nodurile-scop, iar spaiul strilor este cel din Fig. 2.2:














Fig. 2.2
a
b c
d e g
h i k

f
j


50
Ordinea n care strategia breadth-first viziteaz nodurile din acest spaiu
de stri este: a, b, c, d, e, f. Soluia mai scurt [a, c, f] va fi gsit naintea
soluiei mai lungi [a, b, e, j].
Pentru figura anterioar, cutarea breadth-first se desfoar
astfel:
(1) Se ncepe cu mulimea de candidai iniial:
[[a]]
(2) Se genereaz extensii ale lui [a]:
[[b, a], [c, a]]
(Se observ reprezentarea drumurilor n ordine invers).
(3) Se nltur primul drum candidat, [b, a], din mulime i se genereaz
extensii ale acestui drum:
[[d, b, a], [e, b, a]]
Se adaug lista extensiilor la sfritul mulimii de candidai:
[[c, a], [d, b, a], [e, b, a]]
(4) Se nltur [c, a] i se adaug extensiile sale la sfritul mulimii de
candidai, rezultnd urmtoarea mulime de drumuri:
[[d, b, a], [e, b, a], [f, c, a], [g, c, a]]
La urmtorii pai, [d, b, a] i [e, b, a] sunt extinse, iar mulimea de
candidai modificat devine:
[[f, c, a], [g, c, a], [h, d, b, a], [i, e, b, a], [j, e, b, a]]
Acum procesul de cutare ntlnete [f, c, a], care conine un nod scop, f.
Prin urmare, acest drum este returnat ca soluie.
Programul Prolog care implementeaz acest proces de cutare va
reprezenta mulimile de noduri ca pe nite liste, efectund i un test care
s previn generarea unor drumuri ciclice. n cadrul acestui program,


51
toate extensiile de un pas vor fi generate prin utilizarea procedurii
ncorporate bagof:

rezolva_b(Start,Sol):-breadthfirst([[Start]],Sol).
breadthfirst([[Nod|Drum]|_],[Nod|Drum]):-scop(Nod).
breadthfirst([Drum|Drumuri],Sol):-
extinde(Drum,DrumuriNoi),
concat(Drumuri,DrumuriNoi,Drumuri1),
breadthfirst(Drumuri1,Sol).
extinde([Nod|Drum],DrumuriNoi):-
bagof([NodNou,Nod|Drum],
s(Nod,NodNou),\+(membru(NodNou,[Nod|Drum]))),
DrumuriNoi),
!.
extinde(_,[]).

Predicatul rezolva_b(Start,Sol) este adevrat dac Sol este
un drum (n ordine invers) de la nodul iniial Start la o stare-scop, drum
obinut folosind cutarea de tip breadth-first.
Predicatul breadthfirst(Drumuri,Sol) este adevrat dac
un drum din mulimea de drumuri candidate numit Drumuri poate fi
extins la o stare-scop; un astfel de drum este Sol.
Predicatul extinde(Drum,DrumuriNoi) este adevrat dac
prin extinderea mulimii de noduri Drum obinem mulimea numit
DrumuriNoi, el genernd mulimea tuturor extensiilor acestui drum.
Predicatul concat(Drumuri,DrumuriNoi,Drumuri1) este
adevrat dac, atunci cnd concatenm lista de noduri Drumuri cu lista de
noduri DrumuriNoi, obinem lista de noduri Drumuri1.


52
Predicatul membru(NodNou,[Nod|Drum]) este adevrat dac
nodul numit NodNou aparine listei de noduri [Nod|Drum].
Fapta Prolog scop(Nod) arat c Nod este un nod-scop.
Funcia de succesiune este implementat astfel: s(Nod,NodNou)
desemneaz faptul c NodNou este nodul succesor al nodului Nod.
Prezentm, n continuare, programul Prolog complet cores-
punztor exemplului din Fig. 2.2. Programul implementeaz strategia de
cutare breadth-first pentru a gsi soluiile, cele dou drumuri [f, c, a] i
respectiv [j, e, b, a]:

Programul 2.1

scop(f). % specificare noduri-scop
scop(j).
s(a,b). % descrierea funciei succesor
s(a,c).
s(b,d).
s(d,h).
s(b,e).
s(e,i).
s(e,j).
s(c,f).
s(c,g).
s(f,k).

concat([],L,L).
concat([H|T],L,[H|T1]):-concat(T,L,T1).

membru(H,[H|T]).
membru(X,[H|T]):-membru(X,T).

rezolva_b(Start,Sol):-breadthfirst([[Start]],Sol).



53
breadthfirst([[Nod|Drum]|_],[Nod|Drum]):-scop(Nod).
breadthfirst([Drum|Drumuri],Sol):-
extinde(Drum,DrumuriNoi),
concat(Drumuri,DrumuriNoi,Drumuri1),
breadthfirst(Drumuri1,Sol).

extinde([Nod|Drum],DrumuriNoi):-
bagof([NodNou,Nod|Drum],(s(Nod,NodNou),
\+(membru(NodNou,[Nod|Drum]))),DrumuriNoi),
!.
extinde(_,[]).

Interogarea Prologului se face astfel:

?- rezolva_b(a,Sol).

Rspunsul Prologului va fi:

Sol=[f, c, a] ? ;
Sol=[j, e, b, a] ? ;
No

Cele dou soluii au fost obinute ca liste de noduri n ordine invers,
plecndu-se de la nodul de start a.
Un neajuns al acestui program l reprezint lipsa de eficien a
operaiei de concatenare. Aceast problem poate fi rezolvat prin
reprezentarea listelor sub forma diferenei de liste. Pentru un exemplu de
implementare a algoritmului breadth-first folosind reprezentarea listelor
prin diferene, vezi 2.2.1.4.


54
2.2.1.3. Timpul i memoria cerute de strategia breadth-first

Pentru a vedea cantitatea de timp i de memorie necesare
completrii unei cutri, vom lua n consideraie un spaiu al strilor
ipotetic, n care fiecare stare poate fi extins pentru a genera b stri noi.
Se spune c factorul de ramificare al acestor stri (i al arborelui de
cutare) este b. Rdcina genereaz b noduri la primul nivel, fiecare
dintre acestea genereaz nc b noduri, rezultnd un total de b
2
noduri la
al doilea nivel .a.m.d.. S presupunem c soluia acestei probleme este
un drum de lungime d. Atunci numrul maxim de noduri extinse nainte
de gsirea unei soluii este:
d
b b b + + + +
2
1 .
Prin urmare, algoritmul are o complexitate exponenial de ) (
d
b O .
Complexitatea spaiului este aceeai cu complexitatea timpului deoarece
toate nodurile frunz ale arborelui trebuie s fie meninute n memorie n
acelai timp.
Iat cteva exemple de execuii cu factor de ramificare b=10,
preluate de noi din [9]:
Adncime Noduri Timp Memorie
2 111 0.1 sec. 11 kilobytes
6 10
6
18 min. 111 megabytes
8 10
8
31 ore 11 gigabytes
12 10
12
35 ani 111 terabytes

Se observ c cerinele de memorie sunt o problem mai mare, pentru
cutarea de tip breadth-first, dect timpul de execuie. (Este posibil s


55
putem atepta 18 minute pentru a se efectua o cutare de adncime 6, dar
s nu dispunem de 111 megabytes de memorie). La rndul lor, cerinele
de timp sunt majore. (Dac problema are o soluie la adncimea 12,
o cutare neinformat de acest tip o gsete n 35 de ani). n general,
problemele de cutare de complexitate exponenial nu pot fi rezolvate
dect pe mici poriuni.

2.2.1.4. Un exemplu. Problema misionarilor i canibalilor

Pe malul estic al unei ape se gsesc N misionari si N canibali.
Acetia urmeaz s treac apa, avnd la dispoziie o barc cu M locuri.
Se tie c, dac pe unul dintre maluri numrul de canibali este mai mare
dect numrul de misionari, atunci misionarii de pe acel mal sunt
mncai de canibali. Se cere determinarea unei variante de trecere a apei
fr ca misionarii s fie mncai de canibali, dac aceasta exist.

n implementarea care urmeaz vom reprezenta o stare
a problemei prin intermediul unui termen Prolog de forma:

st(MalBarca,NMisMBarca,NCanMBarca,NMisMOpus,
NCanMOpus,M,N)

Primul argument specific malul pe care se afl barca (est sau vest), iar
urmtoarele patru constituie numrul de misionari i de canibali de pe
malul pe care se gsete barca i respectiv de pe malul opus. Ultimele
dou argumente, M i N, se refer la numrul de locuri din barc i


56
respectiv la numrul de canibali i de misionari aflai iniial pe malul
estic al rului.

Programul 2.2

%Predicatele specifice problemei misionarilor si
%canibalilor

%Definim relatia de succesiune.

%Predicatul st(S1,S2) este adevarat daca exista un
%arc intre S1 si S2 in spatiul starilor.

s(st(B,NMB,NCB,NMis,NCan,M,N),st(B1,NMisB1,NCanB1,
NMis1,NCan1,M,N)):-
maluri_opuse(B,B1),
intre(K1,0,M),
%determinam K1, numarul de misionari care trec
%cu barca
intre(K2,0,M),
%determinam K1, numarul de canibali care trec
%cu barca
K1+K2=<M,K1+K2>0,
(K1=0;K1=\=0,K1>=K2),
NMB>=K1,NCB>=K2,NMisB1 is NMis+K1,NCanB1 is
NCan+K2,
NMis1 is NMB-K1,NCan1 is
NCB-K2,in_regula(NMisB1,NCanB1),
in_regula(NMis1,NCan1).

membru(X,[X|_]).
membru(X,[_|Y]):-membru(X,Y).


57
intre(A,A,B):-A=<B.
intre(X,A,B):-A<B,A1 is A+1, intre(X,A1,B).

%In starea initiala toti canibalii si toti misionarii
%se afla pe malul estic.

initial(st(est,N,N,0,0,M,N),M,N).

%In starea finala toti canibalii si toti misionarii
%se afla pe malul vestic.

scop(st(vest,N,N,0,0,_,N)).

%Predicatul maluri_opuse(X,Y) este adevarat daca X si
%Y sunt maluri opuse.

maluri_opuse(est,vest).
maluri_opuse(vest,est).

in_regula(0,_).
in_regula(X,Y):-X>0,X>=Y.

%Implementarea algoritmului breadth-first folosind
%reprezentarea listelor prin diferente

extinde([Node|Path],NewPaths):-
findall_liste_dif([NewNode,Node|Path],
(s(Node,NewNode),
\+ (membru(NewNode,[Node|Path]))),
NewPaths).

findall_liste_dif(X,Scop,L):-
call(Scop),assertz(elem(X)),fail;
assertz(elem(baza)),colectez(L).

colectez(L):-retract(elem(X)),!,


58
(X==baza,!,L=Z-Z;
colectez(Rest),concat_liste_dif(Rest,
[X|A]-A,L)).

concat_liste_dif(A1-Z1,Z1-Z2,A1-Z2).

rezolva_bf_dif(Nod_initial,Solutie):-
breadthfirst_dif([[Nod_initial]|Z]-Z,
Solutie).

breadthfirst_dif([[Nod|Drum]|_]-_,[Nod|Drum]):-
scop(Nod).
breadthfirst_dif([Drum|Drumuri]-Z1,Solutie):-
extinde(Drum,LL),
concat_liste_dif(Drumuri-Z1,LL,A2-Z2),
A2\==Z2,
breadthfirst_dif(A2-Z2,Solutie).

%Utilizarea algoritmului breadth-first pentru
%rezolvarea problemei canibalilor si misionarilor

solutie(N,M):-
tell('C:\\canib_rez.txt'),
initial(Start,M,N),
(rezolva_bf_dif(Start,Solutie),lung(Solutie,N1),!,
NN is N1-1,afisare(Solutie),nl,nl,
write('Nr mutari: '),write(NN);
nl,write('Problema nu are solutie !!!')),
told.

scrie(st(B,MX,CX,MY,CY,_,_)):-
write('Barca se afla pe malul de '),write(B),


59
write('.'),nl,maluri_opuse(B,B1),
(B=est, write('Pe malul de '),write(B),
write(' se afla '),write(MX),scrie_nr(MX,m),
write(' si '),write(CX),scrie_nr(CX,c),
write('.'),nl,write('Pe malul de '),write(B1),
write(' se afla '),write(MY),scrie_nr(MY,m),
write(' si '),write(CY),scrie_nr(CY,c);
B=vest, write('Pe malul de '),write(B1),
write(' se afla '),write(MY),scrie_nr(MY,m),
write(' si '),write(CY),scrie_nr(CY,c),
write('.'),nl,write('Pe malul de '),write(B),
write(' se afla '),write(MX),scrie_nr(MX,m),
write('si'),write(CX),scrie_nr(CX,c)),write('.').

scrie_nr(X,Y):-
Y==m,(X==1, write(' misionar');
X\==1,write(' misionari'));
Y==c,(X==1, write(' canibal');
X\==1,write(' canibali')).

afisare([]).
afisare([H|T]):- afisare(T),scrie(H),nl,nl.

lung([],0).
lung([_|T],N):-lung(T,N1),N is N1+1.

Interogarea Prologului se face, spre exemplu, dup cum urmeaz:

?- solutie(3,2).

Rspunsul sistemului va fi yes


60
cu semnificaia c predicatul a fost satisfcut. n fiierul
C:\canib_rez.txt putem vedea i secvena de mutri prin care s-a
ajuns din starea iniial n starea final (n situaia n care avem 3
canibali, 3 misionari i 2 locuri n barc). Dup interogarea anterioar,
coninutul fiierului C:\canib_rez.txt va fi urmtorul:

Barca se afla pe malul de est.
Pe malul de est se afla 3 misionari si 3 canibali.
Pe malul de vest se afla 0 misionari si 0 canibali.

Barca se afla pe malul de vest.
Pe malul de est se afla 2 misionari si 2 canibali.
Pe malul de vest se afla 1 misionar si 1 canibal.

Barca se afla pe malul de est.
Pe malul de est se afla 3 misionari si 2 canibali.
Pe malul de vest se afla 0 misionari si 1 canibal.

Barca se afla pe malul de vest.
Pe malul de est se afla 3 misionari si 0 canibali.
Pe malul de vest se afla 0 misionari si 3 canibali.

Barca se afla pe malul de est.
Pe malul de est se afla 3 misionari si 1 canibal.
Pe malul de vest se afla 0 misionari si 2 canibali.

Barca se afla pe malul de vest.
Pe malul de est se afla 1 misionar si 1 canibal.
Pe malul de vest se afla 2 misionari si 2 canibali.

Barca se afla pe malul de est.
Pe malul de est se afla 2 misionari si 2 canibali.
Pe malul de vest se afla 1 misionar si 1 canibal.

Barca se afla pe malul de vest.
Pe malul de est se afla 0 misionari si 2 canibali.
Pe malul de vest se afla 3 misionari si 1 canibal.

Barca se afla pe malul de est.
Pe malul de est se afla 0 misionari si 3 canibali.
Pe malul de vest se afla 3 misionari si 0 canibali.



61
Barca se afla pe malul de vest.
Pe malul de est se afla 0 misionari si 1 canibal.
Pe malul de vest se afla 3 misionari si 2 canibali.


Barca se afla pe malul de est.
Pe malul de est se afla 1 misionar si 1 canibal.
Pe malul de vest se afla 2 misionari si 2 canibali.

Barca se afla pe malul de vest.
Pe malul de est se afla 0 misionari si 0 canibali.
Pe malul de vest se afla 3 misionari si 3 canibali.


Nr mutari: 11

2.2.2. Cutarea de tip depth-first

2.2.2.1. Prezentare general i comparaie cu strategia
breadth-first

Strategia de cutare de tip depth-first extinde ntotdeauna unul
dintre nodurile aflate la nivelul cel mai adnc din arbore. Cutarea se
ntoarce napoi i sunt extinse noduri aflate la adncimi mai mici numai
atunci cnd a fost atins un nod care nu reprezint un nod-scop i care nu
mai poate fi extins. Spunem c aceasta este o cutare n adncime.
Modul de a progresa al cutrii de tip depth-first este ilustrat n Fig. 2.3.
Implementarea se poate face cu o structur de date de tip coad,
care ntotdeauna va plasa strile nou generate n faa cozii.
Necesitile de memorie sunt foarte mici la aceast metod. Dup
cum se vede n Fig. 2.3, este necesar s se memoreze un singur drum de
la rdcin la un nod-frunz, mpreun cu nodurile-frate rmase neextinse
corespunztor fiecrui nod de pe drum.


62













Fig. 2.3

Pentru un spaiu al strilor cu factor de ramificare b i adncime
maxim m, trebuie memorate numai bm noduri, spre deosebire de cele b
d

care ar trebui memorate n cazul strategiei de tip breadth-first (atunci
cnd scopul cel mai puin adnc se afl la adncimea d).
Complexitatea de timp a strategiei depth-first este de ) (
m
b O .
Pentru probleme care au foarte multe soluii, cutarea de tip depth-first
s-ar putea s fie mai rapid dect cea de tip breadth-first, deoarece sunt
anse mari s fie gsit o soluie dup ce se exploreaz numai o mic
poriune a ntregului spaiu de cutare. Strategia breadth-first trebuie s
investigheze toate drumurile de lungime d-1 nainte de a lua n


63
consideraie pe oricare dintre drumurile de lungime d. Depth-first este de
complexitate ) (
m
b O i n cazul cel mai nefavorabil.
Principalul dezavantaj al acestei strategii este acela c o cutare
de tip depth-first va continua ntotdeauna n jos, chiar dac o soluie mai
puin adnc exist. Aceast strategie
poate intra ntr-un ciclu infinit fr a returna vreodat o soluie;
poate gsi un drum reprezentnd o soluie, dar care este mai lung
dect drumul corespunztor soluiei optime; din aceste motive
cutarea de tip depth-first nu este nici complet i nici optimal.
Prin urmare, aceast strategie trebuie evitat n cazul arborilor de cutare
de adncimi maxime foarte mari sau infinite.
Aa cum s-a argumentat deja, principalele avantaje ale acestui tip
de cutare sunt:
consumul redus de memorie;
posibilitatea gsirii unei soluii fr a se explora o mare parte din
spaiul de cutare.

2.2.2.2. Implementare n Prolog

Strategia depth-first este cea care se potrivete cel mai bine cu
stilul de programare recursiv din Prolog. Motivul pentru aceasta este
faptul c, nsui Prologul, atunci cnd execut scopuri, exploreaz diferite
alternative n manier depth-first.
Problema gsirii unui drum-soluie, Sol, de la un nod dat, N, pn
la un nod-scop, se rezolv n felul urmtor:


64
dac N este un nod-scop, atunci Sol=[N] sau
dac exist un nod succesor, N1, al lui N, astfel nct s existe un
drum, Sol1, de la N1 la un nod-scop, atunci Sol=[N|Sol1].
Aceasta se traduce n Prolog astfel
13
:
rezolva_d(N,[N]):-
scop(N).
rezolva_d(N,[N|Sol1]):-
s(N,N1),
rezolva_d(N1,Sol1).
Interogarea Prologului se va face n felul urmtor:
?- rezolva_d(a,Sol).
Pentru exemplificare, vom lua din nou n consideraie spaiul
strilor din Fig. 2.2, n care a este nodul de start, iar f i j sunt noduri-
scop. Ordinea n care strategia depth-first viziteaz nodurile n acest
spaiu de stri este: a, b, d, h, e, i, j. Soluia gsit este [a, b, e, j]. Dup
efectuarea backtracking-ului este gsit i cealalt soluie, [a, c, f].
Prezentm, n continuare, programul Prolog complet, corespunztor
acestui exemplu:

Programul 2.3

scop(f). % specificare noduri-scop
scop(j).
s(a,b). % descrierea funciei succesor
s(a,c).
s(b,d).
s(d,h).
s(b,e).
s(e,i).

13
Implementarea n Prolog a strategiei depth-first propus aici este preluat din [1].


65
s(e,j).
s(c,f).
s(c,g).
s(f,k).

rezolva_d(N,[N]):-scop(N).
rezolva_d(N,[N|Sol1]):-
s(N,N1),
rezolva_d(N1,Sol1).

Interogarea Prologului se face astfel:
?- rezolva_d(a,Sol).
Rspunsul Prologului va fi:
Sol=[a,b,e,j] ? ;
Sol=[a,c,f] ? ;
no
Se observ faptul c forma drumurilor-soluie este cea fireasc, de la
nodul de start la nodul-scop (spre deosebire de cazul strategiei breadth-
first, unde nodurile intervin n ordine invers).
Exist ns multe situaii n care procedura rezolva_d poate s
nu lucreze bine, acest fapt depinznd n exclusivitate de spaiul de stri.
Pentru exemplificare, este suficient s adugm un arc de la nodul h la
nodul d n spaiul de stri reprezentat de Fig. 2.2. Corespunztor Fig. 2.4,
cutarea se va efectua n felul urmtor: se pleac din nodul a, apoi se
coboar la nodul h, pe ramura cea mai din stnga a arborelui. n acest
moment, spre deosebire de situaia anterioar, h are un succesor, i
anume pe d. Prin urmare, de la h, execuia nu va mai efectua un
backtracking, ci se va ndrepta spre d. Apoi va fi gsit succesorul lui d,
adic h, .a.m.d., rezultnd un ciclu infinit ntre d i h.


66













Fig. 2.4

Devine astfel evident faptul c, pentru mbuntirea programului,
trebuie adugat un mecanism de detectare a ciclurilor. Conform
acestuia, orice nod care se afl deja pe drumul de la nodul de start la
nodul curent nu mai trebuie luat vreodat n consideraie. Aceast cerin
poate fi formulat ca o relaie:
depthfirst(Drum, Nod, Soluie).
Aici Nod este starea pornind de la care trebuie gsit un drum la o stare-
scop; Drum este un drum, adic o list de noduri, ntre nodul de start i
Nod; Soluie este Drum, extins via Nod, la un nod-scop. Reprezentarea
relaiei este cea din Fig. 2.5:



a
b c
d e
h



67








Fig.2.5

Argumentul Drum poate fi folosit cu dou scopuri:
s mpiedice algoritmul s ia n consideraie acei succesori ai lui
Nod care au fost deja ntlnii, adic s detecteze ciclurile;
s construiasc un drum-soluie numit Soluie.
Predicatul corespunztor,
depthfirst(Drum,Nod,Sol),
este adevrat dac, extinznd calea Drum via Nod, se ajunge la un nod-
scop.
n cele ce urmeaz, prezentm implementarea n Prolog a
strategiei depth-first cu detectare a ciclurilor:

rezolva1_d(N,Sol):-depthfirst([ ],N,Sol).
depthfirst(Drum,Nod,[Nod|Drum]):-scop(Nod).
depthfirst(Drum,Nod,Sol):-s(Nod,Nod1),
\+(membru(Nod1,Drum)),
depthfirst([Nod|Drum],Nod1,
Sol).
Solutie
Nod-scop
Nod
Drum
Nod de start


68
Se observ c fragmentul de program anterior verific dac anumite
noduri au fost luate deja n consideraie pn la momentul curent, punnd
condiia de nonapartenen: \+(membru(Nod1,Drum)). Drumurile-
soluie sunt date ca liste de noduri n ordine invers, aa cum se va vedea
i n exemplul care urmeaz.
Prezentm, n continuare, programul Prolog complet cores-
punztor exemplului din Fig. 2.4. Programul implementeaz strategia de
cutare depth-first cu detectare a ciclurilor, pentru gsirea celor dou
soluii posibile:

Programul 2.4

scop(f). % specificare noduri-scop
scop(j).
s(a,b). % descrierea funciei succesor
s(a,c).
s(b,d).
s(d,h).
s(h,d).
s(b,e).
s(e,i).
s(e,j).
s(c,f).
s(c,g).
s(f,k).

rezolva1_d(N,Sol):-depthfirst([ ],N,Sol).

depthfirst(Drum,Nod,[Nod|Drum]):-scop(Nod).
depthfirst(Drum,Nod,Sol):-s(Nod,Nod1),
\+(membru(Nod1,Drum)),
depthfirst([Nod|Drum],Nod1,
Sol).


69
membru(H,[H|T]).
membru(X,[H|T]):-membru(X,T).

Interogarea Prologului se face astfel:

?- rezolva1_d(a,Sol).

Rspunsul Prologului va fi:

Sol=[j,e,b,a] ? ;
Sol=[f,c,a] ? ;
no

Pentru un exemplu mai complex de problem a crei rezolvare
necesit o cutare de tip depth-first cu mecanism de detectare a ciclurilor,
vezi 2.2.4.
Aa cum se arat n [1], un program de acest tip nu va lucra totui
corect atunci cnd spaiul strilor este infinit. ntr-un astfel de spaiu
algoritmul depth-first poate omite un nod-scop deplasndu-se de-a lungul
unei ramuri infinite a grafului. Programul poate atunci s exploreze n
mod nedefinit aceast parte infinit a spaiului, fr a se apropia vreodat
de un scop. Pentru a evita astfel de ramuri aciclice infinite, procedura de
cutare depth-first de baz poate fi, n continuare, rafinat, prin limitarea
adncimii cutrii. n acest caz, procedura de cutare depth-first va avea
urmtoarele argumente:
depthfirst1(Nod, Soluie, Maxdepth),
unde Maxdepth este adncimea maxim pn la care se poate efectua
cutarea.


70
Aceast constrngere poate fi programat prin micorarea limitei
de adncime la fiecare apelare recursiv, fr a permite ca aceast limit
s devin negativ. Tipul acesta de cutare se numete Depth-limited
search (cutare cu adncime limitat). Predicatul Prolog corespun-
ztor,
depthfirst1(Nod,Sol,Max),
va fi adevrat dac, pornind din nodul Nod, obinem un drum-soluie
numit Sol, prin efectuarea unei cutri de tip depth-first pn la
adncimea maxim notat Max. Lsm cititorului ca exerciiu scrierea
programului Prolog care va explora cu succes un spaiu aciclic infinit,
prin stabilirea unei limite de adncime.
Numrul de extinderi ntr-o cutare depth-limited, pn la o
adncime d, cu factor de ramificare b, este:
d d
b b b b + + + + +
1 2
1
Neajunsul n cazul acestui tip de cutare este acela c trebuie
gsit dinainte o limit convenabil a adncimii cutarii. Dac aceast
limit este prea mic, cutarea va eua. Dac limita este mare, atunci
cutarea va deveni prea scump. Pentru a evita aceste neajunsuri, putem
executa cutarea de tip depth-limited n mod iterativ, variind limita
pentru adncime. Se ncepe cu o limit a adncimii foarte mic i se
mrete aceast limit n mod gradat, pn cnd se gsete o soluie.
Aceast tehnic de cutare se numete Iterative Deepening Search
(cutare n adncime iterativ).





71
2.2.3. Cutarea n adncime iterativ

2.2.3.1. Prezentare general

Cutarea n adncime iterativ este o strategie care evit
chestiunea stabilirii unei adncimi optime la care trebuie cutat soluia,
prin testarea tuturor limitelor de adncime posibile: mai nti adncimea
0, apoi 1, apoi 2, .a.m.d.. Acest tip de cutare combin beneficiile
cutrii breadth-first i depth-first, dup cum urmeaz:
este optim i complet ca i cutarea breadth-first;
consum numai cantitatea mic de memorie necesar cutarii
depth-first (cerina de memorie este liniar).
Ordinea extinderii strilor este similar cu cea de la cutarea de
tip breadth-first, numai c anumite stri sunt extinse de mai multe ori.
Aceast strategie de cutare garanteaz gsirea nodului-scop de la
adncimea minim, dac un scop poate fi gsit.
Dei anumite noduri sunt extinse de mai multe ori, numrul total
de noduri extinse nu este mult mai mare dect cel dintr-o cutare de tip
breadth-first. Vom calcula acest numr de noduri extinse n cazul cel mai
nefavorabil, n care se caut ntr-un arbore cu factor de ramificare b,
scopul cel mai puin adnc aflndu-se la adncimea d i fiind ultimul nod
care va fi generat la acea adncime. Reamintim c numrul de noduri
extinse de o cutare de tip breadth-first n aceste condiii poate urca pn
la:
1
1
1
1
2

= + + + + =
+
b
b
b b b N
d
d
bf




72
Pentru a calcula numrul nodurilor extinse de cutarea n adncime
iterativ, vom nota, mai nti, faptul c numrul nodurilor extinse de o
cutare de tip depth-first complet pn la nivelul j este:
1
1
1

=
+
b
b
N
j
df

n cel mai nefavorabil caz, pentru un scop aflat la adncimea d, cutarea
depth-first iterativ trebuie s efectueze cutri de tip depth-first
complete, separate, pentru toate adncimile pn la d. Suma nodurilor
extinse n aceast situaie este:
2
2
2
2
2
1
1
0 0
0 0
1
0
1
0
1
) 1 (
1 2
) 1 (
1
) 1 (
) 1 )( 1 ( ) 1 (
)] 1 (
1
1
[
1
1
] 1 ) ( [
1
1
] 1 [
1
1
] 1 [
1
1
1
1

+ +
=
=

+ +
=

+
=
= +

=
+
+ +
+
= =
= =
+
=
+
=
+


b
d bd b b
b
d b bd b b
b
d b b b
d
b
b
b
b
b b
b
b
b
b
b b
b
N
d
d d
d d
j
d
j
j
d
j
d
j
j
d
j
j
d
j
j
id

Spre exemplu [7], atunci cnd b=10, iar scopurile se afl la mare
adncime, o cutare n adncime iterativ de la adncimea 1 pn la
adncimea d extinde cu numai 11% noduri mai mult dect o singur
cutare de tip breadth-first sau dect una n adncime limitat la
adncimea d. Cu ct factorul de ramificare are o valoare mai mare, cu att
se micoreaz costurile legate de extinderea repetat a acelorai stri.
Chiar i atunci cnd factorul de ramificare are valoarea 2, cutarea n
adncime iterativ dureaz numai de aproximativ dou ori mai mult dect
o cutare de tip breadth-first complet [9]. Aceasta nseamn c strategia
j


73
de cutare n adncime iterativ are tot complexitatea de timp ) (
d
b O , iar
complexitatea sa de spatiu este ) (bd O . n general, cutarea n adncime
iterativ este metoda de cutare preferat atunci cnd exist un spaiu al
cutrii foarte mare, iar adncimea soluiei nu este cunoscut.

2.2.3.2. Implementare n Prolog

Pentru implementarea n Prolog a cutrii n adncime iterative
vom folosi predicatul cale de forma
cale(Nod1,Nod2,Drum)
care este adevrat dac Drum reprezint o cale aciclic ntre nodurile
Nod1 i Nod2 n spaiul strilor. Aceast cale va fi reprezentat ca o list
de noduri date n ordine invers. Corespunztor nodului de start dat,
predicatul cale genereaz toate drumurile aciclice posibile de lungime
care crete cu cte o unitate. Drumurile sunt generate pn cnd se
genereaz o cale care se termin cu un nod-scop.
Implementarea n Prolog a cutrii n adncime iterative este
urmtoarea:

cale(Nod,Nod,[Nod]).
cale(PrimNod,UltimNod,[UltimNod|Drum]):-
cale(PrimNod,PenultimNod,Drum),
s(PenultimNod,UltimNod),
\+(membru(UltimNod,Drum)).
depth_first_iterative_deepening(Nod,Sol):-
cale(Nod,NodScop,Sol),
scop(NodScop), !.


74
Prezentm, n continuare, programul Prolog complet cores-
punztor aceluiai exemplu dat de Fig. 2.2:

Programul 2.5

scop(f). % specificare noduri-scop
scop(j).
s(a,b). % descrierea funciei succesor
s(a,c).
s(b,d).
s(d,h).
s(b,e).
s(e,i).
s(e,j).
s(c,f).
s(c,g).
s(f,k).

membru(H,[H|T]).
membru(X,[H|T]):-membru(X,T).

cale(Nod,Nod,[Nod]).
cale(PrimNod,UltimNod,[UltimNod|Drum]):-
cale(PrimNod,PenultimNod,Drum),
s(PenultimNod,UltimNod),
\+(membru(UltimNod,Drum)).

depth_first_iterative_deepening(Nod,Sol):-
cale(Nod,NodScop,Sol),
scop(NodScop),!.

Interogarea Prologului se face astfel:

?- depth_first_iterative_deepening(a,Sol).


75
Rspunsul Prologului va fi:
Sol=[f,c,a] ? ;
no
Programul gsete soluia cel mai puin adnc, sub forma unui drum
scris n ordine invers, dup care oprete cutarea. El va funciona la fel
de bine i ntr-un spaiu al strilor coninnd cicluri, datorit
mecanismului de verificare \+(membru(UltimNod,Drum)), care evit
luarea n consideraie a nodurilor deja vizitate.
Principalul avantaj al acestei metode este acela c ea necesit
puin memorie. La orice moment al execuiei, necesitile de spaiu se
reduc la un singur drum, acela dintre nodul de nceput al cutrii i nodul
curent.
Dezavantajul metodei este acela c, la fiecare iteraie, drumurile
calculate anterior sunt recalculate, fiind extinse pn la o nou limit de
adncime. Timpul calculator nu este ns foarte afectat, deoarece nu se
extind cu mult mai multe noduri.
Pentru un exemplu mai complex de problem a crei rezolvare
necesit o cutare iterativ n adncime, vezi 2.2.4.

2.2.4. Strategii de cutare neinformat. Un exemplu

Un exemplu de problem care poate fi rezolvat prin
implementarea oricreia dintre principalele strategii de cutare
neinformat este Problema mutrii blocurilor. Programul care urmeaz
implementeaz succesiv tehnicile de cutare breadth-first, depth-first cu


76
detectarea ciclurilor i respectiv iterative deepening, folosind predicatele
descrise anterior.

Problema Mutarii Blocurilor

S considerm c avem la dispoziie M blocuri, depozitate pe un
teren. Pe suprafaa terenului exist un numr de N locaii de depozitare.
Pentru o mai bun utilizare a spaiului, blocurile pot fi aezate unele
peste altele, n stive. n fiecare locaie de depozitare exist cte o astfel
de stiv, eventual vid. Un bloc poate fi mutat din locul su numai dac
el se afl n vrful unei stive i poate fi aezat numai deasupra unei alte
stive (eventual vide).
Pentru dou configuraii date, C1 i C2, ale aezrii celor M
blocuri n cele N locaii, s se stabileasc dac i cum este posibil s se
ajung n configuraia C2, plecnd din configuraia C1.

Rezolvare:

n Prolog reprezentm o stare a problemei (o configuraie) prin
intermediul unei liste de liste C. Fiecare list din C corespunde unei stive
de blocuri i este ordonat astfel nct blocul din vrful stivei corespunde
capului listei. Stivele vide sunt reprezentate prin liste vide. n cazul
exemplului din Fig. 2.6, termenii Prolog corespunztori lui C1, respectiv
C2 sunt: [[d],[a,b],[c]] si [[ ],[a,b,c,d],[ ]].





77
M = 4, N = 3

C1:






C2:






Fig 2.6

Programul 2.6

%Predicatele specifice problemei mutarii blocurilor

%Definim relatia de succesiune

s(Lista_stive,Lista_stive_rez):-
membru(X,Lista_stive),
X=[Varf|_],
det_poz_el(Lista_stive,N,X),
sterg_la_n(Lista_stive,Lista_stive_inter,N),
membru(Y,Lista_stive),
a
b c
L1 L2 L3
d
L1 L2 L3
b
c
d
a


78
det_poz_el(Lista_stive,N1,Y),N1\==N,
adaug_la_n(Varf,Lista_stive_inter,
Lista_stive_rez,N1),
\+(permutare(Lista_stive,Lista_stive_rez)).

%Predicatul sterg_la_n(Lista_stive,N,X) este folosit
%pentru stergerea capului stivei de pe pozitia N din
%lista de stive Lista_stive.

sterg_la_n([[_|T]|TT],[T|TT],1).
sterg_la_n([H|T],[H|L],N):-
N>1,N1 is N-1,sterg_la_n(T,L,N1).

%Predicatul adaug_la_n(Lista_stive,N,X) este folosit
%pentru adaugarea elementului X in capului stivei
%din lista de stive Lista_stive, de pe pozitia N.

adaug_la_n(H,[T|TT],[[H|T]|TT],1).
adaug_la_n(H,[HH|T],[HH|T1],N):-
N>1,N1 is N-1,adaug_la_n(H,T,T1,N1).

%Prin intermediul predicatelor initial si scop
%definim starile initiale si starile finale.

initial([[d],[a,b],[c]]).

scop([[],[a,b,c,d],[]]).

%Cautare de tip breadth-first

%Predicatul rezolva_b(NodInitial,Solutie) este
%adevarat daca Solutie este un drum (in ordine
%inversa) de la nodul NodInitial la o stare scop,
%drum obtinut folosind cautarea de tip breadth-first.

rezolva_b(NodInitial,Solutie):-


79
breadthfirst([[NodInitial]],Solutie).

%Predicatul breadthfirst(Drumuri,Solutie) este
%adevarat daca un drum din multimea de drumuri
%candidate numita "Drumuri" poate fi extins la o
%stare scop; Solutie este un asemenea drum.

breadthfirst([[Nod|Drum]|_],[Nod|Drum]):-scop(Nod).
breadthfirst([Drum|Drumuri],Solutie):-
extinde(Drum,DrumNoi),
concat(Drumuri,DrumNoi,Drumuri1),
breadthfirst(Drumuri1,Solutie).
extinde([Nod|Drum],DrumNoi):-
bagof([NodNou,Nod|Drum],
(s(Nod,NodNou),
\+(membru(NodNou,[Nod|Drum]))),DrumNoi),
!.
extinde(_,[]).

%Cautare de tip depth-first cu mecanism de detectare
%a ciclurilor

%Predicatul rezolva(Nod,Solutie) este adevarat daca
%Solutie este un drum aciclic (in ordine inversa)
%intre nodul Nod si o stare scop.

rezolva(Nod,Solutie):-depthfirst([],Nod,Solutie).

%Predicatul depthfirst(Drum,Nod,Solutie) este
%adevarat daca, extinzand calea [Nod|Drum] catre o
%stare scop, obtinem drumul Solutie. Semnificatia
%argumentelor sale este: Nod este o stare de la care
%trebuie gasita o cale catre o stare scop, Drum este
%o cale (o lista de noduri) intre starea initiala si
%Nod, Solutie este Drum extins via Nod catre o stare
%scop.


80
depthfirst(Drum,Nod,[Nod|Drum]):-scop(Nod).
depthfirst(Drum,Nod,Solution):-
s(Nod,Nod1),
\+ (membru(Nod1,Drum)),
depthfirst([Nod|Drum],Nod1,Solution).

%Cautare de tip iterative deepening

%Predicatul cale(Nod1,Nod2,Drum) este adevarat daca
%Drum este o cale aciclica intre nodurile Nod1 si
%Nod2, in spatiul starilor; calea Drum este
%reprezentata ca o lista de noduri in ordine inversa.

cale(Nod,Nod,[Nod]).
cale(PrimNod,UltimNod,[UltimNod|Drum]):-
cale(PrimNod,PenultimNod,Drum),
s(PenultimNod,UltimNod),
\+(membru(UltimNod,Drum)).

depth_first_iterative_deepening(Nod,Solutie):-
cale(Nod,NodScop,Solutie),
scop(NodScop),!.

pb_bf:-tell('C:\\bloc_mut_ies_bf.txt'),
initial(S),rezolva_b(S,Solutie),
afisare(Solutie),told.

pb_df:-tell('C:\\bloc_mut_ies_df.txt'),
initial(S),rezolva(S,Solutie),
afisare(Solutie),told.

pb_df_id:-tell('C:\\block_mut_ies_df_id_.txt'),


81
initial(S),
depth_first_iterative_deepening(S,Solutie),
afisare(Solutie),told.

%Predicatul lung(L,N) este adevarat daca N este
%lungimea listei L.

lung([],0).
lung([_|T],N):-lung(T,N1),
N is N1+1.

max(A,B,B):-B>=A,!.
max(A,_,A).

%Predicatul max_lung(L,N) este utilizat pentru
%determinarea celei mai mari lungimi a unei stive din
%lista de stive L.

max_lung([],0).
max_lung([H|T],N):-
max_lung(T,N1),
lung(H,N2),
max(N1,N2,N).

%Predicatul arata(Situatie) este utilizat pentru
%afisarea configuratiei Situatie.

arata(L):-nl,
max_lung(L,N),
afis(L,N,N).

%Determinam mai intai cea mai mare lungime a unei
%stive din L si afisam nivel cu nivel,incepand de la
%ultimul, blocurile din stivele aflate in lista L.



82
afis(L1,_,0):-af(L1).
afis(L1,N,K):-K>0,
afis2(L1,N,K),
nl,
K1 is K-1,
afis(L1,N,K1).

af([]):-write(==).
af([_|T]):-write(===),
af(T).

afis2([],_,_).
afis2([H|T],N,K):-lung(H,L),
(L>=K,L1 is L-K+1,det_el_n(H,L1,R),write(R);
L<K,tab(1)),
tab(2),
afis2(T,N,K).

det_el_n([H|_],1,H).
det_el_n([_|T],K,H):-K>1,
K1 is K-1,
det_el_n(T,K1,H).

det_poz_el([H|_],1,H).
det_poz_el([_|T],K,H):-det_poz_el(T,K1,H),
K is K1+1.

sterg(X,[X|L],L).
sterg(X,[Y|L],[Y|L1]):-sterg(X,L,L1).

permutare([],[]).


83
permutare([H|T],L):-permutare(T,T1),
sterg(H,L,T1).

membru(X,[X|_]).
membru(X,[_|Y]):-membru(X,Y).

concat([],L,L).
concat([H|T],L,[H|T1]):-concat(T,L,T1).

afisare([]).
afisare([H|T]):-afisare(T),
arata(H),
nl.

Interogarea Prologului se face apelnd predicatele pb_bf dac se dorete
o cutare de tip breadth-first, pb_df pentru o cutare de tip depth-first cu
mecanism de detectare a ciclurilor i respectiv pb_df_id pentru o cutare
de tip iterative deepening. Iat un exemplu de execuie:

?- pb_df_id.

Rspunsul sistemului va fi

yes

cu semnificaia c predicatul a fost satisfcut. n fiierul
C:\block_mut_ies_df_id_.txt putem vedea secvena de mutri
prin care s-a ajuns din configuraia iniial n configuraia final. Dup
interogarea anterioar, coninutul fiierului C:\block_ies_bf.txt va
fi urmtorul:


84
a
d b c
===========

a d
b c
===========

d
a b c
===========

b d
a c
===========

b
a d c
===========

b c
a d
===========

b
c
a d
===========
a
b
c
d
===========


85
2.3. Cutarea informat

Cutarea informat se mai numete i cutare euristic. Euristica
este o metod de studiu i de cercetare bazat pe descoperirea de fapte
noi. n acest tip de cutare vom folosi informaia despre spaiul de stri.
Se folosesc cunotine specifice problemei i se rezolv probleme de
optim.

2.3.1. Cutarea de tip best-first

Tipul de cutare pe care l discutm aici se aseamn cu tehnica
breadth-first, numai c procesul nu se desfoar n mod uniform plecnd
de la nodul iniial. El nainteaz n mod preferenial de-a lungul unor
noduri pe care informaia euristic, specific problemei, le indic ca
aflndu-se pe drumul cel mai bun ctre un scop. Un asemenea proces de
cutare se numete cutare euristic sau cutare de tip best-first.
Principiile pe care se bazeaz cutarea de tip best-first sunt
urmtoarele:
1. Se presupune existena unei funcii euristice de evaluare, f

, cu
rolul de a ne ajuta s decidem care nod ar trebui extins la pasul urmtor.
Se va adopta convenia c valori mici ale lui f

indic nodurile cele mai


bune. Aceast funcie se bazeaz pe informaie specific domeniului
pentru care s-a formulat problema. Este o funcie de descriere a strilor,
cu valori reale.
2. Se extinde nodul cu cea mai mic valoare a lui ) (

n f . n cele


86
ce urmeaz, se va presupune c extinderea unui nod va produce toi
succesorii acelui nod.
3. Procesul se ncheie atunci cnd urmtorul nod care ar trebui
extins este un nod-scop.
Fig. 2.7 ilustreaz nceputul unei cutri de tip best-first:























Fig. 2.7
A A
B C D
(3) (5) (1)
A
B C D
E F
(3) (5)
(4) (6)
A
B C D
E F G H
(6) (5)
(5)
(4) (6)
A
B C D
E F G H
(6) (5)
(5)
(6)
I J
(2) (1)


87
n Fig. 2.7 exist iniial un singur nod, A, astfel nct acesta va fi extins.
Extinderea lui genereaz trei noduri noi. Funcia euristic este aplicat
fiecruia dintre acestea. ntruct nodul D este cel mai promitor, el este
urmtorul nod extins. Extinderea lui va produce dou noduri succesor, E
i F, crora li se aplic funcia euristic. n acest moment, un alt drum, i
anume acela care trece prin nodul B, pare mai promitor, astfel nct el
este urmat, generndu-se nodurile G i H. n urma evalurii, aceste
noduri par ins mai puin promitoare dect un alt drum, astfel nct este
ales, n continuare, drumul prin D la E. E este apoi extins producnd
nodurile I i J. La pasul urmtor va fi extins nodul J, ntruct acesta este
cel mai promitor. Procesul continu pn cnd este gsit o soluie.
Pentru a nu fi indui n eroare de o euristic extrem de optimist,
este necesar s nclinm cutarea n favoarea posibilitii de a ne ntoarce
napoi, cu scopul de a explora drumuri gsite mai devreme. De aceea,
vom aduga lui f

un factor de adncime: ), (

) ( ) (

n h n g n f + = unde
) ( n g este o estimaie a adncimii lui n n graf, adic reprezint lungimea
celui mai scurt drum de la nodul de start la n, iar ) (

n h este o evaluare
euristic a nodului n.
Pentru a studia, n cele ce urmeaz, aspectele formale ale cutrii
de tip best-first
14
, vom ncepe prin a prezenta un algoritm de cutare
general bazat pe grafuri. Algoritmul este preluat din [7] i include
versiuni ale cutrii de tip best-first ca reprezentnd cazuri particulare.



14
prezentate, aici, conform [7]


88
2.3.2. Algoritm de cutare general bazat pe grafuri

Acest algoritm, pe care l vom numi GraphSearch, este unul
general, care permite orice tip de ordonare preferat de utilizator -
euristic sau neinformat. Iat o prim variant a definiiei sale:

GraphSearch

1. Creeaz un arbore de cutare,
r
T , care const numai din nodul
de start
0
n . Plaseaz pe
0
n ntr-o list ordonat numit OPEN.
2. Creeaz o list numit CLOSED, care iniial este vid.
3. Dac lista OPEN este vid, EXIT cu eec.
4. Selecteaz primul nod din OPEN, nltur-l din lista OPEN i
include-l n lista CLOSED. Numete acest nod n.
5. Dac n este un nod scop, algoritmul se ncheie cu succes, iar
soluia este cea obinut prin urmarea n sens invers a unui drum de-a
lungul arcelor din arborele
r
T , de la n la
0
n . (Arcele sunt create la pasul
6).
6. Extinde nodul n, genernd o mulime, M, de succesori. Inclu-
de M ca succesori ai lui n n
r
T , prin crearea de arce de la n la fiecare
membru al mulimii M.
7. Reordoneaz lista OPEN, fie n concordan cu un plan arbi-
trar, fie n mod euristic.
8. Mergi la pasul 3.




89
Observaie: Acest algoritm poate fi folosit pentru a efectua
cutri de tip best-first, breadth-first sau depth-first. n cazul
algoritmului breadth-first noile noduri sunt puse la sfritul listei
OPEN (organizat ca o coad), iar nodurile nu sunt reordonate. n
cazul cutrii de tip depth-first noile noduri sunt plasate la
nceputul listei OPEN (organizat ca o stiv). n cazul cutrii de
tip best-first, numit i cutare euristic, lista OPEN este
reordonat n funcie de meritele euristice ale nodurilor.

2.3.2.1. Algoritmul A*

Vom particulariza algoritmul GraphSearch la un algoritm de
cutare best-first care reordoneaz, la pasul 7, nodurile listei OPEN n
funcie de valorile cresctoare ale funciei f

. Aceast versiune a
algoritmului GraphSearch se va numi Algoritmul A*.
Pentru a specifica familia funciilor f

care vor fi folosite,


introducem urmtoarele notaii:
= ) (n h costul efectiv al drumului de cost minim dintre nodul n i
un nod-scop, lund n consideraie toate nodurile-scop posibile i
toate drumurile posibile de la n la ele;
= ) (n g costul unui drum de cost minim de la nodul de start
0
n la
nodul n.
Atunci, ) ( ) ( ) ( n h n g n f + = este costul unui drum de cost minim de la
0
n
la un nod-scop, drum ales dintre toate drumurile care trebuie s treac
prin nodul n.


90
Observaie: ) ( ) (
0 0
n h n f = reprezint costul unui drum de cost
minim nerestricionat, de la nodul
0
n la un nod-scop.

Pentru fiecare nod n, fie ) (

n h , numit factor euristic, o estimaie a


lui ) (n h i fie ) ( n g , numit factor de adncime, costul drumului de cost
minim pn la n gsit de A* pn la pasul curent. Algoritmul A* va
folosi funcia h g f

+ = .
Aa cum se remarc n [7], n definirea Algoritmului A* de pn
acum nu s-a inut cont de urmtoarea problem: ce se ntmpl dac
graful implicit n care se efectueaz cutarea nu este un arbore? Cu alte
cuvinte, exist mai mult dect o unic secven de aciuni care pot
conduce la aceeai stare a lumii plecnd din starea iniial. (Exist situaii
n care fiecare dintre succesorii nodului n l are pe n ca succesor i.e.
aciunile sunt reversibile). Pentru a rezolva astfel de cazuri [7], pasul 6 al
algoritmului GraphSearch trebuie nlocuit cu urmtorul pas 6 :
6. Extinde nodul n, genernd o mulime, M, de succesori care nu
sunt deja prini ai lui n n
r
T . Instaleaz M ca succesori ai lui n n
r
T
prin crearea de arce de la n la fiecare membru al lui M.
Pentru a rezolva problema ciclurilor mai lungi, se nlocuiete
pasul 6 prin urmtorul pas 6:
6. Extinde nodul n, genernd o mulime, M, de succesori care nu
sunt deja strmoi ai lui n n
r
T . Instaleaz M ca succesori ai lui n n
r
T
prin crearea de arce de la n la fiecare membru al lui M.
Desigur, pentru a verifica existena acestor cicluri mai lungi,
trebuie vzut dac structura de date care eticheteaz fiecare succesor al


91
nodului n este egal cu structura de date care eticheteaz pe oricare dintre
strmoii nodului n. Pentru structuri de date complexe, acest pas poate
mri complexitatea algoritmului. Pasul 6 modificat n pasul 6 face ns
ca algoritmul s nu se mai nvrt n cerc, n cutarea unui drum la scop.
Exist nc posibilitatea de a vizita aceeai stare a lumii via
drumuri diferite. O modalitate de a trata aceast problem este ignorarea
ei. Cu alte cuvinte, algoritmul nu verific dac un nod din mulimea M se
afl deja n listele OPEN sau CLOSED. Algoritmul uit deci posibilitatea
de a ajunge n aceleai noduri urmnd drumuri diferite. Acest acelai
nod s-ar putea repeta n
r
T de attea ori de cte ori algoritmul descoper
drumuri diferite care duc la el. Dac dou noduri din
r
T sunt etichetate cu
aceeai structur de date, vor avea sub ele subarbori identici. Prin urmare,
algoritmul va duplica anumite eforturi de cutare.
Pentru a preveni duplicarea efortului de cutare atunci cnd nu
s-au impus condiii suplimentare asupra lui f

, sunt necesare nite


modificri n algoritmul A*, i anume: deoarece cutarea poate ajunge la
acelai nod de-a lungul unor drumuri diferite, algoritmul A* genereaz un
graf de cutare, notat cu G. G este structura de noduri i de arce generat
de A* pe msur ce algoritmul extinde nodul iniial, succesorii lui
.a.m.d.. A* menine i un arbore de cutare,
r
T .
r
T , un subgraf al lui G, este arborele cu cele mai bune drumuri
(de cost minim) produse pn la pasul curent, drumuri pn la toate
nodurile din graful de cutare. Prin urmare, unele drumuri pot fi n graful
de cutare, dar nu i n arborele de cutare. Graful de cutare este
meninut deoarece cutri ulterioare pot gsi drumuri mai scurte, care


92
folosesc anumite arce din graful de cutare anterior ce nu se aflau i n
arborele de cutare anterior.
Dm, n continuare, versiunea algoritmului A* care menine
graful de cutare. n practic, aceast versiune este folosit mai rar
deoarece, de obicei, se pot impune condiii asupra lui f

care garanteaz
faptul c, atunci cnd algoritmul A* extinde un nod, el a gsit deja
drumul de cost minim pn la acel nod.

Algoritmul A*

1. Creeaz un graf de cutare G, constnd numai din nodul iniial
0
n . Plaseaz
0
n ntr-o list numit OPEN.
2. Creeaz o list numit CLOSED, care iniial este vid.
3. Dac lista OPEN este vid, EXIT cu eec.
4. Selecteaz primul nod din lista OPEN, nltur-l din OPEN i
plaseaz-l n lista CLOSED. Numete acest nod n.
5. Dac n este un nod scop, oprete execuia cu succes.
Returneaz soluia obinut urmnd un drum de-a lungul pointerilor de la
n la
0
n n G. (Pointerii definesc un arbore de cutare i sunt stabilii la
pasul 7).
6. Extinde nodul n, genernd o mulime, M, de succesori ai lui
care nu sunt deja strmoi ai lui n n G. Instaleaz aceti membri ai lui M
ca succesori ai lui n n G.
7. Stabilete un pointer ctre n de la fiecare dintre membrii lui M
care nu se gseau deja n G (adic nu se aflau deja nici n OPEN, nici n
CLOSED). Adaug aceti membri ai lui M listei OPEN. Pentru fiecare


93
membru, m, al lui M, care se afla deja n OPEN sau n CLOSED,
redirecioneaz pointerul su ctre n, dac cel mai bun drum la m gsit
pn n acel moment trece prin n. Pentru fiecare membru al lui M care se
afl deja n lista CLOSED, redirecioneaz pointerii fiecruia dintre
descendenii si din G astfel nct acetia s inteasc napoi de-a lungul
celor mai bune drumuri pn la aceti descendeni, gsite pn n acel
moment.
8. Reordoneaz lista OPEN n ordinea valorilor cresctoare ale
funciei f

. (Eventuale legturi ntre valori minimale ale lui f

sunt
rezolvate n favoarea nodului din arborele de cutare aflat la cea mai
mare adncime).
9. Mergi la pasul 3.


Observaie: La pasul 7 sunt redirecionai pointeri de la un nod
dac procesul de cutare descoper un drum la acel nod care are
costul mai mic dect acela indicat de pointerii existeni.
Redirecionarea pointerilor descendenilor nodurilor care deja se
afl n lista CLOSED economisete efortul de cutare, dar poate
duce la o cantitate exponenial de calcule. De aceea, aceast
parte a pasului 7 de obicei nu este implementat. Unii dintre
aceti pointeri vor fi pn la urm redirecionai oricum, pe
msur ce cutarea progreseaz.





94
2.3.2.1.1. Admisibilitatea Algoritmului A*

Exist anumite condiii asupra grafurilor i a lui h

care
garanteaz c algoritmul A*, aplicat acestor grafuri, gsete ntotdeauna
drumuri de cost minim. Condiiile asupra grafurilor sunt:
1. Orice nod al grafului, dac admite succesori, are un numr finit
de succesori.
2. Toate arcele din graf au costuri mai mari dect o cantitate
pozitiv, .
Condiia asupra lui h

este:
3. Pentru toate nodurile n din graful de cutare, ) ( ) (

n h n h . Cu
alte cuvinte, h

nu supraestimeaz niciodat valoarea efectiv h . O


asemenea funcie h

este uneori numit un estimator optimist.



Observaii:
1. Este relativ uor s se gseasc, n probleme, o funcie h

care
satisface aceast condiie a limitei de jos. De exemplu, n probleme de
gsire a drumurilor n cadrul unor grafuri ale cror noduri sunt orae,
distana de tip linie dreapt de la un ora n la un ora-scop constituie o
limit inferioar asupra distanei reprezentnd un drum optim de la nodul
n la nodul-scop.
2. Cu cele trei condiii formulate anterior, algoritmul A*
garanteaz gsirea unui drum optim la un scop, n cazul n care exist un
drum la scop.



95
n cele ce urmeaz, formulm acest rezultat sub forma unei
teoreme:

Teorema 2.1
Atunci cnd sunt ndeplinite condiiile asupra grafurilor i asupra
lui h

enunate anterior i cu condiia s existe un drum de cost finit de la


nodul iniial,
0
n , la un nod-scop, algoritmul A* garanteaz gsirea unui
drum de cost minim la un scop.
Demonstraia teoremei:
Cea mai important component a demonstraiei este urmtoarea
lem:
Lema 2.1
nainte de terminarea Algoritmului A*, la fiecare pas, exist
ntotdeauna un nod, de exemplu n*, n lista OPEN, cu urmtoarele
proprieti:
1. n* este pe un drum optim la un scop.
2. A* a gsit un drum optim pn la n*.
3. ) ( ) (

0
n f n f

.
Presupunnd aceast lem ca fiind demonstrat (vezi p. 97),
continum demonstraia teoremei: vom arta c algoritmul A* se termin
dac exist un scop accesibil i, mai mult, c el se termin prin gsirea
unui drum optim la un scop.
Artm c A* se termin: s presupunem c algoritmul nu se
termin. n acest caz, A* continu s extind noduri la infinit i, la un
moment dat, ncepe s extind noduri la o adncime mai mare n arborele


96
de cutare dect orice limitare finit a adncimii. (S-a presupus c graful
n care se face cutarea are factor de ramificare finit). ntruct costul
fiecrui arc este mai mare dect 0 > , valorile lui g (i, prin urmare, i
cele ale lui f

) ale tuturor nodurilor din OPEN vor depi, pn la urm,


pe ) (
0
n f . Dar acest lucru contrazice Lema 2.1.
Artm c A* se termin cu gsirea unui drum optim: A* se
poate termina numai la pasul 3 (dac lista OPEN este vid) sau la pasul 5
(ajungndu-se ntr-un nod-scop).
O terminare la pasul 3 poate interveni numai n cazul unor grafuri
finite care nu conin nici un nod-scop, iar teorema afirm c este gsit un
drum optim la un scop numai dac un nod-scop exist. Prin urmare, A*
se termin prin gsirea unui nod-scop.
S presupunem acum c A* se termin prin gsirea unui scop care
nu este optim, de exemplu prin gsirea lui
2 g
n cu ) ( ) (
0 2
n f n f
g
> i n
condiiile n care exist un scop optim,
2 1 g g
n n , cu ) ( ) (
0 1
n f n f
g
= .
Atunci cnd are loc terminarea n nodul
2 g
n , ) ( ) ( ) (

0 2 2
n f n f n f
g g
> .
Dar, chiar nainte ca A* s l selecteze pe
2 g
n pentru extindere, conform
Lemei 2.1, a existat un nod n* n OPEN i aflat pe un drum optim, cu
) ( ) (

0
n f n f

. Prin urmare, A* nu ar fi putut s l selecteze pe


2 g
n
pentru extindere, deoarece A* selecteaz ntotdeauna acel nod avnd cea
mai mic valoare a lui f

i ) ( ) ( ) (

2 0 g
n f n f n f <

. Deci teorema a fost


demonstrat.



97
Demonstraia lemei:
Demonstraia Lemei 2.1 se va face prin inducie. Pentru a
demonstra c la fiecare pas al lui A* concluziile lemei sunt valabile, este
suficient s demonstrm c:
(1) sunt valabile la nceputul algoritmului;
(2) dac sunt valabile nainte de extinderea unui nod, vor continua s fie
valabile i dup extinderea nodului.
(1) Cazul de baz: la nceputul cutrii, cnd numai nodul
0
n a fost
selectat pentru extindere, nodul
0
n este n OPEN, el este un drum
optim la scop i A* a gsit acest drum. De asemenea, ) ( ) (

0 0
n f n f
deoarece ) ( ) (

) (

0 0 0
n f n h n f = . Astfel, nodul
0
n poate fi, n acest
stadiu, nodul n* al lemei.
(2) Pasul de inducie: presupunem adevrate concluziile lemei la
momentul la care au fost extinse m noduri ) 0 ( m i, folosind
aceast presupunere, artm c ele sunt adevrate la momentul la care
au fost extinse m+1 noduri.
Fie n* nodul din ipotez i din lista OPEN, nod care se afl pe un
drum optim gsit de algoritmul A* dup ce au fost extinse m noduri.
Cazul I. Dac n* nu este selectat pentru extindere la pasul m+1,
n* are aceleai proprieti pe care le avea nainte, deci pasul de inducie
este demonstrat n acest caz. Fig. 2.8 corespunde acestei situaii i
prezint Algoritmul A* selectnd nodul n
1
ca fiind al (m+1)-lea nod
extins:




98













Fig. 2.8

Cazul II. Dac n* este selectat pentru extindere, toi succesorii si
noi vor fi pui n lista OPEN. Cel puin unul dintre ei, s presupunem n
p
,
va fi pe un drum optim la un scop (deoarece, prin ipotez, un drum optim
trece prin n* i deci trebuie s continue prin unul dintre succesorii si).
A* a gsit un drum optim la n
p
deoarece, dac ar exista un drum mai bun
la n
p
, acel drum mai bun ar reprezenta i un drum mai bun ctre scop,
contrazicnd ipoteza c nu exist un drum mai bun ctre scop dect cel
gsit de A* ca trecnd prin n*. Deci, n acest caz, permitem lui n
p
s fie
noul n* pentru pasul al (m+1)-lea. Fig. 2.9 ilustreaz situaia n care A*
selecteaz pe n* ca fiind al (m+1)-lea nod care se extinde. Pasul de
inducie este demonstrat, cu excepia proprietii ) ( ) (

0 0
n f n f .












OPEN
n
1









n
0

CLOSED
n*


99












Fig. 2.9

Demonstrm acum proprietatea ) ( ) (

0 0
n f n f pentru toi paii m
dinaintea terminrii algoritmului. Pentru orice nod, n*, aflat pe un drum
optim i pn la care A* a gsit un drum optim, avem:
+ =

) (

) ( ) (

n h n g n f (prin definiie)
+

) ( ) ( n h n g deoarece

=


) ( ) (

) ( ) (
n h n h
n g n g



) (n f deoarece ) ( ) ( ) (

= + n f n h n g prin
definiie
) (
0
n f deoarece ) ( ) (
0
n f n f =

, ntruct n* se
afl pe un drum optim, ceea ce completeaz demonstraia lemei.

n
p













OPEN
n
*









n
0

CLOSED


100
Definiia 2.1
Orice algoritm care garanteaz gsirea unui drum optim la scop
este un algoritm admisibil.

Prin urmare, atunci cnd cele trei condiii ale Teoremei 2.1 sunt
ndeplinite, A* este un algoritm admisibil. Prin extensie, vom spune c
orice funcie h

care nu supraestimeaz pe h este admisibil.


n cele ce urmeaz, atunci cnd ne vom referi la Algoritmul A*,
vom presupune c cele trei condiii ale Teoremei 2.1 sunt verificate.
Dac dou versiuni ale lui A*, A*
1
i A*
2
, difer ntre ele numai
prin aceea c
2 1

h h < pentru toate nodurile care nu sunt noduri-scop, vom
spune c A*
2
este mai informat dect A*
1
. Referitor la aceast situaie,
formulm urmtoarea teorem, fr a intra n detaliile demonstrrii ei:

Teorema 2.2
Dac algoritmul A*
2
este mai informat dect A*
1
, atunci la
terminarea cutrii pe care cei doi algoritmi o efectueaz asupra oricrui
graf avnd un drum de la
0
n la un nod-scop, fiecare nod extins de ctre
A*
2
este extins i de ctre A*
1
.

Rezult de aici c A*
1
extinde cel puin tot attea noduri cte
extinde A*
2
i, prin urmare, algoritmul mai informat A*
2
este i mai
eficient. n concluzie, se caut o funcie h

ale crei valori sunt ct se


poate de apropiate de cele ale funciei h (pentru o ct mai mare eficien
a cutrii), dar fr s le depeasc pe acestea (pentru admisibilitate).


101
Desigur, pentru a evalua eficiena total a cutrii, trebuie luat n
consideraie i costul calculrii lui h

.

Observatie: Atunci cnd = = ) ( ) (

n g n f adncime(n), se obine
cutarea de tip breadth-first. Algoritmul breadth-first reprezint
un caz particular al lui A* (cu 0

h ), prin urmare el este un


algoritm admisibil.

2.3.2.1.2. Condiia de consisten

Fie o pereche de noduri ) , (
j i
n n astfel nct
j
n este un succesor
al lui
i
n .

Definiia 2.2
Se spune c h

ndeplinete condiia de consisten dac, pentru


orice astfel de pereche ) , (
j i
n n de noduri din graful de cutare,
) , ( ) (

) (

j i j i
n n c n h n h ,
unde ) , (
j i
n n c este costul arcului de la
i
n la
j
n .

Condiia de consisten mai poate fi formulat i sub una din
formele urmtoare:
) , ( ) (

) (

j i j i
n n c n h n h + sau ) , ( ) (

) (

j i i j
n n c n h n h ,
ceea ce conduce la urmtoarea interpretare a ei: de-a lungul oricrui
drum din graful de cutare, estimaia fcut asupra costului optim rmas


102
pentru a atinge scopul nu poate descrete cu o cantitate mai mare dect
costul arcului de-a lungul acelui drum. Se spune c funcia euristic este
local consistent atunci cnd se ia n consideraie costul cunoscut al unui
arc.
Condiia de consisten:





) (

) , ( ) (

j j i i
n h n n c n h +
Condiia de consisten implic faptul c valorile funciei f


corespunztoare nodurilor din arborele de cutare descresc monoton pe
msur ce ne ndeprtm de nodul de start.
Fie
i
n i
j
n dou noduri n arborele de cutare generat de
algoritmul A*, cu
j
n succesor al lui
i
n . Atunci, dac condiia de
consisten este satisfcut, avem:
) (

) (

i j
n f n f .
Demonstraie:
Pentru a demonstra acest fapt, se ncepe cu condiia de
consisten:
) , ( ) (

) (

j i i j
n n c n h n h
Se adun apoi ) (
j
n g n ambii membri ai inegalitii anterioare ( g este
factor de adncime, adic o estimaie a adncimii nodului):
) , (
j i
n n c

) (

j
n h

n
j

n
i

) (

i
n h



103
) , ( ) ( ) (

) ( ) (

j i j i j j
n n c n g n h n g n h + +
Dar ) , ( ) ( ) (
j i i j
n n c n g n g + = , adic adncimea nodului
j
n este
adncimea lui
i
n plus costul arcului de la
i
n la
j
n . Dac egalitatea nu ar
avea loc,
j
n nu ar fi un succesor al lui
i
n n arborele de cutare. Atunci:
) , ( ) , ( ) ( ) (

) ( ) (

j i j i i i j j
n n c n n c n g n h n g n h + + + ,
deci ) (

) (

i j
n f n f .

Din aceast cauz, condiia de consisten asupra lui h

este adesea
numit condiie de monotonie asupra lui f

.
Exist urmtoarea teorem referitoare la condiia de consisten:

Teorema 2.3
Dac este satisfcut condiia de consisten asupra lui h

, atunci,
n momentul n care algoritmul A* extinde un nod n, el a gsit deja un
drum optim pn la n.
Demonstraie:
S presupunem c A* se pregtete s extind un nod n (n este un
nod deschis, adic un nod din lista OPEN), n cutarea unui drum
optim de la un nod de start
0
n la un nod-scop, ntr-un graf implicit G.
Fie ) ,...., , ,....., , (
1 1 0 k l l
n n n n n n = =
+
o secven de noduri din G
care constituie un drum optim de la
0
n la n. Fie
l
n ultimul nod din
extins de A*. ntruct
l
n este ultimul nod nchis din , adic ultimul


104
din lista CLOSED, tim c
1 + l
n este n lista OPEN i deci reprezint un
candidat pentru extindere.
Pentru orice nod
i
n i succesorul su
1 + i
n din , avem
15

) (

) ( ) (

) , ( ) ( ) (

) (
1 1 1 1 i i i i i i i i
n h n g n h n n c n g n h n g + + + = +
+ + + +
,
atunci cnd condiia de consisten este satisfcut.
Tranzitivitatea relaiei ne d:
) (

) ( ) (

) (
i i j j
n h n g n h n g + + pentru
j i
n n , de pe dac j i < .
n particular,
) (

) (

) ( ) (

) (
1 1 1 + + +
= + +
l l l
n f n h n g n h n g
deoarece A* a gsit un drum optim pn la
1 + l
n , fcnd
) ( ) (
1 1 + +
=
l l
n g n g .
Dar, ntruct A* se pregtete s extind nodul n n locul nodului
1 + l
n , nseamn c :
) (

) (

) ( ) (

1 +
+ =
l
n f n h n g n f (1)
S-a stabilit deja c
) (

) ( ) (

1
n h n g n f
l
+
+
(2)
Din (1) i (2) rezult
) (

) ( ) (

) ( n h n g n h n g + +
Prin urmare,
) ( ) ( n g n g .

15
deoarece ) ( ) , ( ) (
1 1 + +
= +
i i i i
n g n n c n g i din condiia de consisten
), , ( ) (

) (

j i j i
n n c n h n h + cu
j
n succesor; aici
1 +

i j
n n .


105
Dar, ntruct metoda de calcul a funciilor g implic inegalitatea
) ( ) ( n g n g , nseamn c ) ( ) ( n g n g = , ceea ce arat c, fie n n
l
=
+1
, fie
a fost deja gsit un alt drum optim pn la nodul n.

Observaie: Condiia de consisten este extrem de important
deoarece, atunci cnd este satisfcut, algoritmul A* nu trebuie s
redirecioneze niciodat pointeri la pasul 7. Cutarea ntr-un graf
nu difer atunci prin nimic de cutarea n cadrul unui arbore.

2.3.2.1.3. Optimalitatea Algoritmului A*

Fie G o stare-scop optimal cu un cost al drumului notat f*. Fie
G
2
o a doua stare-scop, suboptimal, care este o stare-scop cu un cost al
drumului
g(G
2
)>f*
Presupunem c A* selecteaz din coad, pentru extindere, pe G
2
.
ntruct G
2
este o stare-scop, aceast alegere ar ncheia cutarea cu o
soluie suboptimal. Vom arta c acest lucru nu este posibil.
Fie un nod n, care este, la pasul curent, un nod frunz pe un drum
optim la G. (Un asemenea nod trebuie s existe, n afara cazului n care
drumul a fost complet extins, caz n care algoritmul ar fi returnat G).
Pentru acest nod n, ntruct h este admisibil, trebuie s avem:
) (n f f

(1)
Mai mult, dac n nu este ales pentru extindere n favoarea lui G
2
,
trebuie s avem:


106
) ( ) (
2
G f n f (2)
Combinnd (1) cu (2) obinem:
) (
2
G f f

(3)
Dar, deoarece G
2
este o stare-scop, avem 0 ) (
2
= G h . Prin urmare,
) ( ) (
2 2
G g G f = (4)
Cu presupunerile fcute, conform (3) i (4) am artat c
) (
2
G g f


Aceast concluzie contrazice faptul c G
2
este suboptimal. Ea arat c
A* nu selecteaz niciodat pentru extindere un scop suboptimal. A*
ntoarce o soluie numai dup ce a selectat-o pentru extindere, de aici
rezultnd faptul c A* este un algoritm optim.

2.3.2.1.4. Completitudinea Algoritmului A*

ntruct A* extinde noduri n ordinea valorilor cresctoare ale lui
f, n final va exista o extindere care conduce la o stare-scop. Acest lucru
este adevrat, n afara cazului n care exist un numr foarte mare de
noduri, numr care tinde la infinit, cu

< f n f ) ( .
Singura modalitate n care ar putea exista un numr infinit de
noduri ar fi aceea n care:
exist un nod cu factor de ramificare infinit;
exist un drum cu un cost finit, dar care are un numr infinit de
noduri. (Acest lucru ar fi posibil conform paradoxului lui Zeno,
care vrea s arate c o piatr aruncat spre un copac nu va ajunge


107
niciodat la acesta. Astfel, se imagineaz c traiectoria pietrei este
mprit ntr-un ir de faze, fiecare dintre acestea acoperind
jumtate din distana rmas pn la copac. Aceasta conduce la un
numr infinit de pai cu un cost total finit).
Prin urmare, exprimarea corect este aceea c A* este complet
relativ la grafuri local finite, adic grafuri cu un factor de ramificare finit,
cu condiia s existe o constant pozitiv astfel nct fiecare operator
s coste cel puin .

2.3.2.1.5. Complexitatea Algoritmului A*

S-a artat (demonstraie pe care nu o vom reproduce n cadrul
restrns al acestui curs) c o cretere exponenial va interveni, n afara
cazului n care eroarea n funcia euristic nu crete mai repede dect
logaritmul costului efectiv al drumului. Cu alte cuvinte, condiia pentru o
cretere subexponenial este:
)) ( (log ) ( ) ( n h O n h n h

,
unde ) (n h

este adevratul cost de a ajunge de la n la scop.


n afar de timpul mare calculator, algoritmul A* consum i mult
spaiu de memorie deoarece pstreaz n memorie toate nodurile
generate.
Algoritmi de cutare mai noi, de tip memory-bounded (cu
limitare a memoriei), au reuit s nlture neajunsul legat de problema
spaiului de memorie folosit, fr a sacrifica optimalitatea sau
completitudinea. Unul dintre acetia este algoritmul IDA*.


108
2.3.2.2. Iterative Deepening A* (IDA*)

Algoritmul IDA* se refer la o cutare iterativ n adncime de
tip A* i este o extensie logic a lui Iterative Deepening Search care
folosete, n plus, informaia euristic.
n cadrul acestui algoritm fiecare iteraie reprezint o cutare de
tip depth-first, iar cutarea de tip depth-first este modificat astfel nct
ea s foloseasc o limit a costului i nu o limit a adncimii.
Faptul c n cadrul algoritmului A* f nu descrete niciodat de-a
lungul oricrui drum care pleac din rdcin ne permite s trasm, din
punct de vedere conceptual, contururi n spaiul strilor. Astfel, n
interiorul unui contur, toate nodurile au valoarea f(n) mai mic sau egal
cu o aceeai valoare. n cazul algoritmului IDA* fiecare iteraie extinde
toate nodurile din interiorul conturului determinat de costul f curent, dup
care se trece la conturul urmtor. De ndat ce cutarea n interiorul unui
contur dat a fost completat, este declanat o nou iteraie, folosind un
nou cost f, corespunztor urmtorului contur. Fig. 2.10 prezint cutri
iterative n interiorul cte unui contur.
Algoritmul IDA* este complet i optim cu aceleai amendamente
ca i A*. Deoarece este de tip depth-first nu necesit dect un spaiu
proporional cu cel mai lung drum pe care l exploreaz.
Dac este cel mai mic cost de operator, iar f* este costul
soluiei optime, atunci, n cazul cel mai nefavorabil, IDA* va necesita
spaiu pentru memorarea a

bf
noduri, unde b este acelai factor de
ramificare.


109
Complexitatea de timp a algoritmului depinde n mare msur de
numrul valorilor diferite pe care le poate lua funcia euristic.












Fig. 2.10

2.3.3. Implementarea n Prolog a cutarii de tip best-first

Pentru o mai bun nelegere a metodei, n cele ce urmeaz,
prezentarea cutrii de tip best-first, n vederea implementrii ei n
Prolog, se va face conform abordrii din [1].
Astfel, vom imagina cutarea de tip best-first funcionnd n
felul urmtor: cutarea const dintr-un numr de subprocese
"concurente", fiecare explornd alternativa sa, adic propriul subarbore.
Subarborii au subarbori, care vor fi la rndul lor explorai de subprocese
ale subproceselor, .a.m.d.. Dintre toate aceste subprocese doar unul este
Q
T
C
G
B
F
R
Z
U
V
S A
P


110
activ la un moment dat i anume cel care se ocup de alternativa cea mai
promitoare (adic alternativa corespunztoare celei mai mici
f

- valori). Celelalte procese ateapt pn cnd f

- valorile se schimb
astfel nct o alt alternativ devine mai promitoare, caz n care
procesul corespunztor acesteia devine activ. Acest mecanism de
activare-dezactivare poate fi privit dup cum urmeaz: procesului
corespunztor alternativei curente de prioritate maxim i se aloc un
buget i, atta vreme ct acest buget nu este epuizat, procesul este activ.
Pe durata activitii sale, procesul i expandeaz propriul subarbore, iar
n cazul atingerii unei stri-scop este anunat gsirea unei soluii.
Bugetul acestei funcionri este determinat de f

-valoarea
corespunztoare celei mai apropiate alternative concurente.
Ilustrm aceast idee n exemplul urmtor. Considerm oraele s,
a, b, c, d, e, f, g, t unite printr-o reea de drumuri ca n Fig. 2.11. Aici
fiecare drum direct ntre dou orae este etichetat cu lungimea sa;
numrul din csua alturat unui ora reprezint distana n linie dreapt
ntre oraul respectiv i oraul t. Ne punem problema determinrii celui
mai scurt drum ntre oraul s i oraul t utiliznd strategia best-first.
Definim n acest scop funcia h

bazndu-ne pe distana n linie dreapt


ntre dou orae. Astfel, pentru un ora X, definim
( ) ( ) ( ) ( ) ( ) X,t dist X g X h X g X f + = + =


unde ( ) X,t dist reprezint distana n linie dreapt ntre X i t.
n acest exemplu, cutarea de tip best-first este efectuat prin
intermediul a dou procese, P
1
si P
2
, ce exploreaz fiecare cte una din


111
cele dou ci alternative. Calea de la s la t via nodul a corespunde
procesului P
1
, iar calea prin nodul e corespunde procesului P
2
.











Fig. 2.11

n stadiile iniiale, procesul P
1
este mai activ, deoarece
f

- valorile de-a lungul cii corespunztoare lui sunt mai mici dect
f

- valorile de-a lungul celeilalte ci. Atunci cnd P


1
exploreaz c,
iar procesul P
2
este nc la e, ( ) ( ) ( ) 10 4 6

= + = + = c h c g c f ,
( ) ( ) ( ) 9 7 2

= + = + = e h e g e f i deci ( ) ( ) c f e f

< . n acest moment,
situaia se schimb: procesul P
2
devine activ, iar procesul P
1
intr n
ateptare. n continuare, ( ) 10 = c f

, ( ) 11 = f f

, ( ) ( ) f f c f

< i deci P
1

devine activ i P
2
intr n ateptare. Pentru c ( ) 11 12 > = d f

, procesul P
1

va reintra n ateptare, iar procesul P
2
va rmne activ pn cnd se va
atinge starea scop t.
2
2
2
3
2
5
2
7
s
e
c
b
f
d
t
g
4
4
3
4
5
2
2
3
a
scop


112
Cutarea schiat mai sus pornete din nodul iniial i este
continuat cu generarea unor noduri noi, conform relaiei de succesiune.
n timpul acestui proces, este generat un arbore de cutare, a crui
rdcin este nodul de start. Acest arbore este expandat n direcia cea
mai promitoare conform f

- valorilor, pn la gsirea unei soluii.


n vederea implementrii n Prolog, vom extinde definiia lui f

,
de la noduri n spaiul strilor, la arbori, astfel:
pentru un arbore cu un singur nod N, avem egalitate ntre
f

- valoarea sa i ( ) N f

;
pentru un arbore T cu rdcina N i subarborii , S , S
2 1
definim
) (

min ) (

i
i
S f T f =
n implementarea care urmeaz, vom reprezenta arborele de
cutare prin termeni Prolog de dou forme, i anume:
( ) N,F/G l corespunde unui arbore cu un singur nod N; N este nod
n spaiul strilor, G este ( ) N g

(considerm ( ) N g

ca fiind costul
drumului ntre nodul de start i nodul N), ( ) N h G F

+ = .
( ) s N,F/G, Sub t corespunde unui arbore cu subarbori nevizi; N
este rdcina sa, Subs este lista subarborilor si, G este ( ) N g

, F
este f

- valoarea actualizat a lui N, adic este f

- valoarea celui
mai promitor succesor al lui N; de asemenea, Subs este ordonat
cresctor conform f

- valorilor subarborilor constitueni.




113
Recalcularea f

- valorilor este necesar pentru a permite programului s


recunoasc cel mai promitor subarbore, la fiecare nivel al arborelui de
cutare (adic arborele care conine cel mai promitor nod terminal).
n exemplul anterior, n momentul n care nodul s tocmai a fost
extins, arborele de cutare va avea 3 noduri: rdcina s i copiii a si e.
Acest arbore va fi reprezentat, n program, prin intermediul termenului
Prolog | | ( ) ) / ),l(e, / l(a, , / s, t 2 9 2 7 0 7 . Observm c f

- valoarea lui s este 7,


adic f

- valoarea celui mai promitor subarbore al su. n continuare va


fi expandat subarborele de rdcin a. Cel mai apropiat competitor al lui
a este e; cum ( ) 9 = e f

, rezult c subarborele de rdcin a se poate


expanda atta timp ct f

- valoarea sa nu va depi 9. Prin urmare, sunt


generate b si c. Deoarece ( ) 10 = c f

, rezult c limita de expandare a fost


depit i alternativa a nu mai poate "crete". n acest moment, termenul
Prolog corespunztor subarborelui de cutare este urmtorul:
| | | | ( ) | | ( ) ) ) / l(c, , / t(b, , / a, ),t / l(e, , / s, t 6 10 4 10 2 10 2 9 0 9
n implementarea care urmeaz, predicatul cheie va fi predicatul
expandeaza:
expandeaza(Drum,Arb,Limita,Arb1,Rez,Solutie)
Argumentele sale au urmtoarele semnificaii:
Drum reprezint calea ntre nodul de start al cutrii i Arb
Arb este arborele (subarborele) curent de cutare
Limita este f

- limita pentru expandarea lui Arb


Rez este un indicator a crui valoare poate fi da, nu,
imposibil


114
Solutie este o cale de la nodul de start ("prin Arb1") ctre un
nod-scop (n limita Limita), dac un astfel de nod-scop exist.
Drum, Arb i Limita sunt parametrii de intrare pentru
expandeaza (n sensul c ei sunt deja instaniati atunci cnd expandeaza
este folosit). Prin utilizarea predicatului expandeaza se pot obine trei
feluri de rezultate, rezultate indicate prin valoarea argumentului Rez,
dup cum urmeaz:
Rez=da, caz n care Solutie va unifica cu o cale soluie gsit
expandnd Arb n limita Limita (adic fr ca f

- valoarea s
depeasc limita Limita ); Arb1 va rmne neinstaniat;
Rez=nu, caz n care Arb1 va fi, de fapt, Arb expandat pn cnd
f

- valoarea sa a depit Limita; Solutie va rmne neinstaniat;


Rez=imposibil, caz n care argumentele Arb1 i Solutie vor
rmne neinstaniate; acest ultim caz indic faptul c explorarea
lui Arb este o alternativ moart, deci nu trebuie s i se mai dea
o ans pentru reexplorare n viitor; acest caz apare atunci cnd
f

- valoarea lui Arb este mai mic sau egal dect Limita, dar
arborele nu mai poate fi expandat, fie pentru c nici o frunz a sa
nu mai are succesori, fie pentru c un astfel de succesor ar crea un
ciclu.
Vom prezenta n continuare o implementare a unei variante a metodei
best-first [1], n SICStus Prolog, implementare care folosete
considerentele anterioare.




115
Strategia best-first

%Predicatul bestfirst(Nod_initial,Solutie) este
%adevarat daca Solutie este un drum (obtinut folosind
%strategia best-first) de la nodul Nod_initial la o
%stare-scop.

bestfirst(Nod_initial,Solutie):-
expandeaza([],l(Nod_initial,0/0),9999999,_,
da,Solutie).

expandeaza(Drum,l(N,_),_,_, da,[N|Drum]):-scop(N).

%Caz 1: daca N este nod-scop, atunci construim o
%cale-solutie.

expandeaza(Drum,l(N,F/G),Limita,Arb1,Rez,Sol):-
F=<Limita,
(bagof(M/C,(s(N,M,C), \+ (membru(M,Drum))),Succ),!,
listasucc(G,Succ,As),
cea_mai_buna_f(As,F1),
expandeaza(Drum,t(N,F1/G,As),Limita,Arb1, Rez,Sol);
Rez=imposibil).

%Caz 2: Daca N este nod-frunza a carui f

-valoare
%este mai mica decat Limita,atunci ii generez
%succesorii si ii expandez in limita Limita.

expandeaza(Drum,t(N,F/G,[A|As]),Limita,Arb1,Rez,
Sol):-
F=<Limita,
cea_mai_buna_f(As,BF),
min(Limita,BF,Limita1),


116
expandeaza([N|Drum],A,Limita1,A1,Rez1,Sol),
continua(Drum,t(N,F/G,[A1|As]),Limita,Arb1,
Rez1,Rez,Sol).

%Caz 3: Daca arborele de radacina N are subarbori
%nevizi si f

-valoarea este mai mica decat Limita,


%atunci expandam cel mai "promitator" subarbore al
%sau; in functie de rezultatul obtinut, Rez, vom
%decide cum anume vom continua cautarea prin
%intermediul procedurii (predicatului) continua.

expandeaza(_,t(_,_,[]),_,_,imposibil,_):-!.

%Caz 4: pe aceasta varianta nu o sa obtinem niciodata
%o solutie.

expandeaza(_,Arb,Limita,Arb,nu,_):-
f(Arb,F),
F>Limita.

%Caz 5: In cazul unor f

-valori mai mari decat Bound,


%arborele nu mai poate fi extins.

continua(_,_,_,_,da,da,Sol).
continua(P,t(N,F/G,[A1|As]),Limita,Arb1,nu,Rez,Sol):-
insereaza(A1,As,NAs),
cea_mai_buna_f(NAs,F1),
expandeaza(P,t(N,F1/G,NAs),Limita,Arb1,Rez,Sol).
continua(P,t(N,F/G,[_|As]),Limita,Arb1,imposibil,Rez,
Sol):-cea_mai_buna_f(As,F1),
expandeaza(P,t(N,F1/G,As),Limita,Arb1,Rez,Sol).

listasucc(_,[],[]).
listasucc(G0,[N/C|NCs],Ts):-


117
G is G0+C,
h(N,H),
F is G+H,
listasucc(G0,NCs,Ts1),
insereaza(l(N,F/G),Ts1,Ts).

%Predicatul insereaza(A,As,As1) este utilizat pentru
%inserarea unui arbore A intr-o lista de arbori As,
%mentinand ordinea impusa de f

-valorile lor.

insereaza(A,As,[A|As]):-
f(A,F),
cea_mai_buna_f(As,F1),
F=<F1,!.
insereaza(A,[A1|As],[A1|As1]):-insereaza(A,As,As1).

min(X,Y,X):-X=<Y,!.
min(_,Y,Y).

f(l(_,F/_),F). % f-val unei frunze
f(t(_,F/_,_),F). % f-val unui arbore

%Predicatul cea_mai_buna_f(As,F) este utilizat pentru
%a determina cea mai buna f

-valoare a unui arbore din


%lista de arbori As, daca aceasta lista este nevida;
%lista As este ordonata dupa f

-valorile subarborilor
%constituenti.

cea_mai_buna_f([A|_],F):-f(A,F).
cea_mai_buna_f([],999999).

%In cazul unei liste de arbori vide, f

-valoarea
%determinata este foarte mare.


118
Pentru aplicarea programului anterior la o problem particular,
trebuie adugate anumite relaii specifice problemei. Aceste relaii
definesc de fapt problema particular (regulile jocului) i, de asemenea,
adaug o anumit informaie euristic despre cum anume s-ar putea
rezolva aceasta. Predicatele specifice problemei sunt:
s(Nod,Nod1,Cost)
% acest predicat este adevrat dac exist un arc ntre Nod1 i Nod
n spaiul strilor
scop(Nod)
% acest predicat este adevrat dac Nod este stare-scop n spaiul
strilor
h(Nod,H)
% H este o estimaie euristic a costului celui mai ieftin drum ntre
Nod i o stare-scop.

Exemplificm, n cele ce urmeaz, folosirea strategiei generale
best-first n cazul problemei eight puzzle, precum i al problemei
misionarilor i canibalilor.

2.3.3.1. Exemple

Problema 8-puzzle

Se consider un tablou ptratic de dimensiune 3x3, mprit n 9
cmpuri ptrate de latur 1. Opt dintre aceste cmpuri conin cte o
plcu etichetat cu un numr ntre 1 i 8, n timp ce al noulea cmp
nu conine nimic. O plcu poate fi deplasat de pe cmpul sau pe un


119
cmp vecin, dac astfel nu se suprapune peste alt plcu, deci dac
acest ultim cmp nu conine nici o plcu. Fiind date dou configuraii
C1, C2, ale plcuelor pe tabloul 3x3, se cere s se spun dac i cum
este posibil s se ajung din configuraia C1 n configuraia C2 printr-un
numr minim de mutri.

Rezolvare:

Vom trata aceast problem ca pe una de cutare euristic. Un
nod n spaiul strilor este de fapt o configuraie a plcuelor n tablou.
Deoarece ne intereseaz rezolvarea problemei printr-un numr minim de
mutri (adic ne propunem s minimizm lungimea soluiilor), este firesc
s considerm c lungimile arcelor din spaiul strilor sunt egale cu 1.
Pentru rezolvarea problemei pot fi luate n consideraie mai
multe funcii euristice [1]. Astfel, pentru o stare (configuraie) S, putem
defini:
( ) S h
1

= numrul de plcue care nu sunt la locul lor n starea S


fa de starea final;
( ) = S h
2

suma distanelor pe vertical i pe orizontal de la poziia


fiecrei plcue n configuraia curent (S), la poziia respectivei
plcue n configuraia final.
Vom reprezenta o configuraie n Prolog printr-o list a poziiilor
curente corespunztoare locului liber, respectiv plcuelor, fiecare poziie
fiind specificat printr-o pereche de coordonate, de forma X/Y. Ordinea
acestor obiecte n list este urmtoarea:
(1) poziia curent a locului liber (neocupat de nici o plcu),


120
(2) poziia curent a plcuei etichetate cu 1,
(3) poziia curent a plcuei etichetate cu 2 etc.

Exemplu:






Fig. 2.12

n cele ce urmeaz, vom considera configuraia ilustrat n
exemplul de mai sus ca fiind configuraia final C2 din enunul
problemei, indiferent de alegerea configuraiei iniiale. Prin urmare,
predicatul scop este definit astfel:
scop ([2/2, 1/3, 2/3, 3/3, 3/2, 3/1, 2/1, 1/1, 1/2]).
n acest caz, putem defini o nou euristic,
3

h , dup cum
urmeaz:
( ) ( ) v(S) * S h S h sec 3

2 3
+ = ,
pentru o stare S, unde v(S) sec este un indice al secvenialitii, adic al
gradului n care plcuele sunt deja ordonate n configuraia actual, n
raport cu ordinea lor n configuraia final. Acest indice este calculat ca i
suma indicilor corespunztori fiecrei plcue, astfel:
indicele plcuei aflate n centrul tabloului este 1;
1
8
7
2

6
3
5
4
1 2 3
1
2
3
[2/2, 1/3, 2/3, 3/3, 3/2, 3/1, 2/1, 1/1, 1/2]


121
indicele unei plcue aflate ntr-o poziie diferit de centru este 0,
dac acea plcu este urmat (n sens invers-trigonometric) de
succesorul su din configuraia final;
n orice alt situaie, indicele este egal cu 2.
De exemplu, pentru configuraia
a
S din Fig.2.13 a), ( ) 6 sec =
a
S v .
Fig. 2.13 prezint trei exemple de configuraii iniiale:






Fig. 2.13

Funciile euristice
1

h si
2

h sunt admisibile, iar


2

h este mai
informat dect
1

h . Funcia euristic
3

h funcioneaz bine, n sensul c ea


dirijeaz foarte eficient cutarea spre atingerea scopului. De exemplu,
rezolvnd problema pentru configuraiile a) i b) din Fig. 2.13, cu aceast
euristic, nici un nod din afara drumului celui mai scurt nu va fi extins
nainte de gsirea primei soluii. Acest lucru nseamn c drumurile cele
mai scurte n aceste cazuri sunt generate fr backtracking. Chiar i
pentru configuraia c) din Fig. 2.13, problema este rezolvat aproape
direct.
n ciuda calitilor ei, euristica
3

h nu este totui admisibil. Cu


alte cuvinte, ea nu garanteaz c soluia cea mai scurt este gsit
ntotdeauna naintea uneia mai lungi. Motivul este acela c funcia aleas
a) b) c)

1
8
7
3

6
4
5
2
2
4
7
1

5
6
3
8
2
1
7
8
6

3
5
4


122
nu satisface condiia de admisibilitate pentru toate nodurile din spaiul
strilor. Spre exemplu, pentru configuraia iniial
a
S , avem:
( ) 6 3 4

3
* S h
a
+ =
( ) 4 =
a
S h
Implementarea n Prolog a predicatelor specifice problemei
"8-puzzle" va folosi relaia auxiliar
mandist (P1, P2, D)
pentru determinarea distanei Manhattan D ntre poziiile (ptratele) P1 i
P2, definit ca fiind suma dintre distana pe orizontal i cea pe vertical
ntre cele dou ptrate. Prezentm, n continuare, programul Prolog
complet corespunztor acestei probleme:

Programul 2.7

%Procedurile (predicatele) specifice problemei
%eight-puzzle

%Definim relatia de succesiune; consideram ca toate
%arcele au costul 1.

s([Gol|Placute],[Placuta|Placute1],1):-
interschimba(Gol,Placuta,Placute,Placute1).

%Predicatul modul(A,B,D) este adevarat daca D este
%|A-B|
modul(A,B,D):-D is A-B,D>=0,!;
D is B-A.

distman(X/Y,X1/Y1,D):-
modul(X,X1,Dx),modul(Y,Y1,Dy), D is Dx+Dy.


123
interschimba(Gol,Placuta,[Placuta|Ts],[Gol|Ts]):-
distman(Gol,Placuta,1).
interschimba(Gol,Placuta,[T1|Ts],[T1|Ts1]):-
interschimba(Gol,Placuta,Ts,Ts1).

membru(H,[H|_]).
membru(X,[_|T]):-membru(X,T).

h([Gol|Placute],H):-
scop([Gol1|Placute_final]),
disttot(Placute,Placute_final,D),
secv(Placute,S),
H is D+3*S.

secv([Prima|Placute],S):-
secv([Prima|Placute],Prima,S).
secv([Placuta1,Placuta2|Placute],Prima,S):-
scor(Placuta1,Placuta2,S1),
secv([Placuta2|Placute],Prima,S2),
S is S1+S2.
secv([Ultima],Prima,S):-scor(Ultima,Prima,S).

scor(2/2,_,1):-!.
%Placuta plasata in centru are scorul 1.
scor(1/3,2/3,0):-!.
scor(2/3,3/3,0):-!.
scor(3/3,3/2,0):-!.
scor(3/2,3/1,0):-!.
scor(3/1,2/1,0):-!.
scor(2/1,1/1,0):-!.


124
scor(1/1,1/2,0):-!.
scor(1/2,1/3,0):-!.
scor(_,_,2).

disttot([],[],0).
disttot([T|Ts],[S|Ss],D):-
distman(T,S,D1),
disttot(Ts,Ss,D2),
D is D1+D2.

scop([2/2,1/3,2/3,3/3,3/2,3/1,2/1,1/1,1/2]).

initial([2/1,1/2,1/3,3/3,3/2,3/1,2/2,1/1,2/3]).

arata_solutie([]).
arata_solutie([P|L]):-
arata_solutie(L),nl,
write('-------'),
arata_poz(P).

arata_poz([S0,S1,S2,S3,S4,S5,S6,S7,S8]):-
membru(Y,[3,2,1]),nl,membru(X,[1,2,3]),
membru(P-X/Y,[' '-S0,1-S1,2-S2,3-S3,4-S4,5-S5,
6-S6,7-S7,8-S8]),
write(P),tab(2),fail;
true.

pb:-tell('C:\\best_first_output.txt'),
initial(Poz),bestfirst(Poz,Sol),
arata_solutie(Sol),told.



125
%Predicatul bestfirst(Nod_initial,Solutie) este
%adevarat daca Solutie este un drum (obtinut folosind
%strategia best-first) de la nodul Nod_initial la o
%stare-scop.

bestfirst(Nod_initial,Solutie):-
expandeaza([],l(Nod_initial,0/0),9999999,_,
da,Solutie).

expandeaza(Drum,l(N,_),_,_, da,[N|Drum]):-scop(N).

%Caz 1: daca N este nod-scop, atunci construim o
%cale-solutie.

expandeaza(Drum,l(N,F/G),Limita,Arb1,Rez,Sol):-
F=<Limita,
(bagof(M/C,(s(N,M,C), \+ (membru(M,Drum))),Succ),!,
listasucc(G,Succ,As),
cea_mai_buna_f(As,F1),
expandeaza(Drum,t(N,F1/G,As),Limita,Arb1, Rez,Sol);
Rez=imposibil).

%Caz 2: Daca N este nod-frunza a carui f

-valoare
%este mai mica decat Limita,atunci ii generez
%succesorii si ii expandez in limita Limita.

expandeaza(Drum,t(N,F/G,[A|As]),Limita,Arb1,Rez,
Sol):-
F=<Limita,
cea_mai_buna_f(As,BF),
min(Limita,BF,Limita1),
expandeaza([N|Drum],A,Limita1,A1,Rez1,Sol),
continua(Drum,t(N,F/G,[A1|As]),Limita,Arb1,
Rez1,Rez,Sol).


126
%Caz 3: Daca arborele de radacina N are subarbori
%nevizi si f

-valoarea este mai mica decat Limita,


%atunci expandam cel mai "promitator" subarbore al
%sau; in functie de rezultatul obtinut, Rez, vom
%decide cum anume vom continua cautarea prin
%intermediul procedurii (predicatului) continua.

expandeaza(_,t(_,_,[]),_,_,imposibil,_):-!.

%Caz 4: pe aceasta varianta nu o sa obtinem niciodata
%o solutie.

expandeaza(_,Arb,Limita,Arb,nu,_):- f(Arb,F),
F>Limita.
%Caz 5: In cazul unor f

-valori mai mari decat Bound,


%arborele nu mai poate fi extins.

continua(_,_,_,_,da,da,Sol).
continua(P,t(N,F/G,[A1|As]),Limita,Arb1,nu,Rez,Sol):-
insereaza(A1,As,NAs),
cea_mai_buna_f(NAs,F1),
expandeaza(P,t(N,F1/G,NAs),Limita,Arb1,Rez,Sol).
continua(P,t(N,F/G,[_|As]),Limita,Arb1,imposibil,Rez,
Sol):-
cea_mai_buna_f(As,F1),
expandeaza(P,t(N,F1/G,As),Limita,Arb1,Rez,Sol).

listasucc(_,[],[]).
listasucc(G0,[N/C|NCs],Ts):-
G is G0+C,
h(N,H),
F is G+H,
listasucc(G0,NCs,Ts1),


127
insereaza(l(N,F/G),Ts1,Ts).
%Predicatul insereaza(A,As,As1) este utilizat pentru
%inserarea unui arbore A intr-o lista de arbori As,
%mentinand ordinea impusa de f

-valorile lor.

insereaza(A,As,[A|As]):-f(A,F),
cea_mai_buna_f(As,F1),
F=<F1,!.
insereaza(A,[A1|As],[A1|As1]):-insereaza(A,As,As1).

min(X,Y,X):-X=<Y,!.
min(_,Y,Y).

f(l(_,F/_),F). % f-val unei frunze
f(t(_,F/_,_),F). % f-val unui arbore

%Predicatul cea_mai_buna_f(As,F) este utilizat pentru
%a determina cea mai buna f

-valoare a unui arbore din


%lista de arbori As, daca aceasta lista este nevida;
%lista As este ordonata dupa f

-valorile subarborilor
%constituenti.

cea_mai_buna_f([A|_],F):-f(A,F).
cea_mai_buna_f([],999999).

%In cazul unei liste de arbori vide, f

-valoarea
%determinata este foarte mare.

Interogarea Prologului se face dup cum urmeaz:

?- pb.

Rspunsul sistemului va fi

yes


128
cu semnificaia c predicatul a fost satisfcut. n fiierul
C:\best_first_output.txt putem vedea i secvena de mutri prin
care s-a ajuns din starea iniial

2 8 3
1 6 4
7 5

n starea final

1 2 3
8 4
7 6 5

Dup interogarea anterioar, coninutul fiierului
C:\best_first_output.txt va fi urmtorul:

-------
2 8 3
1 6 4
7 5
-------
2 8 3
1 4
7 6 5
-------
2 3
1 8 4
7 6 5
-------
2 3
1 8 4
7 6 5
-------



129
1 2 3
8 4
7 6 5
-------
1 2 3
8 4
7 6 5

Problema misionarilor i canibalilor

Pe malul estic al unei ape se gsesc N misionari i N canibali.
Acetia urmeaz s treac apa, avnd la dispoziie o barc cu M locuri.
Se tie c dac pe unul dintre maluri numrul de canibali este mai mare
dect numrul de misionari, atunci misionarii de pe acel mal sunt
mncai de canibali. Se cere determinarea unei variante de trecere a apei
fr ca misionarii s fie mncai de canibali.

Rezolvare:

n 2.2.1.4. am expus deja o implementare n Prolog a unei
modaliti de rezolvare a acestei probleme folosind mijloacele specifice
cutrii neinformate (algoritmul breadth-first). Fr a modifica esenial
predicatele din programul 2.2 folosite pentru descrierea spaiului strilor,
precum i predicatele specifice implementrii strategiei best-first, definite
anterior (2.3.3), putem construi o rezolvare a acestei probleme folosind
strategia best-first. Considerm c singurul aspect asupra cruia este
necesar s ne mai concentrm atenia este acela al stabilirii unor funcii
euristice adecvate.


130
Prezentm, n continuare, dou exemple de funcii euristice. Pentru
o stare dat S, notm cu ( ) est n
C
numrul de canibali de pe malul de est i
cu ( ) est n
M
numrul de misionari de pe acelai mal. Definim:

( )
( ) ( ) ( )
(

+
=
M
est n est n
S h
M C
1


( )
( ) ( ) ( )
( )
( ) ( )
( ) ( ) ( )
( )
( ) ( )
( ) ( )

0 est n est n daca 0,
vest de malul pe afla se barca si
0 est n est n daca , 2
1 - M
1 est n est n
2
est de malul pe afla se barca si
0 est n est n daca , 1
1 - M
2 est n est n
2
S h

M C
M C
M C
M C
M C
2

= +
+ +
(

+
+ +
(

+
=

Funcia euristic
2
h

descrie situaia n care un transport est-vest se


face cu ct mai muli pasageri (eventual cu M - capacitatea total a
brcii), iar unul vest-est se face cu ct mai puini (adic unul singur), fr
a ine cont de relaia dintre numrul de canibali i cel de misionari de pe
cele dou maluri. Dac, n plus, intervine i constrngerea privitoare la
aceast relaie numeric ntre canibali i misionari, cu siguran c
transportul va fi fcut ntr-un numr de drumuri mai mare sau egal cu cel
specificat de euristica
2
h . Prin urmare, aceast funcie euristic este
admisibil. Se observ uor c i funcia euristic
1
h

este admisibil, dar


i c aceasta este mai puin informat dect
2
h

.



131
2.3.4. Concluzii

1. Pn acum, cunotinele au fost folosite numai n procesul formulrii
unei probleme n termeni de stri i de operatori. Fiind ns dat o
problem bine definit, singurul loc n care putem aplica cunotinele este
n funcia ce organizeaz coada. Aceast funcie trebuie s determine
urmtorul nod care va fi extins. De obicei, cunotinele care permit
determinarea acestuia sunt furnizate de ctre o funcie de evaluare care
ntoarce un numr menit s descrie ct de oportun sau neoportun este
extinderea unui anumit nod la pasul urmtor. Atunci cnd nodurile sunt
ordonate astfel nct cel care este cel mai bine evaluat s fie primul
extins, strategia care rezult poart denumirea de cutare de tip best-first.

2. Una dintre cele mai simple strategii de cutare de tip best-first const
n minimizarea costului estimat pentru a fi atins scopul. Cu alte cuvinte,
nodul a crui stare este considerat ca fiind cea mai apropiat de starea-
scop este ntotdeauna primul extins. Pentru majoritatea problemelor,
costul atingerii scopului plecndu-se dintr-o anumit stare nu poate fi
determinat n mod exact, dar poate fi estimat. O funcie care calculeaz
astfel de estimri ale costului se numete funcie euristic i este, de
obicei, notat cu h:
h(n) = costul estimat al celui mai ieftin drum de la starea din nodul n
la o stare-scop.
O cutare de tip best-first care folosete aceast funcie h pentru a selecta
urmtorul nod care va fi extins se numete o cutare de tip Greedy.


132
3. Cutarea de tip Greedy minimizeaz costul estimat pn la scop, h(n)
i, prin urmare, reduce considerabil costul cutrii. Ea nu este ns nici
optim i nici complet. Pe de alt parte, cutarea de cost uniform
minimizeaz costul, g(n), al drumului gsit pn la momentul curent. Ea
este i optim i complet, dar poate fi foarte ineficient. Este necesar
combinarea celor dou strategii pentru a se obine avantajele oferite de
amndou. Cele dou funcii de evaluare folosite de ele pot fi combinate
prin simpla sumare:
f(n) = g(n) + h(n)
ntruct g(n) furnizeaz costul drumului de la nodul de start la nodul n,
iar h(n) reprezint costul estimat al celui mai ieftin drum de la n la scop,
avem c f(n) este costul estimat al celei mai ieftine soluii care trece prin
n. Prin urmare, pentru a gsi cea mai ieftin soluie, se ncearc mai nti
extinderea nodului care are cea mai mic valoare a lui f. Aceast strategie
se demonstreaz c este i complet i optim, dac se impune o restricie
simpl asupra funciei h. Restricia asupra lui h este aceea de a se alege
ntotdeauna o funcie h care nu supraestimeaz costul atingerii scopului.
O asemenea funcie h se numete euristic admisibil.

4. Euristicile admisibile sunt ntotdeauna optimiste, ntruct presupun
costul rezolvrii unei probleme mai sczut dect este el n realitate. Acest
optimism se transfer i asupra funciei f n felul urmtor:
dac h este admisibil, f(n) niciodat nu supraestimeaz costul
efectiv al celei mai bune soluii care trece prin n.


133
Cutarea de tip best-first care folosete acest f ca funcie de evaluare i o
funcie h admisibil se numete cutare de tip A*. A* este complet i
optimal.

5. S-a demonstrat (Dechter i Pearl, 1985) c algoritmul A* este optim
eficient. Aceasta nseamn c nici un alt algoritm optim nu extinde mai
puine noduri dect A*.

6. Pentru a folosi algoritmul A* n rezolvarea unei probleme concrete,
trebuie definite, spre a fi utilizate de algoritm: un spaiu al strilor, un
predicat scop i o funcie euristic adecvat fiecrei probleme.

7. Aproape toate euristicile admisibile au proprietatea de monotonie.
Dac euristica nu este monoton, se poate face o corecie minor care
restaureaz monotonia, dup cum urmeaz: considerm dou noduri, n i
n, unde n este printele lui n. De fiecare dat cnd generm un nou nod,
vom verifica dac costul funciei f asociate lui este mai mic dect costul
funciei f asociate nodului printe. Dac da, folosim funcia de cost f a
nodului printe:
f(n) = max(f(n), g(n)+h(n))
Dac se folosete aceast ecuaie, atunci f va fi ntotdeauna
nedescresctoare de-a lungul oricrui drum de la rdcin, cu condiia
ca h s fie admisibil.

8. Algoritmi de cutare de tip memory-bounded, cum ar fi IDA*,
nltur neajunsurile legate de problema spaiului de memorie folosit,
fr a sacrifica optimalitatea sau completitudinea.


134

































135
CAPITOLUL 3
JOCURILE CA PROBLEME DE CUTARE


Jocurile au reprezentat ntotdeauna o arie de aplicaie interesant
pentru algoritmii euristici. Jocurile de dou persoane sunt n general
complicate datorit existenei unui oponent ostil i imprevizibil. De aceea
ele sunt interesante din punctul de vedere al dezvoltrii euristicilor, dar
aduc multe dificulti n dezvoltarea i aplicarea algoritmilor de cutare.
Prezena unui oponent face ca problema de decizie s devin una
mai complex i mai complicat dect problemele de cutare discutate
anterior. Oponentul introduce incertitudinea, ntruct nu se tie niciodat
ce va face acesta la pasul urmtor. n esen, toate programele referitoare
la jocuri trebuie s trateze aa numita problem de contingen.
Incertitudinea care intervine nu este de aceeai natur cu cea introdus,
de pild, prin aruncarea unui zar sau cu cea determinat de starea vremii.
Oponentul va ncerca, pe ct posibil, s fac mutarea cea mai puin
benign, n timp ce zarul sau vremea sunt presupuse a nu lua n
consideraie scopurile agentului.
Dar ceea ce face ca jocurile s constituie probleme cu adevrat
diferite este faptul c, de regul, ele sunt extrem de greu de rezolvat.
Jocul de ah, spre exemplu, are un factor de ramificare mediu de valoare
circa 35, iar partidele constau adesea din cte 50 de mutri
corespunztoare fiecrui juctor, astfel nct arborele de cutare are circa
35
100
noduri.


136
Complexitatea jocurilor introduce un tip de incertitudine complet
nou. Astfel, incertitudinea se nate nu datorit faptului c exist
informaie care lipsete, ci datorit faptului c juctorul nu are timp s
calculeze consecinele exacte ale oricrei mutri. Din acest punct de
vedere, jocurile se aseamn infinit mai mult cu lumea real dect
problemele de cutare standard.
ntruct, n cadrul unui joc, exist, de regul, limite de timp,
jocurile penalizeaz ineficiena extrem de sever. Astfel, dac
o implementare a cutrii de tip A*, care este cu 10% mai puin eficient,
este considerat satisfctoare, un program pentru jocul de ah care este
cu 10% mai puin eficient n folosirea timpului disponibil va duce la
pierderea partidei. Din aceast cauz, studiul nostru se va concentra
asupra tehnicilor de alegere a unei bune mutri atunci cnd timpul este
limitat. Tehnica de retezare ne va permite s ignorm poriuni ale
arborelui de cutare care nu pot avea nici un rol n stabilirea alegerii
finale, iar funciile de evaluare euristice ne vor permite s aproximm
utilitatea real a unei stri fr a executa o cutare complet.
n cele ce urmeaz, ne vom referi la tehnici de joc
corespunztoare unor jocuri de dou persoane cu informaie complet,
cum ar fi ahul. n cazul jocurilor interesante, arborii rezultai sunt mult
prea compleci pentru a se putea realiza o cutare exhaustiv, astfel nct
sunt necesare abordri de o natur diferit. Una dintre metodele clasice se
bazeaz pe principiul minimax, implementat n mod eficient sub forma
Algoritmului Alpha-Beta (bazat pe aa-numita tehnic de alpha-beta
retezare).



137
3.1. O definire formal a jocurilor

Tipul de jocuri la care ne vom referi n continuare este acela al
jocurilor de dou persoane cu informaie perfect sau complet. n astfel
de jocuri exist doi juctori care efectueaz mutri n mod alternativ,
ambii juctori dispunnd de informaia complet asupra situaiei curente
a jocului. (Prin aceasta, este exclus studiul majoritii jocurilor de cri).
Jocul se ncheie atunci cnd este atins o poziie calificat ca fiind
terminal de ctre regulile jocului - spre exemplu, mat n jocul de
ah. Aceleai reguli determin care este rezultatul jocului care s-a
ncheiat n aceast poziie terminal. Un asemenea joc poate fi
reprezentat printr-un arbore de joc n care nodurile corespund situaiilor
(strilor), iar arcele corespund mutrilor. Situaia iniial a jocului este
reprezentat de nodul rdcin, iar frunzele arborelui corespund poziiilor
terminale.
Vom lua n consideraie cazul general al unui joc cu doi juctori,
pe care i vom numi MAX i respectiv MIN. MAX va face prima mutare,
dup care juctorii vor efectua mutri pe rnd, pn cnd jocul ia sfrit.
La finalul jocului vor fi acordate puncte juctorului ctigtor (sau vor fi
acordate anumite penalizri celui care a pierdut).
Un joc poate fi definit, n mod formal, ca fiind un anumit tip de
problem de cutare avnd urmtoarele componente:
starea iniial, care include poziia de pe tabla de joc i o indicaie
referitoare la cine face prima mutare;
o mulime de operatori, care definesc micrile permise (legale)
unui juctor;


138
un test terminal, care determin momentul n care jocul ia sfrit;
o funcie de utilitate (numit i funcie de plat), care acord
o valoare numeric rezultatului unui joc; n cazul jocului de ah,
spre exemplu, rezultatul poate fi ctig, pierdere sau remiz,
situaii care pot fi reprezentate prin valorile 1, -1 sau 0.
Dac un joc ar reprezenta o problem standard de cutare, atunci
aciunea juctorului MAX ar consta din cutarea unei secvene de mutri
care conduc la o stare terminal reprezentnd o stare ctigtoare
(conform funciei de utilitate) i din efectuarea primei mutri aparinnd
acestei secvene. Aciunea lui MAX interacioneaz ns cu cea
a juctorului MIN. Prin urmare, MAX trebuie s gseasc o strategie care
va conduce la o stare terminal ctigtoare, indiferent de aciunea lui
MIN. Aceast strategie include mutarea corect a lui MAX
corespunztoare fiecrei mutri posibile a lui MIN. n cele ce urmeaz,
vom ncepe prin a arta cum poate fi gsit strategia optim (sau
raional), dei n realitate nu vom dispune de timpul necesar pentru a
o calcula.

3.2. Algoritmul Minimax

Oponenii din cadrul jocului pe care l vom trata prin aplicarea
Algoritmului Minimax vor fi numii, n continuare, MIN i respectiv
MAX. MAX reprezint juctorul care ncearc s ctige sau s i
maximizeze avantajul avut. MIN este oponentul care ncearc s
minimizeze scorul lui MAX. Se presupune c MIN folosete aceeai


139
informaie i ncearc ntotdeauna s se mute la acea stare care este cea
mai nefavorabil lui MAX.
Algoritmul Minimax este conceput pentru a determina strategia
optim corespunztoare lui MAX i, n acest fel, pentru a decide care este
cea mai bun prim mutare:

Algoritmul Minimax

1. Genereaz ntregul arbore de joc, pn la strile terminale.
2. Aplic funcia de utilitate fiecrei stri terminale pentru a obine
valoarea corespunztoare strii.
3. Deplaseaz-te napoi n arbore, de la nodurile-frunze spre
nodul-rdcin, determinnd, corespunztor fiecrui nivel al arborelui,
valorile care reprezint utilitatea nodurilor aflate la acel nivel. Propagarea
acestor valori la niveluri anterioare se face prin intermediul nodurilor-
printe succesive, conform urmtoarei reguli:
dac starea-printe este un nod de tip MAX, atribuie-i maximul
dintre valorile avute de fiii si;
dac starea-printe este un nod de tip MIN, atribuie-i minimul
dintre valorile avute de fiii si.
4. Ajuns n nodul-rdcin, alege pentru MAX acea mutare care
conduce la valoarea maxim.

Observaie: Decizia luat la pasul 4 al algoritmului se numete
decizia minimax, ntruct ea maximizeaz utilitatea, n ipoteza c
oponentul joac perfect cu scopul de a o minimiza.


140
Un arbore de cutare cu valori minimax determinate conform
Algoritmului Minimax este cel din Fig. 3.1:


















Fig. 3.1

Valorile poziiilor de la ultimul nivel sunt determinate de ctre funcia de
utilitate i se numesc valori statice. Valorile minimax ale nodurilor
interne sunt calculate n mod dinamic, n manier bottom-up, nivel cu
nivel, pn cnd este atins nodul-rdcin. Valoarea rezultat,
corespunztoare acestuia, este 4 i, prin urmare, cea mai bun mutare
a lui MAX din poziia a este a-b. Cel mai bun rspuns al lui MIN este
b-d. Aceast secven a jocului poart denumirea de variaie principal.
Ea definete jocul optim de tip minimax pentru ambele pri. Se observ
Mutare a lui MAX
Mutare a
lui MIN
Mutare a
lui MAX
Valori
statice
a
g f e d
b c
1
4
4 1
`
4 6 2
1 4 5 6 2 1 1 1


141
c valoarea poziiilor de-a lungul variaiei principale nu variaz. Prin
urmare, mutrile corecte sunt cele care conserv valoarea jocului.
Dac adncimea maxim a arborelui este m i dac exist b
mutri legale la fiecare punct, atunci complexitatea de timp
a Algoritmului Minimax este O(b
m
). Algoritmul reprezint o cutare de
tip depth-first (dei aici este sugerat o implementare bazat pe
recursivitate i nu una care folosete o coad de noduri), astfel nct
cerinele sale de spaiu sunt numai liniare n m i b.
n cazul jocurilor reale, cerinele de timp ale algoritmului sunt
total nepractice, dar acest algoritm st la baza att a unor metode mai
realiste, ct i a analizei matematice a jocurilor.
ntruct, pentru majoritatea jocurilor interesante, arborele de joc
nu poate fi alctuit n mod exhaustiv, au fost concepute diverse metode
care se bazeaz pe cutarea efectuat numai ntr-o anumit poriune
a arborelui de joc. Printre acestea se numr i tehnica Minimax, care, n
majoritatea cazurilor, va cuta n arborele de joc numai pn la o anumit
adncime, de obicei constnd n numai cteva mutri. Ideea este de
a evalua aceste poziii terminale ale cutrii, fr a mai cuta dincolo de
ele, cu scopul de a face economie de timp. Aceste estimri se propag
apoi n sus de-a lungul arborelui, conform principiului Minimax. Mutarea
care conduce de la poziia iniial, nodul-rdcin, la cel mai promitor
succesor al su (conform acestor evaluri) este apoi efectuat n cadrul
jocului.
Este de observat distincia care se face, n acest cadru, ntre
arborele de joc i arborele de cutare. Acesta din urm este de obicei
o parte a arborelui de joc (cea superioar), i anume acea parte care este


142
n mod explicit generat de ctre procesul de cutare. Prin urmare, poziii
terminale ale cutrii nu reprezint, neaprat, poziii terminale ale
jocului.
Jocurile reprezint unul dintre primele obiecte de studiu ale
inteligenei artificiale. nc din anul 1950 au fost scrise primele programe
referitoare la jocul de ah. Autorii lor sunt Claude Shannon i Alan
Turing. Chiar n cadrul primului articol al lui Shannon, referitor la jocul
de ah, se face propunerea ca, n loc de a merge pn la strile terminale
i a folosi funcia de utilitate, programul s ncheie cutarea mult mai
devreme i s aplice o funcie de evaluare euristic nodurilor-frunz ale
arborelui rezultat. Algoritmul general Minimax a fost amendat n dou
moduri: funcia de utilitate a fost nlocuit cu o funcie de evaluare, iar
testul terminal a fost nlocuit de ctre un aa-numit test de tiere.
Cea mai direct abordare a problemei deinerii controlului asupra
cantitii de cutare care se efectueaz este aceea de a fixa o limit
a adncimii, astfel nct testul de tiere s aib succes pentru toate
nodurile aflate la sau sub adncimea d. Limita de adncime va fi aleas
astfel nct cantitatea de timp folosit s nu depeasc ceea ce permit
regulile jocului. O abordare mai robust a acestei probleme este aceea
care aplic iterative deepening. n acest caz, atunci cnd timpul expir,
programul ntoarce mutarea selectat de ctre cea mai adnc cutare
complet.






143

3.2.1. Funcii de evaluare

O funcie de evaluare ntoarce o estimaie, realizat dintr-o
poziie dat, a utilitii ateptate a jocului. Ea are la baz evaluarea
anselor de ctigare a jocului de ctre fiecare dintre pri, pe baza
calculrii caracteristicilor unei poziii. n mod evident, performana unui
program referitor la jocuri este extrem de dependent de calitatea funciei
de evaluare utilizate.
Funcia de evaluare trebuie s ndeplineasc anumite condiii
evidente: ea trebuie s concorde cu funcia de utilitate n ceea ce privete
strile terminale, calculele efectuate nu trebuie s dureze prea mult i ea
trebuie s reflecte n mod corect ansele efective de ctig. O valoare
a funciei de evaluare acoper mai multe poziii diferite, grupate laolalt
ntr-o categorie de poziii etichetat cu o anumit valoare. Spre exemplu,
n jocul de ah, fiecare pion poate avea valoarea 1, un nebun poate avea
valoarea 3 amd.. n poziia de deschidere evaluarea este 0 i toate
poziiile pn la prima captur vor avea aceeai evaluare. Dac MAX
reuete s captureze un nebun fr a pierde o pies, atunci poziia
rezultat va fi evaluat la valoarea 3. Toate poziiile de acest fel ale lui
MAX vor fi grupate ntr-o categorie etichetat cu 3. Funcia de
evaluare trebuie s reflecte ansa ca o poziie aleas la ntmplare dintr-o
asemenea categorie s conduc la ctig (sau la pierdere sau la remiz) pe
baza experienei anterioare.
Funcia de evaluare cel mai frecvent utilizat presupune c
valoarea unei piese poate fi stabilit independent de celelalte piese


144
existente pe tabl. Un asemenea tip de funcie de evaluare se numete
funcie liniar ponderat, ntruct are o expresie de forma
w
1
f
1
+ w
2
f
2
+ ...+ w
n
f
n
,
unde valorile w
i,
n i , 1 = reprezint ponderile, iar f
i,
n i , 1 = sunt
caracteristicile unei anumite poziii. n cazul jocului de ah, spre exemplu
w
i,
n i , 1 = ar putea fi valorile pieselor (1 pentru pion, 3 pentru nebun
etc.), iar f
i,
n i , 1 = ar reprezenta numrul pieselor de un anumit tip aflate
pe tabla de ah.
n construirea formulei liniare trebuie mai nti alese
caracteristicile, operaie urmat de ajustarea ponderilor pn n momentul
n care programul joac suficient de bine. Aceast a doua operaie poate
fi automatizat punnd programul s joace multe partide cu el nsui, dar
alegerea unor caracteristici adecvate nu a fost nc realizat n mod
automat.

3.2.2. Implementare n Prolog

Un program Prolog care calculeaz valoarea minimax a unui nod
intern dat va avea ca relaie principal pe
miminax(Poz,SuccBun,Val)
unde Val este valoarea minimax a unei poziii Poz, iar SuccBun este cea
mai bun poziie succesor a lui Poz (i.e. mutarea care trebuie fcut
pentru a se obine Val). Cu alte cuvinte, avem:




145
minimax( Poz, SuccBun, Val ) :
Poz este o poziie, Val este valoarea ei de
tip minimax;
cea mai bun mutare de la Poz conduce la
poziia SuccBun.
La rndul ei, relaia
mutari(Poz,ListaPoz)
corespunde regulilor jocului care indic mutrile legale (admise):
ListaPoz este lista poziiilor succesor legale ale lui Poz. Predicatul
mutari va eua dac Poz este o poziie de cutare terminal (o frunz
a arborelui de cutare). Relaia
celmaibun(ListaPoz,PozBun,ValBuna)
selecteaz cea mai bun poziie PozBun dintr-o list de poziii candidate
ListaPoz. ValBuna este valoarea lui PozBun i, prin urmare, i a lui
Poz. Cel mai bun are aici sensul de maxim sau de minim, n funcie de
partea care execut mutarea.
O implementare a principiului Minimax este realizat de
urmtorul program Prolog, preluat din [1]:

Principiul Minimax

minimax(Poz,SuccBun,Val):-
% mutrile legale de la Poz produc ListaPoz
mutri(Poz,ListaPoz),!,
celmaibun(ListaPoz,SuccBun,Val);
%Poz nu are succesori i este evaluat
%n mod static
staticval(Poz,Val).


146
celmaibun([Poz],Poz,Val):-
minimax(Poz,_,Val),!.
celmaibun([Poz1|ListaPoz],PozBun,ValBuna):-
minimax(Poz1,_,Val1),
celmaibun(ListaPoz,Poz2,Val2),
maibine(Poz1,Val1,Poz2,Val2,PozBun,ValBuna).

%Poz0 mai bun dect Poz1

maibine(Poz0,Val0,Poz1,Val1,Poz0,Val0):-
%Min face o mutare la Poz0
%Max prefer valoarea maxim
mutare_min(Poz0),
Val0>Val1,!
;
%Max face o mutare la Poz0
%Min prefer valoarea mai mic
mutare_max(Poz0),
Val0<Val1,!.

%Altfel, Poz1 este mai bun dect Poz0

maibine(Poz0,Val0,Poz1,Val1,Poz1,Val1).

3.3. O implementare eficient a principiului Minimax: Algoritmul
Alpha-Beta

Tehnica pe care o vom examina, n cele ce urmeaz, este numit
n literatura de specialitate alpha-beta prunning (alpha-beta retezare).
Atunci cnd este aplicat unui arbore de tip minimax standard, ea va


147
ntoarce aceeai mutare pe care ar furniza-o i Algoritmul Minimax, dar
ntr-un timp mai scurt, ntruct realizeaz o retezare a unor ramuri ale
arborelui care nu pot influena decizia final. Principiul general al
acestei tehnici const n a considera un nod oarecare n al arborelui, astfel
nct juctorul poate alege s fac o mutare la acel nod. Dac acelai
juctor dispune de o alegere mai avantajoas, m, fie la nivelul nodului
printe al lui n, fie n orice punct de decizie aflat mai sus n arbore, atunci
n nu va fi niciodat atins n timpul jocului. Prin urmare, de ndat ce, n
urma examinrii unora dintre descendenii nodului n, ajungem s deinem
suficient informaie relativ la acesta, l putem nltura.
Ideea tehnicii de alpha-beta retezare este aceea de a gsi o mutare
suficient de bun, nu neaprat cea mai bun, dar suficient de bun
pentru a se lua decizia corect. Aceast idee poate fi formalizat prin
introducerea a dou limite, alpha i beta, reprezentnd limitri ale valorii
de tip minimax corespunztoare unui nod intern. Semnificaia acestor
limite este urmtoarea: alpha este valoarea minim pe care este deja
garantat c o va obine MAX, iar beta este valoarea maxim pe care
MAX poate spera s o ating. Din punctul de vedere al juctorului MIN,
beta este valoarea cea mai nefavorabil pentru MIN pe care acesta o va
atinge. Prin urmare, valoarea efectiv care va fi gsit se afl ntre alpha
i beta. Valoarea alpha, asociat nodurilor de tip MAX, nu poate
niciodat s descreasc, iar valoarea beta, asociat nodurilor de tip MIN,
nu poate niciodat s creasc. Dac, spre exemplu, valoarea alpha a unui
nod intern de tip MAX este 6, atunci MAX nu mai trebuie s ia n
cosideraie nici o valoare intern mai mic sau egal cu 6 care este
asociat oricrui nod de tip MIN situat sub el. Alpha este scorul cel mai


148
prost pe care l poate obine MAX, presupunnd c MIN joac perfect. n
mod similar, dac MIN are valoarea beta 6, el nu mai trebuie s ia n
consideraie nici un nod de tip MAX situat sub el care are valoarea 6 sau
o valoare mai mare dect acest numr. Cele dou reguli pentru ncheierea
cutrii, bazat pe valori alpha i beta, pot fi formulate dup cum
urmeaz [5]:
1. Cutarea poate fi oprit dedesubtul oricrui nod de tip MIN
care are o valoare beta mai mic sau egal cu valoarea alpha
a oricruia dintre strmoii si de tip MAX.
2. Cutarea poate fi oprit dedesubtul oricrui nod de tip MAX
care are o valoare alpha mai mare sau egal cu valoarea beta
a oricruia dintre strmoii si de tip MIN.
Dac, referitor la o poziie, se arat c valoarea corespunztoare
ei se afl n afara intervalului alpha-beta, atunci aceast informaie este
suficient pentru a ti c poziia respectiv nu se afl de-a lungul variaiei
principale, chiar dac nu este cunoscut valoarea exact corespunztoare
ei. Cunoaterea valorii exacte a unei poziii este necesar numai atunci
cnd aceast valoare se afl ntre alpha i beta.
Din punct de vedere formal, putem defini o valoare de tip
minimax a unui nod intern, P, V( P, alpha, beta ), ca fiind suficient de
bun dac satisface urmtoarele cerine:
V( P, alpha, beta ) < alpha, dac V( P ) < alpha
V( P, alpha, beta ) = V( P ), dac alpha V( P ) beta (1)
V( P, alpha, beta ) > beta, dac V ( P ) > beta,
unde prin V( P ) am notat valoarea de tip minimax corespunztoare unui
nod intern.


149
Valoarea exact a unui nod-rdcin P poate fi ntotdeauna calculat prin
setarea limitelor dup cum urmeaz:
V( P, -, + ) = V( P ).
Corespunztor arborelui din Fig. 3.2 procesul de cutare decurge
dup cum urmeaz:
1. ncepe din poziia a.
2. Mutare la b.
3. Mutare la d.
4. Alege valoarea maxim a succesorilor lui d, ceea ce conduce la
V( d ) = 4.
5. ntoarce-te n nodul b i execut o mutare de aici la e.
6. Ia n consideraie primul succesor al lui e a crui valoare este 5. n
acest moment, MAX, a crui mutare urmeaz, are garantat,
aflndu-se n poziia e, cel puin valoarea 5, indiferent care ar fi
celelalte alternative plecnd din e. Aceast informaie este
suficient pentru ca MIN s realizeze c, la nodul b, alternativa e
este inferioar alternativei d. Aceast concluzie poate fi tras fr
a cunoate valoarea exact a lui e. Pe aceast baz, cel de-al
doilea succesor al lui e poate fi neglijat, iar nodului e i se poate
atribui valoarea aproximativ 5.
Fig. 3.2 ilustreaz aciunea Algoritmului Alpha-Beta n cazul
arborelui din Fig. 3.1. Aa cum se vede n figur, unele dintre valorile de
tip minimax ale nodurilor interne sunt aproximative. Totui, aceste
aproximri sunt suficiente pentru a se determina n mod exact valoarea
rdcinii. Se observ c Algoritmul Alpha-Beta reduce complexitatea
cutrii de la 8 evaluri statice la numai 5 evaluri de acest tip:


150



















Fig. 3.2

Cutarea de tip alpha-beta reteaz nodurile figurate n mod discontinuu.
Ca rezultat, cteva dintre valorile intermediare nu sunt exacte (nodurile c,
e), dar aproximrile fcute sunt suficiente pentru a determina att
valoarea corespunztoare rdcinii, ct i variaia principal, n mod
exact. Un alt exemplu [5] de aplicare a Algoritmului Alpha-Beta este cel
din Fig. 3.4. Astfel, corespunztor spaiului de stri din Fig. 3.3, alpha-
beta retezarea produce arborele de cutare din Fig. 3.4, n care strile fr
numere nu sunt evaluate.


Mutare a lui MAX
Mutare a
lui MIN
Mutare a
lui MAX
Succesor
ignorat
Valoare
aproximativa
g f e d
a
b
c

4
4 2
`
4 5 2
1 4 5 2 1


151

















Fig. 3.3


















Fig. 3.4

MAX
MIN
MAX
MIN
3
3 2
9
5 9
3
2 3
2
2 1
0
7 4
7
6 5
6 0
0
MAX
MIN
MAX
MIN
3
a 3
3
2 3
2
2 1
0



0
0

5
b
d 2 e
c


152
n Fig. 3.4: a are = 3 (valoarea lui a nu va depi 3);
b este - retezat, deoarece 5 > 3;
c are = 3 (valoarea lui c nu va fi mai mic dect 3);
d este retezat, deoarece 0 < 3;
e este retezat, deoarece 2 < 3;
c este 3.

3.3.1. Implementare n Prolog

n cadrul unei implementri n Prolog a Algoritmului Alpha-Beta,
relaia principal este
alphabeta(Poz,Alpha,Beta,PozBuna,Val)
unde PozBuna reprezint un succesor suficient de bun al lui Poz, astfel
nct valoarea sa, Val, satisface cerinele (1):
Val = V(Poz, Alpha, Beta)
Procedura
limitarebuna(ListaPoz,Alpha,Beta,PozBuna,Val)
gsete, n lista ListaPoz, o poziie suficient de bun, PozBuna, astfel
nct valoarea de tip minimax, Val, a lui PozBuna, reprezint
o aproximaie suficient de bun relativ la Alpha i Beta.
Intervalul alpha-beta se poate ngusta (dar niciodat lrgi) n
timpul apelrilor recursive, de la o mai mare adncime, ale procedurii.
Relaia
limitenoi(Alpha,Beta,Poz,Val,AlphaNou,BetaNou)


153
definete noul interval [AlphaNou, BetaNou]. Acesta este ntotdeauna
mai ngust sau cel mult egal cu vechiul interval [Alpha, Beta]. ngustarea
intervalului conduce la operaii suplimentare de retezare a arborelui.
O implementare a Algoritmului Alpha-Beta este realizat de
urmtorul program Prolog, preluat, de asemenea, din [1]:

Algoritmul Alpha-Beta

alphabeta(Poz,Alpha,Beta,PozBuna,Val ):-
mutari(Poz,ListaPoz),!,
limitarebuna(ListaPoz,Alpha,Beta,PozBuna,Val);
%valoare static a lui Poz
staticval(Poz,Val).

limitarebuna([Poz|ListaPoz],Alpha,Beta,PozBuna,
ValBuna):-
alphabeta(Poz,Alpha,Beta,_,Val),
destuldebun(ListaPoz,Alpha,Beta,Poz,Val,PozBuna,
ValBuna).

%nu exist alt candidat

destuldebun([ ],_,_,Poz,Val,Poz,Val):-!.
destuldebun(_,Alpha,Beta,Poz,Val,Poz,Val):-
%atingere limit superioar
mutare_min(Poz),Val > Beta,!;
%atingere limit inferioar
mutare_max(Poz),Val < Alpha,!.
destuldebun(ListaPoz,Alpha,Beta,Poz,Val,PozBuna,
ValBuna):-


154
%rafinare limite
limitenoi(Alpha,Beta,Poz,Val,AlphaNou,BetaNou),
limitarebuna(ListaPoz,AlphaNou,BetaNou,Poz1,
Val1),
maibine(Poz,Val,Poz1,Val1,PozBuna,ValBuna).

limitenoi(Alpha,Beta,Poz,Val,Val,Beta):-
%cretere limit inferioar
mutare_min(Poz),Val > Alpha,!.
limitenoi(Alpha,Beta,Poz,Val,Alpha,Val):-
%descretere limit superioar
mutare_max(Poz),Val < Beta,!.
%altfel,limitele nu se schimb
limitenoi(Alpha,Beta,_,_,Alpha,Beta).

%Poz mai bun ca Poz1
maibine(Poz,Val,Poz1,Val1,Poz,Val):-
mutare_min(Poz),Val > Val1,!;
mutare_max(Poz),Val < Val1,!.
%altfel, Poz1 mai bun
maibine(_,_,Poz1,Val1,Poz1,Val1).

3.3.2. Consideraii privitoare la eficien

Eficiena Algoritmului Alpha-Beta depinde de ordinea n care
sunt examinai succesorii. Este preferabil s fie examinai mai nti
succesorii despre care se crede c ar putea fi cei mai buni. n mod
evident, acest lucru nu poate fi realizat n ntregime. Dac el ar fi posibil,
funcia care ordoneaz succesorii ar putea fi utilizat pentru a se juca un


155
joc perfect. n ipoteza n care aceast ordonare ar putea fi realizat, s-a
artat c Algoritmul Alpha-Beta nu trebuie s examineze, pentru a alege
cea mai bun mutare, dect O(b
d/2
) noduri, n loc de O(b
d
), ca n cazul
Algoritmului Minimax. Aceasta arat c factorul de ramificare efectiv
este b n loc de b n cazul jocului de ah 6, n loc de 35. Cu alte
cuvinte, Algoritmul Alpha-Beta poate privi nainte la o adncime dubl
fa de Algoritmul Minimax, pentru a gsi acelai cost.
n cazul unei ordonri neprevzute a strilor n spaiul de cutare,
Algoritmul Alpha-Beta poate dubla adncimea spaiului de cutare
(Nilsson 1980). Dac exist o anumit ordonare nefavorabil a nodurilor,
acest algoritm nu va cuta mai mult dect Algoritmul Minimax. Prin
urmare, n cazul cel mai nefavorabil, Algoritmul Alpha-Beta nu va oferi
nici un avantaj n comparaie cu cutarea exhaustiv de tip minimax. n
cazul unei ordonri favorabile ns, dac notm prin N numrul poziiilor
de cutare terminale evaluate n mod static de ctre Algoritmul Minimax,
s-a artat c, n cazul cel mai bun, adic atunci cnd mutarea cea mai
puternic este prima luat n consideraie, Algoritmul Alpha-Beta nu va
evalua n mod static dect N poziii. n practic, o funcie de ordonare
relativ simpl (cum ar fi ncercarea mai nti a capturilor, apoi
a ameninrilor, apoi a mutrilor nainte, apoi a celor napoi) ne poate
apropia suficient de mult de rezultatul obinut n cazul cel mai favorabil.
Aa cum se remarc n [9], toate rezultatele cu privire la
complexitatea jocurilor, ca i a problemelor de cutare, n general, se
bazeaz pe un model arborescent idealizat. Spre exemplu, modelul
folosit pentru Algoritmul Alpha-Beta presupune c toate nodurile au


156
acelai factor de ramificare, b; c toate drumurile ating limita de
adncime fixat, d; c evalurile frunzelor sunt distribuite n mod aleator
de-a lungul ultimului nivel al arborelui. Aceast ultim presupunere are
cel mai serios neajuns: dac o mutare din partea superioar a arborelui
reprezint o greeal dezastruoas, atunci majoritatea descendenilor si
vor prea neavantajoi juctorului care a fcut greeala. Valoarea unui
nod pare a fi strns corelat cu valorile nodurilor frate ale acestuia.
Gradul de corelare depinde foarte mult de fiecare joc n parte i de poziia
particular corespunztoare rdcinii. Astfel, cercetrile legate de jocuri
conin i o component de tiin empiric, care n mod inevitabil
eludeaz puterea analizei matematice.

3.4. Un exemplu. Jocul X i 0

Pentru a ilustra folosirea celor doi algoritmi minimax si alpha-
beta, considerm drept exemplu aa-numitul Joc X i 0, care face parte
din categoria jocurilor ntre dou persoane, cu informaie perfect
(complet).

Jocul X i 0

Se consider un tablou ptratic de dimensiune 3 3 , ale crui
cmpuri sunt marcate alternativ de ctre doi juctori. Unul dintre
juctori marcheaz cu X, iar cellalt cu 0. Ctig acel juctor care
marcheaz primul, cu simbolul su i n ntregime, fie o linie orizontal,


157
fie una vertical (coloan), fie o linie diagonal a tabloului. S se
determine juctorul ctigtor i configuraia final a tabloului.

Pentru rezolvarea acestei probleme vom defini funcia de
evaluare conform [7]. Pentru o poziie p, definim ( ) p e astfel:
( ) M p e = ( M- un numr foarte mare), dac p este poziie
ctigtoare pentru MAX;
( ) M p e = ( M- un numr foarte mare), dac p este poziie
ctigtoare pentru MIN;
( ) = p e numrul de linii deschise pentru MAX numrul de linii
deschise pentru MIN, dac p nu este poziie ctigtoare pentru nici
unul dintre cei doi juctori; prin linie deschis pentru MAX, respectiv
pentru MIN nelegem o linie orizontal, vertical sau diagonal care
a fost parial completat numai cu simbolul corespunztor lui MAX
(MIN); o linie ce conine numai cmpuri nemarcate poate fi
considerat deschis pentru ambii juctori.
Dac juctorul MAX este cel care marcheaz cu 0 (deci juctorul
MIN este cel care marcheaz cu X) i dac poziia p este cea din Fig. 3.5,
atunci ( ) 2 6 4 p e = = .

0
x


Fig. 3.5



158
n implementarea care urmeaz vom reprezenta o stare
a problemei prin intermediul unui termen Prolog de forma
st(J,Tablou,N,MAX)

Aici J este juctorul care face mutarea curent (J poate fi X sau 0), N
reprezint numrul maxim de mutri care se pot face n adncime (n
algoritmii minimax si alpha-beta), iar Tablou este o list n care se
memoreaz tabloul de joc, pe linii. MAX este juctorul (X sau 0)
corespunztor calculatorului, deci oponentul juctorului uman.

Programul 3.1

%jocul X si 0

%predicate specifice pentru jocul X si 0

juc_opus(x,0).
juc_opus(0,x).

%initial, tabloul este complet nemarcat
tablou_initial([gol,gol,gol,gol,gol,gol,gol,gol,
gol]).

%Predicatul tablou_final(T) este adevarat fie daca T
%are o linie orizontala, o coloana sau o diagonala
%marcata in intregime de catre unul din jucatori,
%fie daca T este complet marcat, dar nici unul dintre
%jucatori nu este castigator (caz care corespunde
%unei situatii de remiza).

tablou_final([C,C,C|_],C):-C\==gol,!.
tablou_final([_,_,_,C,C,C|_],C):-C\==gol,!.
tablou_final([_,_,_,_,_,_,C,C,C],C):-C\==gol,!.
tablou_final([C,_,_,C,_,_,C|_],C):-C\==gol,!.


159
tablou_final([_,C,_,_,C,_,_,C|_],C):-C\==gol,!.
tablou_final([_,_,C,_,_,C,_,_,C],C):-C\==gol,!.
tablou_final([C,_,_,_,C,_,_,_,C],C):-C\==gol,!.
tablou_final([_,_,C,_,C,_,C|_],C):-C\==gol,!.
tablou_final(Tablou,gol):- \+ (membru(gol,Tablou)).

membru(X,[X|_]).
membru(X,[_|T]):-membru(X,T).

mutari(Poz,ListaPoz):-
bagof(Poz1,mutare(Poz,Poz1),ListaPoz).

mutare(st(Jucator,T,N,M),st(Jucator_opus,Tablou1,
N1,M)):-
N>0,\+(tablou_final(T,_)),
juc_opus(Jucator,Jucator_opus),N1 is N-1,
marcheaza_pozitie(T,Jucator,Tablou1).

marcheaza_pozitie([gol|T],Jucator,[Jucator|T]).
marcheaza_pozitie([H|T],Jucator,[H|T1]):-
marcheaza_pozitie(T,Jucator,T1).

%definim functia de evaluare statica

staticval(st(_,Tablou,_,MAX),Val):-
tablou_final(Tablou,T),!,juc_opus(MAX,MIN),
(T==MIN, Val is -99;
T==MAX, Val is 99;
T==gol,Val is 0).
staticval(st(_,Tablou,_,MAX),Val):-
juc_opus(MAX,MIN),


160
nr_lin_deschise(MAX,L_D_2,Tablou),
%determinam numarul de linii deschise
%pentru MAX
nr_lin_deschise(MIN,L_D_1,Tablou),
%determinam numarul de linii deschise
%pentru MIN
Val is L_D_2-L_D_1.

%Predicatul nr_lin_deschise(XO,L_D,Tablou) este
%utilizat pentru determinarea numarului de linii
%deschise (L_D) pentru jucatorul XO, in cazul
%configuratiei (tabloului) Tablou.

nr_lin_deschise(XO,L_D,Tablou):-
linia1(Tablou,L1,XO),
linia2(Tablou,L2,XO),
linia3(Tablou,L3,XO),
coloana1(Tablou,C1,XO),
coloana2(Tablou,C2,XO),
coloana3(Tablou,C3,XO),
diagonala1(Tablou,D1,XO),
diagonala2(Tablou,D2,XO),
L_D is L1+L2+L3+C1+C2+C3+D1+D2.

membru_l([],_).
membru_l([H|T],XO):-
membru(H,[XO,gol]),membru_l(T,XO).

%Predicatul linia1(T,R,XO) este folosit pentru a
%determina daca prima linie orizontala a tabloului T
%este linie deschisa pentru jucatorul XO; daca da,
%atunci R=1, altfel R=0.



161
linia1([X,Y,Z|_],1,XO):-membru_l([X,Y,Z],XO),!.
linia1(_,0,_).

linia2([_,_,_,X,Y,Z|_],1,XO):-membru_l([X,Y,Z],XO),!.
linia2(_,0,_).

linia3([_,_,_,_,_,_,X,Y,Z],1,XO):-
membru_l([X,Y,Z],XO),!.
linia3(_,0,_).

%Predicatul linia1(T,R,XO) este folosit pentru a
%determina daca prima coloana a tabloului T este
%linie deschisa pentru jucatorul XO; daca da, atunci
%R=1, altfel R=0.

coloana1([X,_,_,Y,_,_,Z|_],1,XO):-
membru_l([X,Y,Z],XO),!.
coloana1(_,0,_).

coloana2([_,X,_,_,Y,_,_,Z|_],1,XO):-
membru_l([X,Y,Z],XO),!.
coloana2(_,0,_).

coloana3([_,_,X,_,_,Y,_,_,Z],1,XO):-
membru_l([X,Y,Z],XO),!.
coloana3(_,0,_).

%Predicatul diagonala1(T,R,XO) este folosit pentru a
%determina daca prima diagonala a tabloului T este
%linie deschisa pentru jucatorul XO; daca da, atunci
%R=1, altfel R=0

diagonala1([X,_,_,_,Y,_,_,_,Z],1,XO):-
membru_l([X,Y,Z],XO),!.


162
diagonala1(_,0,_).

diagonala2([_,_,X,_,Y,_,Z|_],1,XO):-
membru_l([X,Y,Z],XO),!.
diagonala2(_,0,_).

mutare_max(st(MAX,_,_,MAX)).
mutare_min(st(MIN,_,_,MAX)):-juc_opus(MAX,MIN).

%algoritmul minimax

minimax(Poz,SuccBun,Val):-
mutari(Poz,ListaPoz),!,
celmaibun(ListaPoz,SuccBun,Val);
staticval(Poz,Val).

celmaibun([Poz],Poz,Val):-minimax(Poz,_,Val).
celmaibun([Poz1|ListaPoz],PozBun,ValBuna):-
minimax(Poz1,_,Val1),
celmaibun(ListaPoz,Poz2,Val2),
maibine(Poz1,Val1,Poz2,Val2,PozBun,ValBuna).

maibine(Poz0,Val0,Poz1,Val1,Poz0,Val0):-
mutare_min(Poz0),Val0>Val1,!;
mutare_max(Poz0),Val0<Val1,!.
maibine(Poz0,Val0,Poz1,Val1,Poz1,Val1).

%algoritmul alpha-beta

alphabeta(Poz,Alpha,Beta,PozBuna,Val):-
mutari(Poz,ListaPoz),!,


163
limitarebuna(ListaPoz,Alpha,Beta,PozBuna,
Val);
staticval(Poz,Val).

limitarebuna([Poz|ListaPoz],Alpha,Beta,PozBuna,
ValBuna):-
alphabeta(Poz,Alpha,Beta,_,Val),
destuldebun(ListaPoz,Alpha,Beta,Poz,Val,
PozBuna,ValBuna).

destuldebun([],_,_,Poz,Val,Poz,Val):-!.
destuldebun(_,Alpha,Beta,Poz,Val,Poz,Val):-
mutare_min(Poz),Val>Beta,!;
mutare_max(Poz),Val<Alpha,!.
destuldebun(ListaPoz,Alpha,Beta,Poz,Val,PozBuna,
ValBuna):-
limitenoi(Alpha,Beta,Poz,Val,AlphaNou,BetaNou),
limitarebuna(ListaPoz,AlphaNou,BetaNou,Poz1,
Val1),
maibine(Poz,Val,Poz1,Val1,PozBuna,ValBuna).

limitenoi(Alpha,Beta,Poz,Val,Val,Beta):-
mutare_min(Poz),Val>Alpha,!.
limitenoi(Alpha,Beta,Poz,Val,Alpha,Val):-
mutare_max(Poz),Val<Beta,!.
limitenoi(Alpha,Beta,_,_,Alpha,Beta).

%predicate specifice pentru jocul x si 0

x_si_o_minimax:-


164
initializari(MAX,N),
tablou_initial(Tablou),
afis_tablou(Tablou),
joc_minimax(st(x,Tablou,N,MAX)).
%jucatorul care marcheaza cu X incepe jocul

x_si_o_alpha_beta:-
initializari(MAX,N),
tablou_initial(Tablou),
afis_tablou(Tablou),
joc_alpha_beta(st(x,Tablou,N,MAX)).
%jucatorul care marcheaza cu X incepe jocul

%Predicatul jucator_MAX(M) este folosit pentru
%determinarea jucatorului care va face prima mutare;
%el este, de asemenea, utilizat pentru determinarea
%jucatorului MAX.

jucator_MAX(M):-
write('Incepe jocul ... '),nl,
repeat,
write('Vrei sa fii cu X ? (da/nu)'),nl,
read(T),
(T=da,M=0 ;T=nu, M=x;T=d,M=0;T=n,M=x),!.

initializari(M,N):-
jucator_MAX(M),
nl,repeat,
write('Adancimea: '),
read(N),integer(N),!,nl.

joc_minimax(st(_,Tablou,_,MAX)):-


165
tablou_final(Tablou,J),!,anunt_castigator(J,MAX).
joc_minimax(st(J,Tablou,N,MAX)):-
MAX\==J,!,juc_opus(J,J_O),
mutare_MIN(Tablou,Tablou_urm,J),nl,
afis_tablou(Tablou_urm),
joc_minimax(st(J_O,Tablou_urm,N,MAX)).
joc_minimax(st(J,Tablou,N,MAX)):-
MAX==J,juc_opus(J,J_O),
minimax(st(J,Tablou,N,MAX),
st(J_O,Tablou_urm,_,MAX),_),
nl,write('Mutarea mea este: '),nl,nl,
afis_tablou(Tablou_urm),nl,
joc_minimax(st(J_O,Tablou_urm,N,MAX)).

joc_alpha_beta(st(_,Tablou,_,MAX)):-
tablou_final(Tablou,J),!,
anunt_castigator(J,MAX).
joc_alpha_beta(st(J,Tablou,N,MAX)):-
MAX\==J,!,juc_opus(J,J_O),
mutare_MIN(Tablou,Tablou_urm,J),nl,
afis_tablou(Tablou_urm),
joc_alpha_beta(st(J_O,Tablou_urm,N,MAX)).
joc_alpha_beta(st(J,Tablou,N,MAX)):-
MAX==J,juc_opus(J,J_O),
alphabeta(st(J,Tablou,N,MAX),
-500,500,st(J_O,Tablou_urm,_,MAX),_),
nl,write('Mutarea mea este: '),nl,nl,
afis_tablou(Tablou_urm),nl,
joc_alpha_beta(st(J_O,Tablou_urm,N,MAX)).


166
anunt_castigator(J,MAX):-
J==MAX,write('Ai pierdut!'),nl;
juc_opus(J,J_O),J_O==MAX,
write('Ai castigat!'),nl,
write('Bravo !!');
J==gol,
write('Jocul s-a incheiat cu remiza '),nl.

mutare_MIN(Tablou,Tablou_urm,J):-
nl,write('Trebuie sa marchezi. '),nl,
write('Specifica campul pe care il vei marca.'),
nl,repeat,det_coord_1(L),
det_coord_2(C),
N is L*3+C,
liber_marcheaza(N,Tablou,Tablou_urm,J),!.

det_coord_1(L):-
repeat,write('Linia: '),
read(L1),integer(L1),!,
L is L1-1.

det_coord_2(C):-
repeat,write('Coloana: '),
read(C1),integer(C1),!,
C is C1-1.

liber_marcheaza(0,[gol|R],[J|R],J):-!.
liber_marcheaza(N,[H|T],[H|T1],J):-
N1 is N-1,liber_marcheaza(N1,T,T1,J).



167
afis_tablou([C1,C2,C3,C4,C5,C6,C7,C8,C9]):-
write(' 1 2 3 '),nl,nl,
write('1 '),scrie_elem(C1),
tab(1),scrie_elem(C2),
tab(1),scrie_elem(C3),nl,
write('2 '),scrie_elem(C4),
tab(1),scrie_elem(C5),
tab(1),scrie_elem(C6),nl,
write('3 '),scrie_elem(C7),
tab(1),scrie_elem(C8),
tab(1),scrie_elem(C9),nl.

scrie_elem(X):-X==gol,!,write('.');
X==x,!,write('X');
write('0').

Interogarea Prologului se face apelnd predicatele
x_si_o_minimax dac se dorete folosirea algoritmului minimax i
respectiv x_si_o_alpha_beta pentru folosirea algoritmului alpha-
beta. Iat nite exemple de execuie ale programului:

1. Unul dintre juctori ctig

?- x_si_o_minimax.
Incepe jocul...
Vrei sa fii cu X? (da/nu)
|: nu.
Adancimea: 6.

1 2 3
1 . . .
2 . . .
3 . . .


168
Mutarea mea este:

1 2 3
1 . . .
2 . X .
3 . . .

Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 1.
Coloana: 2.

1 2 3
1 . 0 .
2 . X .
3 . . .

Mutarea mea este:

1 2 3
1 . 0 .
2 . X .
3 . . X

Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 1.
Coloana: 1.

1 2 3
1 0 0 .
2 . X .
3 . . X

Mutarea mea este:

1 2 3
1 0 0 X
2 . X .
3 . . X

Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 3.
Coloana: 1.



169
1 2 3
1 0 0 X
2 . X .
3 0 . X

Mutarea mea este:

1 2 3
1 0 0 X
2 . X X
3 0 . X

Ai pierdut!

Yes

2. Remiz

?- x_si_o_minimax.
Incepe jocul...
Vrei sa fii cu X? (da/nu)
|: da.

Adancimea: 6.

1 2 3
1 . . .
2 . . .
3 . . .

Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 2.
Coloana: 2.

1 2 3
1 . . .
2 . X .
3 . . .

Mutarea mea este:

1 2 3
1 . . .
2 . X .
3 . . 0


170
Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 1.
Coloana: 1.

1 2 3
1 X . .
2 . X .
3 . . 0

Mutarea mea este:

1 2 3
1 X . .
2 . X .
3 0 . 0

Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 3.
Coloana: 2.

1 2 3
1 X . .
2 . X .
3 0 X 0

Mutarea mea este:

1 2 3
1 X 0 .
2 . X .
3 0 X 0

Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 2.
Coloana: 1.

1 2 3
1 X 0 .
2 X X .
3 0 X 0

Mutarea mea este:



171
1 2 3
1 X 0 .
2 X X 0
3 0 X 0

Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 1.
Coloana: 3.

1 2 3
1 X 0 .
2 X X 0
3 0 X 0

Jocul s-a incheiat cu remiza

yes






















172



































173
CAPITOLUL 4
ASPECTE ALE REPREZENTRII CUNOTINELOR


Pentru a rezolva problemele complexe ntlnite n domeniul
inteligenei artificiale este nevoie att de o mare cantitate de cunotine,
ct i de mecanisme specifice pentru manipularea acestor cunotine cu
scopul gsirii de soluii ale unor noi probleme. Cele dou tipuri diferite
de entiti pe care le trateaz diversele modaliti de reprezentare
a cunotinelor sunt:
Faptele - reprezentnd adevruri ntr-o lume relevant. Acestea
sunt entitile pe care dorim s le reprezentm.
Reprezentri ale faptelor ntr-un anumit formalism. Acestea sunt
entitile care vor putea fi efectiv manipulate.
Structurarea acestor entiti se poate face la dou niveluri diferite:
Nivelul cunotinelor, nivel la care sunt descrise faptele (inclusiv
comportamentul fiecrui agent i scopurile lui curente).
Nivelul simbolurilor, la care reprezentrile obiectelor de la nivelul
cunotinelor sunt definite n termenii unor simboluri care pot fi
manipulate de ctre programele de calculator.
Un bun sistem de reprezentare a cunotinelor ntr-un anumit
domeniu ar trebui s posede [8] urmtoarele patru proprieti:
Adecvare n reprezentare - abilitatea de a reprezenta toate tipurile
de cunotine care sunt necesare ntr-un anumit domeniu.


174
Adecvare inferenial - abilitatea de a manipula structurile
reprezentaionale ntr-un asemenea mod nct s poat fi derivate
structuri noi, corespunztoare cunotinelor noi deduse din cele
vechi.
Eficiena inferenial - abilitatea de a ncorpora n structura de
cunotine informaii adiionale care s poat fi folosite pentru
a canaliza atenia mecanismului de inferen n direciile cele mai
promitoare.
Eficiena n achiziie - abilitatea de a achiziiona uor informaii
noi. n mod ideal, nsusi programul ar trebui s poat controla
achiziia de cunotine.
Nici un sistem unic nu poate optimiza toate aceste caracteristici,
nu n ultimul rnd datorit tipurilor extrem de diverse de cunotine care
exist, majoritatea programelor bazndu-se pe tehnici multiple.

4.1. Tipuri de cunotine
4.1.1. Cunotine relaionale simple

Cea mai simpl modalitate de reprezentare a faptelor declarative
const n folosirea unei mulimi de relaii de acelai tip cu cele utilizate n
sistemele de baze de date. Un exemplu de sistem relaional este cel din
Fig. 4.1. Cunotinele relaionale din acest tabel corespund unei mulimi
de atribute i de valori asociate, care mpreun descriu obiectele bazei de
cunotine.




175
Student Vrst An de studiu Note la
informatic
Popescu Andrei 18 I 8-9
Ionescu Maria 18 I 9-10
Hristea Oana 20 I 7-8
Prvu Ana 19 II 8-9
Savu Andrei 19 II 7-8
Popescu Ana 20 III 9-10

Fig. 4.1

Aceast reprezentare este simpl deoarece, n sine, nu posed i
nu furnizeaz capacitatea de inferen. Dar cunotinele reprezentate n
acest mod pot constitui input-ul adecvat pentru motoare de inferen mult
mai puternice. Sistemele de baze de date sunt proiectate tocmai cu scopul
de a furniza suportul necesar cunotinelor relaionale.

4.1.2. Cunotine care se motenesc

Cunotinele despre obiecte, atributele lor i valorile acestora sunt
adesea mult mai complexe dect permite modul de reprezentare din Fig.
4.1. n particular, este posibil ca reprezentarea de baz s fie mbogit
cu mecanisme de inferen care opereaz asupra structurii reprezentrii.
Pentru ca aceast modalitate de reprezentare s fie eficient, structura
trebuie proiectat n aa fel nct ea s corespund mecanismelor de
inferen dorite. Una dintre cele mai utilizate forme de inferen este
motenirea proprietilor, prin care elemente aparinnd anumitor clase
motenesc atribute i valori provenite de la clase mai generale, n care
sunt incluse. Pentru a admite motenirea proprietilor, obiectele trebuie


176
s fie organizate n clase, iar clasele trebuie s fie aranjate n cadrul unei
ierarhii. n Fig. 4.2 sunt reprezentate cunotine legate de jocul de fotbal,
cunotine organizate ntr-o structur de acest tip. n aceast reprezentare,
liniile desemneaz atribute. Nodurile figurate prin dreptunghiuri
reprezint obiecte i valori ale atributelor obiectelor. Aceste valori pot fi,
la rndul lor, privite ca obiecte avnd atribute i valori .a.m.d.. Sgeile
corespunztoare liniilor sunt orientate de la un obiect la valoarea lui (de-a
lungul liniei desemnnd atributul corespunztor).
n acest exemplu, structura corespunztoare reprezint o structur
de tip slot-and-filler. Ea mai poate fi privit i ca o reea semantic sau
ca o colecie de cadre. n cel din urm caz, fiecare cadru individual
reprezint colecia atributelor i a valorilor asociate cu un anumit nod.
O difereniere exact a acestor tipuri de reprezentri este greu de fcut
datorit marii flexibiliti care exist n reprezentarea cunotinelor. n
general, termenul de sistem de cadre implic existena unei mai mari
structurri a atributelor i a mecanismelor de inferen care le pot fi
aplicate dect n cazul reelelor semantice. Vom reveni asupra ambelor
modaliti de reprezentare a cunotinelor.
n exemplul din Fig. 4.2., toate obiectele i majoritatea atributelor
care intervin corespund domeniului sportiv al jocului de fotbal i nu au
o semnificaie general. Singurele dou excepii sunt atributul isa, utilizat
pentru a desemna incluziunea ntre clase i atributul instaniere, folosit
pentru a arta apartenena la o clas. Aceste dou atribute, extrem de
folosite, se afl la baza motenirii proprietilor ca tehnic de inferen.




177





















Fig. 4.2

Utiliznd aceast tehnic de inferen, baza de cunotine poate asigura
att regsirea faptelor care au fost memorate n mod explicit, precum i
a faptelor care deriv din cele memorate n mod explicit, ca n urmtorul
exemplu:
eficacitate(Adrian_Mutu) = 15/34
Pentru a gsi rspunsul la aceast interogare, ntruct nu exist nici
o valoare pentru eficacitate memorat n mod explicit corespunztor lui
echipa
eficacitate
inaltime
eficacitate
echipa
instantiere instantiere
eficacitate
isa isa
isa
inaltime
Persoana
Adult
Mascul
1,50 - 2
Atacant Mijlocas
15/34
Adrian
Mutu
Hellas
Verona
Gheorghe
Hagi
Steaua
Bucuresti
1,60 1,95
3/20
Fotbalist
6/30


178
Adrian_Mutu, a fost urmat atributul instaniere pn la Atacant i a fost
extras valoarea memorat acolo. Se poate acum observa una dintre
caracteristicile negative ale motenirii proprietilor, i anume aceea c
aceast tehnic de inferen poate produce valori implicite care nu sunt
garantate a fi corecte, dar care reprezint cele mai bune aproximri n
lipsa unor informaii exacte. Aceast tehnic de inferen continu s fie
printre cele mai folosite.

4.1.3. Cunotine infereniale

Motenirea proprietilor este o form de inferen puternic, dar
nu este suficient pentru a construi un sistem de reprezentare complet,
care, de cele mai multe ori, combin mai multe tehnici de reprezentare
a cunotinelor.
Puterea logicii tradiionale este adesea util pentru a se descrie
toate inferenele necesare. Desigur, astfel de cunotine nu sunt utile
dect n prezena unei proceduri de inferen care s le poat exploata.
Procedura de inferen necesar n acest caz este una care implementeaz
regulile logice de inferen standard. Exist multe asemenea proceduri,
dintre care unele fac raionamente de tipul nainte, de la fapte date ctre
concluzii, iar altele raioneaz napoi, de la concluziile dorite la faptele
date. Una dintre procedurile cele mai folosite de acest tip este rezoluia,
care folosete strategia contradiciei.
n general, logica furnizeaz o structur puternic n cadrul creia
sunt descrise legturile dintre valori. Ea se combin adesea cu un alt
limbaj puternic de descriere, cum ar fi o ierarhie de tip isa.


179
4.1.4. Cunotine procedurale

Reprezentarea cunotinelor descris pn n prezent s-a
concentrat asupra faptelor statice, declarative. Un alt tip de cunotine
extrem de utile sunt cunotinele procedurale sau operaionale, care
specific ce anume trebuie fcut i cnd.
Cunotinele procedurale pot fi reprezentate n programe n
diverse moduri. Cea mai simpl modalitate este, desigur, cea sub form
de cod, ntr-un anumit limbaj de programare. n acest caz, maina
folosete cunotinele atunci cnd execut codul pentru a efectua
o anumit sarcin. Acest mod de reprezentare a cunotinelor procedurale
nu este ns cel mai fericit din punctul de vedere al adecvrii infereniale,
precum i al eficienei n achiziie. Din aceast cauz s-au cutat alte
modaliti, diferite, de reprezentare a cunotinelor procedurale, astfel
nct acestea s poat fi manipulate relativ uor att de ctre oameni, ct
i de ctre alte programe.
Cea mai folosit tehnic de reprezentare a cunotinelor
procedurale n programele de inteligen artificial este aceea a utilizrii
regulilor de producie. Atunci cnd sunt mbogite cu informaii asupra
felului n care trebuie s fie folosite, regulile de producie sunt mai
procedurale dect alte metode existente de reprezentare a cunotinelor.
Regulile de producie, numite i reguli de tip if-then, sunt
instruciuni condiionale, care pot avea diverse interpretri, cum ar fi:
if precondiie P then concluzie C
if situaie S then aciune A


180
if condiiile C1 i C2 sunt verificate then condiia C nu este
verificat.
Regulile de producie sunt foarte utilizate n proiectarea
sistemelor expert. Vom reveni asupra lor, precum i a implementrii lor
n limbajul Prolog.
A face o distincie clar ntre cunotinele declarative i cele
procedurale este foarte dificil. Diferena esenial ntre ele este dat de
modul n care cunotinele sunt folosite de ctre procedurile care le
manipuleaz.

4.2. Clase de metode pentru reprezentarea cunotinelor

Principalele tipuri de reprezentri ale cunotinelor sunt
reprezentrile bazate pe logic i cele de tip slot-filler (deschiztur-
umplutur).
Reprezentrile bazate pe logic aparin unor dou mari categorii,
n funcie de instrumentele folosite n reprezentare, i anume:
Logica - mecanismul principal l constituie inferena logic.
Regulile (folosite, de pild, n sistemele expert) - principalele
mecanisme sunt nlnuirea nainte i nlnuirea napoi.
O regul este similar unei implicaii logice, dar nu are o valoare
proprie (regulile sunt aplicate, ele nu au una dintre valorile true
sau false).
Reprezentrile de tip slot-filler folosesc dou categorii diferite de
structuri:


181
Reele semantice i grafuri conceptuale - o reprezentare
distribuit (concepte legate ntre ele prin diverse relaii).
Principalul mecanism folosit este cutarea.
Cadre i scripturi - o reprezentare structurat (grupuri de concepte
i relaii); sunt foarte utile n reprezentarea tipicitii. Principalul
mecanism folosit este mperecherea (potrivirea) abloanelor
(tiparelor).

4.3. Reprezentarea cunotinelor i sistemele expert

Un sistem expert este un program care se comport ca un expert
ntr-un domeniu relativ restrns. Caracteristica major a sistemelor
expert, numite i sisteme bazate pe cunotine, este aceea c ele se
bazeaz pe cunotinele unui expert uman n domeniul care este studiat.
Mai exact, ele se sprijin pe cunotinele expertului uman asupra
strategiilor de rezolvare a problemelor specifice domeniului. Astfel, la
baza sistemelor expert se afl utilizarea n rezolvarea problemelor a unor
mari cantiti de cunotine specifice domeniului.
Sistemele expert
16
trebuie s poat rezolva probleme care necesit
cunotine ntr-un anumit domeniu. Prin urmare, ele trebuie s posede
aceste cunotine ntr-o anumit form. Din aceast cauz ele se mai
numesc i sisteme bazate pe cunotine. Nu toate sistemele bazate pe
cunotine constituie ns sisteme expert. Un sistem expert trebuie, n
plus, s fie capabil s explice utilizatorului comportamentul su i

16
A cror tratare se face aici conform [1].


182
deciziile luate, la fel cum o fac experii umani. Aceast caracteristic
referitoare la generarea explicaiilor este necesar n special n domeniile
n care intervine incertitudinea, cum ar fi diagnosticarea medical. Numai
n acest fel utilizatorul poate detecta o posibil fisur n raionamentul
sistemului.
O caracteristic suplimentar care este adesea cerut sistemelor
expert este, prin urmare, abilitatea de a trata incertitudinea sau starea de
a fi incomplet. Astfel, informaiile asupra problemei care trebuie
rezolvat pot fi incomplete sau de natur a nu inspira ncredere, iar
relaiile din domeniul problemei pot fi aproximative. Spre exemplu, un
anumit medicament poate genera anumite probleme, dar cel mai adesea
nu o face.
Pentru a construi un sistem expert este necesar, n general,
definirea urmtoarelor dou funcii:
o funcie de rezolvare a problemei, funcie capabil s foloseasc
cunotinele specifice domeniului i care trebuie s poat trata
incertitudinea.
o funcie de interaciune cu utilizatorul, care asigur i generarea
de explicaii asupra inteniilor sistemului i a deciziilor luate de
acesta n timpul i dup procesul de rezolvare a problemei.
Fiecare dintre aceste funcii poate fi foarte complicat i depinde n mod
nemijlocit de domeniul de aplicaie i de cerinele practice care pot s
apar.





183
4.3.1. Structura de baz a unui sistem expert

Un sistem expert conine trei module principale, i anume:
o baz de cunotine;
un motor de inferen;
o interfa cu utilizatorul.
Baza de cunotine cuprinde cunotinele specifice unui domeniu,
inclusiv fapte simple referitoare la domeniul de aplicaie, reguli care
descriu relaiile i fenomenele proprii domeniului i, eventual, metode,
euristici i idei pentru rezolvarea problemelor domeniului.
Motorul de inferen utilizeaz n mod activ cunotinele din baza
de cunotine.
Interfaa cu utilizatorul asigur comunicarea dintre utilizator i
sistem, oferind utilizatorului o privire asupra procesului de rezolvare
a problemei executat de ctre motorul de inferen. De cele mai multe ori
motorul de inferen i interfaa sunt privite ca un unic modul, numit shell
(nveli).
Structura de baz a unui sistem expert este prezentat n Fig. 4.3:







Fig. 4.3
Utilizator
Baza de
cunostinte
Motor de
inferenta
Interfata cu
utilizatorul
Shell


184
Schema din Fig. 4.3 separ cunotinele de algoritmii care
folosesc aceste cunotine. Aceast separare este convenabil din
urmtoarele motive: baza de cunotine depinde n mod clar de aplicaie.
Pe de alt parte, nveliul este, n principiu, independent de domeniu.
O modalitate de a dezvolta sisteme expert pentru diverse aplicaii, n
aceste condiii, const din dezvoltarea unui shell care poate fi folosit n
mod universal, cu utilizarea unei baze de cunotine diferite
corespunztor fiecrei aplicaii. Desigur, toate bazele de cunotine
utilizate vor trebui s se conformeze unui acelai formalism care este
neles de ctre shell. n practic, aceast abordare nu va avea succes
dect n cazul n care domeniile de aplicaie sunt extrem de similare, dar,
chiar dac modificri ale nveliului vor fi necesare, atunci cnd se trece
de la un domeniu la altul, principiile de baz pot fi reinute.

4.3.2. Reprezentarea cunotinelor cu reguli if-then

Regulile de tip if-then, numite i reguli de producie, constituie
o form natural de exprimare a cunotinelor i au urmtoarele
caracteristici suplimentare:
Modularitate: fiecare regul definete o cantitate de cunotine
relativ mic i independent de celelalte.
Incrementabilitate: noi reguli pot fi adugate bazei de cunotine
n mod relativ independent de celelalte reguli.
Modificabilitate (ca o consecin a modularitii): regulile vechi
pot fi modificate relativ independent de celelalte reguli.
Susin transparena sistemului.


185
Aceast ultim proprietate este o caracteristic important a sistemelor
expert. Prin transparena sistemului se nelege abilitatea sistemului de
a explica deciziile i soluiile sale. Regulile de producie faciliteaz
generarea rspunsului pentru urmtoarele dou tipuri de ntrebri ale
utilizatorului:
ntrebare de tipul cum: Cum ai ajuns la aceast concluzie?
ntrebare de tipul de ce: De ce te intereseaz aceast informaie?
Regulile de tip if-then adesea definesc relaii logice ntre
conceptele aparinnd domeniului problemei. Relaiile pur logice pot fi
caracterizate ca aparinnd aa-numitelor cunotine categorice, adic
acelor cunotine care vor fi ntotdeauna adevrate. n unele domenii ns,
cum ar fi diagnosticarea n medicin, predomin cunotinele moi sau
probabiliste. n cazul acestui tip de cunotine, regularitile empirice
sunt valide numai pn la un anumit punct (adesea, dar nu ntotdeauna).
n astfel de cazuri, regulile de producie pot fi modificate prin adugarea
la interpretarea lor logic a unei calificri de verosimilitate, obinndu-se
reguli de forma urmtoare:
if conditie A then concluzie B cu certitudinea F
Pentru a exemplifica folosirea regulilor de producie, vom lua n
consideraie baza de cunotine din Fig. 4.4, care i propune s trateze
problema scurgerii de ap n apartamentul din aceeai figur. O scurgere
de ap poate interveni fie n baie, fie n buctrie. n ambele situaii,
scurgerea provoac o problem (inundaie) i n hol. Aceast baz de
cunotine
17
simplist nu presupune dect existena defectelor unice:
problema poate fi la baie sau la buctrie, dar nu n ambele locuri n

17
Preluat de noi, pentru exemplificare, din [1].


186
acelai timp. Ea este reprezentat n Fig. 4.4 sub forma unei reele de
inferen:













Fig. 4.4

Nodurile reelei corespund propoziiilor, iar legturile corespund regulilor
din baza de cunotine. Arcele care conecteaz unele dintre legturi
indic conexiunea conjunctiv existent ntre propoziiile
corespunztoare. n consecin, regula referitoare la existena unei
probleme n buctrie, n cadrul acestei reele, este:

if hol_ud si baie_uscat then problema_la_bucatarie.



fereastra
baie
hol
bucatarie
fara_ploaie
scurgere_la_baie
hol_ud
bucatarie_uscat
fereastra_inchisa
fara_apa_din_afara
scurgere_in_bucatarie
baie_uscat
problema_la_bucatarie


187
4.3.3. nlnuire nainte i napoi n sistemele bazate pe reguli

Atunci cnd cunotinele sunt reprezentate ntr-o anumit form,
este nevoie de o procedur de raionament care s trag concluzii derivate
din baza de cunotine. n cazul regulilor de tip if-then, exist dou
modaliti de a raiona, ambele extrem de uor de implementat n
Prolog [1], i anume:
nlnuire napoi (backward chaining);
nlnuire nainte (forward chaining).

4.3.3.1. nlnuirea napoi

Raionamentul de tip nlnuire napoi pleac de la o ipotez i
apoi parcurge n sensul napoi reeaua de inferen. n cazul bazei de
cunotine din Fig. 4.4, spre exemplu, una dintre ipotezele de la care se
poate pleca este scurgere_in_bucatarie. Pentru ca aceast ipotez s fie
confirmat, este nevoie ca problema_la_bucatarie i fara_apa_din_afara
s fie adevrate. Prima dintre acestea este confirmat dac se constat c
holul este ud i baia este uscat. Cea de-a doua este confirmat dac se
constat, de pild, c fereastra este nchis.
Acest tip de raionament a fost numit nlnuire napoi deoarece
el urmeaz un lan de reguli care pleac de la ipotez
(scurgere_in_bucatarie) i se ndreapt ctre faptele evidente (hol_ud).
Acest mod de a raiona este extrem de simplu de implementat n Prolog,
ntruct reprezint nsui mecanismul de raionament ncorporat n acest
limbaj. Cea mai simpl i mai direct modalitate de implementare este


188
cea care enun regulile din baza de cunotine sub forma unor reguli
Prolog, ca n exemplele urmtoare:

problema_la_bucatarie:-
hol_ud,
baie_uscat.

fara_apa_din_afara:-
fereastra_inchisa
;
fara_ploaie.

Faptele observate ca fiind evidente pot fi reprezentate sub forma unor
fapte Prolog de tipul:

hol_ud.
baie_uscat.
fereastra_inchisa.

Ipoteza de la care s-a plecat poate fi acum verificat printr-o interogare
a Prologului de tipul urmtor:

?- scurgere_in_bucatarie.
yes

n aceast implementare, n cazul regulilor, a fost folosit nsi
sintaxa limbajului Prolog. Aceast abordare prezint anumite
dezavantaje, printre care faptul c expertul n domeniu care utilizeaz
baza de cunotine trebuie s fie familiarizat cu limbajul Prolog, ntruct


189
el trebuie s citeasc regulile, s le poat modifica i s poat specifica
reguli noi. Un al doilea dezavantaj al acestei implementri este faptul c
baza de cunotine nu se poate distinge, din punct de vedere sintactic, de
restul programului. Pentru a face distincia dintre baza de cunotine i
restul programului mai clar, sintaxa regulilor expert poate fi modificat
prin folosirea unor operatori definii de utilizator. Spre exemplu, pot fi
folosii ca operatori if, then, and i or, declarai n felul urmtor:

:- op(800,fx,if).
:- op(700,xfx,then).
:- op(300,xfy,or).
:- op(200,xfy,and).

Regulile pot fi scrise atunci sub forma:
if
hol_ud and bucatarie_uscat
then
scurgere_la_baie.
if
fereastra_inchisa or fara_ploaie
then
fara_apa_din_afara.

Faptele observate pot fi enunate sub forma unei proceduri pe care o vom
numi fapta:

fapta (hol_ud).
fapta (baie_uscat).
fapta (fereastra_inchisa).


190
n aceast nou sintax este nevoie de un nou interpretor pentru
reguli. Un astfel de interpretor poate fi definit sub forma procedurii
este_adevarat(P)
unde propoziia P este fie dat prin intermediul procedurii fapta, fie
poate fi derivat prin utilizarea regulilor. Noul interpretor, aa cum este el
propus n [1], este urmtorul:

:- op(800,fx,if).
:- op(700,xfx,then).
:- op(300,xfy,or).
:- op(200,xfy,and).

este_adevarat(P):-
fapta(P).

este_adevarat(P):-
if Conditie then P,
este_adevarat(Conditie).

este_adevarat(P1 and P2):-
este_adevarat(P1),
este_adevarat(P2).

este_adevarat(P1 or P2):-
este_adevarat(P1)
;
este_adevarat(P2).

Se observ c acest interpretor pentru reguli if-then de tip
nlnuire napoi continu s lucreze napoi n maniera depth-first.


191
Interogarea Prologului se face acum n felul urmtor:

? : -este_adevarat(scurgere_in_bucatarie).
yes

Principalul dezavantaj al procedurilor de inferen relativ simple
prezentate pn acum const n faptul c utilizatorul trebuie s enune
toate informaiile relevante de la nceput, naintea declanrii
raionamentului, sub form de fapte. Exist, prin urmare, pericolul ca
utilizatorul s enune prea puine sau prea multe fapte. De aceea, este de
preferat ca el s furnizeze informaiile n mod interactiv, n cadrul unui
dialog, atunci cnd acest lucru devine necesar. O asemenea abordare
poate fi vzut n [1].

4.3.3.2. nlnuirea nainte

nlnuirea nainte nu ncepe cu o ipotez, ci face un raionament
n direcie opus, de la partea cu if la partea cu then. n cazul exemplului
studiat, de pild, dup ce se observ c holul este ud iar baia este uscat,
se trage concluzia c exist o problem la buctrie.
Interpretorul pentru nlnuirea nainte pe care l vom prezenta
aici i care este preluat din [1], presupune c regulile sunt, ca i nainte,
de forma
if Conditie then Concluzie
unde Conditie poate fi o expresie de tipul AND/OR. Pentru simplitate
vom continua s presupunem c regulile nu conin variabile. Interpretorul
ncepe cu ceea ce este deja cunoscut (i enunat prin intermediul relaiei


192
fapta), trage toate concluziile posibile i adaug aceste concluzii
(folosind assert) relaiei fapta:

inainte:-
fapta_noua_dedusa(P), %o noua fapta
!,
write(Dedus:),write(P),nl,
assert(fapta (P)),
inainte %continua
;
write(Nu mai exista fapte). %Toate faptele
%au fost deduse

fapta_noua_dedusa(Concl):-
if Cond then Concl, %o regula
not fapta(Concl), %Concluzia
%regulii nu este
%incafo fapta
fapta_compusa(Cond). %Conditia este
%adevarata?

fapta_compusa(Cond):- %fapta simpla
fapta(Cond).
fapta_compusa(Cond1 and Cond2):-
fapta_compusa(Cond1), %Ambii conjuncti
fapta_compusa(Cond2). %sunt adevarati
bjmnhfds
fapta_compusa(Cond1 or Cond2):-
fapta_compusa(Cond1)
;
fapta_compusa(Cond2).



193
Interogarea Prologului se face n felul urmtor:

?-inainte.
Dedus: problema_la_bucatarie
Dedus: fara_apa_din_afara
Dedus: scurgere_in_bucatarie
Nu mai exista fapte

4.3.3.3. Concluzii

Regulile if-then formeaz lanuri de forma
informatie input ... informatie dedusa
Aceste dou tipuri de informaie sunt cunoscute sub diverse denumiri n
literatura de specialitate, denumiri care depind, n mare msur, de
contextul n care ele sunt folosite. Informaia de tip input mai poart
denumirea de date sau manifestri. Informaia dedus constituie ipotezele
care trebuie demonstrate sau cauzele manifestrilor sau diagnostice sau
explicaii.
Att nlnuirea nainte, ct i cea napoi presupun cutare, dar
direcia de cutare este diferit pentru fiecare n parte. nlnuirea napoi
execut o cutare de la scopuri nspre date, din care cauz se spune
despre ea c este orientat ctre scop. Prin contrast, nlnuirea nainte
caut pornind de la date nspre scopuri, fiind orientat ctre date.
ntrebarea fireasc care se ridic este cea referitoare la care tip de
raionament este preferabil. Rspunsul depinde n mare msur de
problema dat. n general, dac se dorete verificarea unei anumite
ipoteze, atunci nlnuirea napoi, pornindu-se de la respectiva ipotez,


194
pare mai natural. Dac ns exist o multitudine de ipoteze i nu exist
o anumit motivaie pentru testarea cu prioritate a uneia dintre ele, atunci
nlnuirea nainte va fi preferabil. Aceast metod se recomand i n
cazul sistemelor n care datele se achiziioneaz n mod continuu, iar
sistemul trebuie s detecteze apariia oricrei situaii reprezentnd
o anomalie. n acest caz, fiecare schimbare n datele de intrare poate fi
propagat nainte, pentru a se constata dac ea indic vreo eroare
a procesului monitorizat sau o schimbare a nivelului de performan.
n alegerea metodei de raionament poate fi util nsi forma
reelei n cauz. Astfel, un numr mic de noduri de date i unul ridicat al
nodurilor scop pot sugera ca fiind mai adecvat nlnuirea nainte. Un
numr redus al nodurilor scop i multe noduri corespunztoare datelor
indic nlnuirea napoi ca fiind preferabil. Este totui de notat faptul c
majoritatea sistemelor expert sunt infinit mai complexe i necesit
o combinare a celor dou tipuri de raionament, adic o combinare
a nlnuirii n ambele direcii.

4.3.4. Generarea explicaiilor

Una dintre caracteristicile regulilor de producie care fac din
acestea o modalitate natural de exprimare a cunotinelor n cadrul
sistemelor expert este faptul c ele susin transparena sistemului. Prin
transparena sistemului se nelege abilitatea acestuia de a explica
deciziile i soluiile sale. Regulile de producie faciliteaz generarea
rspunsului pentru urmtoarele dou tipuri de ntrebri ale utilizatorului:
ntrebare de tipul cum: Cum ai ajuns la aceast concluzie?


195
ntrebare de tipul de ce: De ce te intereseaz aceast
informaie?
n cele ce urmeaz, ne vom ocupa de primul tip de ntrebare.
O tratare a ntrebrilor de tipul de ce, care necesit interaciunea
utilizatorului cu procesul de raionament, poate fi consultat n [1].
n cazul ntrebrilor de tipul cum, explicaia pe care sistemul
o furnizeaz cu privire la modul n care a fost dedus rspunsul su
constituie un arbore de demonstraie a modului n care concluzia final
decurge din regulile i faptele aflate n baza de cunotine.
Fie <= un operator infixat. Atunci arborele de demonstraie al
unei propoziii poate fi reprezentat n una dintre urmtoarele forme, n
funcie de necesiti:
1. Dac P este o fapt, atunci arborele de demonstraie este P.
2. Dac P a fost dedus folosind o regul de forma
if Cond then P
atunci arborele de demonstraie este
P <= DemCond
unde DemCond este un arbore de demonstraie a lui Cond.
3. Fie P1 i P2 propoziii ale cror arbori de demonstraie sunt
Dem1 i Dem2. Dac P este de forma P1 and P2, atunci arborele
de demonstraie corespunztor este Dem1 and Dem2. Dac P
este de forma P1 or P2, atunci arborele de demonstraie este fie
Dem1, fie Dem2.
Construcia arborilor de demonstraie n Prolog este direct i se
poate realiza prin modificarea predicatului este_adevarat, introdus n
4.3.3.1, n conformitate cu cele trei cazuri enunate mai sus. Un astfel


196
de predicat este_adevarat modificat ar putea fi urmtorul, preluat de
noi din [1]:

%este_adevarat(P,Dem) daca Dem constituie o
%demonstratie a faptului ca P este adevarat

:-op(800,xfx,<=).

este_adevarat(P,P):-
fapta(P).
este_adevarat(P,P<= DemCond):-
if Cond then P,
este_adevarat(Cond,DemCond).
este_adevarat(P1 and P2, Dem1 and Dem2):-
este_adevarat(P1,Dem1),
este_adevarat(P2,Dem2).
este_adevarat(P1 or P2, Dem):-
este_adevarat(P1,Dem)
;
este_adevarat(P2,Dem).

4.3.5. Introducerea incertitudinii

Reprezentarea cunotinelor luat n discuie pn acum pleac de
la presupunerea c domeniile problemelor sunt categorice. Aceasta
nseamn c rspunsul la orice ntrebare este fie adevrat, fie fals.
Regulile care interveneau erau de aceeai natur, reprezentnd aa-numite
implicaii categorice. Totui, majoritatea domeniilor expert nu sunt


197
categorice. Att datele referitoare la o anumit problem, ct i regulile
generale pot s nu fie certe. Incertitudinea poate fi modelat prin
atribuirea unei calificri, alta dect adevrat sau fals, majoritii
aseriunilor. Gradul de adevr poate fi exprimat prin intermediul unui
numr real aflat ntr-un anumit interval - spre exemplu, un numr ntre
0 i 1 sau ntre -5 i +5. Astfel de numere cunosc, n literatura de
specialitate, o ntreag varietate de denumiri, cum ar fi factor de
certitudine, msur a ncrederii sau certitudine subiectiv.
n cele ce urmeaz, vom exemplifica prin extinderea reprezentrii
bazate pe reguli de pn acum cu o schem simpl de incertitudine,
preluat din [1]. Fiecrei propoziii i se va aduga un numr ntre 0 i 1
ca factor de certitudine. Reprezentarea folosit va consta dintr-o pereche
de forma:
Propoziie: FactorCertitudine

Aceast notaie va fi aplicat i regulilor. Astfel, urmtoarea form va
defini o regul i gradul de certitudine pn la care acea regul este
valid:
If Condiie then Concluzie: Certitudine.

n cazul oricrei reprezentri cu incertitudine este necesar
specificarea modului n care se combin certitudinile propoziiilor i ale
regulilor. Spre exemplu, s presupunem c sunt date dou propoziii P1 i
P2 avnd certitudinile c(P1) i respectiv c(P2). Atunci putem defini
c(P1 and P2) = min(c(P1), c(P2))
c(P1 or P2) = max(c(P1), c(P2))
Dac exist regula


198
if P1 then P2: C
cu C reprezentnd factorul de certitudine, atunci
c(P2) = c(P1)*C
Pentru simplitate, vom presupune, n cele ce urmeaz, c nu exist
mai mult de o regul susinnd o aceeai afirmaie. Dac ar exista dou
astfel de reguli n baza de cunotine, ele ar putea fi transformate, cu
ajutorul operatorului OR, n reguli echivalente care satisfac aceast
presupunere. Implementarea n Prolog a unui interpretor de reguli
corespunztor schemei de incertitudine descrise aici, preluat din [1], va
presupune specificarea de ctre utilizator a estimaiilor de certitudine
corespunztoare datelor observate (nodurile cel mai din stnga ale reelei)
prin relaia
dat(Propozitie, Certitudine).

Iat un asemenea interpretor pentru reguli cu factor de certitudine:

% certitudine (Propozitie, Certitudine)
certutudine(P,Cert):-
dat(P,Cert).
certitudine(Cond1 and Cond2, Cert):-
certitudine(Cond1,Cert1),
certitudine(Cond2,Cert2),
minimum(Cert1,Cert2,Cert).

certitudine(Cond1 or Cond2, Cert):-
certitudine(Cond1,Cert1),
certitudine(Cond2,Cert2),
maximum(Cert1,Cert2,Cert).


199
certitudine(P,Cert):-
if Cond then P:C1,
certitudine(Cond,C2),
Cert is C1*C2.

Regulile bazei de cunotine studiate anterior pot fi acum rafinate
ca n urmtorul exemplu :

if hol_ud and baie_uscat
then
problema_la_bucatarie: 0.9.

O situaie n care holul este ud, baia este uscat, buctria nu este
uscat, fereastra nu este nchis i credem - dar nu suntem siguri - c
afar nu plou, poate fi specificat dup cum urmeaz:

dat(hol_ud,1).
dat(baie_uscat,1).
dat(bucatarie_uscat,0).
dat(fara_ploaie,0.8).
dat(fereastra_inchisa,0).

Interogarea Prologului referitoare la o scurgere n buctrie se
face astfel:

?- certitudine(scurgere_in_bucatarie, C).
C = 0.8

Factorul de certitudine C este obinut dup cum urmeaz: faptul ca holul
este ud iar baia este uscat indic o problem n buctrie cu certitudine


200
0.9. ntruct a existat o oarecare posibilitate de ploaie, factorul de
certitudine corespunztor lui fara_apa_din_afara este 0.8. n final,
factorul de certitudine al lui scurgere_in_bucatarie este calculat ca fiind
min(0.8, 0.9) = 0.8.
Chestiunea manevrrii incertitudinii n sistemele expert a fost
ndelung dezbtut n literatura de specialitate, cele prezentate aici,
constituind, fr ndoial, o schem mult simplificat de tratare a acestei
probleme. Abordri matematice bazate pe teoria probabilitilor exist, n
egal msur. Ele vor fi amintite de noi n 5.1.1 al lucrrii de fa. Ceea
ce li se reproeaz, cel mai adesea, este faptul c abordri corecte din
punct de vedere probabilistic necesit fie informaie care nu este
ntotdeauna disponibil, fie anumite presupuneri simplificatoare care, de
regul, nu sunt justificate n aplicaiile practice i care fac, din nou, ca
abordarea s nu fie suficient de riguroas din punct de vedere matematic.
Una dintre cele mai cunoscute i mai utilizate scheme cu factori
de certitudine este cea dezvoltat pentru sistemul MYCIN
18
, un sistem
expert folosit n diagnosticarea infeciilor bacteriene. Factorii de
certitudine MYCIN au fost concepui pentru a produce rezultate care
preau corecte experilor, din punct de vedere intuitiv. Ali cercettori au
argumentat conceperea unor factori de certitudine bazai ntr-o mai mare
msur pe teoria probabilitilor, iar alii au experimentat scheme mult
mai complexe, proiectate pentru a modela mai bine lumea real. Factorii
MYCIN continu ns s fie utilizai cu succes n multe aplicaii cu
informaie incert.


18
Pentru care vezi 5.1.1 al lucrrii de fa.


201
4.3.6. Un exemplu de sistem expert. Implementare n Prolog

Pentru exemplificarea noiunilor descrise anterior, prezentm, n
continuare, implementarea n Prolog a unui sistem expert (SEPPCO)
destinat asistrii clienilor unei firme de turism, n alegerea unei oferte
pentru petrecerea concediului de odihn, din totalitatea celor existente.
n cadrul acestui sistem, cunotinele sunt reprezentate cu ajutorul
regulilor de tip if-then (dac-atunci), iar inferena utilizat este de tip
nlnuire napoi cu incertitudine (n prezena incertitudinii).
Incertitudinea este modelat prin intermediul factorilor de certitudine/
incertitudine de tip MYCIN (o descriere mai formal a factorilor MYCIN
este realizat n 5.1.1). n exemplul din aceast seciune, considerm c
factorii de certitudine sunt cuprini ntre -100 i 100; -100 corespunde
valorii cu siguran fals, iar 100 corespunde valorii cu siguran
adevrat. S mai remarcm faptul c aceti factori nu reprezint
probabiliti.
Shell-ul sistemului SEPPCO este o versiune modificat a shell-
ului unui sistem expert cu inferen de tip nlnuire napoi prezentat n
[6] (capitolele 3 i 4 i Anexa B).
Prezentm, n continuare, baza de cunotine a sistemului
SEPPCO. Dup cum se va vedea, coninutul bazei apare ntr-o form
foarte apropiat de cea a limbajului natural.

Baza de cunotine sistem SEPPCO
scopul este loc_concediu.

regula 1


202
daca buget_disponibil este redus
atunci in_romania fc 90.

regula 2
daca buget_disponibil este mediu
atunci in_romania fc 70.

regula 3
daca buget_disponibil este mare
atunci in_romania fc 50.

regula 4
daca departare este aproape
atunci in_romania.

regula 5
daca departare este departe
atunci in_romania fc 40.

regula 6
daca in_romania si
la_mare si
tip_oferta este sejur_1_luna si
buget_disponibil este mare si
anotimp este vara
atunci loc_concediu este neptun fc 80.

regula 7
daca in_romania si
la_mare si
tip_oferta este sejur_2_saptamani si
buget_disponibil este mare si
anotimp este vara


203
atunci loc_concediu este mamaia fc 90.

regula 8
daca in_romania si
la_mare si
tip_oferta este sejur_2_saptamani si
anotimp este vara
atunci loc_concediu este costinesti fc 60.

regula 9
daca in_romania si
not la_mare si
tip_oferta este excursie si
anotimp este vara
atunci loc_concediu este manastiri_oltenia fc 70.

regula 10
daca in_romania si
not la_mare si
tip_oferta este excursie si
anotimp este vara
atunci loc_concediu este manastiri_moldova fc 60.

regula 11
daca not la_mare si
anotimp este vara
atunci loc_concediu este delta_dunarii.

regula 12
daca not la_mare si
tip_oferta este sejur_1_luna si
anotimp este vara
atunci loc_concediu_vara este busteni.


204
regula 13
daca la_mare si
departare este foarte_departe si
buget_disponibil este mare si
anotimp este vara
atunci loc_concediu_vara este bahamas fc 80.

regula 14
daca not la_mare si
departare este foarte_departe si
buget_disponibil este mare si
tip_oferta este excursie si
anotimp este vara
atunci loc_concediu este valea_loirei.

regula 15
daca departare este aproape si
not la_mare si
buget_disponibil este mediu si
anotimp este vara
atunci loc_concediu_vara este sinaia fc 70.

regula 16
daca la_mare si
buget_disponibil este mare si
anotimp este iarna
atunci loc_concediu este rio_de_janeiro.

regula 17
daca buget_disponibil este mare si
not la_mare si
departare este foarte_departe si
tip_oferta este excursie si


205
anotimp este iarna
atunci loc_concediu este austria_germania_franta fc
90.

regula 18
daca departare este foarte_departe si
not la_mare si
tip_oferta este sejur_2_saptamani si
buget_disponibil este mare si
anotimp este iarna
atunci loc_concediu este chamonix fc 60.

regula 19
daca departare este aproape si
not la_mare si
tip_oferta este sejur_2_saptamani si
buget_disponibil este mare si
anotimp este iarna
atunci loc_concediu este poiana_brasov.

regula 20
daca in_romania si
not la_mare si
tip_oferta este sejur_2_saptamani si
anotimp este iarna
atunci loc_concediu este busteni fc 70.

intreaba anotimp
optiuni (vara iarna)
afiseaza 'In ce anotimp preferati sa va petreceti
concediul?'.

intreaba tip_oferta


206
optiuni (sejur_2_saptamani sejur_1_luna excursie)
afiseaza 'Preferati sa mergeti intr-o excursie, ori
sa petreceti un sejur intr-o statiune?'.

intreaba la_mare
optiuni (da nu)
afiseaza 'Preferati sa petreceti concediul la mare?'.

intreaba departare
optiuni (aproape departe foarte_departe)
afiseaza 'Preferati ca locul de petrecere a
concediului sa fie mai aproape, ori mai departe de
localitatea unde locuiti?'.

intreaba buget_disponibil
optiuni (redus mediu mare)
afiseaza 'Ce tip de buget alocati pentru petrecerea
concediului?'.

Din punctul de vedere al implementrii n Prolog se poate spune
c, n general, exist dou modaliti de a lucra cu o baz de cunotine
exprimat printr-un limbaj aproape natural. Prima dintre ele se bazeaz
pe definirea unor operatori i aceasta este abordarea folosit n
implementarea sistemului prezentat n capitolul 15 din [1]. Aceast
abordare a fost folosit i de noi n descrierea fcut n paragraful
anterior. Cea de-a doua modalitate (exemplificat aici n implementarea
sistemului SEPPCO) folosete, n esen, abilitatea Prolog-ului de a lucra
cu gramatici de tip DCG (definite clause grammar o extensie
a gramaticilor independente de context). n aceast abordare, din punctul
de vedere al programatorului, problema analizei sintactice (parsing) se


207
reduce doar la specificarea unei gramatici DCG i, de aceea, am putea
spune c aceast variant ofer mai mult flexibilitate programatorului.
O descriere amnunit a acestei modaliti de lucru exist n [2].
Prezentm, n continuare, cteva caracteristici ale sistemului
SEPPCO, precum i principalele predicate ale implementrii sale n
Prolog.
nainte de toate, vom face specificarea c, ori de cte ori o valoare
a unui atribut este determinat, fie cu ajutorul unei reguli, fie cu ajutorul
utilizatorului, o pereche de tipul (Atribut,Valoare) este salvat n spaiul
de lucru, mpreun cu factorul de certitudine FC asociat. Mai clar,
informaiile referitoare la faptele cunoscute la un moment dat (informaii
care sunt, n esen, perechi de tipul (atribut, valoare)) sunt meninute n
spaiul de lucru prin intermediul unor termeni Prolog de tipul:
fapt(av(Atr, Val), FC, Reguli). Aici Atr i Val reprezint un
atribut i respectiv o valoare asociat acestuia, iar FC reprezint factorul
de certitudine asociat faptului nostru. Argumentul Reguli specific lista
regulilor care au dus n mod direct la derivarea faptului i acest argument
este util pentru generarea explicaiilor la ntrebrile de tipul cum.
Formatul intern al regulilor specificate n baza de cunotine este
urmtorul:
regula(N, premise(Lista), concluzie(Scop,FC))

Primul argument, N, reprezint un atom, care identific n mod unic
regula (mai exact, N este un ntreg pozitiv). Lista este o list de
elemente de tipul av(Atr, Val), iar Scop este i el un element de
forma av(Atr, Val).


208
Menionm, de asemenea, c prin intermediul unor propoziii de
tipul Scopul este Atribut putem specifica n baza de cunotine
ntrebrile generale (scopurile principale) la care dorim ca sistemul nostru
s rspund. n formatul intern Prolog, o propoziie Scopul este
Atribut se traduce/ se reprezint prin scop(Atribut).
O caracteristic important a sistemului SEPPCO (n contextul
prezenei incertitudinii) este aceea c inferena nu este oprit atunci cnd
este gsit primul rspuns posibil la o ntrebare; dimpotriv, toate
variantele posibile/rezonabile sunt explorate i raportate. n general,
exist dou posibiliti prin care incertitudinea poate ptrunde/aprea
ntr-un sistem expert: prin intermediul regulilor cu concluzie incert i
prin intermediul rspunsurilor utilizatorului. n aceste condiii, situaiile
n care trebuie specificat modalitatea prin care incertitudinea este
propagat n sistem se refer, n esen, la urmtoarele cazuri:
reguli cu concluzia incert;
reguli cu premise incerte;
date incerte introduse de utilizator;
combinarea premiselor incerte cu concluzii incerte;
actualizarea unor fapte incerte n spaiul de lucru folosind, de
asemenea, fapte incerte;
impunerea unui prag de incertitudine pentru o premis a unei
reguli, prag care determin aplicarea/neaplicarea regulii
respective.
Specificm, n continuare, pe scurt, modalitile n care toate
aceste situaii sunt tratate n SEPPCO. Menionm, mai nti, c lucrm


209
n ipoteza c membrul stng al unei reguli este ntotdeauna o conjuncie
de scopuri elementare. Remarcm faptul c, n general, ntr-un sistem
expert, membrul stng al unei reguli poate avea o form mai general
dect cea permis n SEPPCO, spre exemplu poate fi de tipul conjuncii
de disjuncii de scopuri elementare; pentru aceste situaii au fost propuse
diverse modaliti de a se lucra cu factorii de (in)certitudine [3].
Dup cum se poate vedea n baza de cunotine a sistemului
SEPPCO, anumite reguli au un factor de (in)certitudine asociat lor; aceste
reguli sunt numite reguli cu concluzia incert. Semnificaia factorului
FC asociat unei reguli R este urmtoarea: dac premisele regulii R sunt
adevrate cu certitudinea 100, atunci se poate deduce c concluzia este
cunoscut cu certitudinea FC . De exemplu, dac concluzia unei reguli
R are certitudine FC =50 i dac premisele sale sunt cunoscute cu
certitudinea 100, atunci faptul din concluzia lui R este dedus cu
certitudinea 50. n situaia n care exist premise n membrul stng al unei
reguli R , care au factorul de certitudine diferit de 100, factorul de
certitudine al membrului stng al regulii R este ales ca fiind minimul
factorilor asociai premiselor lui R .
Dac membrul stng al unei reguli R este incert (i factorul su
asociat este StFC ) i dac regula este cu concluzie incert avnd
factorul asociat RFC , atunci factorul de incertitudine FC al faptului
determinat prin aplicarea regulii (adic al concluziei) este calculat astfel:
100
StFC RFC
FC

=
Pentru a evita folosirea regulilor al cror membru stng au un
factor de certitudine pozitiv, dar foarte mic, considerm valoarea 20 ca


210
fiind valoarea pozitiv minim a factorului de certitudine asociat
membrului stng al unei reguli aplicabile R . Exist cazuri n care mai
multe reguli conduc la aceeai concluzie. n aceste situaii este de dorit ca
fiecare dintre ele s contribuie la factorul de incertitudine FC al faptului
rezultat. De aceea folosim urmtoarea strategie: dac o regula R ce
conduce la o concluzie deja existent n spaiul de lucru (prin intermediul
unui fapt F ) se poate aplica la un moment dat, atunci noul factor de
certitudine asociat faptului F se calculeaz astfel:

100
) 100 (
) , ( _
X Y
X Y X FC nou

+ = , dac 0 , > Y X
( )
( ) ) , min( 100
100 ) , ( _
Y X
Y X
Y X FC nou

+
= , dac 0 , 0 > Y X
( )
( ) ) , min( 100
100 ) , ( _
Y X
Y X
Y X FC nou

+
= , dac 0 , 0 > Y X
) , ( _ ) , ( _ Y X FC nou Y X FC nou = , dac 0 , < Y X

n formulele anterioare, X reprezint factorul de certitudine al faptului
existent ( F ), Y este factorul de certitudine al faptului determinat prin
aplicarea regulii R , iar ) , ( _ Y X FC nou este noul factor de certitudine
asociat faptului considerat ( F ).
Pe scurt, motorul de inferen al sistemului SEPPCO trebuie s
ndeplineasc urmtoarele funcii: s combine factorii de certitudine n
modul specificat anterior, s menin n spaiul de lucru faptele derivate
i s actualizeze informaiile relevante. n plus, este nevoie ca toate
informaiile referitoare la un anume atribut s fie determinate (atunci
cnd acest lucru este necesar) i adugate n spaiul de lucru.


211
Trebuie remarcat faptul c, n implementarea de fa, presupunem
c, iniial, n spaiul de lucru nu avem nici un fapt cunoscut, ci numai
reguli i alte informaii referitoare la ntrebrile pe care utilizatorul le
poate pune (toate fiind exact informaiile care se regsesc n baza de
cunotine).
Principalul predicat al programului, predicat care reprezint de
fapt motorul inferenei, este realizare_scop:

realizare_scop(Scop, FC, Istorie)

Argumentele sale au urmtoarele semnificaii:
Scop are fie forma av(Atr,Val), fie forma not
av(Atr,Val); Av este atributul despre care dorim s aflm
informaii la un moment dat i, de obicei, atunci cnd acest
predicat este folosit, Atr este deja instaniat.
FC reprezint factorul de incertitudine ce va fi asociat faptului
nostru n final.
Istorie reine istoria i este folosit pentru a rspunde la
ntrebarea de ce?
Predicatul trateaz, n esen, trei cazuri, dup cum urmeaz:
dac n baza de cunotine exist un fapt care ne ofer informaii
referitoare la Atr, atunci problema este rezolvat i alte
posibiliti (reguli, informaii de la utilizator) sunt eliminate;
deoarece n baza de cunotine apare o informaie referitoare la
Atr, nseamn c toate variantele de rspuns pentru Atr au fost
explorate deja (acest lucru se ntampl deoarece, aa cum s-a


212
specificat, lucrm n ipoteza c, iniial, baza de cunotine nu
conine nici un fapt cunoscut);
altfel, dac utilizatorul poate fi interogat referitor la Atr, atunci
acesta este ntrebat despre Atr i rspunsul su este nregistrat
(adugat n spaiul de lucru); predicatul folosit pentru interogare
este interogheaza;
altfel, se determin pe rnd toate regulile care au atributul Atr n
concluzie i se ncearc demonstrarea premiselor din regulile
respective; dac acestea pot fi demonstrate, atunci incertitudinea
premiselor este combinat cu (in)certitudinea concluziei pentru
a se determina factorul de certitudine al rezultatului datorat
aplicrii fiecrei reguli n parte.
Remarcm faptul c, n cel de-al treilea caz, se iau n calcul toate
regulile n care Atr intervine n concluzie, chiar dac acestea se refer la
valori diferite pentru Atr. Specificm, de asemenea, faptul c sistemul
nostru permite ca premisa unei reguli s fie i de forma not Scop; n
aceast situaie, predicatul realizare_scop este utilizat pentru Scop,
iar factorul de certitudine pentru not Scop este definit/considerat ca
fiind opusul factorului de certitudine pentru Scop.
Menionm c, prin intermediul unor termeni de tipul
interogabil(Atr,Mesaj,Optiuni), sistemul SEPPCO menine n
spaiul de lucru informaii referitoare la atributele despre care putem
obine informaii de la utilizator. Aceste informaii sunt preluate din baza
de cunotine n momentul n care ea este ncrcat.


213
Predicatul interogheaza este utilizat n cel de-al doilea caz
prezentat n descrierea predicatului realizare_scop, i anume atunci
cnd nu exist n spaiul de lucru fapte referitoare la un anume atribut,
dar se pot obine informaii referitoare la Atr de la utilizator. Forma sa
este:

interogheaza(Atr,Mesaj,Optiuni,Istorie)

Argumentele sale au urmtoarele semnificaii:
Atr este atributul despre care dorim s obinem informaii;
Mesaj reprezint mesajul/ntrebarea care va fi adresat
utilizatorului atunci cnd acesta va fi interogat; acest mesaj poate
fi obinut prin intermediul predicatului interogabil;
Optiuni este de fapt lista n care sunt specificate valorile
posibile ale atributului Atr; ca i n cazul atributului Mesaj,
Optiuni poate fi determinat prin intermediul predicatului
interogabil;
Argumentul Istorie reprezint istoria i este folosit pentru
a rspunde la ntrebrile de tipul de ce?
Specificm faptul c rspunsul dorit este fie de forma M (unde M
este un membru din lista de opiuni Optiuni), fie de forma M fc
Numar (unde Numar este un factor de certitudine diferit de 100). Mai
remarcm doar c n prima situaie se consider c factorul de certitudine
al rspunsului asociat este maxim.
Cel de-al treilea caz prezentat n descrierea predicatului
realizare_scop se refer la situaia n care sunt efectiv utilizate reguli


214
pentru a determina informaii despre Atr. Predicatul folosit n aceast
situaie este predicatul fg, predicat care foreaz folosirea tuturor
regulilor care au Atr n concluzie, precum i combinarea factorilor de
certitudine ale faptelor derivate, n modul dorit i descris anterior. Dup
cum se va vedea n textul programului, predicatele principale folosite n
definiia predicatului fg sunt: demonstreaza, ajusteaza,
actualizeaza. Predicatul demonstreaza este utilizat pentru
a considera toate premisele din lista de premise a fiecrei reguli de
interes, apelnd realizare_scop pentru fiecare dintre premise;
factorul de certitudine final asociat membrului stng al fiecrei reguli este
calculat ca fiind minimul factorilor de certitudine din lista de premise
asociate regulii respective. Predicatul ajusteaza este folosit pentru
a combina incertitudinea asociat unei reguli cu incertitudinea premiselor
sale. n final, predicatul actualizeaza trateaz situaia n care
concluzia datorat aplicrii unei reguli se regsete deja n spaiul de
lucru prin intermediul unui fapt; acest predicat este folosit n cazul n care
concluziile mai multor reguli se refer la aceeai pereche (atribut,
valoare).
Principalul predicat al shell-ului este predicatul pornire,
predicat care determin un ciclu de execuie, n acesta din urm opiunile
fiind incarca, consulta, reinitiaza, afisare_fapte,
iesire, cum. Opiunile incarca, afisare_fapte, consulta,
cum sunt implementate prin intermediul predicatelor incarca,
scopuri_princ, cum, afiseaza_fapte. Predicatul
scopuri_princ ncearc satisfacerea, pe rnd, a fiecrui scop care


215
a fost specificat n baza de cunotine; el reprezint punctul de pornire al
inferenei (de tip nlnuire napoi). Predicatul incarca este utilizat
pentru ncrcarea bazei de cunotine n spaiul de lucru; cel mai
important predicat care intervine n descrierea predicatului incarca este
predicatul incarca_reguli, care este definit n felul urmtor:

incarca_reguli :-
repeat, citeste_propozitie(L),
proceseaza(L),L == [end_of_file],nl.

Aa cum arat definiia sa, predicatul incarca_reguli foreaz
citirea, pe rnd, a fiecrei propoziii din fiierul de intrare (fiier
determinat n interiorul predicatului incarca). Fiecrei propoziii ii este
asociat o list de atomi (prin intermediul predicatului
citeste_propozitie) i fiecare astfel de list de atomi este
transformat ntr-un termen Prolog, prin intermediul predicatului
proceseaza. Definirea predicatului citeste_propozitie se bazeaz
pe o implementare sugerat n [2]. Predicatul proceseaza este definit
astfel:

proceseaza([end_of_file]):-!.
proceseaza(L) :-trad(R,L,[]),assertz(R), !.

Argumentul su, L, reprezint o list de atomi, despre care
considerm c este valid dac ea corespunde cuvintelor unei fraze din
fiierul n care este specificat baza de cunotine a sistemului SEPPCO.
n esen, predicatul trad este folosit pentru traducerea unei fraze valide


216
din baza de cunotine (fraz specificat prin lista de atomi
corespunztoare) n formatul intern al Prologului. Aa cum am specificat
deja, aceast traducere este implementat folosind gramatici de tip DCG.
Dac lista de atomi L nu reprezint o fraz valid, atunci predicatul trad
i, prin urmare, i predicatul proceseaza, eueaz. Remarcm faptul c,
n definirea predicatului trad, se specific n mod clar ce nseamn fraza
valid.
Reamintim c informaiile referitoare la faptele cunoscute la un
moment dat sunt meninute n spaiul de lucru prin intermediul unor
termeni Prolog de tipul fapt(av(Atr, Val), FC, Reguli), unde
argumentul Reguli specific lista regulilor care au dus n mod direct la
derivarea faptului nostru. Folosind aceast caracteristic, implementarea
predicatului cum (predicat folosit pentru generarea explicaiilor la
ntrebrile de tipul cum?) este foarte natural (a se vedea textul
programului).
Predicatul reinitiaza este utilizat pentru a readuce spaiul de
lucru la o fom identic cu cea imediat de dup ncrcarea bazei de
cunotine (o form n care, n spaiul de lucru, se regsesc numai reguli
i informaii referitoare la ntrebrile pe care utilizatorul le poate pune,
dar nu i fapte cunoscute (deduse/ derivate)).
Prezentm, n continuare, o implementare n Prolog a sistemului
nostru, implementare ce folosete predicatele i considerentele anterioare:

:-use_module(library(lists)).
:-use_module(library(system)).
:-op(900,fy,not).


217
:-dynamic fapt/3.
:-dynamic interogat/1.
:-dynamic scop/1.
:-dynamic interogabil/3.
:-dynamic regula/3.

not(P):-P,!,fail.
not(_).

scrie_lista([]):-nl.
scrie_lista([H|T]) :-
write(H), tab(1),
scrie_lista(T).

afiseaza_fapte :-
write('Fapte existente n baza de cunostinte:'),
nl,nl, write(' (Atribut,valoare) '), nl,nl,
listeaza_fapte,nl.

listeaza_fapte:-
fapt(av(Atr,Val),FC,_),
write('('),write(Atr),write(','),
write(Val), write(')'),
write(','), write(' certitudine '),
FC1 is integer(FC),write(FC1),
nl,fail.
listeaza_fapte.

lista_float_int([],[]).
lista_float_int([Regula|Reguli],[Regula1|Reguli1]):-


218
(Regula \== utiliz,
Regula1 is integer(Regula);
Regula ==utiliz, Regula1=Regula),
lista_float_int(Reguli,Reguli1).

pornire :-
retractall(interogat(_)),
retractall(fapt(_,_,_)),
repeat,
write('Introduceti una din urmatoarele optiuni: '),
nl,nl,
write(' (Incarca Consulta Reinitiaza Afisare_fapte
Cum Iesire) '),
nl,nl,write('|: '),citeste_linie([H|T]),
executa([H|T]), H == iesire.

executa([incarca]) :-
incarca,!,nl,
write('Fisierul dorit a fost incarcat'),nl.
executa([consulta]) :-
scopuri_princ,!.
executa([reinitiaza]) :-
retractall(interogat(_)),
retractall(fapt(_,_,_)),!.
executa([afisare_fapte]) :-
afiseaza_fapte,!.
executa([cum|L]) :- cum(L),!.
executa([iesire]):-!.
executa([_|_]) :-


219
write('Comanda incorecta! '),nl.

scopuri_princ :-
scop(Atr),determina(Atr), afiseaza_scop(Atr),fail.
scopuri_princ.

determina(Atr) :-
realizare_scop(av(Atr,_),_,[scop(Atr)]),!.
determina(_).

afiseaza_scop(Atr) :-
nl,fapt(av(Atr,Val),FC,_),
FC >= 20,scrie_scop(av(Atr,Val),FC),
nl,fail.
afiseaza_scop(_):-nl,nl.

scrie_scop(av(Atr,Val),FC) :-
transformare(av(Atr,Val), X),
scrie_lista(X),tab(2),
write(' '),
write('factorul de certitudine este '),
FC1 is integer(FC),write(FC1).

realizare_scop(not Scop,Not_FC,Istorie) :-
realizare_scop(Scop,FC,Istorie),
Not_FC is - FC, !.
realizare_scop(Scop,FC,_) :-
fapt(Scop,FC,_), !.
realizare_scop(Scop,FC,Istorie) :-
pot_interoga(Scop,Istorie),


220
!,realizare_scop(Scop,FC,Istorie).
realizare_scop(Scop,FC_curent,Istorie) :-
fg(Scop,FC_curent,Istorie).

fg(Scop,FC_curent,Istorie) :-
regula(N, premise(Lista), concluzie(Scop,FC)),
demonstreaza(N,Lista,FC_premise,Istorie),
ajusteaza(FC,FC_premise,FC_nou),
actualizeaza(Scop,FC_nou,FC_curent,N),
FC_curent == 100,!.
fg(Scop,FC,_) :- fapt(Scop,FC,_).

pot_interoga(av(Atr,_),Istorie) :-
not interogat(av(Atr,_)),
interogabil(Atr,Optiuni,Mesaj),
interogheaza(Atr,Mesaj,Optiuni,Istorie),nl,
asserta( interogat(av(Atr,_)) ).

cum([]) :- write('Scop? '),nl,
write('|:'),citeste_linie(Linie),nl,
transformare(Scop,Linie), cum(Scop).
cum(L) :-
transformare(Scop,L),nl, cum(Scop).
cum(not Scop) :-
fapt(Scop,FC,Reguli),
lista_float_int(Reguli,Reguli1),
FC < -20,transformare(not Scop,PG),
append(PG,[a,fost,derivat,cu, ajutorul, 'regulilor:
'|Reguli1],LL),
scrie_lista(LL),nl,afis_reguli(Reguli),fail.


221
cum(Scop) :-
fapt(Scop,FC,Reguli),
lista_float_int(Reguli,Reguli1),
FC > 20,transformare(Scop,PG),
append(PG,[a,fost,derivat,cu, ajutorul, 'regulilor:
'|Reguli1],LL),
scrie_lista(LL),nl,afis_reguli(Reguli),
fail.
cum(_).

afis_reguli([]).
afis_reguli([N|X]) :-
afis_regula(N),
premisele(N),
afis_reguli(X).
afis_regula(N) :-
regula(N, premise(Lista_premise),
concluzie(Scop,FC)),NN is integer(N),
scrie_lista(['regula ',NN]),
scrie_lista([' Daca']),
scrie_lista_premise(Lista_premise),
scrie_lista([' Atunci']),
transformare(Scop,Scop_tr),
append([' '],Scop_tr,L1),
FC1 is integer(FC),append(L1,[FC1],LL),
scrie_lista(LL),nl.

scrie_lista_premise([]).
scrie_lista_premise([H|T]) :-


222
transformare(H,H_tr),
tab(5),scrie_lista(H_tr),
scrie_lista_premise(T).

transformare(av(A,da),[A]) :- !.
transformare(not av(A,da), [not,A]) :- !.
transformare(av(A,nu),[not,A]) :- !.
transformare(av(A,V),[A,este,V]).

premisele(N) :-
regula(N, premise(Lista_premise), _),
!, cum_premise(Lista_premise).

cum_premise([]).
cum_premise([Scop|X]) :-
cum(Scop),
cum_premise(X).

interogheaza(Atr,Mesaj,[da,nu],Istorie) :-
!,write(Mesaj),nl,
de_la_utiliz(X,Istorie,[da,nu]),
det_val_fc(X,Val,FC),
asserta( fapt(av(Atr,Val),FC,[utiliz]) ).
interogheaza(Atr,Mesaj,Optiuni,Istorie) :-
write(Mesaj),nl,
citeste_opt(VLista,Optiuni,Istorie),
assert_fapt(Atr,VLista).

citeste_opt(X,Optiuni,Istorie) :-
append(['('],Optiuni,Opt1),


223
append(Opt1,[')'],Opt),
scrie_lista(Opt),
de_la_utiliz(X,Istorie,Optiuni).

de_la_utiliz(X,Istorie,Lista_opt) :-
repeat,write(': '),citeste_linie(X),
proceseaza_raspuns(X,Istorie,Lista_opt).

proceseaza_raspuns([de_ce],Istorie,_) :-
nl,afis_istorie(Istorie),!,fail.

proceseaza_raspuns([X],_,Lista_opt):-
member(X,Lista_opt).
proceseaza_raspuns([X,fc,FC],_,Lista_opt):-
member(X,Lista_opt),float(FC).

assert_fapt(Atr,[Val,fc,FC]) :-
!,asserta( fapt(av(Atr,Val),FC,[utiliz]) ).
assert_fapt(Atr,[Val]) :-
asserta( fapt(av(Atr,Val),100,[utiliz])).

det_val_fc([nu],da,-100).
det_val_fc([nu,FC],da,NFC) :- NFC is -FC.
det_val_fc([nu,fc,FC],da,NFC) :- NFC is -FC.
det_val_fc([Val,FC],Val,FC).
det_val_fc([Val,fc,FC],Val,FC).
det_val_fc([Val],Val,100).

afis_istorie([]) :- nl.
afis_istorie([scop(X)|T]) :-
scrie_lista([scop,X]),!,


224
afis_istorie(T).
afis_istorie([N|T]) :-
afis_regula(N),!,afis_istorie(T).

demonstreaza(N,ListaPremise,Val_finala,Istorie) :-
dem(ListaPremise,100,Val_finala,[N|Istorie]),!.

dem([],Val_finala,Val_finala,_).
dem([H|T],Val_actuala,Val_finala,Istorie) :-
realizare_scop(H,FC,Istorie),
Val_interm is min(Val_actuala,FC),
Val_interm >= 20,
dem(T,Val_interm,Val_finala,Istorie).

actualizeaza(Scop,FC_nou,FC,RegulaN) :-
fapt(Scop,FC_vechi,_),
combina(FC_nou,FC_vechi,FC),
retract( fapt(Scop,FC_vechi,Reguli_vechi) ),
asserta( fapt(Scop,FC,[RegulaN | Reguli_vechi]) ),!.
actualizeaza(Scop,FC,FC,RegulaN) :-
asserta( fapt(Scop,FC,[RegulaN]) ).

ajusteaza(FC1,FC2,FC) :-
X is FC1 * FC2 / 100,
FC is round(X).
combina(FC1,FC2,FC) :-
FC1 >= 0,FC2 >= 0,
X is FC2*(100 - FC1)/100 + FC1,
FC is round(X).
combina(FC1,FC2,FC) :-


225
FC1 < 0,FC2 < 0,
X is - ( -FC1 -FC2 * (100 + FC1)/100),
FC is round(X).
combina(FC1,FC2,FC) :-
(FC1 < 0; FC2 < 0),
(FC1 > 0; FC2 > 0),
FCM1 is abs(FC1),FCM2 is abs(FC2),
MFC is min(FCM1,FCM2),
X is 100 * (FC1 + FC2) / (100 - MFC),
FC is round(X).

incarca :-
write('Introduceti numele fisierului care doriti sa
fie incarcat: '),nl, write('|:'),read(F),
file_exists(F),!,incarca(F).
incarca:-write('Nume incorect de fisier! '),nl,fail.

incarca(F) :-
retractall(interogat(_)),retractall(fapt(_,_,_)),
retractall(scop(_)),retractall(interogabil(_,_,_)),
retractall(regula(_,_,_)),
see(F),incarca_reguli,seen,!.

incarca_reguli :-
repeat,citeste_propozitie(L),
proceseaza(L),L == [end_of_file],nl.

proceseaza([end_of_file]):-!.
proceseaza(L) :-
trad(R,L,[]),assertz(R), !.


226
trad(scop(X)) --> [scopul,este,X].
trad(scop(X)) --> [scopul,X].
trad(interogabil(Atr,M,P)) -->
[intreaba,Atr],lista_optiuni(M),afiseaza(Atr,P).
trad(regula(N,premise(Daca),concluzie(Atunci,F))) -->
identificator(N),daca(Daca),atunci(Atunci,F).
trad('Eroare la parsare'-L,L,_).

lista_optiuni(M) -->
[optiuni,'('],lista_de_optiuni(M).
lista_de_optiuni([Element]) --> [Element,')'].
lista_de_optiuni([Element|T]) -->
[Element],lista_de_optiuni(T).

afiseaza(_,P) --> [afiseaza,P].
afiseaza(P,P) --> [].
identificator(N) --> [regula,N].

daca(Daca) --> [daca],lista_premise(Daca).

lista_premise([Daca]) --> propoz(Daca),[atunci].
lista_premise([Prima|Celalalte]) -->
propoz(Prima),[si],lista_premise(Celalalte).
lista_premise([Prima|Celalalte]) -->
propoz(Prima),[','],lista_premise(Celalalte).

atunci(Atunci,FC) --> propoz(Atunci),[fc],[FC].
atunci(Atunci,100) --> propoz(Atunci).

propoz(not av(Atr,da)) --> [not,Atr].
propoz(av(Atr,Val)) --> [Atr,este,Val].


227
propoz(av(Atr,da)) --> [Atr].

citeste_linie([Cuv|Lista_cuv]) :-
get0(Car),
citeste_cuvant(Car, Cuv, Car1),
rest_cuvinte_linie(Car1, Lista_cuv).

% -1 este codul ASCII pt EOF

rest_cuvinte_linie(-1, []):-!.
rest_cuvinte_linie(Car,[]) :-(Car==13;Car==10), !.
rest_cuvinte_linie(Car,[Cuv1|Lista_cuv]) :-
citeste_cuvant(Car,Cuv1,Car1),
rest_cuvinte_linie(Car1,Lista_cuv).

citeste_propozitie([Cuv|Lista_cuv]) :-
get0(Car),citeste_cuvant(Car, Cuv, Car1),
rest_cuvinte_propozitie(Car1, Lista_cuv).

rest_cuvinte_propozitie(-1, []):-!.
rest_cuvinte_propozitie(Car,[]) :-Car==46, !.
rest_cuvinte_propozitie(Car,[Cuv1|Lista_cuv]) :-
citeste_cuvant(Car,Cuv1,Car1),
rest_cuvinte_propozitie(Car1,Lista_cuv).

citeste_cuvant(-1,end_of_file,-1):-!.
citeste_cuvant(Caracter,Cuvant,Caracter1) :-
caracter_cuvant(Caracter),!,
name(Cuvant, [Caracter]),get0(Caracter1).
citeste_cuvant(Caracter, Numar, Caracter1) :-
caracter_numar(Caracter),!,


228
citeste_tot_numarul(Caracter, Numar, Caracter1).

citeste_tot_numarul(Caracter,Numar,Caracter1):-
determina_lista(Lista1,Caracter1),
append([Caracter],Lista1,Lista),
transforma_lista_numar(Lista,Numar).

determina_lista(Lista,Caracter1):-
get0(Caracter),
(caracter_numar(Caracter),
determina_lista(Lista1,Caracter1),
append([Caracter],Lista1,Lista);
\+(caracter_numar(Caracter)),
Lista=[],Caracter1=Caracter).

transforma_lista_numar([],0).
transforma_lista_numar([H|T],N):-
transforma_lista_numar(T,NN),
lungime(T,L), Aux is exp(10,L),
HH is H-48,N is HH*Aux+NN.

lungime([],0).
lungime([_|T],L):-
lungime(T,L1),
L is L1+1.

% 39 este codul ASCII pt '

citeste_cuvant(Caracter,Cuvant,Caracter1) :-
Caracter==39,!,
pana_la_urmatorul_apostrof(Lista_caractere),


229
L=[Caracter|Lista_caractere],
name(Cuvant, L),get0(Caracter1).

pana_la_urmatorul_apostrof(Lista_caractere):-
get0(Caracter),
(Caracter == 39,Lista_caractere=[Caracter];
Caracter\==39,
pana_la_urmatorul_apostrof(Lista_caractere1),
Lista_caractere=[Caracter|Lista_caractere1]).

citeste_cuvant(Caracter,Cuvant,Caracter1) :-
caractere_in_interiorul_unui_cuvant(Caracter),!,
((Caracter>64,Caracter<91),!,
Caracter_modificat is Caracter+32;
Caracter_modificat is Caracter),
citeste_intreg_cuvantul(Caractere,Caracter1),
name(Cuvant,[Caracter_modificat|Caractere]).

citeste_intreg_cuvantul(Lista_Caractere,Caracter1) :-
get0(Caracter),
(caractere_in_interiorul_unui_cuvant(Caracter),
((Caracter>64,Caracter<91),!,
Caracter_modificat is Caracter+32;
Caracter_modificat is Caracter),
citeste_intreg_cuvantul(Lista_Caractere1, Caracter1),
Lista_Caractere=[Caracter_modificat|Lista_Caractere1]
; \+(caractere_in_interiorul_unui_cuvant(Caracter)),
Lista_Caractere=[], Caracter1=Caracter).

citeste_cuvant(_,Cuvant,Caracter1):-


230
get0(Caracter),
citeste_cuvant(Caracter,Cuvant,Caracter1).

caracter_cuvant(C):-
member(C,[44,59,58,63,33,46,41,40]).

% am specificat codurile ASCII pentru , ; : ? ! . ) (

caractere_in_interiorul_unui_cuvant(C):-
C>64,C<91;C>47,C<58;
C==45;C==95;C>96,C<123.
caracter_numar(C):-C<58,C>=48.

Prezentm, n continuare, un exemplu complex de execuie a
programului. n acest exemplu, sunt evideniate cele mai importante
caracteristici ale sistemului SEPCCO, prin intermediul unor situaii
special alese pentru a releva modul n care sistemul propus trateaz
incertitudinea. Un exerciiu util (chiar recomandabil) ar putea fi rularea
exemplului mpreun cu urmrirea ndeaproape a mecanismului de
producere a rspunsurilor, n fiecare caz n parte.

Exemplu de utilizare

| ?- pornire.
Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: incarca
Introduceti numele fisierului care doriti sa fie incarcat:
|:'C:/ sist_seppco.txt'.

Fisierul dorit a fost incarcat


231
Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: consulta
'Ce tip de buget alocati pentru petrecerea concediului?'
( redus mediu mare )
: mare

'Preferati ca locul de petrecere a concediului sa fie mai aproape, ori mai departe de
localitatea unde locuiti?'
( aproape departe foarte_departe )
: departe

'Preferati sa petreceti concediul la mare?'
: da

'Preferati sa mergeti intr-o excursie, ori sa petreceti un sejur intr-o statiune?'
( sejur_2_saptamani sejur_1_luna excursie )
: sejur_2_saptamani

'In ce anotimp preferati sa va petreceti concediul?'
( vara iarna )
: vara

loc_concediu este costinesti
factorul de certitudine este 42
loc_concediu este mamaia
factorul de certitudine este 63

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: afisare_fapte
Fapte existente n baza de cunostinte:

(Atribut,valoare)

(loc_concediu,costinesti), certitudine 42
(loc_concediu,mamaia), certitudine 63
(anotimp,vara), certitudine 100
(tip_oferta,sejur_2_saptamani), certitudine 100
(la_mare,da), certitudine 100
(in_romania,da), certitudine 70
(departare,departe), certitudine 100


232
(buget_disponibil,mare), certitudine 100

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: cum
Scop?
|:loc_concediu este costinesti

loc_concediu este costinesti a fost derivat cu ajutorul regulilor: 8

regula 8
Daca
in_romania
la_mare
tip_oferta este sejur_2_saptamani
anotimp este vara
Atunci
loc_concediu este costinesti 60

in_romania a fost derivat cu ajutorul regulilor: 5 3

regula 5
Daca
departare este departe
Atunci
in_romania 40

departare este departe a fost derivat cu ajutorul regulilor: utiliz

regula 3
Daca
buget_disponibil este mare
Atunci
in_romania 50

buget_disponibil este mare a fost derivat cu ajutorul regulilor: utiliz

la_mare a fost derivat cu ajutorul regulilor: utiliz

tip_oferta este sejur_2_saptamani a fost derivat cu ajutorul regulilor: utiliz

anotimp este vara a fost derivat cu ajutorul regulilor: utiliz

Introduceti una din urmatoarele optiuni:


233
(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: reinitiaza
Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: consulta
'Ce tip de buget alocati pentru petrecerea concediului?'
( redus mediu mare )
: mare

'Preferati ca locul de petrecere a concediului sa fie mai aproape, ori mai departe de
localitatea unde locuiti?'
( aproape departe foarte_departe )
: aproape

'Preferati sa petreceti concediul la mare?'
: da

'Preferati sa mergeti intr-o excursie, ori sa petreceti un sejur intr-o statiune?'
( sejur_2_saptamani sejur_1_luna excursie )
: sejur_1_luna

'In ce anotimp preferati sa va petreceti concediul?'
( vara iarna )
: vara

loc_concediu este neptun
factorul de certitudine este 80

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: cum
Scop?
|:loc_concediu este neptun

loc_concediu este neptun a fost derivat cu ajutorul regulilor: 6

regula 6
Daca
in_romania
la_mare
tip_oferta este sejur_1_luna


234
buget_disponibil este mare
anotimp este vara
Atunci
loc_concediu este neptun 80

in_romania a fost derivat cu ajutorul regulilor: 4 3

regula 4
Daca
departare este aproape
Atunci
in_romania 100

departare este aproape a fost derivat cu ajutorul regulilor: utiliz

regula 3
Daca
buget_disponibil este mare
Atunci
in_romania 50

buget_disponibil este mare a fost derivat cu ajutorul regulilor: utiliz

la_mare a fost derivat cu ajutorul regulilor: utiliz

tip_oferta este sejur_1_luna a fost derivat cu ajutorul regulilor: utiliz

buget_disponibil este mare a fost derivat cu ajutorul regulilor: utiliz

anotimp este vara a fost derivat cu ajutorul regulilor: utiliz

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: reinitiaza
Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: consulta
'Ce tip de buget alocati pentru petrecerea concediului?'
( redus mediu mare )
: mare



235
'Preferati ca locul de petrecere a concediului sa fie mai aproape, ori mai departe de
localitatea unde locuiti?'
( aproape departe foarte_departe )
: aproape fc 90

'Preferati sa petreceti concediul la mare?'
: da

'Preferati sa mergeti intr-o excursie, ori sa petreceti un sejur intr-o statiune?'
( sejur_2_saptamani sejur_1_luna excursie )
: sejur_1_luna fc 60

'In ce anotimp preferati sa va petreceti concediul?'
( vara iarna )
: vara fc 70

loc_concediu este neptun
factorul de certitudine este 48

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: cum loc_concediu este neptun

loc_concediu este neptun a fost derivat cu ajutorul regulilor: 6

regula 6
Daca
in_romania
la_mare
tip_oferta este sejur_1_luna
buget_disponibil este mare
anotimp este vara
Atunci
loc_concediu este neptun 80

in_romania a fost derivat cu ajutorul regulilor: 4 3
regula 4
Daca
departare este aproape
Atunci
in_romania 100

departare este aproape a fost derivat cu ajutorul regulilor: utiliz



236
regula 3
Daca
buget_disponibil este mare
Atunci
in_romania 50

buget_disponibil este mare a fost derivat cu ajutorul regulilor: utiliz

la_mare a fost derivat cu ajutorul regulilor: utiliz

tip_oferta este sejur_1_luna a fost derivat cu ajutorul regulilor: utiliz

buget_disponibil este mare a fost derivat cu ajutorul regulilor: utiliz

anotimp este vara a fost derivat cu ajutorul regulilor: utiliz

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: afisare_fapte
Fapte existente n baza de cunostinte:

(Atribut,valoare)

(loc_concediu,neptun), certitudine 48
(anotimp,vara), certitudine 70
(tip_oferta,sejur_1_luna), certitudine 60
(la_mare,da), certitudine 100
(in_romania,da), certitudine 95
(departare,aproape), certitudine 90
(buget_disponibil,mare), certitudine 100

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: reinitiaza
Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: consulta
'Ce tip de buget alocati pentru petrecerea concediului?'
( redus mediu mare )
: mare


237
'Preferati ca locul de petrecere a concediului sa fie mai aproape, ori mai departe de
localitatea unde locuiti?'
( aproape departe foarte_departe )
: departe

'Preferati sa petreceti concediul la mare?'
: nu fc 30

'Preferati sa mergeti intr-o excursie, ori sa petreceti un sejur intr-o statiune?'
( sejur_2_saptamani sejur_1_luna excursie )
: excursie

'In ce anotimp preferati sa va petreceti concediul?'
( vara iarna )
: vara

loc_concediu este delta_dunarii
factorul de certitudine este 30
loc_concediu este manastiri_oltenia
factorul de certitudine este 21

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: cum loc_concediu este delta_dunarii

loc_concediu este delta_dunarii a fost derivat cu ajutorul regulilor: 11

regula 11
Daca
not la_mare
anotimp este vara
Atunci
loc_concediu este delta_dunarii 100

not la_mare a fost derivat cu ajutorul regulilor: utiliz

anotimp este vara a fost derivat cu ajutorul regulilor: utiliz

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: cum loc_concediu este manastiri_oltenia



238
loc_concediu este manastiri_oltenia a fost derivat cu ajutorul regulilor: 9

regula 9
Daca
in_romania
not la_mare
tip_oferta este excursie
anotimp este vara
Atunci
loc_concediu este manastiri_oltenia 70

in_romania a fost derivat cu ajutorul regulilor: 5 3

regula 5
Daca
departare este departe
Atunci
in_romania 40

departare este departe a fost derivat cu ajutorul regulilor: utiliz

regula 3
Daca
buget_disponibil este mare
Atunci
in_romania 50

buget_disponibil este mare a fost derivat cu ajutorul regulilor: utiliz

not la_mare a fost derivat cu ajutorul regulilor: utiliz

tip_oferta este excursie a fost derivat cu ajutorul regulilor: utiliz

anotimp este vara a fost derivat cu ajutorul regulilor: utiliz

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: afisare_fapte
Fapte existente n baza de cunostinte:

(Atribut,valoare)

(loc_concediu,delta_dunarii), certitudine 30
(loc_concediu,manastiri_moldova), certitudine 18


239
(loc_concediu,manastiri_oltenia), certitudine 21
(anotimp,vara), certitudine 100
(tip_oferta,excursie), certitudine 100
(la_mare,da), certitudine -30
(in_romania,da), certitudine 70
(departare,departe), certitudine 100
(buget_disponibil,mare), certitudine 100

Introduceti una din urmatoarele optiuni:
(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: reinitiaza
Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: consulta
'Ce tip de buget alocati pentru petrecerea concediului?'
( redus mediu mare )
: mare

'Preferati ca locul de petrecere a concediului sa fie mai aproape, ori mai departe de
localitatea unde locuiti?'
( aproape departe foarte_departe )
: departe

'Preferati sa petreceti concediul la mare?'
: da fc 90

'Preferati sa mergeti intr-o excursie, ori sa petreceti un sejur intr-o statiune?'
( sejur_2_saptamani sejur_1_luna excursie )
: sejur_1_luna

'In ce anotimp preferati sa va petreceti concediul?'
( vara iarna )
: iarna fc 50

loc_concediu este rio_de_janeiro
factorul de certitudine este 50

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: cum loc_concediu este rio_de_janeiro



240
loc_concediu este rio_de_janeiro a fost derivat cu ajutorul regulilor: 16

regula 16
Daca
la_mare
buget_disponibil este mare
anotimp este iarna
Atunci
loc_concediu este rio_de_janeiro 100

la_mare a fost derivat cu ajutorul regulilor: utiliz

buget_disponibil este mare a fost derivat cu ajutorul regulilor: utiliz

anotimp este iarna a fost derivat cu ajutorul regulilor: utiliz
Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: afisare_fapte
Fapte existente n baza de cunostinte:

(Atribut,valoare)

(loc_concediu,rio_de_janeiro), certitudine 50
(anotimp,iarna), certitudine 50
(tip_oferta,sejur_1_luna), certitudine 100
(la_mare,da), certitudine 90
(in_romania,da), certitudine 70
(departare,departe), certitudine 100
(buget_disponibil,mare), certitudine 100

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: reinitiaza
Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: consulta
'Ce tip de buget alocati pentru petrecerea concediului?'
( redus mediu mare )
: mare fc 35



241
'Preferati ca locul de petrecere a concediului sa fie mai aproape, ori mai departe de
localitatea unde locuiti?'
( aproape departe foarte_departe )
: foarte_departe

'Preferati sa petreceti concediul la mare?'
: nu fc 90

'In ce anotimp preferati sa va petreceti concediul?'
( vara iarna )
: iarna fc 80

'Preferati sa mergeti intr-o excursie, ori sa petreceti un sejur intr-o statiune?'
( sejur_2_saptamani sejur_1_luna excursie )
: sejur_2_saptamani

loc_concediu este chamonix
factorul de certitudine este 21

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: cum loc_concediu este chamonix

loc_concediu este chamonix a fost derivat cu ajutorul regulilor: 18

regula 18
Daca
departare este foarte_departe
not la_mare
tip_oferta este sejur_2_saptamani
buget_disponibil este mare
anotimp este iarna
Atunci
loc_concediu este chamonix 60

departare este foarte_departe a fost derivat cu ajutorul regulilor: utiliz

not la_mare a fost derivat cu ajutorul regulilor: utiliz

tip_oferta este sejur_2_saptamani a fost derivat cu ajutorul regulilor: utiliz

buget_disponibil este mare a fost derivat cu ajutorul regulilor: utiliz

anotimp este iarna a fost derivat cu ajutorul regulilor: utiliz


242
Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: afisare_fapte
Fapte existente n baza de cunostinte:

(Atribut,valoare)

(loc_concediu,chamonix), certitudine 21
(tip_oferta,sejur_2_saptamani), certitudine 100
(anotimp,iarna), certitudine 80
(la_mare,da), certitudine -90
(departare,foarte_departe), certitudine 100
(in_romania,da), certitudine 18
(buget_disponibil,mare), certitudine 35

Introduceti una din urmatoarele optiuni:

(Incarca Consulta Reinitiaza Afisare_fapte Cum Iesire)

|: iesire

yes
4.4. Reele semantice i cadre

Sistemele bazate pe reguli nu constituie singurul cadru de lucru
pentru reprezentarea cunotinelor. Alte dou moduri de lucru posibile
constau n utilizarea aa-numitelor reele semantice i, respectiv, cadre,
la care ne vom referi, pe scurt, n cele ce urmeaz. Acestea difer de
reprezentrile bazate pe reguli n primul rnd prin faptul c se
concentreaz asupra reprezentrii, ntr-un mod structurat, a unor mulimi
foarte mari de fapte. Mulimea de fapte reprezentat este structurat i, n
msura n care este posibil, comprimat: o serie de fapte nu sunt
reprezentate n mod explicit atunci cnd ele pot fi reconstruite prin
mecanismul de inferen. Att reelele semantice, ct i cadrele sunt uor
de reprezentat n Prolog, aa cum se va vedea n cele ce urmeaz.


243
4.4.1. Reele semantice

O reea semantic const din entiti i relaii ntre acestea. Ea se
reprezint sub forma unui graf orientat ale crui arce leag vrfuri
etichetate. Cel mai adesea nodurile grafului corespund entitilor, n timp
ce relaiile sunt figurate ca legturi ntre noduri etichetate cu denumirile
relaiilor. n Fig. 4.5 este prezentat, spre exemplificare, o reea
semantic:














Fig. 4.5

Exemplul a fost preluat de noi din [1], iar reeaua este folosit pentru
reprezentarea unor fapte de tipul urmtor:
activ
isa
metoda_de_miscare
animal
pasare
zbor
activ
ziua
culoare
isa
isa
isa
albatros
Tudor
Mihai
alb_si_negru
isa
mers
metoda_de_miscare
maro
culoare
isa
kiwi
Dana
noaptea


244
O pasre este un anumit tip de animal.
Metoda uzual de micare a psrilor este zborul.
Un albatros este o pasre.
Mihai i Tudor sunt albatroi.
Se observ c relaia de tip isa uneori realizeaz legtura dintre
o clas de obiecte i o alt clas avnd o sfer mai larg i reprezentnd
un element supraordonat (animal este o clas supraordonat a lui pasre),
iar alteori face legtura ntre o instaniere a unei clase i nsi clasa
respectiv (Mihai este un albatros). O astfel de reea este imediat
tradus sub forma unor fapte Prolog de tipul:

isa(pasare,animal).
isa(mihai,albatros).
metoda_de_miscare(pasare,zbor).
metoda_de_miscare(kiwi,mers).

Pe lng faptele de acest tip, care sunt enunate n mod explicit,
alte fapte pot fi deduse pe baza aceleiai reele. Principiul tipic de
inferen ncorporat n reea este, aa cum s-a mai menionat, motenirea
proprietilor. Faptele sunt motenite prin intermediul relaiei isa. n
Prolog putem enuna faptul c metoda de micare este motenit, urcnd
de-a lungul ierarhiei isa, sub forma urmtoare:

metoda_de_miscare(X,Metoda):-
isa(X,SuperX),
metoda_de_miscare(SuperX,Metoda).



245
Pentru a nu enuna cte o regul de motenire distinct
corespunztor fiecrei relaii care poate fi motenit, se va enuna
o regul mult mai general referitoare la fapte, fie ele enunate n mod
explicit n cadrul reelei, fie motenite:

fapta(Fapta):- %Fapta nu este o variabila;
%Fapta=Rel(Ar1,Arg2)
Fapta,!. %Fapta explicita in retea

fapta(Fapta):-
Fapta=..[Rel,Arg1,Arg2],
isa(Arg1,SuperArg), %urcand de-a lungul
%ierarhiei isa
SuperFapta=..[Rel,SuperArg,Arg2].

Reeaua semantic din Fig. 4.5 poate fi acum interogat n modul
urmtor:

?-fapta(metoda_de_miscare(dana,Metoda)).
Metoda=mers

Aceast metod de micare a fost motenit de la faptul c psrile kiwi
merg, aceasta fiind o fapt dat n mod explicit n cadrul reelei. Pe de
alt parte, metoda de micare a lui Mihai este motenit de la clasa
pasre i ea este, prin urmare, zborul:

?-fapta(metoda_de_miscare(mihai,Metoda)).
Metoda= zbor



246
Unul dintre subdomeniile inteligenei artificiale n care este
extrem de folosit reprezentarea cunotinelor prin intermediul reelelor
semantice este acela al prelucrrii limbajului natural. Astfel, una dintre
cele mai utile reprezentri ale cunotinelor lexicale este cea sub form de
reea semantic. Avantajele oferite de reelele semantice n reprezentarea
cunotinelor lexicale sunt multiple. Printre acestea amintim faptul c
reelele semantice uureaz construcia lexiconului, permind motenirea
proprietilor. n acelai timp, ele furnizeaz o mulime foarte bogat de
legturi ntre sensurile cuvintelor, ceea ce faciliteaz dezambiguizarea.
Aceasta din urm este, de regul, realizat printr-o reprezentare ierarhic
a sensurilor cuvintelor, cel mai adesea captat tocmai prin intermediul
reelelor semantice. Folosindu-se astfel de ierarhii pot fi definite restricii
selecionale i pot fi utilizate aceste constrngeri pentru a reduce numrul
de sensuri posibile ale unui cuvnt.

Un alt exemplu de reea semantic. WordNet

Un exemplu celebru de reea semantic (din domeniul prelucrrii
limbajului natural) este WordNet, datorit creia procesarea
cunotinelor a dobndit noi dimensiuni.
WordNet reprezint n primul rnd o baz de date lexical
interactiv, dezvoltat n ultimii 15 ani, pentru limba englez, la
Universitatea Princeton, de ctre un grup de cercettori condus de
profesorul George Miller. n acelai timp, WordNet poate fi privit ca un
dicionar semantic, deoarece cuvintele sunt localizate pe baza afinitilor
conceptuale cu alte cuvinte, spre deosebire de cazul dicionarelor clasice,


247
unde cuvintele sunt ordonate alfabetic. Dei este similar unui tezaur,
WordNet este mult mai util aplicaiilor inteligenei artificiale, ntruct
este nzestrat cu o bogat mulime de relaii ntre cuvinte i sensuri ale
cuvintelor. WordNet este implementat n limbajele Prolog, C i Java.
WordNet conine majoritatea substantivelor, verbelor, adjectivelor
i adverbelor limbii engleze, organizate n mulimi de sinonime numite
synset-uri. Fiecare synset reprezint un concept.
Reeaua WordNet structureaz informaia lexical n termeni de
sensuri ale cuvintelor. Ea face corespondena dintre formele tip ale
cuvintelor i sensurile acestora utiliznd categoria sintactic ca
parametru. Astfel, cuvintele aparinnd aceleiai categorii sintactice, care
pot fi folosite pentru a exprima acelai neles, sunt grupate ntr-un
acelai synset. Cuvintele polisemantice aparin mai multor synset-uri.
Spre exemplu, cuvntul englezesc computer are dou sensuri definite n
WordNet, ceea ce face ca el s aparin la doua synset-uri diferite, dup
cum urmeaz:

(1) {computer, data processor, electronic computer, information
processing system}
i
(2) {calculator, reckoner, figurer, estimator, computer}.

n versiunea sa curent (versiunea 1.6), WordNet conine 129509
cuvinte organizate n 99643 synset-uri, reeaua utiliznd un numr de
229152 noduri. Cuvintele i conceptele sunt legate ntre ele prin relaii
semantice. Exist n total 299711 asemenea relaii. Toate aceste numere


248
sunt ns aproximative, ntruct WordNet continu s creasc. Versiunea
1.7.1 este acum accesibil n egala msur, la adresa:

http://www.cogsci.princeton.edu/~wn/obtain/

Relaiile semantice se stabilesc ntre cuvinte, ntre cuvinte i
synset-uri, precum i ntre synset-uri. Fiecare cuvnt intete ctre unul
sau mai multe synset-uri, fiecare dintre acestea corespunznd unui anumit
sens al cuvntului respectiv. Prin urmare, diferite cuvinte pot inti ctre
un acelai sens (synset). Bogia mulimii de relaii stabilite ntre
synset-uri este ceea ce face ca reeaua semantic WordNet s fie att de
puternic i de interesant pentru diverse tipuri de aplicaii. Exemple de
relaii semantice existente n WordNet sunt sinonimia (synonymy),
folosit pentru a forma synset-urile, hiperonimia (hypernymy) i
hiponimia (hyponymy), corespunznd relaiei de tip isa i respectiv
relaiei inverse (reverse isa), meronimia (meronymy), corespunznd
relaiei parte-din, relaia cauzal referitoare la verbe i altele.
O importan deosebit este ataat relaiilor de hiperonimie i de
hiponimie ca relaii ntre synset-uri.
Cu ajutorul relaiei de hiperonimie (sau de tip isa) conceptele de
substantiv i de verb sunt structurate sub form de ierarhii. Cele de
adjectiv i de adverb au o structur diferit (cluster). n WordNet exist
11 ierarhii substantivale i 512 ierarhii verbale. Semantica relaiei de tip
isa permite unui concept s moteneasc toate proprietile hiperonimelor
sale. n plus, proprietile tipice ale unui concept sunt enunate sub form
de glos ataat fiecrui concept n parte. Fiecare glos include


249
o definiie, una sau mai multe explicaii suplimentare i unul sau mai
multe exemple.
WordNet reprezint o baz de date lexical a limbii engleze care
a fost adoptat pe scar larg pentru o ntreag varietate de aplicaii
practice din domeniul inteligenei artificiale, cu precdere din
subdomeniul procesrii limbajului natural. Muli cercettori care
utilizeaz WordNet, n special n domeniul inteligenei artificiale,
consider c aceasta reprezint o baz de cunotine lexical i
o valorific ca atare. Procesarea cunotinelor a dobndit noi dimensiuni
n S.U.A. datorit existenei WordNet. n acelai timp, comunitatea
tiinific internaional se arat extrem de interesat de dezvoltarea unor
baze de date lexicale de tip WordNet pentru ct mai multe limbi, n
ncercarea de a crea o infrastructur ontologic uniform. Astfel, ntruct
mulimea de baz a relaiilor care leag ntre ele conceptele rmne
aceeai, indiferent de limb, algoritmii de inferen pentru extragerea
informaiei pot rmne aceiai.
Posibilele aplicaii ale WordNet n cele mai variate domenii
(regsirea informaiei, extragerea informaiei, dezambiguizarea,
generarea limbajului natural, nvarea, dicionarele electronice,
achiziia de cunotine .a.) sunt citate n peste 300 de lucrri tiinifice.
Este de menionat faptul c, la mijlocul anilor 90, datorit
multiplelor aplicaii dezvoltate pe baza WordNet, a fost puternic resimit
nevoia de a se crea baze de date asemntoare i pentru alte limbi, n
special pentru cele europene. Un imens efort tiinific i financiar a fost
lansat n Europa Occidental, pentru a se crea aa-numita EuroWordNet,
utiliznd varianta american WordNet ca model. Acest efort tiinific s-a


250
concretizat n anul 1996, n cadrul proiectului de cercetare - dezvoltare
EuroWordNet, sub conducerea Universitii din Amsterdam:

http://www.hum.uva.nl/~ewn/

n prezent exist cte o baz de date lexical de tip WordNet pentru
limbile danez, italian i spaniol (fiecare aflat n continu
mbuntire) i se lucreaz la unele similare pentru limbile german,
francez i estonian. Tot n prezent se pune problema crerii unor astfel
de baze de date lexicale interactive pentru limbile din Europa Central i
de Est, folosindu-se varianta WordNet a limbii engleze ca model i
adaptnd-o specificului fiecrei limbi n parte. Proiectul BalkaNet,
finanat de Comisia European, se ocup n prezent de aceste limbi:

http://www.ceid.upatras.gr/Balkanet/

Eforturile cercettorilor (informaticienilor) se concentreaz i
asupra problemei generrii automate a unor baze de date de tip WordNet
corespunztoare diverselor limbi, generare care s porneasc de la
reeaua semantic WordNet a limbii engleze. n cazul limbii romne acest
studiu a fost realizat, referitor la substantivele i adjectivele romneti, de
ctre echipa RORIC-LING de la Universitatea din Bucureti, n cadrul
proiectului BALRIC-LING (finanat tot de Comisia European) i este
descris n pagina de web a acestui proiect:

http://phobos.cs.unibuc.ro/roric



251
4.4.2. Cadre

n reprezentarea bazat pe cadre faptele sunt concentrate n jurul
obiectelor. Cuvntul obiect are aici fie sensul unui obiect fizic concret,
fie al unui concept mai abstract, cum ar fi o clas de obiecte sau chiar
o situaie.
Un cadru este o structur de date ale crei componente sunt
numite slot-uri (tietur, deschiztur). Slot-urile pot gzdui informaii de
diverse naturi. Aici se pot gsi valori simple, referine la alte slot-uri sau
chiar proceduri care pot calcula valoarea slot-ului pe baza altor
informaii. Un slot poate s fie vid, el putnd fi umplut prin mecanismul
de inferen. Ca i n cazul reelelor semantice, cel mai frecvent principiu
de inferen este motenirea proprietilor. Atunci cnd un cadru
reprezint o clas de obiecte (albatros) iar un alt cadru reprezint
o superclas a acestei clase (pasre), cadrul corespunztor clasei poate
moteni valori de la cadrul reprezentnd superclasa.
Un cadru, prin urmare, este o colecie de atribute (slot-uri) i de
valori asociate (eventual i de constrngeri asupra acelor valori), care
descriu o anumit entitate a lumii. Uneori, un cadru descrie o entitate
ntr-un sens absolut, alteori el reprezint acea entitate numai dintr-un
anumit punct de vedere. Un cadru unic este arareori util. n schimb, se
pot construi ntregi sisteme de cadre cu ajutorul unor colecii de cadre
care sunt conectate ntre ele prin faptul c valoarea unui atribut al unui
anumit cadru este un alt cadru. n particular, este util s se atribuie ct
mai mult structur att nodurilor, ct i legturilor unei reele. Dei
actualmente nu se face o distincie clar ntre o reea semantic i un


252
sistem de cadre, putem spune c, pe masur ce sistemul dobndete mai
mult structur, el se apropie din ce n ce mai mult de un aa-numit
sistem de cadre.
Prelund acelai exemplu din [1] vom plasa o serie de cunotine
despre psri n cadre, dup cum urmeaz:
CADRU: pasare
un_fel_de: animal
metoda_de_miscare: zbor
activ: ziua
Acest cadru reprezint clasa psrilor. Iat cadrele pentru dou subclase
ale acestei clase - albatros i kiwi:
CADRU: albatros
un_fel_de: pasare
culoare: alb_si_negru
marime: 115

CADRU: kiwi
un_fel_de: pasare
metoda_de_miscare: mers
activ: noaptea
culoare: maro
marime: 40
Albatros, ca element tipic al clasei psrilor, motenete metoda de
micare (zborul), precum i faptul c este activ n timpul zilei, de la
cadrul pasre. Din aceast cauz, nu se menioneaz nimic relativ la
metoda_de_miscare i activ n cadrul referitor la albatros. Pe de alt


253
parte, kiwi este o pasre atipic i nu respect valorile pentru
metoda_de_miscare i activ ale clasei psrilor.
Un cadru se poate referi i la o anumit instaniere a unei clase, ca
n cazul albatrosului numit Mihai:
CADRU: Mihai
instantiere_pentru: albatros
marime: 120
Se observ faptul c, n cazul primelor cadre, relaia un_fel_de este
o relaie ntre o clas i o superclas, n timp ce relaia
instantiere_pentru din ultimul exemplu este o relaie ntre un membru
(element) al unei clase i clasa respectiv.
Informaia inserat n cadre poate fi reprezentat n Prolog ca
o mulime de fapte, cte o fapt Prolog corespunznd fiecrei valori
a unui slot. Formatul pentru aceste fapte ales n [1] i pe care l prezentm
aici este urmtorul:
Nume_cadru(Slot,Valoare).
Avantajul acestui format este acela c toate faptele referitoare la un
anumit cadru sunt colectate laolalt de ctre relaia a crei denumire este
chiar numele cadrului. Dou exemple de cadre reprezentate n acest
format sunt urmtoarele:

%Cadrul kiwi:
kiwi(un_fel_de,pasare).
kiwi(metoda_de_miscare,mers).
kiwi(activ,noaptea).
kiwi(marime,40).
kiwi(culoare,maro).


254
%Cadrul mihai:
mihai(instantiere_pentru,albatros).
mihai(marime,120).

Pentru a putea folosi o astfel de mulime de cadre este necesar
existena unei proceduri pentru regsirea faptelor referitoare la valorile
corespunztoare slot-urilor. O procedur Prolog cu acest rol este propus
n [1] ca fiind de forma
valoare(Cadru,Slot,Valoare)
unde Valoare este valoarea corespunztoare slot-ului Slot n cadrul
Cadru. Dac slot-ul este plin - valoarea sa este dat n mod explicit n
cadru - atunci aceasta este valoarea; altfel, aceast valoare poate fi
obinut prin inferen, de pild ca o consecin a motenirii
proprietilor. Pentru a gsi o valoare prin motenire, trebuie s ne
deplasm de la cadrul curent la un cadru mai general, n conformitate cu
relaia un_fel_de sau cu relaia instantiere_pentru dintre cadre.
n acest fel se ajunge la un cadru-printe, iar valoarea poate fi gsit n
mod explicit n acest cadru sau prin continuarea procesului de motenire.
Acest proces de regsire a informaiei din cadre, fie c este
o regsire direct, fie c este o regsire prin motenire, poate fi exprimat
n Prolog dup cum urmeaz:

valoare(Cadru,Slot,Valoare):-
%valoare regasita in mod direct
Interogare=..[Cadru,Slot,Valoare],
call(Interogare),!.

valoare(Cadru,Slot,Valoare):-


255
%un cadru mai general
parinte(Cadru,CadruParinte),
valoare(CadruParinte,Slot,Valoare).

parinte(Cadru,CadruParinte):-
(Interogare=..[Cadru,un_fel_de,CadruParinte];
Interogare=..[Cadru,instantiere_pentru,
CadruParinte]),
call(Interogare).

Interogarea Prologului se poate face atunci n felul urmtor:

?-valoare(mihai,activ,TimpMihai).
TimpMihai = ziua

?-valoare(kiwi,activ,TimpKiwi).
TimpKiwi = noaptea

Inferena ntre cadre este un proces extrem de subtil, care ridic
diverse probleme ce nu vor fi tratate aici, ele neconstituind obiectul
acestui curs. Dintre acestea amintim, n primul rnd, cazul mai complicat
de inferen n care, corespunztor unui slot, este dat o procedur de
calcul a valorii, n locul valorii efective. O alt subtilitate a inferenei
ntre cadre o constituie aa-numita motenire multipl. Aceast problem
se ridic atunci cnd un cadru are mai multe cadre printe (conform
relaiei instantiere_pentru sau relaiei un_fel_de). n acest caz
o valoare a unui slot motenit poate proveni de la mai mult de un cadru
printe, problema care se pune fiind aceea a adoptrii valorii corecte.
Soluia propus n [1], de pild, este aceea de a se prelua prima valoare


256
ntlnit, gsit n urma efecturii unei cutri de tip depth-first printre
cadrele care ar putea furniza aceast valoare. Alte soluii exist, n egal
msur, principala concluzie care se desprinde n urma acestei succinte
prezentri fiind aceea c reprezentarea cunotinelor i procesul de
cutare se afl ntr-o strns interdependen.

4.5. Consideraii finale

Sistemele de reprezentare a cunotinelor amintite sau discutate de
noi pn n prezent au fost: structurile de tip slot-and-filler, sistemele
bazate pe reguli, reelele semantice i cadrele. Capitolul 5 al lucrrii de
fa va introduce sistemele de raionament statistic i se va ocupa de dou
tipuri de abordri statistice pentru sisteme de raionament incert (factorii
de certitudine n sistemele bazate pe reguli i, respectiv, reelele
Bayesiene). Indiferent de tipul de structur aleas pentru reprezentarea
cunotinelor, a devenit ns evident faptul c aceste sisteme trebuie nu
numai s ncorporeze cunotine, ci, n egal msur, s furnizeze
o mulime de proceduri de inferen de baz, cum ar fi cea referitoare la
motenirea proprietilor.
Structurile de tip slot-and-filler s-au dovedit foarte valoroase
pentru memorarea i regsirea eficient a cunotinelor n programele
inteligenei artificiale. Ele au ns o performan sczut atunci cnd se
pune problema reprezentrii unor aseriuni de tipul regulilor dac x, y i
z, atunci trage concluzia w. Calculul predicatelor este mult mai adecvat
pentru reprezentarea unor asemenea aseriuni, dar prezint, la rndul su,
dezavantajul de a fi ineficient pentru raionamentul general care le


257
utilizeaz. Reprezentrile de tip slot-and-filler sunt mai orientate ctre
semantic, ceea ce face ca procedurile lor de raionament s fie mai
variate, mai eficiente i mai strns legate de tipuri specifice, particulare
de cunotine. Pe de alt parte, n cadrul structurilor slot-and-filler este
dificil s se exprime aseriuni mai complexe dect motenirea.
Reelele semantice sunt proiectate cu scopul principal de a capta
relaii, legturi i raporturi semantice ntre entiti. Ele sunt, de regul,
utilizate mpreun cu o mulime de reguli de inferen, proiectate special
pentru a putea trata n mod corect tipurile de arce specifice reelei.
Sistemele bazate pe cadre sunt n general mai structurate dect
reelele semantice i ele conin o mulime chiar mai mare de reguli de
inferen specializate, inclusiv cele care implementeaz o ntreag
matrice de reguli de motenire implicite, precum i alte proceduri, cum ar
fi verificarea consistenei.
















258

































259
CAPITOLUL 5
RAIONAMENT STATISTIC


Diversele tehnici de reprezentare a cunotinelor pot fi
augmentate cu ajutorul unor msuri statistice care descriu niveluri ale
dovezilor existente, precum i ale convingerilor unui agent. n cele ce
urmeaz, vom prezenta i folosi unele instrumente furnizate de statistica
Bayesian pentru a realiza aceast augmentare, att de necesar n
descrierea prerilor care nu reprezint certitudini, dar n favoarea crora
exist suficiente dovezi.
Se poate spune c principalul avantaj al raionamentului de tip
probabilist, fa de raionamentul de tip logic, rezid n faptul c cel
dinti permite agentului s ajung la decizii raionale chiar i atunci cnd
nu exist suficient informaie care s dovedeasc c o aciune dat va
avea efectul dorit.

5.1. Abordri statistice pentru sisteme de raionament incert

Un important el al multor sisteme de rezolvare a problemelor este
acela de a coleciona probe, pe msur ce sistemul avanseaz i de a-i
modifica comportamentul pe baza acestor dovezi. Statistica Bayesian
este o teorie statistic care poate modela acest tip de comportament.
Dac notm cu H evenimentul ca ipoteza (notat H ) s fie
adevrat, iar cu E evenimentul obinut prin observarea dovezii E ,


260
atunci conceptul fundamental al statisticii Bayesiene poate fi considerat
ca fiind acela de probabilitate condiionat,
( ) | P H E ,
reprezentnd probabilitatea ca ipoteza H s fie adevrat, atunci cnd se
observ dovada E . Pentru a calcula aceast probabilitate trebuie luate n
consideraie probabilitatea prealabil sau a priori a lui H
(i.e. probabilitatea pe care am atribui-o lui H n lipsa oricror probe),
precum i gradul pn la care E furnizeaz dovezi n favoarea lui H .
Acest lucru se realizeaz prin definirea unui univers coninnd o mulime
exhaustiv de ipoteze
i
H , care se exclud reciproc i ntre care ncercm
s discernem. Fie
E = dovezile obinute printr-un experiment auxiliar.
( )
i
P H = probabilitatea a priori ca ipoteza
i
H s fie adevrat.
( ) |
i
P E H = probabilitatea de a observa dovezile E
(probabilitatea s se realizeze E ), atunci cnd ipoteza
i
H este
adevrat.
( ) |
i
P H E = probabilitatea a posteriori ca ipoteza
i
H s fie
adevrat, fiind date dovezile E (tiind c s-a realizat E ).
Ca modalitate de calcul, probabilitatea a posteriori ( ) |
i
P H E se
obine n mod Bayesian. Dac notm prin k numrul ipotezelor posibile,
atunci formula lui Bayes, n varianta necondiionat, calculeaz aceast
probabilitate a posteriori n felul urmtor (vezi Anexa 1):


261
( )
( ) ( )
( ) ( )
1
|
|
|
i i
i k
n n
n
P E H P H
P H E
P E H P H
=


Teorema lui Bayes poate sta la baza raionamentului incert. n
general, probabilitatea ( ) | P A B descrie probabilitatea condiionat a lui
A atunci cnd singurele dovezi de care dispunem sunt reprezentate de
B . Dac ns exist i alte dovezi relevante, atunci acestea trebuie i ele
luate n consideraie. Atunci cnd sunt date un corp prealabil de dovezi e
i o nou observaie , E trebuie calculat probabilitatea condiionat
a posteriori ( ) | , P H E e , prin aplicarea formulei lui Bayes n versiune
condiionat (vezi Anexa 1). Avem:
( ) ( )
( )
( )
| ,
| , |
|
P e E H
P H E e P H E
P e E
=
ntr-o lume arbitrar de complex, dimensiunea mulimii
repartiiilor de probabilitate multidimensionale, care este necesar pentru
a calcula aceast funcie, crete la valoarea 2
n
dac sunt luate n
consideraie n propoziii diferite. Aa cum se arat n [8], utilizarea
teoremei lui Bayes face ca problema s devin insolubil din mai multe
motive:
Problema achiziionrii de cunotine devine insurmontabil,
ntruct trebuie furnizate prea multe probabiliti.
Spaiul necesar pentru memorarea tuturor probabilitilor este
prea mare.
Timpul necesar pentru calcularea tuturor probabilitilor este prea
mare.


262
n ciuda acestor neajunsuri, statistica Bayesian constituie o baz
atractiv pentru un sistem de raionament incert. Din aceast cauz, au
fost dezvoltate cteva mecanisme care i exploateaz puterea, fcnd, n
acelai timp, problema rezolvabil, din punct de vedere computaional.
Dou dintre aceste mecanisme, asupra crora ne vom opri n continuare,
constau n ataarea unor factori de certitudine regulilor de producie i
respectiv n folosirea reelelor Bayesiene.

5.1.1. Factori de certitudine i sisteme bazate pe reguli

Abordarea pe care o propunem aici a fost preluat din [8] i
provine de la sistemul MYCIN [Shortliffe, 1976; Buchanan i Shortliffe,
1984; Shortliffe i Buchanan, 1975], care i propune s recomande
terapii adecvate pacienilor cu infecii bacteriene. MYCIN este un
exemplu de sistem expert, care interacioneaz cu medicul pentru
a dobndi datele clinice de care are nevoie.
MYCIN reprezint majoritatea cunotinelor sale legate de
diagnostic ca pe o mulime de reguli, fiecare regul avnd asociat un
factor de certitudine. Sistemul folosete aceste reguli pentru a face un
raionament de tip nlnuire napoi de la scopul su de a detecta
organisme semnificative care pot cauza maladii i pn la datele clinice
disponibile. De ndat ce identific asemenea organisme, MYCIN
ncearc s selecteze o terapie prin care boala s fie tratat. Pentru
a nelege cum exploateaz sistemul informaia incert trebuie stabilit
cum combin acesta estimaiile de certitudine ale fiecrei reguli n parte
pentru a produce o estimaie final a certitudinii concluziilor sale.


263
O ntrebare natural care se ridic, n egal msur, avnd n vedere
observaiile anterioare privind insolvabilitatea spre care conduce
raionamentul Bayesian pur, este urmtoarea: ce compromisuri trebuie s
fac tehnica MYCIN i care sunt riscurile asociate acestor compromisuri?
Un factor de certitudine (notat aici prin | | , FC h e sau, mai simplu,
prin FC ) este definit n termenii a dou componente:
| | , MI h e - o msur (ntre 0 i 1) a ncrederii n ipoteza h fiind
dat dovada . e MI msoar gradul pn la care dovezile
existente susin ipoteza. Valoarea este 0 dac aceste dovezi
eueaz n susinerea ipotezei.
| | , MN h e - o msur (ntre 0 i 1) a nencrederii n ipoteza h
fiind dat dovada . e MN msoar gradul pn la care dovezile
existente susin negaia ipotezei. Valoarea este 0 dac aceste
dovezi susin ipoteza.
Fiind date aceste dou msuri, putem defini factorul de certitudine ca
fiind
| | | | | | , , , FC h e MI h e MN h e =
ntruct orice dovad particular fie susine, fie neag o ipotez i
ntruct fiecare regul MYCIN corespunde unei anumite dovezi (dei
aceasta ar putea fi o dovad compus), este suficient un singur numr
corespunztor fiecrei reguli pentru a defini att MI , ct i MN i, prin
urmare, factorul de certitudine, FC .
Factorii de certitudine ai regulilor MYCIN sunt furnizai de ctre
experii care scriu aceste reguli. Pe msur ns ce sistemul raioneaz,
aceti factori de certitudine trebuie combinai, pentru a reflecta dovezi


264
multiple i reguli multiple aplicate aceleiai probleme. Cele trei tipuri de
combinaii care trebuie luate n consideraie sunt reflectate n Fig. 5.1.
Astfel, n Fig. 5.1 (a) mai multe reguli furnizeaz dovezi referitoare la
o singur ipotez. n Fig. 5.1 (b) mai multe propoziii trebuie luate n
consideraie mpreun pentru a ne forma o prere. n Fig. 5.1 (c)
output-ul corespunztor unei reguli furnizeaz input pentru o alta.









Fig. 5.1

nainte de a stabili formulele care trebuie folosite pentru a realiza
aceste combinaii, trebuie avute n vedere anumite proprieti pe care
funcia de combinare trebuie s le satisfac, i anume:
ntruct ordinea n care dovezile sunt colectate este arbitrar,
funciile de combinare trebuie s fie comutative i asociative.
Pn cnd este atins certitudinea, dovezile suplimentare ar trebui
s creasc valoarea lui MI . (n mod similar, dovezile care infirm
ipoteza ar trebui s creasc valoarea lui MN ).
A
B
C
(a)
A B
(b)
A
B
C
(c)


265
Dac sunt nlnuite inferene incerte, atunci rezultatul ar trebui s
fie mai puin cert dect fiecare inferen n parte.
Acceptnd necesitatea acestor proprieti
19
, vom considera mai nti
situaia din Fig. 5.1 (a), n care mai multe probe se combin pentru a se
determina factorul de certitudine al unei ipoteze. Msura ncrederii i
a nencrederii ntr-o ipotez, fiind date dou observaii,
1
s i
2
s ,
se calculeaz dup cum urmeaz:

| |
| |
| | | | | | ( )
1 2
1 2
1 2 1
0, daca , 1
,
, , 1 , , altfel
MN h s s
MI h s s
MI h s MI h s MI h s
=

=

+


| |
| |
| | | | | | ( )
1 2
1 2
1 2 1
0, daca , 1
,
, , 1 , , altfel
MI h s s
MN h s s
MN h s MN h s MN h s
=

=

+


| |
1 2
, FC h s s se calculeaz pe baza lui | |
1 2
, MI h s s i | |
1 2
, MN h s s .
Se observ c, dac se coroboreaz mai multe dovezi ale aceleiai
ipoteze, atunci valoarea absolut a lui FC va crete. Dac sunt introduse
dovezi conflictuale, atunci valoarea absolut a lui FC va descrete.
n situaia din Fig. 5.1 (b) este necesar calculul factorului de
certitudine al unei conjuncii de ipoteze. FC se calculeaz pe baza
valorilor MI i MN . Formulele folosite de MYCIN pentru calculul lui
MI , corespunztor unei conjuncii i respectiv unei disjuncii de ipoteze,
sunt urmtoarele:
| | | | | | ( )
1 2 `1 `2
, min , , , MI h h e MI h e MI h e =

19
Descrierea sistemului MYCIN este fcut aici conform [8].


266
| | | | | | ( )
1 2 `1 `2
, max , , , MI h h e MI h e MI h e =
MN poate fi calculat n mod analog.
Fig. 5.1 (c) prezint cazul n care regulile sunt nlnuite laolalt,
ceea ce are ca rezultat faptul c ieirea incert a uneia dintre reguli
trebuie s constituie intrarea alteia. Soluia dat acestei probleme se va
ocupa i de cazul n care trebuie atribuit o msur a incertitudinii
intrrilor iniiale. Aceste situaii sunt frecvente i corespund cazurilor n
care dovezile provin ca urmare a unui experiment sau al unui test de
laborator ale crui rezultate nu sunt suficient de exacte. n aceste cazuri,
factorul de certitudine al unei ipoteze trebuie s ia n consideraie att
tria cu care probele sugereaz ipoteza, ct i nivelul de ncredere n
aceste probe. MYCIN furnizeaz o regul de nlnuire care este definit
dup cum urmeaz.
Fie | | , MI h s msura ncrederii n h atunci cnd suntem absolut
siguri de validitatea lui s . Fie e dovada care ne-a determinat s credem
n s (spre exemplu, msurtorile efectuate cu ajutorul instrumentelor de
laborator sau rezultatele aplicrii altor reguli). Atunci:
| | | | | | ( )
, , max 0, , MI h s MI h s FC s e =
ntruct valorile FC iniiale din sistemul MYCIN sunt date de
ctre experii care scriu regulile, nu este necesar s se formuleze
o definiie mai exact a factorului de certitudine dect cea dat pn
acum. Autorii sistemului iniial au dat ns o astfel de definiie,
exprimnd pe MI (care poate fi privit ca o descretere proporional
a nencrederii n h ca rezultat al observrii lui e ) dup cum urmeaz:


267
| |
( )
( ) ( ) ( )
( )
1, daca 1
,
max | ,
, altfel
1
P h
MI h e
P h e P h P h
P h
=

=
(


n mod similar, MN este descreterea proporional a ncrederii n h ca
rezultat al observrii lui e :
| |
( )
( ) ( ) ( )
( )
1, daca 0
,
min | ,
, altfel
P h
MN h e
P h e P h P h
P h
=

=
(


Aceste definiii s-au dovedit a fi incompatibile cu viziunea Bayesian
asupra probabilitii condiionate. Modificri minore le fac ns
compatibile [Heckerman, 1986]. n particular, putem redefini MI astfel:
| |
( )
( ) ( ) ( )
( ) ( ) ( )
1, daca 1
, max | ,
, altfel
1 |
P h
MI h e P h e P h P h
P h P h e
=

= (


Definiia lui MN trebuie schimbat n mod similar.
Cu aceste reinterpretri nu mai exist nici un conflict fundamental
ntre tehnicile MYCIN i cele sugerate de statistica Bayesian, MYCIN
nefiind un sistem care conduce la insolubilitate.
Fiecare FC dintr-o regul MYCIN reprezint contribuia unei
reguli individuale la ncrederea pe care MYCIN o acord unei anumite
ipoteze. ntr-un anume sens, acest factor reprezint o probabilitate
condiionat, ( ) | P H E . Dar, ntr-un sistem Bayesian pur, ( ) | P H E
descrie probabilitatea condiionat a lui H atunci cnd singurele dovezi
relevante sunt date de E . Dac exist i alte probe, atunci trebuie luate n


268
consideraie repartiii de probabilitate multidimensionale. Acesta este
momentul n care MYCIN se distaneaz de un sistem Bayesian pur,
devenind mai eficient n execuie, dar cu riscul de a avea un
comportament mai puin intuitiv. n particular, formulele MYCIN pentru
cele trei situaii din Fig. 5.1 fac presupunerea c toate regulile sunt
independente. Sarcina garantrii independenei revine expertului care
scrie regulile. Fiecare dintre scenariile combinate ale Fig. 5.1 devine
vulnerabil atunci cnd aceast presupunere de independen este
nclcat.
Abordarea care utilizeaz factori de certitudine i sisteme bazate
pe reguli face, prin urmare, presupuneri puternice privitoare la
independen, datorit crora este uor de folosit n practic. n acelai
timp, regulile trebuie scrise n aa fel nct ele s reflecte dependenele
importante. Abordarea st la baza multor programe, precum MYCIN, ca
i a unei game largi de sisteme diferite, care au fost construite pe
platforma EMYCIN [van Melle et al., 1981]. Platforma EMYCIN
constituie o generalizare (numit shell) a lui MYCIN, n cadrul creia au
fost nlturate toate regulile specifice domeniului. Unul dintre motivele
pentru care acest cadru de lucru este util, n ciuda limitrilor sale, este
acela c, ntr-un sistem robust, valorile exacte care sunt folosite nu au
o importan prea mare. Aceast abordare pare, de asemenea, a imita
suficient de bine [Shultz et al., 1989] felul n care oamenii manipuleaz
certitudinile.





269
5.1.2. Reele Bayesiene

Factorii de certitudine au fost descrii ca un mecanism de
reducere a complexitii unui sistem de raionament Bayesian prin
intermediul unor aproximri ale formalismului. O abordare alternativ
este cea bazat pe reele Bayesiene [Pearl, 1988], abordare care conserv
formalismul bazndu-se, n schimb, pe modularitatea universului a crui
modelare se ncearc.
Ideea de baz a acestei abordri este aceea c, pentru a descrie
lumea real, nu este necesar folosirea unei tabele imense de repartiii de
probabilitate multidimensionale n care s fie listate probabilitile tuturor
combinaiilor posibile de evenimente. Majoritatea evenimentelor sunt
independente de celelalte, astfel nct interaciunile dintre ele nu trebuie
luate n consideraie. n schimb, se poate folosi o reprezentare local
avnd rolul de a descrie grupuri de evenimente care interacioneaz.
Astfel, n contextul folosirii regulii lui Bayes, relaiile de independen
condiionat dintre variabile pot reduce substanial numrul
probabilitilor condiionate care trebuie specificate. Structura de date
folosit cel mai frecvent pentru a reprezenta dependena dintre variabile
i pentru a da o specificaie concis a repartiiei de probabilitate
multidimensionale este reeaua Bayesian.

Definiia 5.1
O reea Bayesian este un graf cu urmtoarele proprieti:
(1) Graful este direcionat i aciclic.
(2) O mulime de variabile aleatoare constituie nodurile reelei.


270
(3) O mulime de arce direcionate conecteaz perechi de noduri.
n mod intuitiv, semnificaia unui arc direcionat de la nodul X la nodul
Y este aceea c X are o influen direct asupra lui Y .
(4) Fiecrui nod i corespunde un tabel de probabiliti
condiionate care cuantific efectele pe care prinii le au asupra nodului
respectiv. (Prinii unui nod sunt toate acele noduri din care pleac arce
direcionate nspre acesta).

Un expert n domeniu poate, de obicei, s decid relativ uor
relaiile directe de dependen condiionat care sunt valabile n domeniu,
acest lucru fiind mult mai uor dect specificarea probabilitilor
propriu-zise. Dup stabilirea topologiei reelei Bayesiene, nu mai este
necesar dect specificarea probabilitilor condiionate ale acelor noduri
care particip n dependene directe, urmnd ca acestea s fie apoi
folosite n calculul oricror alte probabiliti.
n mod concret, se construiete un graf direcionat aciclic care
reprezint relaiile de cauzalitate dintre variabile. Variabilele dintr-un
astfel de graf pot fi propoziionale (caz n care pot lua valorile TRUE sau
FALSE) sau pot fi variabile care primesc valori de un alt tip (spre
exemplu o temperatur a corpului sau msurtori fcute de ctre un
dispozitiv de diagnosticare).
n Fig. 5.2 este prezentat un astfel de graf al cauzalitii (reea).
Un asemenea graf ilustreaz relaiile de cauzalitate care intervin ntre
nodurile pe care le conine. Pentru a-l putea folosi ca baz a unui
raionament de tip probabilist sunt necesare ns mai multe informaii. n
particular este necesar s cunoatem, pentru o valoare a unui nod


271
printe, ce dovezi sunt furnizate referitor la valorile pe care le poate lua
nodul fiu.







Fig. 5.2

Probabilitile condiionate corespunztoare pot fi date sub forma
unui tabel de tipul:

Atribut Probabilitate
p(Ud|Stropitoare, Ploaie) 0.95
p(Ud|Stropitoare, Ploaie) 0.9
p(Ud| Stropitoare, Ploaie) 0.8
p(Ud| Stropitoare, Ploaie) 0.1

p(Stropitoare| Sezon ploios) 0.0
p(Stropitoare| Sezon ploios) 1.0

p(Ploaie|Sezon ploios) 0.9
p(Ploaie| Sezon ploios) 0.1

p(Sezon ploios) 0.5

Din acest tabel, preluat de noi, spre exemplificare, din [8], se poate citi,
de pild, probabilitatea a priori de a avea un sezon ploios ca fiind 0.5.
Dac suntem n timpul unui sezon ploios, probabilitatea de a avea ploaie
Sezon_ploios
Stropitoare Ploaie
Ud


272
ntr-o noapte dat este 0.9. Dac sezonul nu este ploios, aceast
probabilitate este numai 0.1.
Pentru a putea folosi o asemenea reprezentare n rezolvarea
problemelor este necesar un mecanism de calcul al influenei oricrui nod
arbitrar asupra oricrui alt nod. Pentru a obine acest mecanism de calcul
este necesar ca graful iniial s fie convertit la un graf nedirecionat, n
care arcele s poat fi folosite pentru a se transmite probabiliti n
oricare dintre direcii, n funcie de locul din care provin dovezile. Este,
de asemenea, necesar un mecanism de folosire a grafului care s
garanteze transmiterea corect a probabilitilor. Spre exemplu, dei este
adevrat c iarba ud poate constitui o dovad de ploaie i c existena
ploii constituie o dovad n favoarea ierbii ude, trebuie s garantm faptul
c nici un ciclu nu este vreodat traversat astfel nct iarba ud s
constituie o dovad a ploii, care s fie considerat apoi o dovad
a existenei ierbii ude .a.m.d..
Exist trei mari clase de algoritmi [8] care efectueaz aceste
calcule, ideea care st la baza tuturor acestor metode fiind aceea c
nodurile au domenii limitate de influen. Metoda cea mai folosit este
probabil cea a transmiterii mesajelor [Pearl, 1988], abordare care se
bazeaz pe observaia c, pentru a calcula probabilitatea unui nod A
condiionat de ceea ce se tie despre celelalte noduri din reea, este
necesar cunoaterea a trei tipuri de informaii:
suportul total care sosete n A de la nodurile sale printe
(reprezentnd cauzele sale);
suportul total care sosete n A de la fiii acestuia (reprezentnd
simptomele sale);


273
intrarea n matricea fixat de probabiliti condiionate care face
legtura dintre nodul A i cauzele sale.
Au fost dezvoltate cteva metode de propagare a mesajelor de
primele dou tipuri, precum i de actualizare a probabilitilor
corespunztoare nodurilor. Structura reelei determin abordarea care va
fi folosit. Spre exemplu, n reelele unic conectate (acelea n care exist
un singur drum ntre fiecare pereche de noduri), se poate folosi un
algoritm mai simplu (a se vedea 5.1.2.2.1 al lucrrii de fa) dect n
cazul celor conectate multiplu.

5.1.2.1. Relaii de independen condiionat n reele Bayesiene

O reea Bayesian exprim independena condiionat a unui nod
i a predecesorilor si, fiind dai prinii acestuia i folosete aceast
independen pentru a proiecta o metod de construcie a reelelor. Pentru
a stabili algoritmi de inferen trebuie ns s tim dac se verific
independene condiionate mai generale. Fiind dat o reea dorim s
putem citi dac o mulime de noduri X este independent de o alt
mulime , Y fiind dat o mulime de noduri dovezi E . Metoda de
stabilire a acestui fapt se bazeaz pe noiunea de separare dependent de
direcie sau d-separare, definit dup cum urmeaz:

Definiia 5.2
O mulime de noduri E d-separ dou mulimi de noduri X i Y
dac orice drum nedirecionat de la un nod din X la un nod din Y este
blocat condiionat de E .


274
Definiia 5.3
Fiind dat o mulime de noduri E , spunem c un drum este blocat
condiionat de E dac exist un nod Z aparinnd drumului, pentru care
una dintre urmtoarele trei condiii se verific:
(1) Z aparine lui E i Z are o sgeat a drumului intrnd n E i
o sgeat a drumului ieind din E .
(2) Z aparine lui E i Z are ambele sgei ale drumului ieind din E .
(3) Nici Z i nici vreunul dintre descendenii si nu aparin lui E , iar
ambele sgei ale drumului intesc nspre Z .

Fig. 5.3 ilustreaz cele trei cazuri posibile:













Fig. 5.3

X
X


(1)


(2)


(3)
E Y
Z
Z
Z
X


275
S-a demonstrat c dac orice drum nedirecionat de la un nod din
X la un nod din Y este d-separat de E , atunci X i Y sunt
independente condiionat de E . Aceasta este teorema fundamental
a reelelor Bayesiene, demonstrat de Verma i Pearl. Demonstraia
acestei teoreme este suficient de complicat i nu ne vom opri asupra ei
n cadrul restrns al cursului de fa. Reinem faptul c noiunea de
d-separare este fundamental n construcia algoritmilor de inferen.
Procesul construirii i folosirii reelelor Bayesiene nu utilizeaz
d-separarea.

5.1.2.2. Inferena n reele Bayesiene

Sarcina principal a oricrui sistem probabilist de inferen este
aceea de a calcula probabiliti a posteriori de tipul
P(Interogare|Dovezi)
corespunztor unei mulimi de variabile de interogare condiionat de
valori exacte ale unor variabile dovezi. (n exemplul considerat, Ud este
o variabil de interogare, iar Stropitoare i Sezon_ploios ar putea fi
variabile dovezi).
Reelele Bayesiene sunt suficient de flexibile pentru ca orice nod
s poat servi fie ca o variabil de interogare, fie ca o variabil dovad. n
general, un agent primete valori ale variabilelor dovezi de la senzorii si
(sau n urma altor raionamente) i ntreab despre posibilele valori ale
altor variabile astfel nct s poat decide ce aciune trebuie ntreprins.
Literatura de specialitate discut patru tipuri distincte de inferen,
care poate fi realizat de reelele Bayesiene:


276
inferen de tip diagnostic (de la efecte la cauze);
inferen cauzal (de la cauze la efecte);
inferen intercauzal (ntre cauze ale unui efect comun);
inferene mixte (reprezentnd combinaii a dou sau mai multe
dintre inferenele anterioare).
Exemplu: Setnd efectul Stropitoare la valoarea adevrat i
cauza Sezon_ploios la valoarea fals, ne propunem s calculm
P(Ud|Stropitoare, Sezon_ploios).
Aceasta este o inferen mixt, care reprezint o utilizare simultan
a inferenei de tip diagnostic i a celei cauzale.
Reelele Bayesiene s-au dovedit extrem de folositoare n
realizarea mai multor tipuri de sarcini. Paragraful urmtor se va concentra
asupra celei mai frecvente i mai utile dintre acestea, i anume
determinarea probabilitilor condiionate a posteriori ale variabilelor de
interogare.

5.1.2.2.1. Un algoritm pentru rspunsul la interogri

n cele ce urmeaz, ne propunem s stabilim un algoritm de calcul
al probabilitilor condiionate a posteriori ale variabilelor de interogare.
Algoritmul gsit va fi de tip nlnuire napoi prin faptul c pleac de la
variabila de interogare i urmeaz drumurile de la acel nod pn la
nodurile dovezi. Datorit complicaiilor care se pot nate atunci cnd
dou drumuri diferite converg la acelai nod, algoritmul pe care l vom
prezenta i care este preluat din [9] se refer numai la reele unic
conectate, cunoscute i sub denumirea de polyarbori. Reamintim faptul


277
c, n astfel de reele, exist cel mult un drum nedirecionat ntre oricare
dou noduri ale reelei. Algoritmii pentru reele generale, asupra crora
nu ne vom opri n cadrul restrns al acestui curs, vor folosi algoritmii
referitori la polyarbori ca principal subrutin.
Fig. 5.4 prezint o reea generic unic conectat. n aceast reea
nodul X are prinii
1
= U
m
U U i fiii
1
= Y
n
Y Y . Corespunztor
fiecrui fiu i fiecrui printe a fost desenat un dreptunghi care include
toi descendenii nodului i toi strmoii lui (cu excepia lui X ).
Proprietatea de unic conectare nseamn c toate dreptunghiurile sunt
disjuncte i c nu exist legturi care s le conecteze ntre ele. Se
presupune c X este variabila de interogare i c exist o mulime E de
variabile dovezi
20
. Se urmrete calcularea probabilitii condiionate
( ) | P X E
n mod evident, dac nsui X este o variabil dovad din E , atunci
calcularea lui ( ) | P X E este banal. Vom presupune, de aceea, c X nu
aparine lui E .
Reeaua din Fig. 5.4 este partiionat n conformitate cu prinii i
cu fiii variabilei de interogare . X Pentru a concepe un algoritm, va fi util
s ne putem referi la diferite poriuni ale dovezilor. Prima distincie pe
care o vom face este urmtoarea:

X
E
+
reprezint suportul cauzal pentru X - variabilele dovezi
aflate deasupra lui X , care sunt conectate la X prin
intermediul prinilor si.

20

{ } { }
1 1
, , , , , ,
X X m n
E E E U U Y Y
+
= = , mulime de variabile aleatoare discrete.


278

X
E

reprezint suportul probatoriu pentru X - variabilele


dovezi aflate dedesubtul lui X i care sunt conectate la X prin
intermediul fiilor si.

















Fig. 5.4

Notaia
\
i
U X
E va fi folosit pentru a se face referire la toate
dovezile conectate cu nodul
i
U , mai puin cele prin drumul de la X . Cu
aceast ultim notaie, putem partiiona pe
X
E
+
n
1
\ \
, ,
m
U X U X
E E i deci
putem exprima pe
X
E
+
sub forma urmtoare:
E
x
+


X

Y
1

Z
1j

E
x
-

Z
nj

Y
n

U
m
U
1



279
\
1
i
m
X U X
i
E E
+
=
=

(1)
n mod similar,
\
i
Y X
E semnific mulimea tuturor dovezilor conectate la
i
Y prin intermediul prinilor si, cu excepia lui X . Mulimea
X
E

poate
fi deci partiionat n mulimile
1
\ \
, ,
n
Y X Y X
E E i este de forma
\
1
i
n
X Y X
i
E E

=
=

(2)
Se observ c mulimea tuturor dovezilor E poate fi scris ca
X
E (toate
dovezile conectate la X ) i ca
\ X
E (toate dovezile conectate la X , fr
excepie).
Strategia general pentru calculul lui ( ) | P X E este atunci
urmtoarea:
Exprim ( ) | P X E n termenii contribuiilor lui
X
E
+
i
X
E

.
Calculeaz contribuia mulimii
X
E
+
calculnd efectul ei asupra
prinilor lui X i apoi transmind acest efect lui X . (Calcularea
efectului asupra fiecrui printe al lui X este o secven recursiv
a problemei calculrii efectului asupra lui X ).
Calculeaz contribuia mulimii
X
E

calculnd efectul ei asupra


fiilor lui X i apoi transmind acest efect lui X . (Calcularea
efectului asupra fiecrui fiu al lui X reprezint o secven
recursiv a problemei calculrii efectului asupra lui X ).


280
Totalitatea dovezilor, E , const din dovezile aflate deasupra lui
X i din cele aflate dedesubtul lui , X ntruct s-a fcut presupunerea
c X nsui nu se afl n E . Prin urmare, avem
( ) ( )
| | ,
X X
P X E P X E E
+
=
Pentru a separa contribuiile lui
X
E
+
i
X
E

, vom aplica versiunea


condiionat a regulii lui Bayes, pstrnd pe
X
E

ca dovad fixat n
fundal:
( )
( ) ( )
( )
| | ,
| ,
|
X X X
X X
X X
P X E P E X E
P X E E
P E E
+ +
+
+
=
ntruct X d-separ n cadrul reelei pe
X
E
+
de
X
E

, putem folosi
independena condiionat pentru a simplifica al doilea termen al
numrtorului. De asemenea, putem trata
( )
1 |
X X
P E E
+
ca pe o constant
de normalizare, obinnd:
( ) ( ) ( )
| | |
X X
P X E P X E P E X
+
= (3)
Prin urmare, este necesar s calculm cei doi termeni
( )
|
X
P X E
+
i
( )
|
X
P E X

. Vom ncepe prin tratarea primului, care se calculeaz relativ


uor.
Vom calcula
( )
|
X
P X E
+
lund n consideraie toate configuraiile
posibile ale prinilor lui , X precum i ct de probabile sunt acestea fiind
dat mulimea
X
E
+
. n cazul fiecrei configuraii date, probabilitatea lui
X se cunoate direct din tabelul probabilitilor condiionate.


281
Fie U vectorul prinilor
1
, ,
m
U U i fie u o atribuire de valori
pentru acetia
21
. n calculele care urmeaz vom folosi faptul c
\
i
U X
E
d-separ pe
i
U de toate celelalte dovezi din
X
E
+
. innd cont de acest
fapt i de formula (1), obinem egalitatea:
{ } ( ) { } ( )
\
| | 1,
i
i i X i i U X
P U u E P U u E i m
+
= = = = (4)
Lund n consideraie evenimentul sigur, putem exprima
probabilitatea
( )
|
X
P X E
+
sub urmtoarea form:
( ) { }
( )
1
1 1
, ,
| , , |
m
X m m X
u u
P X E P X U u U u E
+ +
| |
= = = |
|
\


(5)
ntruct membrul drept din (5) reprezint probabilitatea unei reuniuni de
mulimi disjuncte, avem:
( ) { } ( )
( )
1
1 1
, ,
| , , |
m
X m m X
u u
P X E P X U u U u E
+ +
= = =

(6)
Aplicnd, n continuare, versiunea condiionat a formulei de nmulire
a probabilitilor membrului drept din (6), obinem:
( ) { } ( )
( )
1
1 1
, ,
| , , |
m
X m m X
u u
P X E P U u U u E
+ +
= = =


{ } ( )
1 1
| , , ,
m m X
P X U u U u E
+
= = (7)
Probabilitatea { } ( )
1 1
, , |
m m X
P U u U u E
+
= = , care intervine n membrul
drept al formulei (7), poate fi explicitat dac se ine cont de
independena variabilelor aleatoare
1
, ,
m
U U , precum i de faptul c

21
Spre exemplu, dac exist doi prini Booleeni,
1
U i
2
U , atunci u trece peste patru
atribuiri posibile, dintre care una este [true, false].


282
\
i
U X
E d-separ pe
i
U de toate celelalte dovezi din
X
E
+
, care a fost
partiionat n
1
\ \
, ,
m
U X U X
E E . ntruct
1
, ,
m
U U sunt independente,
{ } ( ) { } ( )
1 1
1
, , | |
m
m m X i i X
i
P U u U u E P U u E
+ +
=
= = = =

(8)
i, innd cont de (1), avem:
{ } ( ) { } ( )
\
1 1
| |
i
m m
i i X i i U X
i i
P U u E P U u E
+
= =
= = =

(9)
Cea de-a doua probabilitate condiionat care intervine n membrul drept
al formulei (7) poate fi explicitat inndu-se cont de faptul c U
d-separ pe X de
X
E
+
:
{ } ( ) { } ( )
1 1 1 1
| , , , | , ,
m m X m m
P X U u U u E P X U u U u
+
= = = = = (10)
innd cont de (7), (8), (9) i (10), obinem:
( ) { } ( ) { } ( )
( )
1
1 1 \
, , 1
| | , , |
i
m
m
X m m i i U X
u u i
P X E P X U u U u P U u E
+
=
= = = =


(11)
Introducnd expresia lui
( )
|
X
P X E
+
dat de (11) n formula (3), rezult:
( ) ( ) ( ) { } ( )
\
1
| | | |
i
m
X i i U X
i
P X E P E X P X P U u E

=
= =

u
u (12)
Ecuaia (12) sugereaz deja un algoritm. Astfel, ( ) | P X u este repartiia
lui X condiionat de realizarea ( )
1 1
, ,
m m
U u U u = = . Valoarea acestei
probabiliti poate fi luat din tabelul de probabiliti condiionate asociat
lui . X Calculul fiecrei probabiliti { } ( )
\
|
i
i i U X
P U u E = reprezint
o secven recursiv a problemei iniiale, aceea de a calcula ( ) | P X E ,
adic ( )
\
|
X
P X E . Vom mai nota aici faptul c mulimea variabilelor


283
dovezi care intervin n apelarea recursiv reprezint o submulime a celor
din apelarea iniial, ceea ce constituie un indiciu c procedura de calcul
se va termina ntr-un numr finit de pai, ea reprezentnd ntr-adevr un
algoritm.
n continuare ne propunem s calculm probabilitatea
( )
|
X
P E X

,
care intervine n formula (12), urmrind, n egal msur, obinerea unei
soluii recursive.
ntruct
\
i
Y X
E d-separ pe
i
Y de toate celelalte dovezi din
X
E

,
rezult independena dovezilor din fiecare caset
i
Y fa de celelalte,
condiionat de X . Forma lui
X
E

este cea dat de formula (2). Datorit


independenei dovezilor de sub X avem:
( ) ( )
\
1
| |
i
n
X Y X
i
P E X P E X

=
=

(13)
Fie Y vectorul fiilor
1
, ,
n
Y Y i fie ( )
1
, ,
n
y y = y o realizare
a acestuia. n cele ce urmeaz, vom ine cont de valorile fiilor lui
( )
, 1,
i
X Y i n = , dar va trebui s includem i prinii fiecrui
i
Y . Fie
i
Z
prinii lui
i
Y , alii dect X i fie
i
z o atribuire de valori ale prinilor.
Lund n consideraie evenimentul sigur { }
i
i i
Y y =
y

i respectiv
{ }
i
i i
=
z
Z z

, avem:
( ) { } { }
\ \
| |
i i
i i
Y X Y X i i i i
y
P E X P E Y y X
| |
= = = =
|
|
\
z
Z z


{ } { } ( )
\
, , |
i
i i
Y X i i i i
y
P E Y y X = = =

z
Z z


284
Aplicnd, n formula anterioar, versiunea condiionat a formulei de
nmulire a probabilitilor, obinem:
( ) { } ( ) { } ( )
\ \
| , | | , ,
i i
i i
Y X i i i i Y X i i i i
y
P E X P Y y X P E X Y y = = = = =

z
Z z Z z
(14)
Mulimea dovezilor
\
i
Y X
E reprezint reuniunea a dou submulimi
disjuncte i independente de variabile aleatoare:
\ \
i i i
Y X Y X Y
E E E
+
=


Prin urmare, avem:
{ } ( ) { } ( )
\ \
| , , | , ,
i i
Y X i i i i Y X i i i i
P E X Y y P E X Y y
+
= = = = = Z z Z z
{ } ( )
| , ,
i
Y i i i i
P E X Y y

= = Z z (15)
Dar
i
Y
E

este o mulime de variabile aleatoare independente de X i


i
Z ,
iar
\
i
Y X
E
+
constituie o mulime de variabile aleatoare independente de X
i
i
Y . n aceste condiii, repartiiile condiionate din (15) devin:
{ } ( ) { } ( ) { } ( )
\ \
| , , | |
i i i
Y X i i i i Y i i Y X i i
P E X Y y P E Y y P E
+
= = = = = Z z Z z (16)
Cea de-a doua repartiie condiionat din membrul drept al lui
(16) apare ca o repartiie a posteriori i poate fi exprimat cu formula lui
Bayes (n versiune necondiionat):
{ } ( )
( ) { } ( )
{ } ( )
\ \
\
|
|
i i
i
Y X i i Y X
Y X i i
i i
P E P E
P E
P
+ +
+
=
= =
=
Z z
Z z
Z z
(17)
Introducnd (17) n (16) obinem:
{ } ( )
\
| , ,
i
Y X i i i i
P E X Y y = = = Z z


285
{ } ( )
( ) { } ( )
{ } ( )
\ \
|
|
i i
i
Y X i i Y X
Y i i
i i
P E P E
P E Y y
P
+ +

=
= =
=
Z z
Z z
(18)
Introducnd acum expresia lui { } ( )
\
| , ,
i
Y X i i i i
P E X Y y = = Z z dat de (18)
n formula (14), rezult:
( ) { } ( ) { } ( )
\
| , | |
i i
i i
Y X i i i i Y i i
y
P E X P Y y X P E Y y

= = = =

z
Z z
( ) { } ( )
{ } ( )
\ \
|
i i
Y X i i Y X
i i
P E P E
P
+ +
=

=
Z z
Z z
(19)
Revenind acum la repartiia lui
X
E

condiionat de , X dat de formula


(13) i lund n consideraie (19), obinem:
( ) { } ( ) { } ( )
1
| | , |
i
i i
n
X Y i i i i i i
y i
P E X P E Y y P Y y X

=
= = = =

z
Z z

( ) { } ( )
{ } ( )
\ \
|
i i
Y X i i Y X
i i
P E P E
P
+ +
=

=
Z z
Z z
(20)
Aplicnd n (20) versiunea condiionat a formulei de nmulire
a probabilitilor, rezult:
( ) { } ( )
( ) { } ( )
{ } ( )
\ \
1
|
| |
i i
i
i i
n
Y X i i Y X
X Y i i
y i
i i
P E P E
P E X P E Y y
P
+ +

=
=
= =
=

z
Z z
Z z

{ } ( ) { } { } ( )
| | ,
i i i i i i
P X P Y y X = = = Z z Z z (21)
Dar Z i X sunt d-separate, ceea ce nseamn c
{ } ( ) { } ( )
|
i i i i
P X P = = = Z z Z z . Putem, de asemenea, nlocui pe
( )
\
i
Y X
P E
+
cu o constant de normalizare
i
. n aceste condiii, egalitatea
(21) devine:


286
( ) { } ( ) { } ( )
\
1
| | |
i i
i i
n
X Y i i i i i Y X
y i
P E X P E Y y P E
+
=
= = =

z
Z z
{ } { } ( )
| ,
i i i i
P Y y X = = Z z
Combinnd toi
i
ntr-o unic constant de normalizare i innd
cont de semnificaia lui
\
i
Y X
E
+
, obinem:

( ) ( ) ( )
( ) \
| | | , |
i ij i
i i
X Y i i i ij Z Y
y i j
P E X P E y P y X P z E

=

z
z (22)
Se observ c fiecare dintre termenii expresiei finale date de (22) este
uor de evaluat:

( )
|
i
Y i
P E y

este o secven recursiv a calculrii lui


( )
|
X
P E X

;
( ) | ,
i i
P y X z se citesc din tabelul de probabiliti condiionate
asociat lui
i
Y ;

( ) \
|
ij i
ij Z Y
P z E reprezint o secven recursiv a problemei iniiale,
adic a calculrii lui ( ) | P X E , mai precis a lui ( )
\
|
X
P X E .
Problema transformrii acestor calcule ntr-un algoritm este
relativ simpl. Aa cum se arat n [9], vor fi necesare dou subrutine de
baz, care vor calcula ( )
\
|
X V
P X E i respectiv
( )
\
|
X V
P E X

, unde prin
V am notat variabila care desemneaz dovezile exceptate atunci cnd
sunt luate n consideraie cele conectate la nodul X .
n Algoritmul 5.1 subrutina SUPORT-EXCEPT( ) , X V
calculeaz ( )
\
|
X V
P X E folosind o generalizare a ecuaiei (12), n timp ce
subrutina DOVEZI-EXCEPT( ) , X V calculeaz
( )
\
|
X V
P E X

folosind
o generalizare a ecuaiei (22).


287
Pentru a simplifica prezentarea, se va presupune c reeaua este
fixat i deja aprovizionat cu dovezi, precum i c variabilele dovezi
satisfac predicatul DOVEZI?. Probabilitile ( ) | P X U , unde U
reprezint vectorul prinilor lui X , sunt disponibile n tabelul de
probabiliti condiionate asociat lui X . Calculul expresiilor i
se face prin normalizare.
n general, un agent primete valori ale variabilelor dovezi prin
intermediul senzorilor si sau n urma unor raionamente i se intereseaz
(ntreab) despre posibilele valori ale altor variabile, astfel nct s poat
decide ce aciune trebuie ntreprins n continuare. Algoritmul 5.1,
preluat de noi din [9], calculeaz distribuia de probabilitate condiionat
pentru o variabil de interogare dat. El reprezint un algoritm de tip
nlnuire-napoi pentru rezolvarea interogrilor probabiliste asupra unui
polyarbore.

Algoritmul 5.1

function INTEROGARE-REEA( ) X return
o distribuie de probabilitate a valorilor lui X
input: , X o variabil aleatoare
SUPORT-EXCEPT( ) , nul X
function SUPORT-EXCEPT( ) , X V return ( )
\
|
X V
P X E
if DOVEZI ? ( ) X then return distribuia observat pentru X
else
calculeaz
( )
\
|
X V
P E X

= DOVEZI-EXCEPT ( ) , X V


288
U PRINI | | X
if U este vid
then return
( ) ( )
\
|
X V
P E X P X


else
pentru fiecare
i
U in U do
calculeaz i memoreaz
( )
\
|
i
i U X
P U E =
=SUPORT-EXCEPT ( ) ,
i
U X
return
( ) ( ) ( )
\ \
| | |
i
X V i U X
i
P E X P X P U E


u
u
function DOVEZI-EXCEPT ( ) , X V return
( )
\
|
X V
P E X


Y FII | | X V
if Y este vid
then return o repartiie uniform
else
pentru fiecare
i
Y in Y do
calculeaz
( )
|
i
Y i
P E y

=DOVEZI-EXCEPT( ) , nul
i
Y

i
Z PRINI | |
i
Y X
pentru fiecare
ij
Z in
i
Z
calculeaz
( ) \
|
ij i
ij Z Y
P Z E =
=SUPORT-EXCEPT
( )
,
ij i
Z Y
return
( ) ( )
( ) \
| | , |
i ij i
i i
Y i i i ij Z Y
y i j
P E y P y X P z E


z
z



289
Calculele efectuate de Algoritmul 5.1 presupun apeluri recursive
care se extind de la X de-a lungul tuturor drumurilor din reea.
Recursivitatea se ncheie atunci cnd sunt atinse noduri-dovezi,
noduri-rdcin (care nu au prini) i noduri-frunz (care nu au fii).
Fiecare apel recursiv exclude nodul de la care s-a produs apelul, astfel
nct fiecare nod din arbore este tratat o singur dat. Prin urmare,
algoritmul este liniar raportat la numrul de noduri ale reelei. Algoritmul
se comport n acest fel deoarece reeaua dat reprezint un polyarbore.
Dac ar exista mai mult de un singur drum ntre o pereche de noduri,
atunci fie procedurile recursive ar lua n calcul aceleai dovezi de mai
multe ori, fie execuia nu s-ar ncheia ntr-un numr finit de pai.
Algoritmul prezentat, de tip nlnuire-napoi, este cel mai simplu
algoritm pentru polyarbori. Principalul neajuns al unui asemenea algoritm
este acela c el calculeaz repartiia de probabilitate pentru o unic
variabil. Dac se dorete determinarea repartiiilor a posteriori pentru
toate variabilele care nu constituie variabile dovezi, atunci programul
implementnd Algoritmul 5.1 ar trebui executat pentru fiecare dintre
acestea, ceea ce ar mri timpul de execuie. n acest caz este preferabil
o abordare de tip nlnuire-nainte, care pleac de la variabilele dovezi.
n cazul unei contabilizri adecvate, calculele pot fi efectuate ntr-un timp
liniar. Versiunea algoritmului care folosete nlnuirea-nainte poate fi
privit ca reprezentnd o propagare a mesajelor prin reea. Din aceast
cauz implementarea pe calculatoare paralele este relativ simpl i pot fi
fcute analogii interesante cu propagarea mesajelor ntre neuronii din
creier.



290




























291
ANEXA 1. Notaii i formule matematice

1. Repartiii de probabilitate multidimensionale

Fie ( )
1
, ,
n
E X X = un vector aleator format din n variabile
discrete. Repartiia sa, ( )
1
0 1
, ,
n
P X X

, este complet specificat de
valorile
( ) ( )
1 1 1
, , , , 0
n n n
p x x P X x X x = = =
( )
( )
1
1
, ,
, , 1
n
n
x x
p x x =

,
unde ( )
1
, ,
n
x x este o realizare a lui E .
n general, pentru a desemna ( )
1
0 1
, ,
n
P X X

, se folosete notaia
simplificat ( ) P E .
n acest context, are loc urmtoarea formul de nmulire
a probabilitilor:
( ) ( ) ( )
1 1 1 1 2 2 1 1
, , |
n n
P X x X x P X x P X x X x = = = = = =
( )
1 1 1 1
| , ,
n n n n
P X x X x X x

= = =

2. Repartiii condiionate

Fie Y o variabil aleatoare discret i ( )
1
, ,
n
E X X = un vector
aleator cu componente discrete. Corpul de evenimente generate de E
este finit, avnd ca generatori pe { }
1 1
, ,
n n
X x X x = = .


292
Pentru fiecare realizare ( )
1
, ,
n
x x a lui E , notm probabilitatea
condiionat a unui eveniment A cu
( ) ( )
{ } ( )
( )
1 1
1
1 1
, ,
| , ,
, ,
n n
n
n n
P A X x X x
P A x x
P X x X x
= =
=
= =


Corespunztor variabilei Y putem lua n consideraie:
repartiia lui ( ) , Y P Y , dat de valorile
( ) ( ) p y P Y y = = ;
repartiia lui Y condiionat de ( ) , | E P Y E , care este dat,
pentru fiecare realizare ( )
1
, ,
n
x x , de valorile
( ) ( ) { } ( ) ( )
1 1
| , , | , ,
n n
p y x x P Y y x x = = .
n acest context se verific versiunea condiionat a formulei de
nmulire a probabilitilor:
( ) ( ) ( )
1 1 1 1 2 2 1 1
, , | | | ,
n n
P X x X x C P X x C P X x C X x = = = = = =
( )
1 1 1 1
| , , ,
n n n n
P X x C X x X x

= = = .

3. Formula lui Bayes

Fie E i Y cu aceeai semnificaie din 1 i 2.
Formula lui Bayes n versiune necondiionat este utilizat
pentru a exprima o repartiie a posteriori
( )
( ) { } ( )
{ } ( )
|
|
P E P Y y E
P E Y y
P Y y
=
= =
=

unde:


293
( ) P E este repartiia a priori a lui E ;
{ } Y y = este evenimentul observat ;
( ) | P E Y y = este repartiia a posteriori a lui E ;
{ } ( )
| P Y y E = este complet determinat de valorile
{ } { } ( )
1 1
| , ,
n n
P Y y X x X x = = = .
Formula lui Bayes n versiune condiionat este utilizat pentru
a exprima o repartiie a posteriori condiionat


unde:
( ) | P Y E este o probabilitate condiionat, a priori ;
e reprezint o nou dovad ;
( ) | , P Y E e este o probabilitate condiionat, a posteriori.













( )
( ) ( )
( )
| | ,
| ,
|
P Y E P e E Y
P Y E e
P e E

=


294

































295
BIBLIOGRAFIE

1. BRATKO, I., Prolog Programming for Artificial Intelligence.
Second Edition. Workingham, Addison - Wesley, 1990.
2. CLOCKSIN, W. F., MELLISH, C. S., Programming in Prolog.
Springer-Verlag, 1994.
3. DURKIN, J., Expert Systems Design and Development. Prentice
Hall, 1994.
4. FLOREA, A. M., Elemente de inteligen artificial. Vol. I,
Principii i modele. Lito. UPB, Bucuresti, 1993.
5. LUGER, G. F., STUBBLEFIELD, W. A., Artificial Intelligence.
Structures and Strategies for Complex Problem Solving. Third
Edition. Addison Wesley, 1998.
6. MERRITT, D., Building Expert Systems in Prolog. Springer-
Verlag, 1989.
7. NILLSON, N., Artificial Intelligence: A New Synthesis. Morgan
Kauffman, 1998.
8. RICH, E., KNIGHT, K., Artificial Intelligence. Second Edition.
Tata McGraw-Hill Publishing Company Limited, New Delhi,
1993.
9. RUSSELL, S. J., NORVIG, P., Artificial Intelligence. A Modern
Approach. Prentice - Hall International, Inc., 1995.
10. SICSTUS PROLOG USERS MANUAL. Intelligent Systems
Laboratory, Sweedish Institute of Computer Science;
http://www.sics.se/isl/sicstuswww/site/documentation.html


296
11. MICROSOFT PRESS. DICIONAR DE CALCULATOARE.
(Traducere de Nicolae Pora). Editura Teora, Bucuresti, 1999.


























297
CUPRINS


CUVNT NAINTE ............................................................................. 3

1. CONSIDERAII PRELIMINARE ............................................... 5
1.1. Domeniul inteligenei artificiale. Definiii
i un scurt istoric ........................................................................... 6
1.2. Subdomenii ale inteligenei artificiale .......................................... 12
1.3. Tehnici ale inteligenei artificiale ................................................. 14
1.4. Un exemplu de problem tipic
n inteligena artificial ................................................................17

2. TEHNICI DE CUTARE ............................................................. 31
2.1. Rezolvarea problemelor prin intermediul cutrii ........................ 32
2.1.1. Tipuri de probleme ............................................................... 34
2.1.2. Probleme i soluii corect definite ........................................ 36
2.1.3. Cutarea soluiilor i generarea
secvenelor de aciuni ........................................................... 41
2.1.4. Structuri de date pentru arbori de cutare ............................ 42
2.1.5. Evaluarea strategiilor de cutare .......................................... 45
2.2. Cutarea neinformat ................................................................... 45
2.2.1. Cutarea de tip breadth-first ................................................. 46
2.2.1.1. Algoritmul de cutare breadth-first .......................... 47
2.2.1.2. Implementare n Prolog ............................................ 48
2.2.1.3. Timpul i memoria cerute
de strategia breadth-first ........................................... 54



298
2.2.1.4. Un exemplu. Problema misionarilor
i canibalilor ............................................................. 55
2.2.2. Cutarea de tip depth-first .................................................... 61
2.2.2.1. Prezentare general i comparaie
cu strategia breadth-first ........................................... 61
2.2.2.2. Implementare n Prolog ............................................ 63
2.2.3. Cutarea n adncime iterativ ............................................. 71
2.2.3.1. Prezentare general .................................................. 71
2.2.3.2. Implementare n Prolog ............................................ 73
2.2.4. Strategii de cutare neinformat. Un exemplu ..................... 75
2.3. Cutarea informat ....................................................................... 85
2.3.1. Cutarea de tip best-first ...................................................... 85
2.3.2. Algoritm de cutare general bazat pe grafuri ....................... 88
2.3.2.1. Algoritmul A* .. 89
2.3.2.1.1. Admisibilitatea Algoritmului A* .. 94
2.3.2.1.2. Condiia de consisten ............................ 101
2.3.2.1.3. Optimalitatea Algoritmului A* ............... 105
2.3.2.1.4. Completitudinea Algoritmului A* .......... 106
2.3.2.1.5. Complexitatea Algoritmului A* .............. 107
2.3.2.2. Iterative Deepening A* (IDA*) .. 108
2.3.3. Implementarea n Prolog a cutrii
de tip best-first .................................................................... 109
2.3.3.1. Exemple .................................................................. 118
2.3.4. Concluzii ............................................................................ 131

3. JOCURILE CA PROBLEME DE CUTARE .......................... 135
3.1. O definire formal a jocurilor ..................................................... 137


299
3.2. Algoritmul Minimax .................................................................. 138
3.2.1. Funcii de evaluare ............................................................. 143
3.2.2. O implementare n Prolog .................................................. 144
3.3. O implementare eficient a principiului Minimax:
Algoritmul Alpha-Beta ............................................................... 146
3.3.1. Implementare n Prolog ...................................................... 152
3.3.2. Consideraii privitoare la eficien ..................................... 154
3.4. Un exemplu. Jocul X i 0 ........................................................... 156

4. ASPECTE ALE REPREZENTRII CUNOTINELOR ...... 173
4.1. Tipuri de cunotine .................................................................... 174
4.1.1. Cunotine relaionale simple ............................................. 174
4.1.2. Cunotine care se motenesc ............................................. 175
4.1.3. Cunotine infereniale ....................................................... 178
4.1.4. Cunotine procedurale ...................................................... 179
4.2. Clase de metode pentru reprezentarea cunotinelor .................. 180
4.3. Reprezentarea cunotinelor i sistemele expert ......................... 181
4.3.1. Structura de baz a unui sistem expert ............................... 183
4.3.2. Reprezentarea cunotinelor cu reguli if-then .................... 184
4.3.3. nlnuire nainte i napoi
n sistemele bazate pe reguli .............................................. 187
4.3.3.1. nlnuirea napoi .................................................... 187
4.3.3.2. nlnuirea nainte ................................................... 191
4.3.3.3. Concluzii ................................................................ 193
4.3.4. Generarea explicaiilor ....................................................... 194
4.3.5. Introducerea incertitudinii .................................................. 196



300
4.3.6. Un exemplu de sistem expert.
Implementare n Prolog ...................................................... 201
4.4. Reele semantice i cadre ........................................................... 242
4.4.1. Reele semantice ................................................................ 243
4.4.2. Cadre .................................................................................. 251
4.5. Consideraii finale ...................................................................... 256

5. RAIONAMENT STATISTIC .................................................... 259
5.1. Abordri statistice pentru sisteme
de raionament incert .................................................................. 259
5.1.1. Factori de certitudine i
sisteme bazate pe reguli ..................................................... 262
5.1.2. Reele Bayesiene ................................................................ 269
5.1.2.1. Relaii de independen condiionat
n reele Bayesiene ................................................ 273
5.1.2.2. Inferena n reele Bayesiene .................................. 275
5.1.2.2.1. Un algoritm pentru
rspunsul la interogri ............................ 276

ANEXA1. NOTAII I FORMULE MATEMATICE .................. 291

BIBLIOGRAFIE ................................................................................ 295