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

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.

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

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

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 definiie1 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.

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 metodologiilor 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

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

termenii

unor

procese

computaionale (Schalkoff, 1990); Acea ramur a informaticii care se


ocup de automatizarea comportamentului inteligent (Luger i
Stubblefield, 1993).

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 interdisciplinar, 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

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 logic2, cum este cazul
limbajului Prolog3, 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 neurale5. O asemenea reea reprezint un tip de
sistem de inteligen artificial modelat dup neuronii -celulele nervoasedintr-un sistem nervos biologic, n ncercarea de a simula modul n care
creierul prelucreaz informaiile, nva sau i aduce aminte6 ).
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
euristic7.

Inteligena artificial rezolv probleme folosind i informaie

inexact, care lipsete sau care nu este complet definit i utilizeaz formalisme 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

Este acceptat i termenul de reea neuronal.


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.
6

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 conecionisteste 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 ntrun 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 posibilitate 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 formalizate 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 exemplu8:
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

instantiere:

Palton

culoare:

Rosu

Lucru1

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 script9. 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

9. C prsete L

10. C cumpr M

8. C nu reuete s gseasc 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 Programul 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 contingen10. 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 cutrii11 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 aceast stare i STOP.
2.2.3. Altfel, adaug noua stare la sfritul lui LISTA_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 candidate12.
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:
a

Fig. 2.2

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 corespunztor 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).
scop(j).
s(a,b).
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).

% specificare noduri-scop
% descrierea funciei succesor

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 b2 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:
1 + b + b2 + + bd .

Prin urmare, algoritmul are o complexitate exponenial de O(b d ) .


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

111

0.1 sec.

11 kilobytes

18 min.

111 megabytes

31 ore

11 gigabytes

12

35 ani

111 terabytes

8
12

10
10
10

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
%canibalilor

specifice

problemei

misionarilor

si

%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
%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)),!,

folosind

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

predicatul

fost

satisfcut.

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 bd
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 O (b m ) .
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 O (b m ) 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 astfel13:


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 noduriscop. 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).
scop(j).
s(a,b).
s(a,c).
s(b,d).
s(d,h).
s(b,e).
s(e,i).
13

% specificare noduri-scop
% descrierea funciei succesor

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 breadthfirst, 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 starescop; 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:

67

Nod de start
Drum

Nod
Solutie

Nod-scop

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

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)). Drumurilesoluie 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 corespunztor 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).
scop(j).
s(a,b).
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).

% specificare noduri-scop
% descrierea funciei succesor

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 corespunztor,
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:
1 + b + b 2 + + b d 1 + b d

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:

N bf = 1 + b + b 2 + + b d =

b d +1 1
b 1

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:
N dfj =

b j +1 1
b 1

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:

1 d j +1 d
b j +1 1
1 d j +1
[ b 1]
b
[
1
]
=

b 1 j =0
b 1 j =0
j =0 b 1
j =0
d

N id =
=

d
d
1
1
b d +1 1
[b( b j ) 1] =
[b
(d + 1)] =
b 1 j =0
b 1
b 1
j =0

b(b d +1 1) (b 1)(d + 1) b d + 2 b bd b + d + 1
=
=
(b 1) 2
(b 1) 2

b d + 2 2b bd + d + 1
(b 1) 2

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

73

de cutare n adncime iterativ are tot complexitatea de timp O(b d ) , iar


complexitatea sa de spatiu este O (bd ) . 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 corespunztor aceluiai exemplu dat de Fig. 2.2:
Programul 2.5
scop(f).
scop(j).
s(a,b).
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).

% specificare noduri-scop
% descrierea funciei succesor

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:
a
d

L1

L2

L3

C2:
a
b
c
d

L1

L2

L3

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),

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
%definim starile initiale si starile finale.

scop

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)
%lungimea listei L.

este

adevarat

daca

este

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
%afisarea configuratiei Situatie.

utilizat

pentru

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

predicatul

fost

satisfcut.

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

===========
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 f ( n) . 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:
A

(3)

(5)

(1)

(3)

(5)

(4)

(6)

(5)

(5)

(4)

(6)

(6)

(5)

(5)

(2)

(6)

(1)

Fig. 2.7

(6)

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: f ( n) = g ( n) + h( n), unde
g ( n) este o estimaie a adncimii lui n n graf, adic reprezint lungimea

celui mai scurt drum de la nodul de start la n, iar h( n) este o evaluare


euristic a nodului n.
Pentru a studia, n cele ce urmeaz, aspectele formale ale cutrii
de tip best-first14, 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, Tr , care const numai din nodul

de start n 0 . Plaseaz pe n 0 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 Tr , de la n la n 0 . (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 Tr , 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:

h(n) = 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;

g (n ) = costul unui drum de cost minim de la nodul de start n 0 la

nodul n.
Atunci, f ( n ) = g ( n) + h( n ) este costul unui drum de cost minim de la n 0
la un nod-scop, drum ales dintre toate drumurile care trebuie s treac
prin nodul n.

90

Observaie: f (n0 ) = h(n0 ) reprezint costul unui drum de cost

minim nerestricionat, de la nodul n 0 la un nod-scop.


Pentru fiecare nod n, fie h( n) , numit factor euristic, o estimaie a
lui h(n) i fie g ( n ) , numit factor de adncime, costul drumului de cost
minim pn la n gsit de A* pn la pasul curent. Algoritmul A* va
folosi funcia f = g + h .
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 Tr . Instaleaz M ca succesori ai lui n n Tr


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 Tr . Instaleaz M ca succesori ai lui n n Tr


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 Tr de attea ori de cte ori algoritmul descoper
drumuri diferite care duc la el. Dac dou noduri din Tr 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, Tr .

Tr , 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
n 0 . Plaseaz n 0 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 n 0 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, h( n) h ( n ) . 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, n 0 , 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. f (n ) f (n 0 ) .
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 f (n 0 ) . 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 n g 2 cu f ( n g 2 ) > f ( n 0 ) i n
condiiile n care exist un scop optim, n g 1 n g 2 , cu f ( n g 1 ) = f ( n 0 ) .
Atunci cnd are loc terminarea n nodul n g 2 , f ( n g 2 ) f ( n g 2 ) > f ( n 0 ) .
Dar, chiar nainte ca A* s l selecteze pe n g 2 pentru extindere, conform
Lemei 2.1, a existat un nod n* n OPEN i aflat pe un drum optim, cu

f (n ) f (n 0 ) . Prin urmare, A* nu ar fi putut s l selecteze pe n g 2


pentru extindere, deoarece A* selecteaz ntotdeauna acel nod avnd cea
mai mic valoare a lui f i f (n ) f (n 0 ) < f (n g 2 ) . 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 n 0 a fost
selectat pentru extindere, nodul n 0 este n OPEN, el este un drum
optim la scop i A* a gsit acest drum. De asemenea, f (n 0 ) f (n 0 )
deoarece f (n 0 ) = h(n 0 ) f (n 0 ) . Astfel, nodul n 0 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 ( m 0) 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 n1 ca fiind al (m+1)-lea nod
extins:

98

n*
n0

CLOSED

n1
OPEN

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 np,
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 np deoarece, dac ar exista un drum mai bun
la np, 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 np 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 f (n0 ) f (n0 ) .

99

n0

np
n*

CLOSED

OPEN

Fig. 2.9

Demonstrm acum proprietatea

f (n0 ) f (n0 ) 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:
f ( n ) = g ( n ) + h( n )

(prin definiie)

g ( n ) + h(n )

g ( n ) = g ( n )
deoarece
h( n ) h(n )

f (n )

deoarece

g ( n ) + h( n ) = f ( n )

prin

definiie

f (n 0 )

deoarece

f ( n ) = f (n 0 ) , ntruct n* se

afl pe un drum optim, ceea ce completeaz demonstraia lemei.




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 h1 < h2 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 n 0 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 f ( n ) = g ( n ) = adncime(n), se obine

cutarea de tip breadth-first. Algoritmul breadth-first reprezint


un caz particular al lui A* (cu h 0 ), prin urmare el este un
algoritm admisibil.

2.3.2.1.2. Condiia de consisten

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


al lui ni .
Definiia 2.2

Se spune c h ndeplinete condiia de consisten dac, pentru


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

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


unde c ( n i , n j ) este costul arcului de la ni la n j .
Condiia de consisten mai poate fi formulat i sub una din
formele urmtoare:

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


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:
nj
h(n j )

c (n i , n j )

ni

h( ni )

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


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 ni i n j dou noduri n arborele de cutare generat de

algoritmul A*, cu n j succesor al lui ni . Atunci, dac condiia de


consisten este satisfcut, avem:

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

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


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

103

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


Dar

g ( n j ) = g ( n i ) + c ( n i , n j ) , adic adncimea nodului

nj

este

adncimea lui ni plus costul arcului de la ni la n j . Dac egalitatea nu ar


avea loc, n j nu ar fi un succesor al lui ni n arborele de cutare. Atunci:

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


deci f (n j ) f (n i ) .


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 n 0 la un nod-scop, ntr-un graf implicit G.
Fie = (n 0 , n1 ,....., n l , n l +1 ,...., n = n k ) o secven de noduri din G
care constituie un drum optim de la n 0 la n. Fie nl ultimul nod din
extins de A*. ntruct nl este ultimul nod nchis din , adic ultimul

104

din lista CLOSED, tim c n l +1 este n lista OPEN i deci reprezint un


candidat pentru extindere.
Pentru orice nod ni i succesorul su n i +1 din , avem15

g (ni +1 ) + h(n i +1 ) = g (ni ) + c(ni , n i +1 ) + h(ni +1 ) g (ni ) + h(ni ) ,


atunci cnd condiia de consisten este satisfcut.
Tranzitivitatea relaiei ne d:

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


n particular,

g (n) + h(n) g (nl +1 ) + h(nl +1 ) = f (nl +1 )


deoarece A* a gsit un drum optim pn la

n l +1 , fcnd

g ( n l +1 ) = g ( n l +1 ) .

Dar, ntruct A* se pregtete s extind nodul n n locul nodului

n l +1 , nseamn c :

f (n) = g (n) + h(n) f (nl +1 )

(1)

S-a stabilit deja c

f (nl +1 ) g (n) + h(n)

(2)

Din (1) i (2) rezult

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


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

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

h(ni ) h(n j ) + c(ni , n j ), cu n j succesor; aici n j n i +1 .

15

105

Dar, ntruct metoda de calcul a funciilor g implic inegalitatea


g ( n ) g ( n ) , nseamn c g ( n ) = g ( n) , ceea ce arat c, fie n l +1 = n , 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


G2 o a doua stare-scop, suboptimal, care este o stare-scop cu un cost al
drumului
g(G2)>f*
Presupunem c A* selecteaz din coad, pentru extindere, pe G2 .
ntruct G2 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:

f f (n)

(1)

Mai mult, dac n nu este ales pentru extindere n favoarea lui G2 ,


trebuie s avem:

106

f (n) f (G 2 )

(2)

Combinnd (1) cu (2) obinem:

f f (G 2 )

(3)

Dar, deoarece G2 este o stare-scop, avem h(G 2 ) = 0 . Prin urmare,

f (G 2 ) = g (G 2 )

(4)

Cu presupunerile fcute, conform (3) i (4) am artat c


f g (G 2 )

Aceast concluzie contrazice faptul c G2 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:
h( n) h (n) O (log h ( n)) ,

unde h (n) 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
ramificare.

bf

noduri, unde b este acelai factor de

109

Complexitatea de timp a algoritmului depinde n mare msur de


numrul valorilor diferite pe care le poate lua funcia euristic.
Q
Z
V
A

B
C

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

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

f ( X ) = g ( X ) + h ( X ) = g ( X ) + dist ( X,t )
unde dist ( X,t ) reprezint distana n linie dreapt ntre X i t.
n acest exemplu, cutarea de tip best-first este efectuat prin
intermediul a dou procese, P1 si P2, ce exploreaz fiecare cte una din

111

cele dou ci alternative. Calea de la s la t via nodul a corespunde


procesului P1, iar calea prin nodul e corespunde procesului P2.
2
s

2
a

2
4

f
3

2
g

scop

Fig. 2.11

n stadiile iniiale, procesul P1 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 P1 exploreaz c,

iar

procesul

P2

este

nc

la

e,

f (e) = g (e) + h(e ) = 2 + 7 = 9 i deci

f (c ) = g (c ) + h(c ) = 6 + 4 = 10 ,

f (e ) < f (c ) . n acest moment,

situaia se schimb: procesul P2 devine activ, iar procesul P1 intr n

ateptare. n continuare, f (c ) = 10 , f ( f ) = 11 , f (c ) < f ( f ) i deci P1

devine activ i P2 intr n ateptare. Pentru c f (d ) = 12 > 11 , procesul P1


va reintra n ateptare, iar procesul P2 va rmne activ pn cnd se va
atinge starea scop t.

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 f (N ) ;

pentru un arbore T cu rdcina N i subarborii S1 , S2 , definim


f (T ) = min f ( S i )
i

n implementarea care urmeaz, vom reprezenta arborele de


cutare prin termeni Prolog de dou forme, i anume:

l ( N,F/G ) corespunde unui arbore cu un singur nod N; N este nod

n spaiul strilor, G este g ( N ) (considerm g ( N ) ca fiind costul

drumului ntre nodul de start i nodul N), F = G + h ( N ) .

t ( N,F/G, Subs ) corespunde unui arbore cu subarbori nevizi; N

este rdcina sa, Subs este lista subarborilor si, G este g (N ) , 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 t (s,7 / 0,[l(a,7 / 2 ),l(e,9 / 2 )]) . 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 f (e ) = 9 , 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 f (c ) = 10 , 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:

t (s,9 / 0,[l(e,9 / 2 ),t (a,10 / 2,[t(b,10 / 4,[l(c,10 / 6 )] )])])


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
%cale-solutie.

este

nod-scop,

atunci

construim

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
%determinata este foarte mare.

vide,

f -valoarea

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:
 h1 (S ) = numrul de plcue care nu sunt la locul lor n starea S

fa de starea final;
 h2 (S ) = 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:

3
4

[2/2, 1/3, 2/3, 3/3, 3/2, 3/1, 2/1, 1/1, 1/2]

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, h3 , dup cum


urmeaz:

h3 (S ) = h2 (S ) + 3* sec v(S) ,
pentru o stare S, unde sec v(S) 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;

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 Sa din Fig.2.13 a), sec v(S a ) = 6 .


Fig. 2.13 prezint trei exemple de configuraii iniiale:
1

8
7

6
a)

b)

6
8

c)

Fig. 2.13

Funciile euristice h1 si h2 sunt admisibile, iar h2 este mai


informat dect h1 . Funcia euristic h3 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 h3 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

122

nu satisface condiia de admisibilitate pentru toate nodurile din spaiul


strilor. Spre exemplu, pentru configuraia iniial Sa , avem:

h3 (S a ) = 4 + 3* 6
h (S a ) = 4

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
%cale-solutie.

este

nod-scop,

atunci

construim

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
%determinata este foarte mare.

vide,

Interogarea Prologului se face dup cum urmeaz:


?- pb.

Rspunsul sistemului va fi
yes

f -valoarea

128

cu

semnificaia

predicatul

fost

satisfcut.

fiierul

C:\best_first_output.txt putem vedea i secvena de mutri prin

care s-a ajuns din starea iniial


2

n starea final
1

8
7

Dup

interogarea

3
4

anterioar,

coninutul

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
-------

fiierului

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 n C (est ) numrul de canibali de pe malul de est i
cu n M (est ) numrul de misionari de pe acelai mal. Definim:

(n (est ) + n M (est ))
h1 (S) = C
M

(n C (est ) + n M (est ) 2 )

2
(M - 1) + 1, daca n C (est ) + n M (est ) 0

si barca se afla pe malul de est

(n (est ) + n (est ) 1)
+ 2, daca n (est ) + n (est ) 0
M
h 2 (S) = 2 C
C
M
M
1
(
)

si barca se afla pe malul de vest

0,
daca n C (est ) + n M (est ) = 0
Funcia euristic h 2 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 h 2 . Prin urmare, aceast funcie euristic este
admisibil. Se observ uor c i funcia euristic h1 este admisibil, dar
i c aceasta este mai puin informat dect h 2 .

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 stareascop 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
35100 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,

penalizeaz ineficiena

jocurile

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 nodurilorprinte 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:
a

Mutare a lui MAX

Mutare a
lui MIN

Mutare a
lui MAX

Valori
statice

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

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(bm). 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


w1f1 + w2f2 + ...+ wnfn,
unde valorile wi, i = 1, n reprezint ponderile, iar fi, i = 1, n sunt
caracteristicile unei anumite poziii. n cazul jocului de ah, spre exemplu

wi, i = 1, n ar putea fi valorile pieselor (1 pentru pion, 3 pentru nebun


etc.), iar fi, i = 1, n 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

V( P, alpha, beta ) > beta,

dac V ( P ) > beta,

(1)

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

Mutare a lui MAX

Mutare a
lui MIN

Valoare
aproximativa
4

Mutare a
lui MAX

Succesor
ignorat

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, alphabeta retezarea produce arborele de cutare din Fig. 3.4, n care strile fr
numere nu sunt evaluate.

151

MAX

MIN

MAX

MIN

Fig. 3.3

MAX

MAX

Fig. 3.4

MIN

MIN

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(bd/2) noduri, n loc de O(bd), 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 alphabeta, 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 e(p ) astfel:

e(p ) = M ( M - un numr foarte mare), dac p este poziie

ctigtoare pentru MAX;

e(p ) = M ( M - un numr foarte mare), dac p este poziie


ctigtoare pentru MIN;

e(p ) = 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 e(p ) = 4 6 = 2 .

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)
%utilizat pentru determinarea numarului de
%deschise (L_D) pentru jucatorul XO, in
%configuratiei (tabloului) Tablou.

este
linii
cazul

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 alphabeta. 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.
123
1 ...
2 ...
3 ...

168

Mutarea mea este:


123
1 ...
2 .X.
3 ...
Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 1.
Coloana: 2.
123
1 .0.
2 .X.
3 ...
Mutarea mea este:
123
1 .0.
2 .X.
3 ..X
Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 1.
Coloana: 1.
123
1 00.
2 .X.
3 ..X
Mutarea mea este:
123
1 00X
2 .X.
3 ..X
Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 3.
Coloana: 1.

169

123
1 00X
2 .X.
3 0.X
Mutarea mea este:
123
1 00X
2 .XX
3 0.X
Ai pierdut!
Yes

2. Remiz
?- x_si_o_minimax.
Incepe jocul...
Vrei sa fii cu X? (da/nu)
|: da.
Adancimea: 6.
123
1 ...
2 ...
3 ...
Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 2.
Coloana: 2.
123
1 ...
2 .X.
3 ...
Mutarea mea este:
123
1 ...
2 .X.
3 ..0

170

Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 1.
Coloana: 1.
123
1 X..
2 .X.
3 ..0
Mutarea mea este:
123
1 X..
2 .X.
3 0.0
Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 3.
Coloana: 2.
123
1 X..
2 .X.
3 0X0
Mutarea mea este:
123
1 X0.
2 .X.
3 0X0
Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 2.
Coloana: 1.
123
1 X0.
2 XX.
3 0X0
Mutarea mea este:

171

123
1 X0.
2 XX0
3 0X0
Trebuie sa marchezi.
Specifica campul pe care il vei marca.
Linia: 1.
Coloana: 3.
123
1 X0.
2 XX0
3 0X0
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

Popescu Andrei
Ionescu Maria
Hristea Oana
Prvu Ana
Savu Andrei
Popescu Ana

An de studiu
18
18
20
19
19
20

I
I
I
II
II
III

Note la
informatic
8-9
9-10
7-8
8-9
7-8
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

Persoana
isa
inaltime

Adult
Mascul

1,50 - 2

inaltime

1,60 1,95

eficacitate

3/20

Fotbalist

isa

15/34

eficacitate

isa

Atacant

Mijlocas

instantiere
Hellas
Verona

echipa

Adrian
Mutu

eficacitate

6/30

instantiere
Gheorghe
Hagi

echipa

Steaua
Bucuresti

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

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 (deschizturumplutur).

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 expert16 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:

Baza de
cunostinte

Motor de
inferenta

Interfata cu
utilizatorul
Shell

Fig. 4.3

Utilizator

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
cunotine17 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:
bucatarie_uscat

fereastra
scurgere_la_baie

bucatarie

hol_ud

hol

baie
problema_la_bucatarie

baie_uscat
scurgere_in_bucatarie
fereastra_inchisa
fara_apa_din_afara
fara_ploaie

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.

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
%Conditia este
%adevarata?

fapta_compusa(Cond).
fapta_compusa(Cond):-

%fapta simpla

fapta(Cond).
fapta_compusa(Cond1 and Cond2):fapta_compusa(Cond1),

%Ambii conjuncti

fapta_compusa(Cond2).

%sunt

bjmnhfds
fapta_compusa(Cond1 or Cond2):fapta_compusa(Cond1)
;
fapta_compusa(Cond2).

adevarati

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 MYCIN18, 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 shellului 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:
FC =

RFC StFC
100

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:
nou _ FC ( X , Y ) = X +

Y (100 X )
, dac X , Y > 0
100

nou _ FC ( X , Y ) = 100

(X + Y )

, dac X > 0, Y 0

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

X 0, Y > 0

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


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 nou _ FC ( X , Y ) 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:

actualizeaza. Predicatul

demonstreaza,

demonstreaza

ajusteaza,

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,

iesire,
cum

consulta,

reinitiaza,

cum. Opiunile incarca,

afisare_fapte,

afisare_fapte,

consulta,

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

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
Cum

Afisare_fapte

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
scrie_lista(['

',NN]),

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:
animal
isa
activ

ziua

pasare
isa

metoda_de_miscare
zbor
isa

albatros
culoare

kiwi

culoare

metoda_de_miscare

isa
isa

maro

isa

activ

Tudor

mers
noaptea

alb_si_negru
Mihai

Dana

Fig. 4.5
Exemplul a fost preluat de noi din [1], iar reeaua este folosit pentru
reprezentarea unor fapte de tipul urmtor:

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,!.

%Fapta nu este o variabila;


%Fapta=Rel(Ar1,Arg2)
%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

priori

lui

(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 H i , care se exclud reciproc i ntre care ncercm
s discernem. Fie
E = dovezile obinute printr-un experiment auxiliar.

P ( H i ) = probabilitatea a priori ca ipoteza H i s fie adevrat.


P ( E | Hi )

probabilitatea

de

observa

dovezile

(probabilitatea s se realizeze E ), atunci cnd ipoteza H i este


adevrat.
P ( H i | E ) = probabilitatea a posteriori ca ipoteza H i s fie
adevrat, fiind date dovezile E (tiind c s-a realizat E ).
Ca modalitate de calcul, probabilitatea a posteriori P ( H i | 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

P ( Hi | E ) =

P ( E | Hi ) P ( Hi )
k

P(E | H ) P(H )
n

n =1

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 ( H | E, e ) = P ( H | E )

P ( e | E, H )
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.
A

(a)

(b)

(c)

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

265

Dac sunt nlnuite inferene incerte, atunci rezultatul ar trebui s


fie mai puin cert dect fiecare inferen n parte.

Acceptnd necesitatea acestor proprieti19, 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, s1 i s2 ,
se calculeaz dup cum urmeaz:

0,
daca MN [ h, s1 s2 ] = 1
MI [ h, s1 s2 ] =
altfel
MI [ h, s1 ] + MI [ h, s2 ] (1 MI [ h, s1 ]) ,
daca MI [ h, s1 s2 ] = 1
0,
MN [ h, s1 s2 ] =
altfel
MN [ h, s1 ] + MN [ h, s2 ] (1 MN [ h, s1 ]) ,
FC [ h, s1 s2 ] se calculeaz pe baza lui MI [ h, s1 s2 ] i MN [ h, s1 s2 ] .
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:

MI [ h1 h2 , e ] = min ( MI [ h`1 , e ] , MI [ h`2 , e])

19

Descrierea sistemului MYCIN este fcut aici conform [8].

266

MI [ h1 h2 , e ] = max ( MI [ h`1 , e ] , MI [ h`2 , 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:

MI [ h, s ] = MI [ h, s ] max ( 0, 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 P ( h ) = 1

MI [ h, e ] = max P ( h | e ) , P ( h ) P ( h )
, altfel

1 P (h)

n mod similar, MN este descreterea proporional a ncrederii n h ca


rezultat al observrii lui e :

1,
daca P ( h ) = 0

MN [ h, e ] = min P ( h | e ) , P ( h ) P ( h )
, altfel

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 P ( h ) = 1

MI [ h, e ] = max P ( h | e ) , P ( h ) P ( h )
, altfel

(1 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.
Sezon_ploios

Stropitoare

Ploaie

Ud

Fig. 5.2
Probabilitile condiionate corespunztoare pot fi date sub forma
unui tabel de tipul:

Atribut
p(Ud|Stropitoare, Ploaie)
p(Ud|Stropitoare, Ploaie)
p(Ud| Stropitoare, Ploaie)
p(Ud| Stropitoare, Ploaie)

Probabilitate
0.95
0.9
0.8
0.1

p(Stropitoare| Sezon ploios)


p(Stropitoare| Sezon ploios)

0.0
1.0

p(Ploaie|Sezon ploios)
p(Ploaie| Sezon ploios)

0.9
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

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:

(1)

X
X
X

E
Z

(2)

(3)

Fig. 5.3

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 U = U1 U m i fiii Y = Y1 Yn . 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 dovezi20. 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:

 E X+ reprezint suportul cauzal pentru X - variabilele dovezi


aflate deasupra lui X , care sunt conectate la X

prin

intermediul prinilor si.


20

E = { E X , E X+ } = {U1 , , U m , Y1 , , Yn } , mulime de variabile aleatoare discrete.

278

 E X reprezint suportul probatoriu pentru X - variabilele


dovezi aflate dedesubtul lui X i care sunt conectate la X prin
intermediul fiilor si.

Ex+
U1

Um

Z1j

Znj

Ex

Yn

Y1

Fig. 5.4
Notaia EUi \ X va fi folosit pentru a se face referire la toate
dovezile conectate cu nodul U i , mai puin cele prin drumul de la X . Cu
aceast ultim notaie, putem partiiona pe E X+ n EU1 \ X , , EU m \ X i deci

putem exprima pe E X+ sub forma urmtoare:

279

E X+ = EUi \ X

(1)

i =1

n mod similar, EYi \ X semnific mulimea tuturor dovezilor conectate la


Yi prin intermediul prinilor si, cu excepia lui X . Mulimea E X poate

fi deci partiionat n mulimile EY1 \ X , , EYn \ X i este de forma


n

E X = EYi \ X

(2)

i =1

Se observ c mulimea tuturor dovezilor E poate fi scris ca E X (toate


dovezile conectate la X ) i ca E X \ (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 E X+ i E X .

Calculeaz contribuia mulimii E X+ 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 E X 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
P ( X | E ) = P ( X | E X , E X+ )

Pentru a separa contribuiile lui E X+ i E X , vom aplica versiunea


condiionat a regulii lui Bayes, pstrnd pe E X ca dovad fixat n
fundal:

P(X | E , E

+
X

)=

P ( X | E X+ ) P ( E X | X , E X+ )
P ( E X | E X+ )

ntruct X d-separ n cadrul reelei pe E X+ de E X , putem folosi


independena condiionat pentru a simplifica al doilea termen al
numrtorului. De asemenea, putem trata 1 P ( E X | E X+ ) ca pe o constant
de normalizare, obinnd:
P ( X | E ) = P ( X | E X+ ) P ( E X | X )

(3)

Prin urmare, este necesar s calculm cei doi termeni P ( X | E X+ ) i


P ( E X | X ) . Vom ncepe prin tratarea primului, care se calculeaz relativ

uor.
Vom calcula P ( X | E X+ ) lund n consideraie toate configuraiile
posibile ale prinilor lui X , precum i ct de probabile sunt acestea fiind
dat mulimea E X+ . n cazul fiecrei configuraii date, probabilitatea lui
X se cunoate direct din tabelul probabilitilor condiionate.

281

Fie U vectorul prinilor U1 , , U m i fie u o atribuire de valori


pentru acetia21. n calculele care urmeaz vom folosi faptul c EUi \ X
d-separ pe U i de toate celelalte dovezi din E X+ . innd cont de acest
fapt i de formula (1), obinem egalitatea:

P ({U i = ui } | E X+ ) = P {U i = ui } | EUi \ X

i = 1, m

(4)

Lund n consideraie evenimentul sigur, putem exprima


probabilitatea P ( X | E X+ ) sub urmtoarea form:

P ( X | E X+ ) = P X {U1 = u1 , ,U m = um } | E X+

( u1 ,,um )

(5)

ntruct membrul drept din (5) reprezint probabilitatea unei reuniuni de


mulimi disjuncte, avem:

P ( X | E X+ ) =

( u1 ,,um )

P ( X {U1 = u1 , , U m = um } | E X+ )

(6)

Aplicnd, n continuare, versiunea condiionat a formulei de nmulire


a probabilitilor membrului drept din (6), obinem:

P ( X | E X+ ) =

( u1 ,,um )

P ({U1 = u1 , , U m = um } | E X+ )

P ( X | {U1 = u1 , ,U m = um } , E X+ )

(7)

Probabilitatea P ({U1 = u1 , , U m = um } | E X+ ) , care intervine n membrul


drept al formulei (7), poate fi explicitat dac se ine cont de
independena variabilelor aleatoare U1 , ,U m , precum i de faptul c
21

Spre exemplu, dac exist doi prini Booleeni, U 1 i U 2 , atunci


atribuiri posibile, dintre care una este [true, false].

u trece peste patru

282

EU i \ X d-separ pe U i de toate celelalte dovezi din E X+ , care a fost

partiionat n EU1 \ X , , EU m \ X . ntruct U1 , ,U m sunt independente,


m

P ({U1 = u1 , ,U m = um } | E X+ ) = P ({U i = ui } | E X+ )

(8)

i =1

i, innd cont de (1), avem:


m

i =1

i =1

P ({U i = ui } | E X+ ) = P {U i = ui } | EUi \ X

(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 E X+ :
P ( X | {U1 = u1 , , U m = um } , E X+ ) = P ( X | {U1 = u1 , , U m = um } )

(10)

innd cont de (7), (8), (9) i (10), obinem:


P ( X | E X+ ) =

( u1 ,,um )

P ( X | {U1 = u1 , , U m = um } ) P {U i = ui } | EUi \ X
i =1

Introducnd expresia lui P ( X | E

+
X

(11)
dat de (11) n formula (3), rezult:
m

P ( X | E ) = P ( E X | X ) P ( X | u ) P {U i = ui } | EU i \ X
u

i =1

(12)

Ecuaia (12) sugereaz deja un algoritm. Astfel, P ( X | u ) este repartiia


lui X condiionat de realizarea (U1 = u1 , ,U m = um ) . Valoarea acestei
probabiliti poate fi luat din tabelul de probabiliti condiionate asociat

lui X . Calculul fiecrei probabiliti P {U i = ui } | EU i \ X

reprezint

o secven recursiv a problemei iniiale, aceea de a calcula P ( X | E ) ,


adic P ( X | E X \ ) . 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 P ( E X | X ) ,
care intervine n formula (12), urmrind, n egal msur, obinerea unei
soluii recursive.
ntruct EYi \ X d-separ pe Yi de toate celelalte dovezi din E X ,
rezult independena dovezilor din fiecare caset Yi fa de celelalte,
condiionat de X . Forma lui E X este cea dat de formula (2). Datorit
independenei dovezilor de sub X avem:
n

P ( E X | X ) = P EYi \ X | X
i =1

(13)

Fie Y vectorul fiilor Y1 , , Yn i fie y = ( y1 , , yn ) o realizare


a acestuia. n cele ce urmeaz, vom ine cont de valorile fiilor lui

X , Yi i = 1, n , dar va trebui s includem i prinii fiecrui Yi . Fie Zi

prinii lui Yi , alii dect X i fie z i o atribuire de valori ale prinilor.


Lund n consideraie evenimentul sigur

{Y = y }
i

i respectiv

yi

{Z

= z i } , avem:

zi

P EYi \ X | X = P EYi \ X {Yi = yi } {Zi = z i } | X =


zi
yi

= P EYi \ X , {Yi = yi } , {Zi = z i } | X


yi

zi

284

Aplicnd, n formula anterioar, versiunea condiionat a formulei de


nmulire a probabilitilor, obinem:

P EYi \ X | X = P ({Yi = yi , Zi = z i } | X ) P EYi \ X | X , {Yi = yi , Zi = z i }


yi

zi

(14)
Mulimea dovezilor EYi \ X reprezint reuniunea a dou submulimi
disjuncte i independente de variabile aleatoare:
EYi \ X = EY+i \ X EYi
Prin urmare, avem:

P EYi \ X | X , {Yi = yi , Zi = z i } = P EY+i \ X | X , {Yi = yi , Zi = z i }

P EYi | X , {Yi = yi , Zi = z i }

(15)

Dar EYi este o mulime de variabile aleatoare independente de X i Zi ,


iar EY+i \ X constituie o mulime de variabile aleatoare independente de X
i Yi . n aceste condiii, repartiiile condiionate din (15) devin:

) (

P EYi \ X | X , {Yi = yi , Zi = z i } = P EYi | {Yi = yi } P EY+i \ X | {Zi = z i } (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):

+
Yi \ X

P E

| {Z i = z i } =

) (

P EY+i \ X P {Zi = z i } | EY+i \ X


P ({Z i = z i } )

Introducnd (17) n (16) obinem:

P EYi \ X | X , {Yi = yi , Zi = z i } =

(17)

285

= P E | {Yi = yi }

Yi

) (

P EY+i \ X P {Zi = z i } | EY+i \ X


P ({ Z i = z i } )

(18)

Introducnd acum expresia lui P EYi \ X | X , {Yi = yi , Z i = z i } dat de (18)


n formula (14), rezult:

P EYi \ X | X = P ({Yi = yi , Zi = z i } | X ) P EYi | {Yi = yi }


yi

zi

) (

P EY+i \ X P {Zi = z i } | EY+i \ X

P ({ Z i = z i } )

(19)

Revenind acum la repartiia lui E X condiionat de X , dat de formula


(13) i lund n consideraie (19), obinem:
n

P ( E X | X ) = P EYi | {Yi = yi }
i =1

yi

) P ({Y = y , Z
i

= zi } | X )

zi

) (

P EY+i \ X P {Zi = z i } | EY+i \ X


P ({ Z i = z i } )

(20)

Aplicnd n (20) versiunea condiionat a formulei de nmulire


a probabilitilor, rezult:
n

P ( E | X ) = P E | {Yi = yi }

i =1

Yi

yi

) (

P EY+i \ X P {Z i = z i } | EY+i \ X
P ({ Z i = z i } )

zi

P ({Zi = z i } | X ) P ({Yi = yi } | X , {Z i = z i } )
Dar

sunt

d-separate,

)
(21)

ceea

ce

nseamn

P ({Zi = z i } | X ) = P ({Zi = z i } ) . Putem, de asemenea, nlocui pe

P EY+i \ X

cu o constant de normalizare i . n aceste condiii, egalitatea

(21) devine:

286

P ( E X | X ) = P EYi | {Yi = yi }
i =1

yi

) P ({ Z
i

= z i } | EY+i \ X

zi

P ({Yi = yi } | X , {Z i = z i } )
Combinnd toi i ntr-o unic constant de normalizare i innd
cont de semnificaia lui EY+i \ X , obinem:

P ( E X | X ) = P EYi | yi
i

yi

) P ( y | X , z ) P ( z
i

zi

ij

| EZij \Yi

(22)

Se observ c fiecare dintre termenii expresiei finale date de (22) este


uor de evaluat:

P EYi | yi este o secven recursiv a calculrii lui P ( E X | X ) ;

P ( yi | X , z i ) se citesc din tabelul de probabiliti condiionate


asociat lui Yi ;

P zij | EZij \Yi

) reprezint o secven recursiv a problemei iniiale,

adic a calculrii lui P ( X | E ) , mai precis a lui P ( X | E X \ ) .


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 P ( X | E X \V ) i respectiv P ( E X \V | 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 P ( X | E X \V ) folosind o generalizare a ecuaiei (12), n timp ce


subrutina DOVEZI-EXCEPT ( X ,V ) calculeaz P ( E X \V | 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

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 ( X , nul )
function SUPORT-EXCEPT ( X ,V ) return P ( X | E X \V )
if DOVEZI ? ( X ) then return distribuia observat pentru X
else

calculeaz P E X \V | X

) = DOVEZI-EXCEPT ( X ,V )

288

U PRINI [ X ]
if U este vid

then return P E X \V | X P ( X )
else
pentru fiecare U i in U do

calculeaz i memoreaz P U i | EU i \ X =

= SUPORT-EXCEPT (U i , X )

return P E X \V | X

) P ( X | u ) P (U
u

| EUi \ X

function DOVEZI-EXCEPT ( X ,V ) return P E X \V | X

Y FII [ X ] V
if Y este vid
then return o repartiie uniform
else
pentru fiecare Yi in Y do

calculeaz P EYi | yi = DOVEZI-EXCEPT ( Yi , nul )

Z i PRINI [Yi ] X
pentru fiecare Z ij in Z i

calculeaz P Z ij | EZij \Yi =

= SUPORT-EXCEPT ( Z ij , Yi )
return

P(E

Yi

yi

| yi

) P ( y | X , z ) P ( z
i

zi

ij

| EZij \Yi

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 E = ( X 1 , , X n ) un vector aleator format din n variabile


1

discrete. Repartiia sa, P0 ( X 1 , , X n ) , este complet specificat de


valorile
p ( x1 , , xn ) = P ( X 1 = x1 , , X n = xn ) 0

( x1 ,, xn )

p ( x1 , , xn ) = 1 ,

unde ( x1 , , xn ) este o realizare a lui E .


1

n general, pentru a desemna P0 ( X 1 , , X n ) , se folosete notaia


simplificat P ( E ) .
n acest context, are loc urmtoarea formul de nmulire
a probabilitilor:
P ( X 1 = x1 , , X n = xn ) = P ( X 1 = x1 ) P ( X 2 = x2 | X 1 = x1 )

P ( X n = xn | X 1 = x1 , , X n1 = xn1 )

2. Repartiii condiionate

Fie Y o variabil aleatoare discret i E = ( X 1 , , X n ) un vector


aleator cu componente discrete. Corpul de evenimente generate de E
este finit, avnd ca generatori pe { X 1 = x1 , , X n = xn } .

292

Pentru fiecare realizare ( x1 , , xn ) a lui E , notm probabilitatea


condiionat a unui eveniment A cu
P ( A | ( x1 , , xn ) ) =

P ( A { X 1 = x1 , , X n = xn })
P ( X 1 = x1 , , X n = xn )

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 ( x1 , , xn ) , de valorile
p ( y | ( x1 , , xn ) ) = P ({Y = y} | ( x1 , , xn ) ) .
n acest context se verific versiunea condiionat a formulei de

nmulire a probabilitilor:
P ( X 1 = x1 , , X n = xn | C ) = P ( X 1 = x1 | C ) P ( X 2 = x2 | C , X 1 = x1 )

P ( X n = xn | C , X 1 = x1 , , X n 1 = xn 1 ) .

3. Formula lui Bayes

Fie E i Y cu aceeai semnificaie din 1 i 2.

Formula lui Bayes

n versiune necondiionat

pentru a exprima o repartiie a posteriori


P(E | Y = y) =
unde:

P ( E ) P ({Y = y} | E )
P ({Y = y} )

este utilizat

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
P ({Y = y} | { X 1 = x1 , , X n = xn } ) .

Formula lui Bayes n versiune condiionat este utilizat pentru


a exprima o repartiie a posteriori condiionat

P (Y | E , e ) =

P (Y | E ) P ( e | E , Y )
P (e | E )

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.

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. SpringerVerlag, 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

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