Professional Documents
Culture Documents
Bibliografie
Barr, A., and Feigenbaum, E. A. (1981). The Handbook of Artificial Intelligence, Vol.
I, II, William Kaufmann, Los Altos, CA.
Benchimol, G., Levine, P., Pomerol, J. C. (1993). Sisteme expert în întreprindere,
Editura Tehnica, Bucuresti.
Boullart, L., Krijgsman, A., and Vingerhoeds, R. A. (1992). Application of Artificial
Intelligence in Process Control, Pergamon Press, Oxford.
Chang, K., and Lee, L. (1973). Symbolic Logic and Mechanical Theorem Proving,
Academic Press, New York.
Cârstoiu, D. I. (1994). Sisteme expert, Editura ALL, Bucuresti.
Cohen, P. R., and Feigenbaum, E. A. (1982). The Handbook of Artificial Intelligence,
Vol. III, William Kaufmann, Los Altos, CA.
CLIPS Reference Manual (1993). Vol. I – III, Software Technology Branch, Lyndon
B. Johnson Space Center.
Cristea, D. (1989). Inteligenta Artificiala – Note de curs, Univ. “Al. I. Cuza” Iasi.
Croitoru, C. (1985). Bazele informaticii – Note de curs, Univ. “Al. I. Cuza” Iasi.
David, J. M., Krivine, J. P., and Simmons, R (edit.) (1993). Second Generation Expert
Systems, Springer-Verlag, Berlin.
Diederich, J., Ruhmann, I., and May, M. (1987). “KRITON: A knowledge acquisition
tool for expert systems”, in International Journal of Man-Machine Studies, 26, pp. 29 – 40.
Dumitras,A. (1997). Proiectarea retelelor neuronale artificiale, Ed. Odeon, Bucuresti.
Findler, N. V. (edit.) (1979). Associative Networks: Representation and Use of
Knowledge by Computers, Academic Press, New York.
Florea, A. M., Boangiu, A. G. (1994). Bazele logice ale inteligentei artificiale,
Universitatea “Politehnica” Bucuresti, Bucuresti.
Forgy, C. (1985). “Rete: A Fast Algorithm for the Many Pattern/Many Object Pattern
Match Problem”, in Artificial Intelligence, 19, pp. 17 – 37.
Freuder, E., and Mackworth, A. (1994). Constraint-Based Reasoning, The MIT Press,
Cambridge.
Fu, K. S., Gonzalez, R. C., and Lee, C. S. G. (1987). Robotics: Control, Sensing,
Vision, and Intelligence, Mc Graw-Hill, New York.
Fukuda, T., and Shibata, T. (1992). “Theory and Applications of Neural Networks for
Industrial Control Systems”, in IEEE Trans. On Industrial Electronics, vol. 39, n. 6, pp. 472 –
489.
Georgescu, I. (1985). Elemente de inteligenta artificiala, Edit. Academiei, Bucuresti.
Giarratano, J., and Riley, G. (1989). Expert Systems: Principles and Programming,
PWS-KENT, Boston.
Giarratano, J. (1993). CLIPS User’s Guide, Software Technology Branch, NASA
Lyndon B. Johnson Space Center.
290 Bibliografie
Harmon, P., and Sawyer. B. (1990). Creating Expert Systems for Business and
Industry, John Wiley & Sons, New York.
Hutanu, C. (1983). Circuite logice si comenzi secventiale, Editura Junimea, Iasi.
Hutanu, C., Postolache, M., Panescu, D. (1998). Sisteme cu microprocesoare în
conducerea automata a proceselor, Volumul I, Editura Academica, Iasi.
Kirsh, D. (edit.) (1992). Foundations of Artificial Intelligence, The MIT Press,
Cambridge.
Lehmann, F. (edit.) (1992). Semantic Networks in Artificial Intelligence, Pergamon
Press, Oxford.
Linster, M. (1993). “Explicit and operational models as a basis for second generation
knowledge acquisition tools”, in [Dav 93], pp. 465 – 494.
Livovschi, L., Georgescu, H. (1986). Sinteza si analiza algoritmilor, Editura
Stiintifica si Enciclopedica, Bucuresti.
Lucas, P., and Van der Gaag, L. (1991). Principles of Expert Systems, Addison-
Wesley, Wokingham.
Malita, M., Malita, Mr. (1987). Bazele inteligentei artificiale, Edit. Tehnica,Bucuresti.
Metakides, G., Nerode, A. (1998). Principii de logica si programare logica, Editura
Tehnica, Bucuresti.
Newell, A. (1982). “The knowledge level” in Artificial Intelligence, 18, pp. 87 – 127.
Newell, A., and Simon, H. A. (1990). “GPS, A Program That Simulates Human
Thought” in Allen, J., Hendler, J., and Tate, A., Readings in Planning, Morgan Kaufmann,
San Mateo, pp. 59 – 66.
Nilsson, N., (1991). “Logic and artificial intelligence”, in Artificial Intelligence, 47,
pp. 31 – 56.
Nisenfeld, A. E., and Davis, J. (1989). Artificial Intelligence Handbook, Vol. I, II,
ISA, Research Triangle Park.
Patterson, D. (1990). Introduction to Artificial Intelligence and Expert Systems,
Prentice-Hall, Englewood Cliffs, N J.
Panescu, D. (1992). “On Planning Use In Robot Control”, în Buletinul Inst. Politehnic
Iasi, Tomul XXXVIII (XLII), Fasc. 1-4, Sectia IV, Aut. si Calculatoare, pg. 95 - 101.
Panescu, D., Hutanu, C. (1992a). “Intelligent Aids For PLC Programming”, Prep. of
IFAC Workshop on Aut. Control for Quality and Productivity, Istanbul, Vol. I, pp. 96–102.
Panescu, D. (1994). “Contributii la modelarea si conducerea robotilor industriali”,
Teza de doctorat, Universitatea Tehnica “Gh. Asachi” Iasi.
Panescu, D., Hutanu, C., Pricop, A. (1995). “Some Educational Aspects On Teaching
Artificial Intelligence To Automatic Control Students”, Buletinul Institutului Politehnic Iasi,
Tomul XLI (XLV), Fasc. 1-4, Sectia IV, Automatica si Calculatoare, pg. 31 – 36.
Panescu, D. (1995a). “A CIM Benchmark Problem For AI Based Control”, Prep. of
the IFAC/IMACS Workshop on AI in Real-Time Control, Bled, Slovenia, pp. 219 – 224.
Sisteme bazate pe cunostinte 291
Panescu, D., Resmerita, St. (1998). “On Using Fuzzy Expert Systems in the Cement
Production Control”, Proceedings of the 2-nd International Symposium on Intelligent
Manufacturing Systems – IMS’98, Sakarya, Turkey, pp. 863 – 872.
Popovic, D., and Bhatkar, V. (1994). Methods and Tools for Applied Artificial
Intelligence, Marcel Dekker, New York.
Rich, E., and Knight, K. (1991). Artficial Intelligence, Mc Graw-Hill, New York.
Robertson, D. (1989). An Introduction to Knowledge Representation and Expert
Systems, Department of Artificial Intelligence, University of Edinburgh, Edinburgh.
Rus, T. (1983). Mecanisme formale pentru specificarea limbajelor, Editura
Academiei, Bucuresti.
Russell, S., and Norvig, P. (1995). Artificial Intelligence: a Modern Approach,
Prentice Hall, New Jersey.
Sâmbotin, C. (1997). Sisteme Expert cu PROLOG, Editura Tehnica, Bucuresti.
Sofron E., Bizon N., Ionita S., Raducu R. (1998). Sisteme de control fuzzy. Modelare
si proiectare asistate de calculator, Editura ALL, Bucuresti.
Sowa, J. (edit.) (1991). Priciples of Semantic Networks, Morgan Kaufmann, San
Mateo, California.
Streinu, I. (1986). LISP limbajul de programare al inteligentei artificiale, Editura
Stiintifica si Enciclopedica, Bucuresti.
Serbanati, L. D., Giumale, C. (1985). Inteligenta artificiala, Editura Tehnica,
Bucuresti.
Toderan, G., Costeiu, M., Giurgiu, M. (1995). Retele neuronale artificiale, Editura
Albastra, Cluj-Napoca.
Touretzky, D. (1984). LISP A Gentle Introduction to Symbolic Computation, Harper &
Row, New York.
Tzafestas, S. (edit.) (1993). Expert Systems in Engineering Applications, Springer
Verlag, Berlin.
Tandareanu, N. (1994). Introducere în programarea logica. Limbajul PROLOG,
Editura Intarf, Craiova.
Vaessen, N., and De Feyter, A. (1992). “G2 – The development environment for real-
time expert systems”, in Preprints of the International Symposium on Artificial Intelligence in
Real-Time Control, Delft, the Netherlands, pp. 619 – 623.
Van de Velde, W. (1993). “Issues in Knowledge Level Modelling”, in [Dav 93], pp.
211 – 231.
Watson, M. (1999). Aplicatii JAVA inteligente pentru Interent si intraneturi, Editura
ALL Educational, Bucuresti.
Wielinga, B., Van de Velde, W., Schreiber, G., Akkermans, H. (1993). “Towards a
Unification of Knowledge Modelling Approaches”, in [Dav 93], pp. 300 – 335.
Winston, P. H. (1982). Inteligenta Artificiala, Editura Tehnica, Bucuresti.
1.1. Istoric
Momentul de început al inteligentei artificiale (IA) este considerat ca fiind anul 1956,
când la Dartmouth College a avut loc o conferinta ce-si propunea dezbaterea unor noi aspecte din
domeniul calculatoarelor; aici s-a pus problema crearii unor masini de calcul inteligente. La aceasta
conferinta John Mc Carthy a introdus conceptul de IA si astfel se considera ca acesta este
momentul în care aceasta s-a desprins din stiinta calculatoarelor, devenind un domeniu independent.
Conferinta respectiva poate fi privita ca început al IA si pentru ca Newell, Shaw si Simon au descris
primul program în care calculatorul era utilizat ca procesor simbolic, “Logical Theorist”; acesta poate
fi considerat primul program de IA [Bar 81]. Aceeasi cercetatori si-au pus si problema realizarii unui
limbaj capabil sa modeleze posibilitatile umane de procesare a informatiilor. Ei au creat limbajul IPL
(Information Processing Language). Limbajul care avea sa se impuna în acest domeniu a fost însa cel
dezvoltat de John Mc Carthy, si anume LISP (LISt Processing).
Toate notiunile enumerate mai sus sunt astazi elemente de baza ale IA. La sfârsitul anilor 70
si începutul anilor 80 apar aplicatiile industriale ale IA, în primul rând fiind vorba de SE. În ceea ce
priveste evolutia acestora, sunt de referinta urmatoarele momente:
Pentru a putea defini inteligenta artificiala trebuie sa definim mai întâi inteligenta.
Suntem în cazul unui termen complex si intrat în obisnuinta, pentru care încercarea unei definitii
precise poate fi si foarte dificila si lipsita de utilitate. Totusi este importanta macar trasarea unei
granite în jurul conceptului respectiv, necesara aici pentru precizarea unor elemente ale IA.
Inteligenta poate fi definita ca fiind aptitudinea de a sesiza anumite raporturi existente între
obiecte si fenomene. Aceasta sesizare poate fi senzoriala (la animale) si în acest caz ea se datoreaza
reflexelor conditionate, sau intelectuala (la om) si aici intervin limbajul si conceptele.
Cercetatorii din domeniul IA au cautat sa defineasca inteligenta dintr-o perspectiva care sa
permita apoi definirea IA. De exemplu, Findler arata “ca un sistem este considerat a avea
proprietatea de inteligenta, daca se poate adapta singur la noi situatii, are capacitatea de a rationa,
adica de a întelege legaturile dintre fapte, de a descoperi întelesuri si de a recunoaste adevarul. De
asemenea, un sistem inteligent poate sa învete, cu alte cuvinte sa-si îmbunatateasca nivelul
performantelor pe baza experientei” [Fin 79]. Astfel, Findler a cuprins în aceasta definitie
dezideratele pe care le urmareste IA.
Un alt cercetator al conceptului, P. Winston, apreciaza ca inteligenta apare a fi un amalgam
cu foarte multe proprietati de reprezentare si prelucrare a informatiei [Win 82]. În aceasta forma,
definitia pe de o parte ne arata dificultatea precizarii acestei notiuni, dar si apropierea de domeniul
calculatoarelor. Acestea, prin programele lor, reprezinta si prelucreaza informatia. De aici, se poate
spune ca IA este o disciplina care se ocupa de programarea calculatoarelor. Aceasta afirmatie tine
seama de faptul ca programele au proprietatea de a reprezenta situatiile cele mai diferite, prin
simboluri si operatii logice. Alte definitii ale IA se bazeaza pe conceptul de inteligenta, folosind
aceasta notiune ca atare. De exemplu, Barr defineste IA ca fiind un domeniu al stiintei calculatoarelor
care are ca obiectiv conceperea sistemelor de calcul inteligente, adica a acelor sisteme care sa
manifeste proprietati pe care în mod obisnuit le asociem inteligentei în comportamentul uman
(întelegere a limbajului, învatare, rezolvare de probleme) [Bar 81]. Deci IA poate fi înteleasa ca
modalitate de a simula comportamentul inteligent pe diferite sisteme tehnice.
poate spune ca inteligenta este o constructie ipotetica. Nu se poate construi o masura a acesteia, fara
a masura comportamentul subiectului pentru care vrem sa punem în evidenta inteligenta.
Putem schematiza comportarea
inteligenta a omului prin fig. 1.1, în care
lumea perceptie aceasta apare sub forma ciclica. Activitatea
lumea
interioara exterioara inteligenta este determinata de interactiunea
rationament
lumea pe care o are omul cu mediul exterior, în
interioara care apare un feedback, închis prin
actiune
intermediul sistemului senzorial. În lumea
interioara, rationamentul, ce determina
deciziile de actiune, se efectueaza pe baza
Fig. 1.1. Ciclul activitatii inteligente a omului datelor din exterior, obtinute prin perceptie,
dar si pe baza unui model “intern” al lumii.
Acesta este un model al lumii externe, pe care omul desfasoara fictiv actiuni, într-o lume interioara,
realizând un fel de simulare. Pe baza unei asemenea scheme s-a ajuns la o concluzie importanta
pentru IA, aceea a necesitatii introducerii în calculator a unui model al lumii, numit în IA model de
reprezentare a cunoasterii. De aici a derivat unul din cele mai importante subdomenii ale IA:
reprezentarea cunoasterii – reprezentarea realitatii care sa poata fi implantata într-un sistem de
calcul.
2) Comportarea inteligenta este relativa. Nu putem avea o masura absoluta, ci numai una
obtinuta prin raportare. De exemplu, testele de inteligenta dau un scor care raporteaza subiectul la o
comportare medie.
3) O manifestare inteligenta luata în mod izolat nu asigura o comportare inteligenta în general.
Daca un subiect are o comportare inteligenta într-o anumita situatie nu putem trage concluzia
inteligentei lui în general. Sub acest aspect IA apare înca departe de inteligenta naturala, deoarece ea
se manifesta în prezent în situatii particulare.
4) Pentru a putea masura inteligenta trebuie sa avem o masura a complexitatii sarcinii pe care
o rezolva subiectul. Daca am avea asa o masura (nu exista o singura metrica a complexitatii, universal
acceptata de toate domeniile de activitate), atunci am putea spune despre o comportare ca este cu
atât mai inteligenta, cu cât sarcina de rezolvat este mai complicata.
Daca luam în considerare aceste patru aspecte si le folosim ca niste criterii pentru a
defini inteligenta calculatoarelor, deci IA, obtinem :
3) Comportarea inteligenta a unui program trebuie sa se manifeste în situatii cât mai frecvente
si mai variate.
4) Pentru a putea aprecia inteligenta unui program trebuie sa masuram complexitatea sarcinii
de intrare.
Definitia 1.1. IA este o ramura a stiintei calculatoarelor ce studiaza realizarea unor tehnici de
programare performante, care sa permita rezolvarea unor sarcini complexe.
Intrari Problema
Baza Baza de
de Algoritm Euristica
cunostinte
date
Iesiri Solutie
baza de date cuprinde informatiile organizate într-o forma particulara, legata de algoritmul folosit si
pentru a-l servi pe acesta, în baze de cunostinte sunt memorate nu numai fapte, ci si relatii ce exista
între acestea, si reguli, adica modalitati de a prefigura ceea ce se va întâmpla în lumea exterioara, ca
urmare a unor actiuni.
A doua deosebire importanta este aceea ca într-un program de IA în locul algoritmului,
determinist de obicei în problemele abordate în programarea clasica, apare o metoda euristica
ghidând obtinerea solutiei. Euristica (heuristica) este o metoda ce se bazeaza pe reguli derivate din
experienta, introducând în multe situatii un grad de incertitudine. Spre deosebire de algoritm, frecvent
ea nu mai este garantata în privinta obtinerii solutiei. Chiar si asa, în IA se folosesc frecvent metode
euristice, deoarece acestea pot determina solutii în situatii în care un algoritm nu exista sau este
ineficient de implementat.
Sisteme bazate pe cunostinte 7
capitole mentionate mai sus sunt grupate în unul singur. Nuanta de diferenta între cele doua este
aceea ca, fata de rezolvarea problemelor, subdomeniul efectuarii rationamentelor se restrânge la
metodele mai specifice pentru domeniul IA si la aplicarea acestora în SBC.
7) Sistemele si limbajele de IA sunt cele care s-au dezvoltat o data cu perfectionarea
tehnicilor formale ale IA pentru a servi, mai bine decât limbajele conventionale, metodele de IA. De
altfel, una din contributiile majore pe care a avut-o pâna în prezent IA a fost sub forma unor noi
instrumente puse la dispozitia programarii. Notiuni precum: time-sharing, procesare a listelor,
interactivitate, proiectare orientata pe obiecte, folosite astazi în mod curent în programare, au fost
introduse mai întâi în sistemele de IA.
În IA au fost dezvoltate limbaje proprii de programare care sa faciliteze atât reprezentarea si
prelucrarea cunostintelor, cât si deductia. Prima si cea mai importanta idee în aceste noi limbaje a
fost aceea a utilizarii calculatoarelor pentru a manipula simboluri, acestea putând reprezenta orice, nu
numai numere. Aceasta idee si aceea a procesarii listelor, ce a derivat din ea, au fost prima data
introduse în limbajul IPL. În limbajele de IA, pentru a forma asocieri între simboluri, s-au introdus
listele, ce au permis manipularea convenabila a unor date cu forma si marime imprevizibile apriori. În
probleme de IA, de exemplu atunci când se analizeaza întelesul unei fraze, când se planifica actiunile
unui robot, sau se alege o mutare în jocul de sah, nu se poate sti dinainte marimea structurii de date
care va reprezenta întelesul frazei, planul de actiune a robotului sau planul jocului de sah. Structurile
de date fara restrictii de forma si dimensiune au fost unul din câstigurile importante ale IA. Astfel,
limbajele de IA au eliberat programatorul de sarcina unor detalii - calculul dimensiunilor, indicilor,
adreselor de memorie – chestiuni greu de urmarit în problemele de IA, lasându-l sa se preocupe de
problemele prelucrarii informatiilor.
Toate aceste elemente au fost preluate de limbajul LISP [Tou 84], [Str 86] care a adus si
alte facilitati si a fost mult timp folosit ca principal instrument de lucru al domeniului, constituind un
model pentru celelalte limbaje dezvoltate în IA. Un alt limbaj de programare ce s-a impus în IA a
fost PROLOG [Tan 94], [Sâm 97]. O clasificare a limbajelor de programare, facuta din perspectiva
SBC, este prezentata în paragraful urmator.
În unele clasificari sunt citate si alte subdomenii ale IA. De exemplu, SE pot fi luate în
considerare în acest sens. Totusi, desi SE au determinat si aparitia unor aspecte noi, specifice, ele
folosesc rezultatele celorlalte subdomenii ale IA pentru a rezolva o aplicatie concreta. De asemenea,
exista si alte câteva capitole (în unele abordari incluse ca parti în cele sapte din enumerarea
anterioara) care pot fi privite distinct: planificarea, achizitia cunostintelor, sistemele distribuite de IA,
algoritmii genetici; acestea sunt arii ce aprofundeaza unele din subdomeniile amintite mai sus si care
vor putea fi întelese pe baza acestora.
Sisteme bazate pe cunostinte 9
Daca temperatura este mai mica decât 100, atunci porneste cuptorul.
Metacunostintele se obtin prin rafinarea cunostintelor. Ele sunt cunostintele despre ceea ce
stim. Aici se includ cunostintele privitoare la limitele cunoasterii despre un subiect, cunostintele
despre felul în care ne putem îmbogati cunoasterea cu privire la rezolvarea unei probleme. De
exemplu, mai concret, prin intermediul metacunostintelor un SBC determina ordinea în care trebuie
rezolvate scopurile sau chiar îsi stabileste singur scopurile. Astfel, deasupra regulii de cunoastere de
mai sus (practic, aceasta poate însemna o regula cu o prioritate mai mare) poate exista o regula de
metacunoastere, de forma:
În mod implicit, aceasta regula ordoneaza scopurile de rezolvat de catre SBC, în sensul ca
mai întâi trebuie mentinuta siguranta sistemului condus si numai daca aceasta conditie este îndeplinita
se poate rezolva un scop de productie.
Sisteme bazate pe cunostinte 11
Imperative (Pascal, C)
Procedurale (Secventiale)
Functionale ( LISP)
Tehnici de
programare Orientate pe obiecte (C++, Smalltalk)
(limbaje) Declarative
Neprocedurale Logice (PROLOG)
procedurale, cât si declarative. În continuare se vor urmari si explica pe scurt caracteristicile din toate
aceste categorii.
asupra unui numar mare, de obicei infinit de intrari; finititudinea - algoritmul este finit în spatiu (ca
descriere) si timp (ca executie).
O caracteristica a limbajelor procedurale, determinata si de masinile pe care se executa, este
caracterul secvential. Important pentru comparatia cu celelalte variante de programare este aspectul
ca programatorul trebuie sa precizeze exact, pas cu pas, cum se rezolva o problema. În contrast, în
variantele strict neprocedurale, programatorul precizeaza care este scopul care trebuie atins, lasând
sistemul sa determine calea prin care se ajunge la acesta.
Programarea functionala este centrata pe notiunea de functie. Aici programul este vazut ca
o functie, care se obtine din compunerea mai multor functii simple, fie functii sistem, fie definite de
utilizator. De aici proiectarea unui program într-un limbaj functional este de obicei una de tip de jos în
sus (în engleza, ”bottom-up”), utilizatorul realizând mai întâi functiile elementare de care are nevoie si
apoi compunându-le pe acestea pentru rezolvarea problemei. Exemplu cel mai cunoscut de limbaj
functional este LISP. Acesta este important pentru IA si prin modul eficient în care poate manipula
simboluri, ceea ce a facut ca o serie de elemente de baza din LISP sa fie preluate în multe limbaje de
IA (de exemplu, folosirea listelor, reprezentarea prefixata a functiilor).
O alta trasatura pe care au dorit sa o realizeze limbajele functionale este asa numita
transparenta referentiala. Aceasta este o caracteristica a limbajului folosit în matematica si care nu
a fost respectata în limbajele imperative. Ea se refera la faptul ca întelesul unui întreg este complet
determinat de întelesul partilor, neputând apare efecte parazite datorita combinarii partilor sau unor
relatii de ordine dintre ele. De exemplu, întelesul expresiei x + 2x este evident acelasi cu întelesul
expresiei 3x, sau cu cel al expresiei 2x + x si oricum l-am înlocui pe x întelesul ramâne acelasi.
Daca însa luam expresia de atribuire din programarea imperativa y : = f(x) + x aici totul depinde
de felul în care se transfera valoarea parametrului x la apelul functiei f. Într-un limbaj imperativ
valoarea unui parametru poate fi afectata de executia functiei apelante, astfel încât rezultatul atribuirii
Sisteme bazate pe cunostinte 13
de mai sus depinde de functia f. Aceasta înseamna ca transparenta referentiala nu este respectata.
LISP în varianta sa initiala (pura) asigura transparenta referentiala, ca si un alt principiu al programarii
functionale, anume acela ca o functie sa nu aiba efecte laterale (în engleza “side effects”). Aceasta
presupune ca functia sa nu aiba decât un singur efect, acela de a calcula valoarea functiei. Pastrarea
stricta a acestei caracteristici devine stânjenitoare în programare; de exemplu, o functie de afisare pe
terminal este mai importanta pentru efectul lateral - afisarea propriu-zisa, decât pentru calculul unei
valori, care de fapt poate lipsi. În acest sens si LISP si alte limbaje de IA au eliminat aceasta
restrictie, permitând functiilor sa aiba efecte laterale. Oricum, s-a pastrat cerinta din programarea
functionala ca o functie (comanda) sa returneze un rezultat, ca efect principal, si daca este vorba de o
functie determinând si un efect lateral (de exemplu tiparire, deschidere de fisier), atunci rezultatul
returnat de functie poate fi sub forma unei valori de adevar – adevarat/fals – stabilita dupa felul în
care a decurs executia cu privire la efectul lateral.
Chiar programarea orientata pe obiecte este o varianta mixta, partial declarativa si partial
imperativa. Ea poate fi considerata ca o metodologie de programare (dupa cum exista programarea
structurata, programarea prin reguli), care a capatat astazi o mare raspândire, putând fi implementata
în limbajele clasice procedurale, sau în limbaje specializate, destinate acestei metode. Ideea de baza
este de a proiecta un program considerând mai întâi datele ce vor fi prelucrate si se clasifica acestea
în clase (obiecte), iar apoi se definesc pe aceste obiecte operatiile necesare pentru a putea rezolva
problema. Astfel, spre deosebire de programarea procedurala, abordarea în proiectare va fi aici una
de jos în sus: se pleaca de la date si elemente de detaliu, spre elementele generale de control si
prelucrare. O deosebire de principiu este si aceea cu privire la utilizarea procedurilor. Daca în
programarea imperativa procedurile opereaza asupra unor date, parametri, care sunt comunicati
acesteia prin apel, în programarea orientata pe obiecte nu se mai comunica procedurii datele asupra
carora trebuie sa opereze, ci obiectul (deci datele) primeste informatii asupra procedurilor – numite
aici metode – pe care sa le foloseasca. Aceasta se realizeaza printr-o comunicatie între obiecte
folosind mesaje, care indica metodele pe care un obiect trebuie sa le aplice.
Ceea ce se câstiga în programarea orientata pe obiecte este în primul rând flexibilitatea:
modificarea sau reutilizarea unor parti de programe se va face usor, prin simpla adaugare de noi
obiecte, sau numai de noi operatii pe obiectele existente. Dintre limbajele special destinate
14 Domeniul inteligentei artificiale si al sistemelor bazate pe cunostinte
programarii orientate pe obiecte exemplul cel mai citat este Smalltalk, dar si multe limbaje încadrate
în alte categorii au fost completate cu module pentru programarea orientata pe obiecte, pentru a
beneficia de facilitatile acesteia; asa este cazul în C, unde avem C++, sau Objective – C, sau în
CLIPS.
Programarea logica este un reprezentant clar, net, al metodelor declarative. Aici programul
consta dintr-o serie de declaratii, sub forma de enunturi considerate ca adevarate (fapte).
Programatorul poate furniza reguli si trebuie sa furnizeze un scop, adica un enunt care trebuie verificat
daca este adevarat. Algoritmul de control este implicit materializat în interpretorul sau compilatorul
limbajului, asa cum se întâmpla în PROLOG. Este vorba de o cautare înapoi plecând de la scop,
folosind regulile si faptele existente în sistem. Regulile se folosesc de la partea de consecinta spre cea
de conditie. Scopul va putea fi dovedit daca rezulta ca urmare a existentei unei declaratii (fapt) în
acest sens, sau daca nu, va putea fi dovedit daca exista o regula având partea de consecinta stabilind
(rezolvând) scopul respectiv si partea de conditie posibil de dovedit. De exemplu, daca în sistem
exista faptul ”IRB 1400 este robot” si regula ”Daca cineva este robot, atunci acela se misca”, atunci
sistemul va putea rezolva scopul: ”Se misca IRB 1400?”. O problema va implica de obicei o cautare
lunga, în care un scop este descompus în subscopuri, care trebuie rezolvate (dovedite). Prin aceea ca
se folosesc reguli si fapte, care sunt elementele de baza ale unui SE, exista o apropiere de acestea,
astfel ca programarea logica este frecvent utilizata în materializarea SE.
Programarea bazata pe cadre este mai putin raspândita si poate fi caracterizata ca o tehnica
hibrida, care combina elemente ale programarii orientate pe obiecte, într-o forma particulara – aceea
a reprezentarii de cadru, pentru organizarea informatiilor de intrare, cu elemente de control din
sistemele bazate pe reguli.
printr-un numar mare de legaturi. Programarea înseamna aici stabilirea legaturilor si a coeficientilor
asociati acestor legaturi. În functie de legaturile stabilite si de valorile coeficientilor rezulta
comportarea retelei în ansamblu.
Astfel, o retea neuronala se caracterizeaza prin:
Din aceste caracteristici decurg o serie de avantaje ale folosirii retelelor neuronale.
• Datorita posibilitatii de învatare retelele neuronale sunt potrivite acolo unde pot fi puse la
dispozitie exemple de instruire, dar este dificil sau imposibil de a determina un model pentru
problema ce se rezolva.
• Retelele neuronale au capacitatea de a generaliza si în acest sens ele se folosesc în probleme de
clasificare, de exemplu în recunoasterea formelor. Astfel, dupa procesul de învatare, reteaua
neuronala poate face o împartire a datelor de intrare în categorii, conform exemplelor învatate. În
faza de lucru, daca datele de intrare prezinta variatii fata de categoriile învatate, reteaua
neuronala va face de la sine clasificarea noilor date în clasa cea mai apropiata. Este de mentionat
ca retelele neuronale generalizeaza automat, ca urmare a structurii lor, nu cu ajutorul inteligentei
umane înglobate într-un program creat în mod special în acest scop.
• Retelele neuronale asigura rapiditate în executie datorita procesarii paralele.
• Retelele neuronale determina siguranta în functionare, prin doua modalitati de rejectare a
defectelor si erorilor:
a) sunt capabile sa lucreze corect chiar atunci când datele de intrare sunt afectate într-o
anumita masura de erori, datorita capacitatii de generalizare, explicata mai sus.
b) datorita procesarii distribuite are loc o degradare treptata si nu brusca a functionarii la
defectarea neuronilor, astfel ca reteaua poate continua sa lucreze bine atunci când un numar
mic de neuroni functioneaza incorect.
• Retelele neuronale pot aproxima bine functii neliniare, aspect important pentru folosirea lor în
control.
16 Domeniul inteligentei artificiale si al sistemelor bazate pe cunostinte
1) Retele feedforward (cu reactie înainte) - sunt cele cu organizare ierarhica, pe mai multe
nivele, în care conexiunile sunt numai de la
neuronii unui nivel la neuronii nivelului urmator.
În acest fel transmisia semnalului se face de la
intrare spre iesire, într-un singur sens. De
exemplu, în fig. 1.6 este prezentata o retea
neuronala de tip feedforward, cu trei straturi.
strat strat strat Stratul de intrare, în cazul nostru cu 2 neuroni,
intrare ascuns iesire
are doar rolul de a transmite semnalele de
Fig. 1.6. O retea neuronala de tip feedforward
intrare spre nivelul urmator, în timp ce neuronii
din stratul intermediar, numit si strat ascuns, si din stratul de iesire au o structura si functionalitate
identica aceleia a neuronului din fig. 1.5. În general, o retea de acest tip poate avea mai multe straturi
ascunse si mai multi neuroni de iesire.
Pentru ca o retea neuronala feedforward sa poata fi folosita ea trebuie sa parcurga mai întâi
faza de învatare, ceea ce însemna fixarea valorilor ponderilor de pe legaturi. Exista doua variante de
învatare: supervizata si nesupervizata. În primul caz, pentru fiecare set de intrari (vector de intrare)
este cunoscut setul dorit al iesirilor, acestia formând împreuna o pereche de antrenament. În timpul
învatarii se compara valorile obtinute ale iesirilor cu acelea dorite si erorile sunt folosite pentru
ajustarea ponderilor legaturilor. Algoritmul de învatare frecvent utilizat se numeste de propagare
înapoi (în engleza ”backpropagation”), fiind vorba de o metoda iterativa, care calculeaza ponderile
pentru minimizarea erorii, printr-o metoda de tip gradient. Calculul se face de la stratul de iesire spre
cele din fata sa; de aici denumirea algoritmului. Adaugând stratul ascuns reteaua neuronala devine
Sisteme bazate pe cunostinte 17
capabila sa rezolve si probleme care nu sunt liniar separabile (o retea fara strat ascuns poate fi
utilizata numai în cazul liniarei separabilitati [Tod 95]). În schimb, straturile ascunse pot crea
probleme pentru convergenta algoritmului de învatare.
În cazul învatarii nesupervizate nu mai exista prestabilit un anume set al iesirilor dorite, ci în
timpul învatarii are loc un proces de clasificare, în sensul gruparii valorilor vectorilor de intrare în
clase. Aceasta înseamna ca reteaua functioneaza bine în functie de felul în care un nou vector de
intrare, apropiat de un anumit vector folosit în timpul învatarii, este bine clasificat, adica determina un
raspuns identic cu acela al vectorului de antrenament de care este apropiat.
2) Retele recurente (cu reactie inversa) – sunt cele în care nu mai exista o organizare pe straturi, ci
apar si legaturi de reactie între neuroni, astfel ca transmisia semnalului se face în ambele sensuri. Unul
din exemplele cele mai cunoscute de retea recurenta este reteaua de tip Hopfield. O asemenea retea
-1 -1
+1 -1 +3 +1 -1 +3
-1 -1
+2 +1 -2 +3 +2 +1 -2 +3
+1 -1 +1 -1
Fig. 1.7a. O retea de tip Hopfield – starea initiala Fig. 1.7b. Starea finala a retelei Hopfield
este cea din fig. 1.7a. Neuronii, reprezentati ca si în fig. 1.6 sub forma de cercuri, pot fi aici în una din
doua stari: activa (reprezentata prin hasurare) si inactiva. Un coeficient de ponderare pozitiv pe o
legatura ne arata tendinta celor doi neuroni interconectati de a se activa unul pe celalalt, iar unul
negativ, tendinta de a se dezactiva unul pe celalalt. În acest fel, plecând dintr-o stare initiala reteaua
va evolua. Fiecare unitate de procesare (neuron) calculeaza suma coeficientilor transmisi prin legaturi
de la vecinii sai activi si devine activa daca aceasta suma este strict pozitiva. Procesul continua pâna
la atingerea unei stari stabile a retelei, adica aceea în care starea tuturor neuronilor ramâne aceeasi
(nu se mai schimba). De exemplu, pentru starea initiala a retelei din fig. 1.7a evolutia se va produce
pâna în starea stabila data în fig. 1.7b. Se poate demonstra ca oricare ar fi starea initiala si valorile
ponderilor alese pe legaturi se va ajunge la o stare stabila (de exemplu, reteaua din fig. 1.7 are 4
stari stabile) [Ric 91].
O asemenea retea neuronala capata o proprietate apropiata de aceea a memoriei umane:
poate fi privita ca o memorie adresabila prin continut. Cele 4 stari stabile ale retelei din fig. 1.7
corespund la 4 tipare (4 elemente de cunoastere) memorate în retea. De îndata ce acesteia i se
18 Domeniul inteligentei artificiale si al sistemelor bazate pe cunostinte
furnizeaza o intrare, sub forma unei stari initiale, în functie de apropierea acestei intrari de una din cele
4 stari stabile, se va putea recunoaste un continut din cele 4 memorate. Rezulta astfel cum
cunoasterea initiala poate fi una imprecisa: din diferite stari initiale reteaua poate evolua în aceeasi
stare stabila, daca este construita corespunzator.
Domeniile în care retelele neuronale si-au gasit aplicare sunt: recunoasterea vorbirii,
recunoasterea imaginilor, sau materializarea unor metode de rezolvare care sunt greu de formulat sub
forma de algoritmi sau reguli, dar pot fi exemplificate cu cazuri semnificative care sa fie folosite pentru
învatare. În automatica, retelele neuronale sunt utile în aplicatii de supervizare, conducere a robotilor
industriali, control adaptiv, comanda sistemelor neliniare, utilizându-se caracteristicile acestora de a
modela functii neliniare, de a permite obtinerea unei anumite comportari fara necesitatea existentei
unui model, de a se adapta la noi situatii printr-o faza de învatare.
Initializare
Initializare
11 21
Preluare date
de la proces
Module
Prelucrare date procesare Proces
Proces
achizitionate evenimete
11 11
Elaborare
comenzi
Terminare
Terminare program
program
Fig. 1.8. Comparatie între programarea bazata pe bucle si cea bazata pe evenimente
Este usor de observat partile slabe ale acestei variante, plecând de la faptul ca bucla
respectiva se executa în mod repetat (este ca si un ciclu cvasi infinit), independent de existenta sau
inexistenta unor modificari în proces. Programul se cicleaza, încercând surprinderea momentului în
care se produce o schimbare a datelor procesului urmarit, pentru a o lua pe aceasta în considerare si
a stabili deciziile adecvate. Aceasta situatie determina o folosire ineficienta a resurselor hardware:
unitatea de procesare este blocata în ciclarea programului, putând fi în situatia în care executa în mod
repetat, de un numar mare de ori, parti de cod inutile, deoarece în proces nu s-a produs o schimbare
a datelor fata de trecerea anterioara. Programul este ca si un mecanism care o mare parte a timpului
“merge în gol”, prinzând doar din când în când evenimente din proces.
Definitia 1.3. Baza de cunostinte (în engleza ”knowledge base”) este o componenta a
unui SE (sau mai general a unui SBC) care contine cunostinte ale domeniului de expertiza, actualizate
prin faptele introduse de utilizator. Motorul de inferente (în engleza ”inference engine”) este o
componenta a unui SE/SBC care contine elementele de control al rularii programului.
Cunostintele din domeniul de expertiza apar în baza de cunostinte sub forma de:
Elementele de control al rularii, în cazul unui SE, se constituie într-o unitate separata
– motorul de inferente si vor determina momentul când elementele din baza de cunostinte sunt
relevante pentru problema ce se rezolva si trebuie testate sau activate. În plus, motorul de inferente
contine un algoritm de control generic, care este acelasi indiferent de continutul bazei de cunostinte,
adica acelasi indiferent de problema care se rezolva. În programele conventionale elementele de
cunoastere din domeniul problemei si cele de control sunt strâns întrepatrunse în program, neexistând
o separare vizibila. În acest caz începerea si terminarea programului, ca si secventa de operatii de
efectuat sunt definite în mod explicit de catre programator. În cazul SE, programatorul nu trebuie sau
nu poate sa mai anticipeze rularea atât de precis. Cunostintele domeniului sunt înmagazinate în reguli,
cele specifice problemei sunt memorate ca fapte, iar motorul de inferente determina aplicarea
cunostintelor domeniului pe datele problemei, fara interventia utilizatorului.
Aceasta separare a cunostintelor într-un SE atrage dupa sine si alte deosebiri fata de
programarea conventionala.
24 Domeniul inteligentei artificiale si al sistemelor bazate pe cunostinte
• În cazul unui SE stocarea cunostintelor domeniului de lucru se face într-o forma usor accesibila
modificarilor, dezvoltarilor, actualizarilor. În programarea clasica, modificarile pot fi facute de
obicei numai de cel care cunoaste întreg algoritmul de rezolvare.
• Un program conventional se limiteaza la a scoate la iesire rezultatele problemei. Un SE, în afara
de solutie, poate explica rationamentele facute pentru a ajunge la aceasta, în sensul ca poate
pune în evidenta pentru utilizator pasii pe care i-a parcurs pâna când a ajuns la solutie.
• Atât ca rezultat al separarii cunostintelor, cât si prin folosirea unor tehnici adecvate ale IA de
reprezentare a cunoasterii, este posibila construirea bazei de cunostinte într-o forma declarativa
(afirmatii asupra a ceea ce este adevarat la un moment dat). Din aceasta forma declarativa,
trecerea în forma procedurala necesara calculatorului se face în mod automat, de catre
interpretorul/compilatorul limbajului de programare (bazata pe reguli) folosit. Aceasta este o
facilitate atât pentru programatori cât si pentru utilizatori, deoarece baza de cunostinte se poate
construi într-o forma apropiata de limbajul natural.
Înainte de a decide privind construirea unui SE trebuie sa ne dam seama daca aplicatia avuta
în vedere este potrivita pentru o asemenea rezolvare. Elementul esential trebuie sa fie absenta
expertizei la locul si momentul dorit; de asemenea, poate fi vorba despre folosirea unui expert în mod
ineficient, sau despre dificultatile pe care le are expertul uman. Situatii de acest fel pot fi:
• folosirea unor persoane lipsite de experienta sau de cunostinte aprofundate pentru rezolvarea
unor sarcini care implica asa ceva;
• existenta unor sarcini complexe, care trebuie rezolvate rapid, dar care apar rar, astfel ca expertul
efectueaza în cea mai mare parte a timpului activitati de rutina;
• expertul uman face greu fata datorita intervalului lung de timp în care trebuie sa fie activ, sau
datorita faptului ca trebuie sa dea raspunsuri rapide urmarind un volum mare de informatii, sau sa
lucreze în medii periculoase.
O decizie ce trebuie luata este si aceea privind optiunea de a folosi în rezolvarea unei
probleme un SE sau un program conventional. În acest sens trebuie avuti în vedere o serie de factori,
care pot fi considerati raspunzând la urmatoarele întrebari.
4) Poate expertul sa explice cunoasterea, în asa fel încât aceasta sa poata fi înteleasa si
transpusa în SE de catre programator?
De obicei apar probleme în acest sens, deoarece cel care se ocupa de programare nu
cunoaste termenii din domeniul de expertiza si apar dificultati de comunicare si întelegere cu expertul.
Sunt de preferat situatiile în care expertul si-a sistematizat cunoasterea (de exemplu, are un tabel cu
situatiile si deciziile pe care le adopta) si o poate explica. De asemenea, felul în care expertul însusi
are acces la cunoastere poate fi un factor de luat în considerare. Cazul cel mai favorabil este acela
Sisteme bazate pe cunostinte 27
când el poate oricând preciza felul în care actioneaza, iar cel mai nefavorabil este acela în care
expertul poate da explicatii numai daca este pus în contextul respectiv.
Aspectul discutat la acest punct, ca si cele de la punctele 2) si 3), sunt în legatura cu asa
numita faza de achizitie de cunostinte, cea care precede implementarea unui SE, si care este
deosebit de importanta pentru succesul acestuia: felul în care sunt preluate cunostintele de la expert si
înglobate în baza de cunostinte influenteaza în mod decisiv performantele SE.
Se pot enumera si câteva criterii specifice pentru domeniul automaticii. Astfel, SE pot fi
preferate acolo unde modelul procesului este dificil de gasit - nu se poate scrie o functie de transfer
sau sistemul logic ce descrie procesul este foarte complex. De asemenea, SE pot da rezultate bune
acolo unde modelul procesului se schimba foarte frecvent, chiar daca acest model nu este complex,
sau daca suntem în cazul în care conducerea procesului se bazeaza pe interventii frecvente ale
operatorului.
28 Domeniul inteligentei artificiale si al sistemelor bazate pe cunostinte
1.8. Elementele tipice ale unui sistem expert si ale unui sistem bazat
pe cunostinte
Arhitectura si elementele tipice ale unui SE sunt prezentate în fig. 1.10. Desi termenul de SE
este uneori folosit în mod echivalent cu acela de SBC, totusi, dupa cum am mai precizat, ultimul are o
arie de cuprindere mai larga. Astfel, la un SBC pot apare variatii în ceea ce priveste organizarea
bazei de cunostinte, în sensul ca la unele sisteme - de exemplu, cele de tip inductiv, sau cele care
folosesc programarea orientata pe obiecte, aceasta nu mai contine fapte si reguli, si în asemenea
cazuri si mecanismul de control va fi diferit de acela al unui motor de inferente (de aceea în fig. 1.10
apare si denumirea sistem de control, în sensul controlului rularii programului). În plus, un SBC
poate contine si alte subsisteme. Daca SE folosesc asa numita abordare simbolica a IA, ele
bazându-se pe o prelucrare simbolica a informatiilor, exista si abordarea conexionista, aceea data
de retelele neuronale, sau cea evolutionista, data de algoritmii genetici, iar în unele SBC, si anume
cele de tip hibrid, pot apare subsisteme organizate dupa mai multe asemenea abordari. Acestea pot
crea interfete adecvate spre anumite tipuri de procese (de exemplu, este cunoscuta folosirea retelelor
neuronale în sistemele de IA de prelucrare a imaginilor, sau a algoritmilor genetici în anumite clase de
probleme de optimizare). Ceea ce apare în fig. 1.10 este însa varianta cea mai raspândita în cazul
SE/SBC si în continuare ne vom limita la aceasta structura.
Baza de cunostinte este formata din doua parti: baza de reguli care contine
cunostinte generale din domeniul de expertiza si baza de fapte formata în special din cunostintele
Am notat tiparele regulii între semnele < >, ca si actiunile din partea dreapta a acesteia.
Regula este numai una principiala, forma exacta a acesteia depinzând de mediul software în care se
lucreaza.
Motorul de inferente este cel care are rolul de a determina toate regulile ce sunt activate,
facând astfel corelatia între baza de fapte si baza de reguli, si apoi tot el selecteaza una singura dintre
regulile activate la un moment dat, pe care o pune în executie. Executia unei reguli înseamna punerea
în aplicare a partii drepte a acesteia, ceea ce poate avea unul sau mai multe efecte de genul
modificarii bazei de fapte, transmiterii unor mesaje operatorului, sau transmiterii unor semnale spre
exterior, în functie de actiunile ce sunt prevazute în partea de concluzie a regulii.
30 Domeniul inteligentei artificiale si al sistemelor bazate pe cunostinte
La începutul operarii baza de fapte trebuie sa contina situatia initial valabila pentru problema
în lucru si care este încarcata de utilizator prin intermediul unei interfete adecvate. Aceasta interfata
(fig. 1.10), ce asigura calea de comunicare între utilizator si SE, poate fi folosita si în timpul lucrului
SE. Astfel, dupa ce s-a încarcat memoria de lucru, utilizatorul începe consultatia cu SE. Motorul de
inferente initiaza o cautare în baza de cunostinte încercând sa rezolve problema propusa prin
potrivirea partilor stângi ale regulilor cu faptele din memoria de lucru si executia regulilor activate. Se
poate ca SE sa adreseze întrebari utilizatorului în timpul lucrului, atunci când ajunge în impas (nu a
rezolvat problema propusa si nu mai poate activa nici o regula), folosindu-se în acest dialog de
aceeasi interfata. Se ilustreaza si în acest fel deosebirea de principiu fata de programarea
conventionala: calea pe care motorul de inferente o va urma pentru a ajunge la solutie nu este
determinata dinainte. Ea depinde de problema data de utilizator (starea initiala a bazei de fapte) si de
raspunsurile pe care le primeste SE în timpul lucrului. Mai este de mentionat ca explicatia de mai sus
se refera la SE folosind cautarea înainte (principiul cautarii înapoi a fost precizat în 1.4.2).
Interfata utilizatorului mai este în legatura cu alte doua componente: subsistemul de generare
a explicatiilor si subsistemul de achizitie a cunostintelor. Daca motorul de inferente, baza de
cunostinte si interfata utilizatorului sunt întotdeauna prezente într-un SE, celelalte doua subsisteme
sunt optionale într-un SE, fiind adesea prezente într-un SBC.
Daca este necesara o achizitie a cunostintelor chiar în timpul rularii SE, sau este necesara o
adaptare a functionarii SE în conformitate cu informatiile culese de la mediu, cum poate fi cazul
pentru unele sisteme de control bazate pe cunostinte, atunci si baza de reguli poate deveni dinamica,
subsistemul de achizitie a cunostintelor si interfata utilizatorului (sau cea spre proces, nereprezentata
în fig. 1. 10) trebuind sa asigure modificarea acesteia. Într-un asemenea caz SE poate sa-si
îmbunatateasca comportarea în timp, prin modificarea adecvata, on-line, a bazei de reguli, capatând
capacitate de învatare. Daca primele medii destinate programarii bazate pe reguli nu permiteau un
caracter dinamic pentru baza de reguli, cele actuale au asemenea facilitati, ramânând în sarcina
constructorului SBC realizarea unei interfete adecvate pentru achizitia de cunostinte.
32 Domeniul inteligentei artificiale si al sistemelor bazate pe cunostinte
Sistemele bazate pe cunostinte folosesc elemente din mai multe subdomenii ale IA. În ceea
ce priveste baza de cunostinte, capitolul de reprezentare a cunoasterii este important din doua puncte
de vedere: se folosesc anumite modalitati particulare de reprezentare a cunoasterii în realizarea bazei
de fapte si a bazei de reguli, si respectiv aceste modalitati influenteaza caracteristicile sistemului:
eficienta, viteza, posibilitatile de dezvoltare. În ceea ce priveste motorul de inferente, cu privire la
întelegerea realizarii si utilizarea eficienta a acestuia, este important capitolul de efectuare a
rationamentelor. În plus, suportul matematic, necesar în general pentru întelegerea SBC, este oferit
de o parte din capitolele de logica matematica.
Se remarca într-un SE separarea între cunostintele domeniului de lucru – baza de cunostinte
– si elementele de control al rularii programului - motorul de inferente. Acest aspect poate fi mai bine
perceput în momentul rezolvarii unei aceleiasi probleme în cele doua variante: programare bazata pe
reguli, respectiv programare conventionala (imperativa).
Nu trebuie înteles ca programarea bazata pe reguli, frecvent folosita în realizarea SE, este un
instrument universal. În functie de elementele specifice ale aplicatiei, programatorul poate decide care
metoda de programare este mai eficienta, putând intra în discutie tehnici conventionale (programare
imperativa, functionala) sau cele din aria IA (sisteme bazate pe reguli, retele neuronale, etc.), iar
pentru sistemele complexe sunt actuale rezolvarile hibride.
Întrebari si probleme
1. Care este momentul considerat a fi de început pentru stiinta inteligentei artificiale si care au
fost premisele aparitiei ei?
2. De ce este dificil de definit inteligenta?
3. Cum poate fi pusa în evidenta inteligenta? Dar IA?
4. Propuneti o definitie a IA.
5. Ce lipseste calculatoarelor actuale pentru a trece testul Turing?
6. Care sunt domeniile IA?
7. Dati exemple de reguli de cunoastere si de reguli de metacunoastere.
8. Dati exemple de cunoastere procedurala, declarativa si tacita.
9. Precizati avantaje si dezavantaje pentru tehnicile de programare procedurale, declarative si
nondeclarative. Gasiti exemple în care fiecare din aceste variante s-ar aplica în mod eficient.
10. Care sunt caracteristicile retelelor neuronale si ce avantaje decurg din acestea? Gasiti
exemple în care retelele neuronale s-ar putea aplica în automatica.
Sisteme bazate pe cunostinte 33
11. Pentru reteaua neuronala de tip Hopfield din fig. 1.7a aflati celelalte 3 stari stabile (o stare
stabila este aceea din fig. 1.7b).
12. Care sunt avantajele folosirii SE? Dati exemple de aplicatii în care aceste avantaje se pot
materializa.
13. Care sunt deosebirile între un SE si un program conventional?
14. Dati un exemplu de problema de tip nestructurat.
15. Care sunt componentele unui SE/SBC si ce rol îndeplinesc ele?
16. Ce sunt tiparele într-un SE?
17. Ce ar însemna o regula care sa aiba mai multe actiuni, între care operatia logica sa fie
SAU?
18. Ce înseamna cautare înainte si cautare înapoi într-un SE?
2.1. Terminologia logicii matematice
Definitia 2.1. Enuntul este o formatiune lingvistica elementara, cu sens (de tip)
narativ, declarativ si cu înteles de sine statator - se afirma ceva despre ceva.
Enuntul poate fi scris sau vorbit si este o formatiune capabila sa poarte informatie. Din
punct de vedere logic enuntul se compune din doua parti: subiectul (sau subiectele) si partea
predicativa.
Definitia 2.2. Subiectul este acel ceva despre care se afirma ceva într-un enunt. Restul,
ceea ce ramâne dupa îndepartarea subiectului sau a subiectelor, este partea predicativa.
Exemplul 2.1. Microprocesorul 8080 este depasit. Microprocesorul 80686 este mai
performant decât microprocesorul 8086.
Prima afirmatie este un enunt, având ca subiect “microprocesorul 8080”, iar ca parte
predicativa “este depasit”. A doua afirmatie este de asemenea un enunt, care are doua
subiecte: “microprocesorul 80686” si “microprocesorul 8086” si partea predicativa: “este mai
performant decât” (de observat diferenta dintre subiectul si predicatul din gramatica si
subiectul, respectiv partea predicativa din logica).
Exemplul 2.2.
Ce înseamna SBC ?
Deschide geamul !
Acestea nu sunt enunturi, deoarece nu au caracter declarativ.
Sisteme bazate pe cunostinte 35
Un enunt are unul sau mai multe subiecte si o singura parte predicativa. Subiectul
poate sa fie precizat (în IA se foloseste termenul instantiat) sau nu. În cele doua exemple de
enunturi de mai sus toate subiectele au fost instantiate.
Exemplul 2.4. Orasul x si orasul y sunt conectate prin n drumuri. Numarul x este
mai mare decât 3.
Primul enunt este un predicat de aritate 3, variabilele fiind: “orasul x”, “orasul y”, “n
drumuri”, iar partea predicativa este: “sunt conectate prin”. Al doilea enunt este un predicat de
aritate 1, variabila fiind: “numarul x”. În acest enunt mai apare subiectul instantiat “3”, iar
partea predicativa este: “este mai mare decât”.
Atunci când într-un predicat apare variabila x, întelesul este precizat daca stim
domeniul (multimea, iar în IA termenul folosit este univers de discurs – vezi si 1.3) în care
variabila x poate lua valori, adica în IA vom spune ca se instantiaza. În acest fel si definitiile
enunturilor în care apar cuantificatorii, date mai sus, au suport; cuantificatorul ∀ ne permite sa
precizam informatii despre toate elementele universului de discurs fara a fi necesar sa le
enumeram, iar ∃ ne permite sa precizam existenta unui ele ment din universul de discurs,
element având anumite proprietati, fara a fi necesar sa- l identificam în mod direct.
În aceasta prezentare a unor principali termeni folositi în logic a s-au evidentiat cele
doua situatii posibile pentru enunturi: propozitiile, respectiv predicatele, care sunt obiectul de
studiu al unor capitole distincte.
38 Bazele logice ale inteligentei artificiale
Calculul propozitional este acea parte a logicii care se ocupa cu analiza propozitiilor
din punct de vedere al compunerii lor corecte cu ajutorul operatiilor logice si al studiului
valorilor de adevar pentru enunturile compuse în acest fel. Se poate vorbi despre un limbaj al
calculului propozitional, care este un limbaj formal, oferind o prima posibilitate de a
formaliza limbajul natural (completarea facându-se prin limbajul calculului cu predicate).
Orice limbaj presupune existenta unui alfabet, care precizeaza simbolurile folosite, a unei
sintaxe stabilind cum pot fi combinate în limbajul respectiv simbolurile admise si a unei
semantici, stabilind semnificatia combinatiilor admise de sintaxa.
Definitia 2.7. Numim cuvânt peste un alfabet S o succesiune finita de elemente din S.
Multimea tuturor cuvintelor peste alfabetul S se noteaza cu S* . Ne vor interesa cuvintele peste
alfabetul calculului propozitional, multimea acestora notându-se cu S *p . Elementele multimii
S *p le vom nota cu A, B, . . .
Se poate observa ca definitia de mai sus este una de tip recursiv, deoarece entitatea
definita este descrisa chiar pe baza entitatii de acelasi tip (în cazurile 2 si 3). Totodata, ea
poate fi privita si ca fiind de tip inductiv, în care 1 asigura pasul initial, iar 2 si 3 asigura pasul
inductiv. Recitind-o, rezulta ca este formula în calculul propozitional o variabila
propozitionala, negatia unei formule scrisa între paranteze, sau compunerea a doua formule
Sisteme bazate pe cunostinte 39
prin una din operatiile logice binare (conjunctie, disjunctie, implicatie sau echivalenta),
compunere cuprinsa între paranteze.
Regula 1) de mai sus fixeaza prioritatea operatiilor în calculul propozitional – cea mai
prioritara este negatia, urmata de conjunctie, disjunctie, implicatie si echivalenta, iar regulile
2) si 3) arata ca reconstituirea se face de la stânga la dreapta. Practic, se cauta de la stânga la
dreapta cea mai prioritara operatie logica în jurul careia se poate reconstitui o formula, se
reconstituie, s.a.m.d.
A = (p ⇒ q ∨ r ⇔ p) ∨ (7q ⇒ r) ∧ 7p ∧ r
Vom urmari pas cu pas procesul de reconstituire. Simbolul cel mai prioritar este
negatia si reconstituim parantezele pentru cea mai din stânga aparitie a sa; obtinem:
(p ⇒ q ∨ r ⇔ p) ∨ ((7q) ⇒ r) ∧ 7p ∧ r
40 Bazele logice ale inteligentei artificiale
(p ⇒ q ∨ r ⇔ p) ∨ ((7q) ⇒ r) ∧ (7p) ∧ r
Urmeaza reconstituirea parantezelor pentru cele doua aparitii ale conjunctiei; dupa aceste
doua reconstituiri obtinem:
(p ⇒ q ∨ r ⇔ p) ∨ ((((7q) ⇒ r) ∧ (7p)) ∧ r)
Din cele doua implicatii, pentru prima trebuie reconstituite parantezele, în timp ce pentru a
doua implicatie, ca si pentru singura echivalenta, parantezele exista chiar în cuvântul initial si
deci nu mai trebuie reconstituite; obtinem forma finala A1 a formulei corespunzatoare
cuvântului dat:
Definitia 2.9. Daca A ∈ Fp atunci multimea partilor lui A, notata π(A), se defineste
inductiv prin:
1) daca A ∈ V atunci π(A) = {A};
b) daca A = 7B, unde B ∈ Fp , atunci π(A) = π(B) ∪ {A};
c) daca A = B # C, unde B, C ∈ Fp si # ∈ L \ {7}, atunci π(A) = π(B) ∪ π(C) ∪ {A}.
Observatia 2.1. Rezulta din definitia de mai sus ca multimea π(A) are cardinalul egal
cu 1 daca si numai daca A ∈ V (A este o variabila propozitionala). În acest caz A se numeste
formula atomica sau atom. Daca A ∈ Fp si A nu este atom, atunci formula va fi de forma A
= 7B sau A = B # C, cu # ∈ L \ {7}, caz în care formula A se numeste formula compusa, iar 7
sau # se numeste operatie dominanta a formulei. Elementele lui π(A) se numesc subformule
ale lui A.
Aceasta schema inductiva este o aplicare a inductiei complete pentru cazul multimii
Fp , inductia facându-se dupa lungimea formulei (numarul de operatii logice continute de
aceasta).
Toate elementele prezentate pâna aici reprezinta sintaxa calculului propozitional;
semantica (întelesul) limbajului calculului propozitional poate fi precizata folosind notiunea
de evaluare.
42 Bazele logice ale inteligentei artificiale
Din definitia evaluarii se poate remarca semnificatia operatiei logice de implicatie, cea
care are o importanta deosebita si pentru functionarea SE. Se constata ca, daca subformula A
din fata implicatiei este evaluata la fals, atunci rezultatul evaluarii implicatiei este adevarat,
indiferent de evaluarea subformulei B de dupa implicatie. În logica se spune în acest sens ca:
“falsul implica orice”. Tinând seama de caracterul recursiv al definitiei formulei în calculul
propozitional, se constata ca pentru determinarea lui Av pentru o formula data este suficient sa
cunoastem valorile lui v pentru toate variabilele propozitionale ce apar în A.
Teorema 2.2. O formula este tautologie daca si numai daca negatia ei este contradictie.
Teorema 2.3. O formula este realizabila daca si numai daca negatia ei nu este
tautologie.
Demonstratiile sunt imediate pe baza definitiei evaluarii. Teorema 2.2 ne arata o
posibilitate de a demonstra ca o formula este tautologie: se arata ca negatia ei este
contradictie. Aceasta este calea urmata de demonstrarea automata a teoremelor.
Rezulta astfel ca vom avea de testat cel mult 2n cazuri pentru a decide daca A este
tautologie.
Pentru calculul propozitional exista mai multi algoritmi ce pot fi aplicati pentru a
decide asupra caracterului de tautologie al unei formule [Mal 87], [Met 98], [Cro 85]; unul
dintre acestia este prezentat în continuare.
Asociem pentru fiecare variabila propozitionala p o variabila numerica p cu valori în
multimea {0, 1}. Pentru orice formula A, ale carei variabile propozitionale sunt p1 , . . . , pn ,
asociem un polinom A depinzând de variabilele numerice p1 , . . . , p n . Aceasta asociere o
facem pe baza urmatoarelor reguli de calcul:
44 Bazele logice ale inteligentei artificiale
Se remarca faptul ca prin regulile de mai sus orice polinom A va lua valori în
multimea {0, 1}.
Demonstratie.
Folosim schema inductiei matematice pentru formulele din calculul propozitional.
Proprietatea µ este în cazul acesta: “A v = adevarat daca si numai daca A = 1”. Din ipoteza
teoremei rezulta ca are loc µ(A), oricare ar fi A atom. Fie A1 , A2 ∈ Fp , pentru care au loc
µ(A1 ) si µ(A2 ). Trebuie sa demonstram ca au loc si µ(7A1 ), µ(A1 ∧ A2 ), µ(A1 ∨ A2 ), µ(A1
⇒ A2 ), µ(A1 ⇔ A2 ).
Astfel (7A1 )v = adevarat daca si numai daca (A1 )v = fals (conform definitiei evaluarii).
Deoarece µ(A1 ) are loc rezulta ca (A1 )v = fals daca si numai daca A1 = 0. Conform regulii 2 de
calcul pentru asocierea dintre A si A , rezulta ca A1 = 0 daca si numai daca (7 A1 ) = 1, astfel
ca µ(7A1 ) are loc.
Fie (A1 ∧ A2 )v = adevarat. Aceasta se întâmpla daca si numai daca (A1 )v = adevarat si
(A2 )v = adevarat (definitia evaluarii). Atunci, deoarece µ(A1 ) si µ(A2 ) au loc, A1 = 1 si A2 =
1. Folosind regula 3 de asociere, rezulta ca A1 = 1 si A2 = 1 daca si numai daca polinomul
asociat formulei A1 ∧ A2 are valoarea 1. Astfel am demonstrat si µ(A1 ∧ A2 ). În mod similar
se demonstreaza celelalte trei cazuri ramase.
Rezulta, pe baza teoremei 2.4, algoritmul pentru a decide daca o formula A este
tautologie:
Sisteme bazate pe cunostinte 45
A = 1– p + p (q ⇒ p ∧ q)= 1– p + p (1 – q + q p ∧ q ) = 1– p + p (1 – q + q p q )=
= 1 − p + p − p q + p q = 1.
unde am tinut seama de observatia de mai sus. Am demonstrat astfel ca are loc |=A.
Demonstratie.
În enuntul teoremei p1 , . . ., pn pot fi toate, sau o parte din variabilele propozitionale
care apar în A. Fie v o evaluare oarecare. Trebuie sa aratam ca Bv = adevarat. Construim
evaluarea w care satisface egalitatile: p1 w = C1 v , p2 w = C2v , . . ., pn w = Cnv . Din aceasta
constructie si din felul în care a fost obtinuta B rezulta: Aw = Bv . Cum din ipoteza teoremei
are loc |= A, înseamna ca Aw = adevarat si deci Bv = adevarat, ceea ce trebuia demonstrat.
1) |= A ⇒ A
2) |= A ⇔ A (legea identitatii pentru echivalenta)
3) |= A ⇔ 77A (negarea negatiei)
46 Bazele logice ale inteligentei artificiale
Definitia 2.14. Daca A si B sunt formule ele sunt echivalente daca este tautologie A ⇔
B (conform definitiei evaluarii, acesta este acelasi lucru cu a spune ca A si B iau aceleasi
valori de adevar pentru orice evaluare).
Exemple de formule echivalente sunt furnizate de lista anterioara de tautologii. În
demonstrarea automata a teoremelor se foloseste frecvent echivalenta formulei A ⇒ B cu
formula 7A ∨ B (punctul 8 din teorema 2.6).
Sisteme bazate pe cunostinte 47
Observatia 2.2.
Definitia 2.16. Se numeste regula de deductie orice relatie I |= A unde I este finita si
nevida.
Daca I = {B1 , . . ., Bn } si I |= A este regula de deductie, atunci B1 , . . . Bn se numesc
ipoteze, iar A concluzie.
Pe baza punctului 4 din observatiei 2.2 rezulta ca orice regula de deductie se poate
transforma într-o tautologie, si respectiv orice formula care este tautologie si la care operatia
dominanta este implicatia poate fi scrisa ca regula de deductie. În plus, si tautologiile la care
operatia dominanta nu este implicatia ci disjunctia, pot fi reformulate ca formule care sa
contina implicatia, tinând seama de echivalenta data de punctul 8 din teorema 2.6. Totusi,
doar o serie de tautologii sunt mai importante ca reguli de deductie. Dintre acestea pentru
SBC sunt de interes regula de deductie modus ponens: A, A ⇒ B |= B, si, într-o mai mica
masura, regula de deductie modus tollens: 7B, A ⇒ B |= 7A.
48 Bazele logice ale inteligentei artificiale
Definitia 2.17. Fie I o multime de formule. Se numeste deductie (de lungime p) din
multimea de ipoteze I, sirul de formule D1 , D2 , . . ., Dp , astfel încât oricare ar fi i ∈ {1, . . ., p}
are loc una din conditiile:
a) Di ∈ I
b) |= Di
c) Di se obtine din formulele precedente din sir pe baza unei reguli de deductie.
Teorema 2.7. Daca A se deduce din I, atunci I |= A (reciproca are si ea loc daca I este
finita).
Demonstratia se poate face prin inductie dupa lungimea deductiei. Pe baza acestei
teoreme rezulta o modalitate pentru a demonstra I |= A: daca se construieste o deductie a lui A
din I, atunci înseamna ca are loc I |= A.
Exista o infinitate de reguli de deductie, corespunzatoare diferitelor tautologii. Dintre
regulile de deductie un rol deosebit îl joaca regula modus ponens, asa cum rezulta din teorema
urmatoare.
Demonstratie.
Conform exemplului 2.9 are loc |= p ⇒ (q ⇒ p ∧ q). Notam aceasta tautologie cu (T).
Din ipoteza teoremei avem B1 , . . ., Bm |= A, ceea ce conform observatiei 2.2 punctul 4
este echivalent cu: |= B1 ∧ B2 . . . ∧ Bm ⇒ A. Construim o deductie a lui A din multimea de
ipoteze {B1 , . . ., Bm} în care singura regula de deductie folosita va fi modus ponens.
1) B1 - ipoteza
2) B1 ⇒ (B2 ⇒ B1 ∧ B2 ) - tautologia (T)
3) B2 ⇒ B1 ∧ B2 - din 1) si 2) cu regula de deductie modus ponens
4) B2 - ipoteza
5) B1 ∧ B2 - din 3) si 4) cu regula de deductie modus ponens
6) B1 ∧ B2 ⇒ (B3 ⇒ B1 ∧ B2 ∧ B3 ) - tautologia (T)
Sisteme bazate pe cunostinte 49
...
Aceasta teorema justifica felul în care SE pot lucra folosind o singura regula de
deductie, si anume modus ponens.
(A1) A ⇒ (B ⇒ A)
(A2) (A ⇒ (B ⇒ C)) ⇒ ((A ⇒ B) ⇒ (A ⇒ C))
(A3) (7A ⇒ 7B) ⇒ (B ⇒ A)
Se poate verifica faptul ca (A1) – (A3) sunt tautologii, ceea ce creeaza legatura între
aspectele sintactice si cele semantice ale sistemului formal dezvoltat. Datorita caracterului
deosebit, aratat prin teorema 2.8, drept regula de deductie (derivare) în sistemul formal al
calculului propozitional se foloseste regula modus ponens. În plus, conform teoremei 2.5, din
cele 3 axiome putem forma oricâte alte axiome (tautologii) prin substituirea formulelor A, B
si C cu alte formule din acelasi limbaj. De aceea se spune uneori ca, alaturi de modus ponens,
substitutia formulelor este si ea o regula de deductie a sistemului, iar (A1) – (A3) se numesc si
scheme de axiome, în sensul ca pot fi aplicate substituind pe A, B si C cu formule convenabil
alese. Pe baza celor 3 scheme de axiome si a regulii de derivare alese pot fi realizate
demonstratii în sistemul formal creat.
a) Di este o axioma;
b) Di se obtine din formulele precedente din sir pe baza regulii de deductie modus
ponens.
Dp din definitia anterioara se numeste teorema în sistemul formal respectiv, iar sirul de
formule care o precede se numeste demonstratia lui Dp .
Teorema 2.9. Sistemul axiomatic dat de (A1 ) – (A3 ) (respectiv sistemul formal creat)
este complet, în sensul ca orice tautologie din calculul propozitional poate fi obtinuta ca
teorema, si este corect, în sensul ca orice teorema dedusa în acest sistem este tautologie.
Demonstratia se poate face pe baza teoremei 2.7.
Notiunea de deductie, definita anterior prin 2.17, se poate particulariza pentru sistemul
formal al calculului propozitional, dupa cum urmeaza.
a) Di ∈ L;
b) Di este o axioma;
c) Di se obtine din formulele precedente din sir pe baza regulii de deductie modus
ponens.
Despre formula Dp se spune ca se deduce din L în sistemul formal al calculului
propozitional. Comparând cu definitia 2.19 rezulta ca o teorema este o deductie din multimea
vida.
Sisteme bazate pe cunostinte 51
Exemplul 2.11. Fie L = {A}. Din multimea L putem construi urmatoarea deductie:
D1 = A - D1 ∈ L
D2 = A ⇒ (B ⇒ A) - axioma (A1 )
D3 = B ⇒ A - din D1 si D2 folosind modus ponens
D4 = (B ⇒ A) ⇒ (7A ⇒ 7B) - este axioma (A3 ) în care am substituit A cu 7B si B cu 7A
D5 = 7A ⇒ 7B - din D3 si D4 folosind modus ponens
Demonstratia se poate face prin inductie dupa numarul formulelor din sirul de
deductie a lui B [Mal 87]. Teorema 2.10 este numita teorema deductiei si este adevarata si
reciproca acesteia.
Este util ca un SBC sa poata fi validat ca sistem formal, care sa contina initial în baza
de cunostinte un numar de axiome, adica tautologii caracterizând universul de discurs la care
se refera SBC respectiv si care sa deduca noi fapte (teoreme), astfel încât sa rezolve problema
propusa de utilizator. Expresivitatea bazei de cunostinte ar fi însa redusa daca ne-am limita la
calculul propozitional si extinderea necesara este aceea la calculul cu predicate.
52 Bazele logice ale inteligentei artificiale
Definitia 2.22. Se numeste termen orice cuvânt t ∈ (SP)* ce satisface una din conditiile:
(1) t∈ VI
(2) t∈ VF0
(3) t = f(t1, . . ., tn) unde f ∈ VFn si t1, . . .tn sunt termeni.
Sisteme bazate pe cunostinte 53
1) A ∈ VP0
2) A = P(t1, . . ., tn), unde P ∈ VPn (n>0) si t1, t2, . . ., tn ∈ T
3) A = (7B), unde B ∈ FP
4) A = (B # C), unde # ∈{∧, ∨, ⇒, ⇔}, B, C ∈ FP
5) A = (∃ x)B, unde x ∈VI, B ∈ FP
6) A = (∀x)B, unde x ∈VI, B ∈ FP.
Observatia 2.3.
Definitia 2.24. Un predicat este de ordin întâi daca argumentele sale nu sunt predicate. Un
predicat care are cel putin un argument al sau un predicat de ordin întâi este un predicat de ordin doi,
s. a. m. d., un predicat este de ordin n daca macar un argument al sau este un predicat de ordin n –
1. IA se limiteaza cel mai frecvent la cadrul calculului cu predicate de ordin întâi (se folosesc formule
în care apar numai predicate de ordinul întâi), situatie în care rezultatele logicii matematice sunt
eficient utilizabile în IA.
A1 = (((7P(x, f(x, c))) ∧ p) ∨ ((∃ x) Q(x, y) ⇒ (∀y) R(f(x, y)))) este formula în calculul cu
predicate; se observa cum cuantificatorii se ataseaza variabilelor.
Definitia 2.25. Daca A ∈ FP atunci multimea partilor (subformulelor) lui A, notata prin
π(A) se defineste inductiv astfel :
1. Daca A ∈ VP0 sau A = P(t1, . . ., tn) unde P ∈ VPn si t1, t2, . . ., tn ∈ T, atunci π(A) =
{A};
2. Daca A = 7B sau A =∃xB sau A = ∀xB, unde B ∈ FP si x ∈ VI atunci π(A) = π(B) ∪
{A};
3. Daca A = B # C unde B, C ∈ FP, # ∈ {∧, ∨, ⇒, ⇔} atunci π(A) = π(B) ∪ π(C) ∪
{A}.
Definitia 2.27. Daca x ∈ VI, t ∈ T, A ∈ FP, spunem ca termenul t este liber pentru
variabila x în formula A, daca pentru orice variabila y care apare în t, x nu intra liber într-o parte
(subformula) a lui A de forma ∃yB sau ∀yB.
Exemplul 2.16. Fie formula A = ∃yP(x, y) si termenul t=f(z), unde P∈VP2, f∈VF1, x,y,
z∈VI. Termenul t este liber pentru x în formula A deoarece singura variabila care apare în t este z si
nu exista parti ale lui A de forma ∃zB sau ∀zB. În schimb y nu este liber pentru x în formula A.
Astfel, y considerat ca termen contine variabila y si x intra liber în ∃y P(x, y) care este parte a lui A.
În schimb, f(y) sau y sunt termeni liberi pentru y în A, deoarece y nu intra liber în ∃y P(x, y) care este
parte a lui A, ci intra legat. Anticipând modul de folosire a acestei notiuni în teoria deductiei, ideea
este aceea de a preciza situatii în care termenul t poate substitui variabila x într-o formula. Astfel, t =
f(z) este liber pentru x în formula A si substituind pe x cu t nu denaturam pe A. În schimb, t = y nu
este liber pentru x în A, ceea ce ne arata ca substituind pe x cu t = y denaturam pe A; în adevar,
într-un asemenea caz A devine ∃y P(y, y) ceea ce este o formula închisa (vezi definitia urmatoare),
spre deosebire de formula initiala pentru care x era variabila libera.
Definitia 2.28. Un termen fara variabile individuale se numeste termen de baza (în engleza
”ground term”). O formula care nu contine variabile individuale se numeste formula de baza. O
formula este închisa daca toate variabilele sale sunt legate. Daca A este o formula si x1, x2, . . ., xn
56 Bazele logice ale inteligentei artificiale
sunt toate variabilele ce intra liber în A, atunci ∀x1 ∀x2 . . . ∀xn A se numeste închidere universala
a lui A, iar ∃x1 ∃x2. . . ∃xn A se numeste închidere existentiala a lui A. Evident aceste închideri sunt
formule închise.
1. Daca f ∈ VFn (n ∈ N) atunci fi este o n-D - functie (fi ∈ F, unei variabile functionale de
aritate n îi corespunde, prin interpretarea i, o n-D functie).
2. Daca P∈ VPn (n ∈ N) atunci Pi este un n-D - predicat (Pi ∈ P, unui predicat de aritate n
îi corespunde un n-D – predicat).
a. Daca t ∈ VI, atunci ti = Al(t) ∈ D (interpretarea unei variabile este data de alocarea
variabilelor folosita, si va fi un element din universul de discurs);
b. Daca t ∈VF0, adica t = c, atunci ti = ci, ceea ce este un element din D, conform
punctului 1 al definitiei D- interpretarii;
c. Daca t = f(t1, . . ., tn) unde tj ∈ T (j = 1, n) si f ∈ VFn, n > 0, atunci ti = fi(t1i, t2i, . . ., tni),
definitia fiind de tip recursiv, iar fi determinându-se conform punctului 1 al definitiei D-
interpretarii.
Dupa ce am dat interpretarea termenilor, putem interpreta formulele. Daca A ∈ FP, i este o
D– interpretare si Al o alocare a variabilelor, atunci Ai este dat prin:
Observatia 2.4. Acest exemplu sustine remarca facuta mai sus, asupra felului în care a
intervenit alocarea variabilelor în interpretarea unei formulei în care apar cuantificatori. Ideea
respectiva poate fi generalizata: este usor de demonstrat ca putem calcula interpretarea unei formule
fara sa fixam o alocare a variabilelor, ori de câte ori avea de-a face cu o formula care nu contine
variabile libere, adica este o formula de baza sau o formula închisa. În schimb, daca luam în
considerare formula A = P(x, y), unde P ∈ VP2, x, y ∈ VI (A contine variabile libere) si folosim
aceeasi interpretare i din exemplul 2.19, constatam ca nu putem preciza Ai atâta timp cât nu stim
alocarea variabilelor pentru x si y. În adevar, pentru a determina Ai trebuie sa calculam xi si yi, si,
conform felului în care se interpreteaza termenii, xi = Al(x), yi =Al(y).
Formule false
De îndata ce o interpretare i
Formule
realizabile este fixata, multimea FP va fi împartita
în mai multe submultimi, conform fig.
Fig. 2.2. Împartirea multimii formulelor FP din
2.2. Daca am considera din FP
calculul cu predicate fata de o D – interpretare fixata
multimea formulelor închise, sau
multimea formulelor de baza, atunci, tinând seama de definitia interpretarii si de observatia 2.4, orice
interpretare ar partitiona aceste doua multimi de formule în doua submultimi: aceea a formulelor
valide si respectiv a formulelor false în interpretarea respectiva.
Definitia 2.32. O formula este realizabila daca este realizabila cel putin într-o interpretare;
în caz contrar, formula este nerealizabila (nesatisfiabila), ceea ce înseamna ca este falsa în orice
interpretare. O formula este tautologie daca este valida în orice interpretare.
Pentru tautologii se foloseste aceeasi notatie ca în calculul propozitional: daca A este
tautologie, atunci se noteaza |=A. Si pentru formulele din calculul cu predicate are loc o împartire
similara cu aceea din fig. 2.1, unde contradictiile sunt formulele nerealizabile; de asemenea, teoremele
2.2 si 2.3, ca si definitia 2.13 privind multimile de formule realizabile si nerealizabile din calculul
propozitional (vezi 2.2.2, unde în locul evaluarii din calculul propozitional vom avea în calculul cu
predicate interpretarea) sunt valabile si în calculul cu predicate. Astfel, conform celor mentionate si
anterior, calculul cu predicate este o extensie a celui propozitional si în acest sens orice formula A ∈
Fp care este tautologie, este tautologie si în calculul cu predicate.
tautologie atunci algoritmul va da, într-un numar finit de pasi, raspunsul Da; în schimb, în cazul în care
formula de intrare nu este tautologie este posibil ca algoritmul sa nu se opreasca.
Teorema 2.11. Fie A o formula în calculul propozitional (A ∈ Fp), iar p1, . . ., pn variabile
propozitionale ce apar în A. Daca A este tautologie, atunci orice formula obtinuta din A prin
substitutia simultana a variabilelor p1, . . ., pn cu formulele oarecare B1, . . ., Bn din calculul cu
predicate (Bi ∈ FP) este tautologie.
Demonstratia este imediata, fiind analoga demonstratiei teoremei 2.5 din calculul
propozitional.
În calculul propozitional am dat o lista de tautologii de baza (teorema 2.6); conform celor
mentionate, toate ramân valabile si în calculul cu predicate. Exista si o serie de tautologii specifice
pentru calculul cu predicate, prin aceea ca se refera la formule în care apar variabile si cuantificatori.
O parte din acestea sunt date prin urmatoarea teorema.
1) |= 7 ∃x A ⇔ ∀x 7A
2) |= 7 ∀x A ⇔ ∃x 7A
3) |= ∀x A ∧ ∀x B ⇔ ∀x (A ∧ B)
4) |= ∃x A ∨ ∃x B ⇔ ∃x (A ∨ B)
5) |= ∀x ∀y A ⇔ ∀y ∀x A
6) |= ∃x ∃y A ⇔ ∃y ∃x A
Demonstram prima din aceste tautologii. Conform tab. 2.4, pentru a arata ca este tautologie
o formula care are drept operatie dominanta echivalenta, trebuie sa demonstram ca subformulele
care sunt legate prin echivalenta iau aceeasi valoare de adevar, în orice interpretare. Astfel, sa
presupunem ca i este o D – interpretare oarecare, astfel încât (7 ∃x A)i = adevarat. Tinând seama
de semnificatia negatiei rezulta (∃x A)i = fals. Conform interpretarii cuantificatorului ∃ înseamna ca
nu exista nici un element d ∈ D, astfel încât folosind o alocare oarecare Al, care sa respecte conditia
Al(x) = d, sa avem Ai = adevarat. Aceasta înseamna ca oricare ar fi d ∈ D si alocarea variabilelor
care determina Al(x) = d, vom avea Ai = fals, ceea ce este echivalent (conform interpretarii
negatiei) cu (7A)i = adevarat. Adica, oricare ar fi un element d ∈ D avem (7A)i = adevarat pentru
orice alocare a variabilelor care satisface Al(x) = d. Aceasta înseamna ca (∀x 7A)i = adevarat.
Lasam ca exercitiu demonstrarea faptului ca daca (7 ∃x A)i = fals atunci si (∀x 7A)i = fals, cât si
demonstrarea celorlalte tautologii.
|? ∀x (A ∨ B) ⇔ ∀x A ∨ ∀x B
|? ∃x (A ∧ B) ⇔ ∃x A ∧ ∃x B
Sisteme bazate pe cunostinte 63
Astfel, pentru prima dintre ele se poate construi urmatorul contraexemplu, în care aratam ca
nu este tautologie implicatia: L = ∀x (A(x) ∨ B(x)) ⇒ ∀x A(x) ∨ ∀x B(x) (conform tautologiei de
baza 10 din paragraful 2.2.2, teorema 2.6, pentru a fi tautologie o formula la care operatia dominanta
este echivalenta trebuie sa fie tautologii cele doua implicatii corespunzatoare). Fie urmatoarea
interpretare i: D = N (multimea numerelor naturale), Ai: N → {adevarat, fals}, Ai(u) = adevarat,
daca u este numar par si fals în caz contrar; Bi: N → {adevarat, fals}, Bi(u) = adevarat, daca u este
numar impar si fals în caz contrar. În aceasta interpretare avem [∀x (A(x) ∨ B(x))]i = adevarat
(oricare ar fi un numar natural, acesta este sau par sau impar) si [∀x A(x) ∨ ∀x B(x)]i = fals (nu
toate numerele naturale sunt pare si nici impare). Conform interpretarii unei implicatii rezulta ca Li =
fals. Se poate construi un contraexemplu si pentru a doua formula de mai sus.
Daca formulele din observatia anterioara (în care operatia dominanta este echivalenta) nu
sunt tautologii, în schimb sunt tautologii o serie de formule la care operatia dominanta este implicatia.
1) |= ∃x ∀y A ⇒ ∀y ∃x A
2) |= ∃x (A ∧ B) ⇒ ∃xA ∧ ∃xB
3) |= ∀x A ∨ ∀x B ⇒ ∀x (A ∨ B)
4) |= ∀x (A ⇒ B) ⇒ (∀x A ⇒ ∀x B)
5) |= ∀x (A ⇒ B) ⇒ (∃x A ⇒ ∃x B)
6) |= ∀x (A ⇔ B) ⇒ (∀x A ⇔ ∀x B)
7) |= ∀x (A ⇔ B) ⇒ (∃x A ⇔ ∃x B)
Demonstram prima dintre tautologii. Fie i o D – interpretare oarecare. Dupa tab. 2.4, cazul
care trebuie studiat este cel în care (∃x ∀y A(x, y))i = adevarat, trebuind sa demonstram ca are loc
(∀y ∃x A(x, y))i = adevarat. Conform interpretarii formulelor în calculul cu predicate, din (∃x∀yA(x,
y))i = adevarat, rezulta ca exista un element a ∈ D, astfel încât (∀y A(x, y))i = adevarat, cu
conditia ca alocarea variabilelor folosita sa satisfaca Al(x) = a. Tinând seama de interpretarea
cuantificatorului ∀, înseamna ca oricare ar fi b ∈ D, (A(x, y))i = adevarat, cu conditia ca Al(y) = b.
Atunci putem spune ca are loc (∃x A(x, y))i = adevarat, deoarece exista elementul a ∈ D astfel încât
(A(x, y))i = adevarat, cu conditia Al(x) = a, si fara vreo restrictie asupra lui Al(y), deoarece (A(x,
y))i = adevarat, oricum am aloca pe y cu un element din D. Aceasta înseamna ca oricare ar fi b
∈ D, (∃x A(x, y))i = adevarat, cu Al(y) = b, adica (∀y ∃x A(x, y))i = adevarat.
64 Bazele logice ale inteligentei artificiale
Observatia 2.8. Pentru a întelege mai bine felul în care se interpreteaza cuantificatorii este util
sa cercetam caracterul de tautologie al implicatiei inverse fata de 1) din teorema de mai sus, adica sa
vedem daca este tautologie formula: ∀y ∃x A(x, y) ⇒ ∃x ∀y A(x, y). Ar trebui sa putem demonstra
ca oricare ar fi i o D – interpretare, daca (∀y ∃x A(x, y))i = adevarat, atunci are loc si (∃x ∀y A(x,
y))i = adevarat. Din ipoteza în care lucram rezulta ca oricare ar fi a ∈ D, (∃x A(x, y))i = adevarat,
pentru o alocare a variabilelor care satisface Al(y) = a. Tinând seama de interpretarea
cuantificatorului ∃, înseamna ca exista un b ∈ D, astfel încât (A(x, y))i = adevarat, de îndata ce Al(x)
= b. În continuare ar trebui sa putem arata ca (∀y A(x, y))i = adevarat. Aceasta ar presupune ca
oricare ar fi un element a ∈ D, sa avem (A(x, y))i = adevarat, pentru o alocare a variabilelor care
satisface numai conditia Al(y) = a. Dar acest lucru nu poate fi dedus; ceea ce am dedus presupune si
restrictia ca Al(x) = b. Faptul ca formula cercetata nu este tautologie se poate demonstra si printr-un
contraexemplu.
Mai exista în calculul cu predicate o serie de tautologii care presupun anumite restrictii asupra
variabilelor care apar în formulele în cauza; o parte din acestea sunt date de teorema urmatoare.
|= Kx A(x) α B ⇔ Kx (A(x) α B)
În calculul cu predicate apar noi reguli de deductie, specifice. Câteva exemple în acest sens
sunt date de urmatoarea teorema.
Demonstratia se face tinând seama de observatia 2.2, punctul 4, prin care o regula de
deductie este echivalata cu o tautologie si de interpretarea formulelor în calculul cu predicate.
mai adauga alte doua axiome, specifice pentru FP. Acestea sunt necesare pentru a pastra caracterul
de completitudine si corectitudine al sistemului formal (vezi teorema 2.9) si au urmatoarea forma:
La fel ca si celelalte trei axiome, cele doua de mai sus trebuie privite ca scheme de axiome;
ele pot fi folosite oricum am substitui pe A cu formule din FP. Se remarca absenta cuantificatorului ∃
în sistemul de axiome (A1) – (A5); explicatia este aceea ca ∃ poate fi exprimat cu ajutorul lui ∀. În
adevar, este usor de demonstrat tautologia |= ∃xA ⇔ 7 ∀x 7A pe baza tautologiilor date de
teorema2.14, punctul 2) si teorema 2.6 punctul 3).
Definitia 2.34. Daca L ∈ FP , L se numeste literal daca este o formula atomica sau
negatia unei formule atomice. Daca A este formula atomica, atunci L1 = A se numeste literal
pozitiv, iar L2 = 7A se numeste literal negativ.
Observatia 2.9. Tinând seama de forma unei clauze (este o formula închisa) si de
teorema 2.16 care ne permite în anumite conditii sa scoatem cuantificatorii în fata unei
conjunctii, rezulta ca o formula A care este în forma clauzala se va putea scrie întotdeauna ca:
Observatia 2.10. Uneori vom nota un literal cu eL, pentru a putea apoi nota cu eL
negatul lui eL; acesta înseamna ca daca, de exemplu, eL = P(x, y), atunci eL = 7P(x, y), iar
daca eL = 7P(x, y), atunci eL = P(x, y).
A ∨ B, 7B ∨ C |= A ∨ C,
unde A, B, C pot fi formule oarecare din calculul cu predicate. Daca ne limitam la cazul
calculului propozitional si consideram pe A, B, C ca fiind literali, atunci constatam ca atât
ipotezele cât si concluzia în regula de deductie de mai sus sunt clauze. În plus, regula poate fi
generalizata pentru situatia în care ipotezele contin mai multi literali, în forma data prin
urmatoarea definitie.
se numeste rezolutie; concluzia rezolutiei se nume ste clauza rezolventa (pe scurt rezolventa) a
clauzelor ce sunt ipoteze.
Se observa ideea acestei reguli de deductie: se folosesc drept ipoteze doua clauze care
se bucura de proprietatea ca un acelasi literal apare în ele, în una ca literal pozitiv, iar în a
Sisteme bazate pe cunostinte 69
doua ca literal negativ, concluzia obtinându-se din disjunctia tuturor literalilor din cele doua
clauze, mai putin cei doi mentionati (se spune ca literalul pozitiv dintr-o clauza se anihileaza
cu cel negativ corespunzator, din a doua clauza). Regula de deductie respectiva este aplicabila
si în cazul în care n1 si/sau n2 sunt nule. O situatie particulara, care va fi exploatata în
demonstrarea automata a teoremelor, este aceea în care n1 = n2 = 0. În acest caz regula de
deductie folosita este B, 7B |= , adica printr-o rezolutie obtinem clauza vida daca clauzele
ipoteze sunt contradictorii, ceea ce înseamna ca ele ar corespunde formulei B ∧ 7B, care este
în forma clauzala si este nerealizabila (în acest sens trebuie privita ca o formula
nerealizabila).
Daca A ∈ FP si α este substitutia din definitia de mai sus, atunci Aα = A(x1 |t1 , . . .,
xn |tn ), adica este formula A în care înlocuim: toate intrarile variabilei x1 cu termenul t1 ,
s.a.m.d., toate intrarile variabilei xn cu termenul tn .
α = {x|f(z, c), w|f(f(z, c), c), y|c}, iar factorul este F = P(f(z, c), f(f(z, c), c), c).
begin
α: = { } ; initial substitutia este multimea vida
unif: = DN ; unif este un flag, initializat cu o valoare diferita de DA si NU
while (unif = DN) do
begin
if (L1 α = L2 α = . . .= Lkα)
then
Sisteme bazate pe cunostinte 71
begin
unif: = DA
F: = L1 α
end
else
begin
D:= DEZ (L1 α, L2 α, . . ., Lkα)
If (În D exista x ∈ VI si t ∈ T, astfel încât x nu apare în t)
then α: = α(x|t) ∪ {x|t}
else unif: = NU
end
end
end
În algoritm apare multimea DEZ, care este dezacordul unei multimi de literali pozitivi
ce încep cu aceeasi variabila predicativa. DEZ se poate calcula usor daca folosim asa numita
notatie frontala a literalilor. Astfel, stiind ca literalii pozitivi sunt de forma L = P(t1 , . . ., tn ),
unde P ∈ VPn , iar tj sunt termeni, în notatia frontala se renunta la paranteze si la virgule.
Aceasta presupune sa fie cunoscuta aritatea lui P si a fiecarei variabile functionale care apare
în termenii tj, situatie în care se va putea reveni la forma obisnuita a literalilor, în mod univoc.
Exemplul 2.25. L = P(x, f(x, c), f(x, y)), unde P ∈ VP3 , f ∈ VF2 , c ∈ VF0 , x, y ∈ VI; în
notatie frontala avem L = P x f x c f x y.
Multimea DEZ (L1 , . . ., Lk ) se poate determina în felul urmator. Se aseaza literalii unii
sub altii, folosind scrierea în notatie frontala. Daca P este variabila predicativa cu care încep
literalii vom avea:
L1 = P t1 t2 . . . ti t 1i+1 . . . tn1
L2 = P t1 t2 . . . ti t i2+1 . . . tn2
...
Lk = P t1 t2 . . . ti t ik+1 . . . tnk
unde tj sunt termeni. Consideram, de la stânga spre dreapta, prima pozitie (prima coloana) în
care simbolurile difera, multimea dezacord fiind formata din simbolurile care apar pe coloana
respectiva, adica DEZ (L1 , . . ., Lk ) = { t 1i+1 , t i2+1 , . . ., t ik+1 }.
72 Bazele logice ale inteligentei artificiale
Pxfxcfxy
Pyfgcvfgvy
Pzfgcwfzgs
DEZ(M) = {x, y, z}.
Observatia 2.11.
z|c}, iar factorul este F= P(c, c). Aplicând formula de calcul a rezolventei din definitia 2.41
obtinem: Rez(C 1 , C2 ’) = {Q(c), S(c, f(c)), 7S(c, c)}. Este de observat felul în care am aplicat
substitutia α în cele doua clauze înainte de a construi rezolventa. Acest rezultat, conform
teoremei 2.18, ne spune ca are loc urmatoarea deductie:
Putem obtine si alta rezolventa a celor doua clauze, luând în locul lui P variabila
predicativa S. În acest caz se ajunge, dupa formarea multimii M, gasirea lui α = {x|w, z|f(y)}
si a lui F = S(w, f(y)), la : Rez(C 1 , C2 ’) = {7P(w, y), Q(w), P(w, c), P(c, f(y))}.
Definitia 2.42. Fie S o multime de clauze. Se numeste deductie sau derivare prin
rezolutie a clauzei C din multimea S, sirul de clauze C1 , C2 , . . ., Cn astfel încât Cn = C si
oricare ar fi i∈{1, . . ., n} are loc una din conditiile:
a) Ci ∈ S
b) Ci = Rez (C j, Ck ), unde 1 ≤ j, k ≤ i
Teorema 2.19. Multimea S de clauze este nerealizabila daca si numai daca exista o
deductie prin rezolutie a clauzei vide din S.
C1 = Rya
C2 = Px ∨ 7 Rfax
C3 = 7 Pz ∨ Qz
C4 = 7 Pw ∨ 7 Tfa
C5 = 7 Qu ∨ Tfu
C6 = Pa (este Rez(C 1 , C2 ), unde substitutia folosita este α = {y|f(a), x|a}
C7 = Qa (este Rez(C 6 , C3 ), unde substitutia folosita este α = {z|a}
C8 = 7 Tfa (este Rez(C 6 , C4 ), unde substitutia folosita este α = {w|a}
C9 = 7 Qa (este Rez(C 8 , C5 ), unde substitutia folosita este α = {u|a}
76 Bazele logice ale inteligentei artificiale
a) A nu contine cuantificatori;
b) A = K1 x1 K2 x2 . . . Kn xn B, unde K1 , K2 , . . ., Kn ∈ {∃ , ∀}, x1 , x2 , . . ., xn ∈ VI,
iar B ∈ FP , este o formula care nu contine cuantificatori.
În conformitate cu aceasta definitie, o formula este în forma normala prenex daca este
sau fara cuantificatori, sau cu toti cuantificatorii scosi în fata formulei. Daca formula A este în
situatia b) din definitia de mai sus, atunci K1 x1 K2 x2 . . . Kn xn se numeste prefixul formulei, iar
B se numeste matricea formulei A. Urmarind definitiile 2.35, 2.36 si observatia 2.9 se
constata ca o clauza si o formula în forma clauzala sunt si formule în forma normala prenex.
În legatura cu aducerea unei formule la forma normala prenex se poate enunta urmatoarea
teorema, a carei demonstratie, de tip constructiv, ne da solutia problemei.
Demonstratia foloseste teorema 2.12, conform careia daca într-o formula A înlocuim o
parte a acesteia B cu o formula echivalenta B1 , vom obtine o formula A1 echivalenta cu A.
Înlocuirile le vom face în scopul scoaterii cuantificatorilor în fata formulei. Sunt posibile
urmatoarele situatii, unde în paranteza am dat justificarea pentru |= B ⇔ B1 (x∈ VI, C, D∈FP ):
A1 = (∀x ∃y P(x, y) ⇒ Q(x, y, z)) ∧ (Q(x, y, z) ⇒ ∀x ∃y P(x, y)) (conform punctului e).
A2 = (7 (∀x ∃y P(x, y)) ∨ Q(x, y, z)) ∧ (7Q(x, y, z) ∨ ∀x ∃y P(x, y)) (conform punctului d).
A3 = (∃x∀y 7P(x, y) ∨ Q(x, y, z)) ∧ (7Q(x, y, z) ∨ ∀x∃yP(x, y)) (conform punctelor a si b).
A4 = (∃u ∀v 7P(u, v) ∨ Q(x, y, z)) ∧ (7Q(x, y, z) ∨ ∀w ∃s P(w, s)) (conform punctului c2 ).
A5 = ∃u ∀v (7P(u, v) ∨ Q(x, y, z)) ∧ ∀w ∃s (7Q(x, y, z) ∨ P(w, s)) (conform punctului c1 ).
A6 = ∃u ∀v ((7P(u, v) ∨ Q(x, y, z)) ∧ ∀w ∃s (7Q(x, y, z) ∨ P(w, s))) (conform punctului c1 ).
A7 = ∃u ∀v ∀w ∃s ((7P(u, v) ∨ Q(x, y, z)) ∧ (7Q(x, y, z) ∨ P(w, s))) (conform punctului c1 ).
Revenind la etapele aducerii unei formule la forma clauzala, cea de-a doua etapa se
refera la eliminarea cuantificatorilor existentiali. Ea se bazeaza pe teorema urmatoare, numita
a lui L. Skolem.
Fara a da demonstratia acestei teoreme, ideea este aceea data de regula de deductie 6)
din teorema 2.17. Aratam felul în care se obtine formula A’ din formula A. Mai întâi se aduce
formula A la forma normala prenex, obtinându-se A. Apoi se aplica regula: daca în prefixul
formulei A se afla ∃v (v ∈ VI), atunci se elimina cuantificatorul respectiv, înlocuindu-se
totodata în matricea lui A toate aparitiile lui v cu f(x1 , x2 , . . ., xn ), unde f ∈ VFn (n ≥ 0) si f
este o variabila functionala noua (nu apare în A sau în vreo alta formula utilizata), iar x1 , x2 , . .
., xn sunt toate variabilele care apar în prefixul lui A în fata lui v si sunt cuantificate cu
cuantificatorul ∀. Cazul particular n = 0 este acela în care în fata lui ∃v în prefixul formulei A
nu apare nici un cuantificator ∀, când f va fi o constanta noua (f ∈ VF0 ). Regula respectiva se
va aplica pentru toti cuantificatorii ∃ aflati în prefixul lui A. Se va ajunge în acest fel la
formula A’, fara cuantificatori existentiali si care se va numi în forma normala Skolem.
Cele doua formule sunt formule închise, fiind deja în forma normala prenex.
Formulele corespunzatoare în forma normala Skolem sunt:
A1 = ∀x∀y∀u (P(x, y, u, f2 (x, y, u)) ∨ Q(x, y, f1 (x, y), u, f2 (x, y, u))) si A2 = ∀x∀y R(x, y, c),
unde f1 ∈ VF2 , f2 ∈ VF3 , c ∈ VF0 .
Etapa a treia a aducerii la forma clauzala, atunci când este necesara, se refera la
obtinerea formulei ca o forma conjunctiva (conjunctie de disjunctii). Pentru aceasta se
folosesc legile lui De Morgan, distributivitatea si asociativitatea pentru conjunctie si
disjunctie. Prezentam în continuare un exemplu care implica toate etapele mentionate anterior,
plecând de la niste ipoteze exprimate în limbaj natural, împreuna cu o concluzie, care trebuie
verificata prin demonstrarea automata a teoremelor.
nostru acestea sunt urmatoarele variabile predicative, pentru care definim si interpretarea care
ne intereseaza:
Mai trebuie precizat universul de discurs D, care este în cazul discutat o colectivitate,
continând programatori, împreuna cu rezultate ale activitatii acestora, rezultate care pot face
adevarat, prin interpretarea i, predicatul E si/sau predicatul S. Folosind aceste variabile
predicative, ipotezele si concluzia se modeleaza prin urmatoarele formule:
A1 = ∃x (P(x) ∧ ∀y (E(y) ⇒ U(x, y))); ideea acestei modelari este aceea ca exista unii
programatori si acestia urasc toate esecurile, ceea ce explica felul în care am folosit
cuantificatorii.
A2 = ∀x (P(x) ⇒ ∀y (S(y) ⇒ 7U(x, y))); ideea de modelare este similara cu aceea de
la A1 , dar acum toti programatorii sunt în situatia de a nu urî succesele, oricare ar fi acestea;
în plus se observa si felul în care am folosit operatiile logice: în A1 interpretarea este aceea ca
sunt unii care sunt programatori si care urasc esecurile, în timp ce în A2 , este vorba de faptul
ca daca o persoana este programator, atunci, oricare ar fi ea, nu uraste nici un succes
(cuvintele de legatura pe care le-am scos în evidenta, dar mai ales întelesul frazelor modelate
ne conduc la modelarea corecta prin formule).
C = ∀x (E(x) ⇒ 7S(x)); ideea este aceea ca daca x are proprietatea de a fi un esec,
oricare ar fi acesta, atunci x nu este un succes.
D nu este formula în forma clauzala, astfel ca aplicam cele trei etape necesare obtinerii
acestei forme. În loc sa lucram cu formula D, este mai convenabil sa observam ca D este o
conjunctie a trei subformule, sa le prelucram pe acestea si apoi sa revenim la D. Cu alte
cuvinte folosim relatia D = A1 ∧ A2 ∧ A3 , unde A3 = 7C. Mai întâi procedam la aducerea la
forma normala prenex a celor trei subformule.
Sisteme bazate pe cunostinte 81
În prelucrarile de mai sus a, b ∈ VF0 si am folosit semnal “=” desi noile formule la
care am ajuns nu sunt echivalente cu acelea de plecare; ideea este cea spusa si anterior: ne
intereseaza doar caracterul de nerealizabilitate. Formula A2 nu a fost prelucrata, necontinând
cuantificatorul ∃. Urmeaza cea de-a treia etapa, în care vom scrie cele trei formule în forma
clauzala, adica sub forma de conjunctii de disjunctii.
S = {P(a), 7E(y) ∨
P(a) 7P(x) ∨ 7S(z) ∨ 7U(x, z)
U(a,y), 7P(x) ∨ 7S(z) ∨ 7U(x, z),
E(b), S(b)}
7S(z)∨7U(a, z) S(b) E(b) 7E(y) ∨ U(a, y)
Folosind cele 5 clauze
U(a, b) trebuie sa construim rezolvente
7U(a, b)
pentru obtinerea clauzei vide.
Arborele corespunzator deductiei
prin rezolutie a clauzei vide din
Fig. 2.4. Deductia prin rezolutie a clauzei vide multimea S este dat în fig. 2.4.
pentru cazul din exemplul 2. 34.
Aceasta ne arata ca din cele doua
82 Bazele logice ale inteligentei artificiale
Întrebari si probleme
1. Fiind dat textul: “Polinomul 2x5 + 4x3 + 2x se divide cu polinomul Q(x)” precizati
daca textul respectiv reprezinta un enunt, o propozitie si/sau un predicat (de ce aritate); de
asemenea stabiliti care sunt subiectele si care este partea predicativa.
2. Care este numarul evaluarilor în calculul propozitional? Dar numarul interpretarilor
în calculul cu predicate?
84 Bazele logice ale inteligentei artificiale
P(x) ∨ R(f(x), y), 7R(a, x) ∨ 7R(x, b) ∨ P(g(x))}, unde P ∈ VP1 , Q, R ∈ VP2 , f, g ∈ VF1 ,
a, b ∈ VF0 , x, y ∈ VI.
19. Fie urmatoarele ipoteze: “Nu toti cei prezenti la examenul oral au promovat.”, “Toti
cei prezenti la examenul oral au dat proba scrisa.” Sa se verifice prin demonstrarea automata a
teoremelor daca este adevarata concluzia: “Sunt unii care au dat proba scrisa si nu au
promovat.”
20. Fiind data ipoteza: “Studentii sunt cetateni.” sa se verifice prin demonstrarea
automata a teoremelor concluzia: “Voturile studentilor sunt voturi ale cetatenilor. ”
21. Fie 3 cuburi asezate într-un turn, conform fig. 2.5 (Problema lui Moore [Cha 73]). Se
stie despre cubul A ca are culoarea verde, iar despre cubul C se stie ca nu este verde. Sa se
arate, prin demonstrarea automata a teoremelor, ca exista un cub de culoare verde care este
asezat pe un cub ce nu este verde.
A
B
C
Cunoasterea este alcatuita din piese de cunoastere, adica elemente care au o anumita
semnificatie, datorita careia (pentru care) au fost achizitionate. În mod deosebit distingem
doua tipuri de piese de cunoastere:
Sisteme bazate pe cunostinte 87
rationamentelor de catre un sistem de calcul. În acest capitol ne ocupam de cea de-a doua
etapa, iar în urmatorul de achizitia de cunostinte.
conducând la baza de cunostinte, este de organizata în asa fel încât sa serveasca efectuarea
rationamentelor, adica sa faciliteze realizarea motorului de inferente.
evolutia în timp a obiectelor din universul de discurs. Din punct de vedere epistemologic,
adica al teoriei cunoasterii, un model trebuie sa exprime felul în care poate fi interpretata
cunoasterea asupra elementelor admise de ontologie. În acest sens, de exemplu, logica binara
considera ca un fapt de cunoastere asupra universului de discurs poate fi adevarat sau fals, în
timp ce logica fuzzy lucreaza cu valori de adevar aflate în corespondenta cu un interval real.
favoarea uneia mai grosiere. Astfel, folosirea unor primitive reprezentationale de nivel scazut
(de detaliu, apropiate de sensul de primitive semantice) poate facilita scrierea unor reguli
simple pentru efectuarea inferentelor, în termenii acestor primitive. Este ca si cum am avea de
construit un SBC pentru rezolvarea ecuatiilor algebrice, si folosim ca primitiva ecuatia de
gradul întâi, situatie în care regula de rezolvare a acesteia este usor de exprimat. Problema
este aceea ca nu toate ecuatiile pot fi reduse la acest caz elementar si nici nu este eficient sa
procedam în acest fel.
Exista mai multe argumente pentru fixarea unui nivel de granularitate mai înalt decât
cel minim. Astfel, folosirea unui nivel minim va impune stocarea unor structuri complicate,
cele reprezentând descrierea unor entitati în termeni ai primitivelor de nivel scazut, chestiune
ce se evita ridicând nivelul granularitatii (în exemplul nostru, ecuatia de gradul 2, poate fi si
ea o primitiva reprezentationala, care nu mai trebuie descompusa). În plus, descompunerea la
un nivel scazut al granularitatii va însemna si un consum de timp si ineficienta a algoritmilor
de cautare aplicati pe modelul respectiv, în timpul rezolvarii problemelor.
Un alt dezavantaj major este acela ca initial cunoasterea este data, de exemplu, în
limbaj natural, adica într-o forma în care nu apar detaliile cele mai intime. Aducerea
cunoasterii respective la forma unor combinatii ale unor primitive semantice poate fi dificila
si nenecesara, atâta timp cât rezolvarea problemelor de care se ocupa SBC se obtine fara a fi
nevoie sa crestem nivelul de detaliere. De exemplu, se poate ca un expert în domeniul
proiectarii sistemelor cu microprocesoare sa nu mai faca referire la functionarea
tranzistorului.
Cea de-a treia problema a folosirii unor elemente ce ar reprezenta în adevar primitive
semantice este aceea a dificultatii identificarii acestora. Fie ca este vorba de complexitatea
unui anumit domeniu, sau de faptul ca informatiile sunt incomplete, primitivele
reprezentationale trebuie sa se opreasca la un nivel de detaliere mai mare decât cel minim. Un
exemplu de felul în care primitivele reprezentationale influenteaza un SBC este acela dat în
3.3.3 (fig. 3.13).
Concluzia este ca primitivele reprezentationale se vor alege la acel grad de
granularitate care este adecvat universului de discurs, sarcinii de rezolvat de catre SBC si care
sa asigure si eficienta implementarii. Problema este una dificila; câteva idei care pot ghida
aceasta alegere sunt acelea cu privire la calitatile unor bune primitive reprezentationale:
Este varianta de model derivata direct din logica matematica. Astfel, în aceasta
reprezentare piesele de cunoastere sunt descrise ca formule în calculul cu predicate, iar
sintaxa si semantica sunt cele cunoscute din logica. Avantajele metodei sunt:
Exemplul 3.1. “Robotul 1 este compus din baza, brat si apucator. Bratul avanseaza
daca un operator apasa butonul P si daca magazia contine piese.”
Prima propozitie este si prima asertiune, pe care o notam cu A1. Urmatoarea fraza este
alcatuita din asertiunile: A2 - bratul avanseaza; A3 - un operator apasa butonul P; A4 - magazia
contine piese. Am eliminat cuvintele de legatura – daca, si – urmând a tine seama de ele
atunci când stabilim operatiile logice dintre asertiuni.
Cunoasterea despre robotul 1, data prin textul de mai sus, se va reprezenta prin
urmatoarele formule, pe care le consideram a fi tautologii.
|= A1
|= A3 ∧ A4 ⇒ A2 (3.1)
În aceasta reprezentare am pus în evidenta operatiile logice între asertiunile care apar
în fraza în limbaj natural. Rezultatul acestei faze îsi are corespondentul în logica în partea de
calcul propozitional, în sensul în care A1 ÷ A4 ar putea fi privite ca variabile propozitionale.
Cel mai frecvent ele urmeaza a fi înlocuite cu formule din calculul cu predicate, în faza a
doua, pentru a putea surprinde o serie de aspecte date în descrierea initiala si care nu apar în
modelul (3.1).
a) orice asertiune (enunt) are, conform celor precizate în paragraful 2.1, structura de
forma subiect/subiecte – parte predicativa;
b) partea predicativa va fi reprezentata printr-un simbol de predicat (variabila
predicativa), în ale carui locuri sunt plasate subiectele;
c) unele componente din descrierea în limbaj natural au rolul de a modifica valoarea
de adevar în functie de acoperirea multimii (domeniului) în care variabilele iau valori, dând
astfel o semnificatie cantitativa, care este surprinsa cu ajutorul cuantificatorilor.
Vom aplica aceste elemente pe cazul exemplului 3.1. A1 se poate exprima cu ajutorul
predicatului ESTE_COMPUS(obiect_compus, componenta_1, componenta_2, componenta_3) ,
iar instantele din exemplul nostru ce determina ca interpretarea predicatului sa fie adevarat
sunt: ESTE_COMPUS(robot_1, baza, brat, apucator). Avem în vedere o D- interpretare, în
care D se refera la o celula de fabricatie. Aceasta varianta de reprezentare are doua
dezavantaje:
94 Reprezentarea cunoasterii
Se pot evita aceste deficiente prin reformularea asertiunii în forma logic echivalenta de
conjunctie de predicate mai simple (adesea este necesar sa reformulam un enunt în limbaj
natural, într-o forma logic echivalenta, pentru obtinerea modelului corespunzator). Astfel,
folosind predicatul de aritate doi ESTE_COMPONENTA(obiect_compus, componenta), cu
instantele din exemplul considerat, rezulta pentru A1 :
În acest caz vom putea usor completa modelul, atunci când se achizitioneaza noi piese
de cunoastere, de exemplu, adaugând în conjunctia de mai sus termenul:
ESTE_COMPONENTA(robot_1, sistem_actionare)
si descrierea devine:
Subliniem faptul ca atunci când folosim un predicat, pentru a fixa semantica acestuia,
trebuie sa stim D– interpretarea în care lucram. Conform definitiei acesteia (vezi definitia
2.30), vom putea preciza interpretarea unei variabile predicative numai daca stim multimea
(conceptul, domeniul) în care fiecare argument al sau ia valori (se instantiaza). În functie de
instantierele argumentelor, de felul în care acestea sunt eventual cuantificate si de
interpretarea folosita, un predicat va fi interpretat ca adevarat sau fals.
reprezinta conceptul si care va fi interpretat ca adevarat, ori de câte ori x este înlocuit cu o
instanta a conceptului respectiv. Aceasta ar însemna ca în locul lui A1 sa avem asertiunea A0 :
“Un robot este compus din baza, brat si apucator”, prin subiectul “un robot” trebuind sa
întelegem caracterul de generalitate, pe care îl modelam cu cuantificatorul ∀. Obtinem atunci
pentru A0 (am pastrat predicatul ESTE_COMPONENTA, cu semnificatia deja precizata în
(3.2)):
În aceste conditii vom avea în baza de cunostinte, pentru prima asertiune din exemplul
3.1, în locul tautologiei (3.2), tautologia de mai sus, împreuna cu:
|= ROBOT(robot_1) (3.5)
Putem în mod similar considera ca obiectele baza, brat, apucator nu sunt nici ele
obiecte individuale, ci componente generice. În acest caz am putea specifica prin predicatie,
de exemplu, caracteristica de a fi brat. Ar urma sa avem un predicat drept argument în alt
predicat:
Brat: R → B (3.7)
Sunt situatii când nu toate elementele unei multimi satisfac o proprietate, dar se
cunoaste faptul ca exista cel putin un element (o instanta) care o satisface. Un asemenea caz
96 Reprezentarea cunoasterii
“Bratul avanseaza daca exista un operator care apasa butonul P si daca magazia
contine cel putin o piesa.”
În aceasta, unul din subiecte este “robot”, care a devenit în model o variabila
predicativa.
Trebuie sa identificam actiunile, relatiile în care subiectele sunt implicate si care vor
forma variabile predicative. Operatiile logice între diferitele variabile predicative le vom
determina tinând seama de anumite cuvinte de legatura din exprimarea în limbaj natural, dar
mai ales de sensul logic al asertiunilor respective. Operatia de conjunctie este reprezentata în
limbajul natural prin cuvinte ca: “si”, “de asemenea”, “cât si”. Operatia de implicatie este
determinata de cuvinte ca: “daca”, “atunci”, “când”, dar adesea aceste cuvinte lipsesc si
necesitatea folosirii ei trebuie sa o determinam din logica asertiunii: exista doua parti în
enuntul modelat, P1 si P2 , care sunt în relatia ca daca P1 este adevarat, atunci si P2 este
adevarat.
Daca în asertiunea pe care o reprezentam exista obiecte care nu sunt instante, atunci
vom folosi pentru acestea variabile individuale, care vor fi argumente ale predicatelor
(eventual, daca este vorba despre concepte modelate prin variabile functionale de aritate mai
mare ca zero, variabilele individuale pot apare si ca argumente ale acestora, ca în (3.6)).
Aproape fara exceptie aceste variabile vor trebui cuantificate, ajungându-se la formule
închise, pentru care, în conformitate cu cele aratate în paragraful 2.3.3, orice interpretare le va
evalua fie ca formule valide, sau ca formule false (deci o valoare de adevar fixata, si nu va fi
cazul unor formule realizabile). Aceasta înseamna ca trebuie sa gasim cuantificatorul care sa
lege fiecare variabila. Cuantificatorul ∀ este determinat de situatii ca: “Toti x au proprietatea
…”, sau “Este întotdeauna adevarat ca x are proprietatea …”, dar adesea aceste cuvinte nu
apar si trebuie sa ne dam seama ca asertiunea respectiva se refera la un întreg concept.
a) ∀x (P(x) ⇒ M(x))
b) ∀x P(x) ⇒ ∀x M(x) (3.9)
c) ∀x P(x) ⇒ M(x)
98 Reprezentarea cunoasterii
Exemplul 3.4. “Daca toti politicienii sunt mincinosi, atunci nici un politician nu este de
încredere.”
Putem construi usor modelul, bazându- ne pe cele doua exemple anterioare. Este vorba
despre doua asertiuni între care operatia logica este implicatia; prima asertiune este aceeasi cu
aceea din exemplul 3.2 si folosim varianta corecta de modelare, adica formula a) de la (3.9),
iar a doua asertiune este negatia celei din exemplul 3.3. În acest fel ajungem la formula:
unde variabilele predicative folosite sunt cele din cele doua exemple anterioare. Este de
observat ca în formula (3.11) nu este necesar ca variabila individuala din prima subformula sa
fie aceeasi cu aceea din a doua subformula si astfel am folosit doua variabile distincte. Totusi,
Sisteme bazate pe cunostinte 99
în acest caz întelesul nu s-ar schimba daca am folosi o singura variabila, existând însa situatii
când trebuie sa alegem cu grija variabilele individuale, ca în exemplul urmator.
si în aceeasi interpretare ca mai sus, noua formula se evalueaza la valoarea fals (nu este
adevarat ca orice numar din D care este pozitiv este si egal cu zero). Concluzia este aceea ca
folosirea repetata a aceleiasi variabile în mai multe subformule ale unei formule, determina
restrictii în plus, aspect similar, de exemplu, cu folosirea repetata a unei variabile în
programarea bazata pe reguli.
Exemplul 3.6. Fie variabila predicativa de aritate 2, VT(x, y), D multimea oamenilor,
si D interpretarea i, conform careia [VT(x, y)]i = adevarat, daca xi si yi reprezinta oameni care
satisfac conditia ca xi l-a votat pe yi (D este o anumita colectivitate). În aceste conditii fie
formulele urmatoare, care difera numai prin ordinea cua ntificatorilor:
100 Reprezentarea cunoasterii
∃y ∀x VT(x, y) (3.15)
∀x ∃y VT(x, y) (3.16)
3.2.3. Legatura între elementele componente ale unui sistem bazat pe cunostinte
si reprezentarea în limbajul calculului cu predicate de ordin întâi
7A ∧ 7B ⇒ C (3.17)
Din punct de vedere logic aceasta are mai multe forme echivalente, pe care le vom
deduce usor pe baza tautologiei:
Acestea sunt:
Faptul ca formulele (3.19) ÷ (3.23) sunt echivalente cu formula (3.17) rezulta facând
aceeasi echivalare ca în (3.18). Dintre aceste forme echivalente, variantele (3.21), (3.22) si
(3.23) nu vor putea fi materializate într-un SBC, în care partea de actiune a unei reguli va
putea fi numai sub forma unei formule conjunctive (o regula nu poate determina o actiune sau
alta).
echivalenta de mai sus, ceea ce înseamna scrierea a doua reguli de productie distincte, având
aceeasi parte de actiune cu regula de plecare si drept parti de conditie, subformulele aflate în
disjunctie în regula initiala.
C, C ⇒ D
(3.24)
D
A( a), ∀x ( A( x ) ⇒ B( x ))
(3.25)
B( a )
Un motor de inferente care admite orice forma de regula de deductie din calculul cu
predicate se numeste motor de inferente de ordin 1. Denumirea provine de la partea din logica
numita calculul cu predicate de ordin întâi. Forma generala a regulii de deductie dupa care ar
lucra un asemenea motor de inferente ar fi:
∀xA( x ), ∀ x( A( x ) ⇒ B ( x ))
(3.26)
∀xB( x)
unde A, B si x au aceeasi semnificatie ca în (3.25). Acest caz înseamna ca variabilele pot fi
folosite atât în partea de baza de fapte, cât si în aceea de baza de reguli a SBC. Un motor de
inferente care lucreaza numai dupa forma particulara (3.24) a regulii de deductie modus
ponens, ceea ce înseamna absenta folosirii variabilelor, se numeste motor de inferente de
ordin 0. Cazul intermediar, acela al motorului de inferente care foloseste forma (3.25), se
numeste motor de inferente de ordin 0,5.
Sisteme bazate pe cunostinte 103
Retelele semantice au fost pentru prima data dezvoltate de Quillian, în anul 1968,
plecând de la caracterul de asociativitate al memoriei umane; de aceea s-au numit si retele
asociative. Un obiect, eveniment sau situatie are o anumita structura ce poate fi modelata
printr-un graf. De aici, într-o retea semantica primitivele reprezentationale sunt nodurile si
arcele, care sunt si elementele acesteia, adica o retea semantica este un graf orientat si
etichetat. Atât nodurile cât si arcele sunt etichetate. Etichetele nodurilor pot fi: concepte,
instante, valori si proceduri. Arcele sunt etichetate cu relatii ce exista între noduri. Astfel, un
nod concept este unit cu un nod instanta a sa printr- un arc este-un (este-o), iar doua concepte,
dintre care unul îl cuprinde pe celalalt, sunt unite prin arcul subset (fig. 3.2).
Este de observat ca arcele este-un corespund relatiei de apartenenta, iar arcele subset
corespund relatiei de incluziune din teoria multimilor. În plus, arcele subset corespund unei
relatii tranzitive, ceea ce nu mai este valabil pentru arcele este-un. În cazul din fig. 3.3, nodul
“Ion” este un nod de tip instanta, în timp ce toate celelalte noduri reprezinta concepte (vezi si
paragraful 3.1). Arcele este-un si subset creeaza într-o retea semantica o clasificare: nodurile
de la nivelul superior se refera la conceptele generice, iar cele de la nivelul de baza vor fi
instante. O asemenea varianta de model este utila pentru reprezentarea unor universuri de
discurs în care apar clasificari – taxonomii (în acest sens arcele respective se numesc si
primitive taxonomice).
În ierarhia determinata de succesiunea arcelor de tip este-un si subset, în situatia în
care se utilizeaza un singur nivel de arce este-un, apare o posibilitate de a efectua inferente pe
baza relatiei de mostenire (tranzitivitate) din ierarhia respectiva. Astfel, în exemplul din fig.
3.3 avem:
104 Reprezentarea cunoasterii
Apucator
Actionare
Limbaj Echipament Electrica
industrial
procedural Efector
Subset Subset
Numar grd.
Actionare
Calcul mobilitate Robot Presa Hidraulica
numar gdm Procedura industrial
Este-o
Este-un Este-un
PP 1
Este-un
Limbaj de IRB R1
RAPID programare
1400 Numar elemente
mobile
Numar grd. 3
Numar cuple
mobilitate
Valoare 3 Efector
6
Pistol de
Fig. 3.4. Fragment de retea semantica vopsire
pentru un mediu industrial
Sisteme bazate pe cunostinte 105
si ajunge într-un nod de tip valoare, adica un nod ce ne da valoarea proprietatii respective. În
acest fel, în reteaua din fig. 3.4 etichetele arcelor se refera la doua tipuri de proprietati: cele
legate de apartenenta/incluziune si respectiv celelalte tipuri de proprietati. Astfel, întelesul
este acela conform caruia:
IRB 1400 este un robot industrial. Robotul industrial este echipament industrial.
Echipamentul industrial are actionare electrica.
De aici concluzia:
Robotul R1 are efector pistol de vopsire. Robotul IRB 1400 are efector apucator
(valoare mostenita de la conceptul robot industrial). Presa are actionare hidraulica. Robotul
industrial are actionare electrica (valoare mostenita de la conceptul echipament industrial).
subset pot exprima fie conditii necesare si suficiente, fie numai conditii necesare, sau
suficiente (în functie de sensul în care privim reteaua) pentru apartenenta unei instante la un
concept sau pentru incluziunea unui subconcept la un concept generic. Varianta mai putin
stricta este mai des folosita, legat de faptul ca frecvent avem cunostinte incomplete asupra
unui univers de discurs. De exemplu, putem privi reteaua din fig. 3.4 în sensul ca stim despre
robotul industrial ca este un echipament industrial, fara a sti ce alte conditii trebuie îndeplinite
pentru ca un obiect sa fie echipament industrial – a fi echipament industrial este o conditie
necesara pentru a fi robot industrial; în sens invers, daca stim despre o instanta ca este un
robot industrial, atunci vom putea spune ca este si echipament industrial - a fi robot industrial
este conditie suficienta pentru a fi echipament industrial. Nedispunând de o conditie necesara
si suficienta (nu orice echipament industrial este robot industrial), putem trage doar concluzii
de genul celor de mai sus. Pentru arcele care reprezinta proprietati diferite de apartenenta si
incluziune nu mai este vorba nici macar de conditii necesare sau suficiente. Ele exprima doar
o conditie “în general adevarata (adevarata în cele mai multe cazuri)”. De exemplu, cu referire
la reteaua discutata, un echipament industrial are cel mai adesea actionare electrica, fara ca
aceasta sa fie o conditie necesara a unui echipament industrial. În asemenea conditii aparitia
exceptiilor privind mostenirea proprietatilor este explicabila.
În cazul unei retele cu mostenire multipla efectul nefavorabil apare atunci când
valorile unora din aceste proprietati mostenite pe ramuri diferite, intra în conflict, ca în cazul
din fig. 3.5. Aici nodul Robot are doi predecesori, ambii înzestrati cu proprietatea
Functionare, cu doua valori care determina o incompatibilitate atunci când sunt mostenite de
conceptul Robot. Situatii de acest fel se rezolva de la caz la caz, fie admitând ca o proprietate
sa poata avea mai multe valori (reuniunea valorilor mostenite, pentru cazul anterior aceasta
însemnând ca un robot are sau o func tionarea automata sau telecomandata), fie, în cazul în
care este necesara o determinare univoca, va trebui sa reconstruim reteaua.
Functionare
Functionare Dispozitiv de Dispozitiv lucru
Automata Telecomandata
automatizare medii periculoase
Subset Subset
Robot i
a
Fig. 3.5. Un conflict de mostenire într-o retea semantica
Este de mentionat ca nodurile valoare pot intra si ele în ierarhia data de arcele este-un
si subset, asa cum se întâmpla în fig. 3.4. Nodul RAPID este un nod valoare pentru
proprietatea Limbaj de programare atasata nodului IRB 1400 si, în acelasi timp, este o
instanta a conceptului Limbaj procedural.
Sunt situatii când nu este cel mai eficient ca pentru o proprietate sa fie fixata în mod
direct o valoare, ci aceasta sa poata fi dedusa, atunci când este necesara, pe baza informatiilor
din reteaua semantica. Într- un asemenea caz vom folosi în reteaua semantica respectiva un
nod procedura. Pentru aceasta vom completa arcele de tip proprietate (cele diferite de este-un
si subset) cu fatete. Una din aceste fatete va contine eticheta cu numele proprietatii, iar pe a
doua fateta se va specifica daca vom gasi proprietatea ca o valoare – fateta Valoare, sau vom
Valoare Procedura
Numar grd. de mobilitate Numar grd. de mobilitate
(în cazul considerat valoarea este 6). În schimb, nodul Robot industrial are atasat un arc
Numar grade de mobilitate cu a doua fateta purtând eticheta Procedura. În acest caz arcul
respectiv ajunge în nodul Calcul numar grade de mobilitate (gdm), nod care va determina
lansarea unei proceduri ce asigura calculul numarului gradelor de mobilitate pentru un robot
la care se cunoaste numarul de elemente mobile si numarul de cuple cinematice. De exemplu,
aceasta procedura va fi activata daca trebuie aflata valoarea proprietatii numar grade de
mobilitate pentru nodul R1. În reteaua semantica din fig. 3.4 nu am folosit o reprezentare
spatiala a arcelor si daca pentru un arc corespunzator unei anumite proprietati am folosit
numai fateta Valoare, am considerat-o pe aceasta implicita si nu am mai reprezentat-o.
Rezulta cum, de la caz la caz, vor putea fi folosite cele doua posibilitati de determinare a
valorii unei proprietati – direct ca o valoarea, sau printr-o procedura atasata.
Toate retelele semantice pe care le-am prezentat pâna acum au avut rolul de a preciza
relatii exis tente între anumite instante si concepte, relatii determinate de structura sau de
definirea acestora. Despre aceste retele semantice se spune ca sunt de tip definitional sau
structural sau inferential [Sow 91], [Leh 92]. Ultima caracterizare provine din aceea ca o
asemenea retea semantica ne permite sa efectuam în mod eficient inferente, folosind concepte
ce au atasate proprietati si tinând seama de apartenentele la diferitele concepte; constructia
unei asemenea retele se bazeaza pe arcele Este-un si Subset si pe proprietati atasate la nivelul
ierarhic potrivit. Spre deosebire de acestea, exista si retele semantice numite descriptive sau
asertionale care descriu o stare de fapt existenta la un moment dat. Fara a intra în detaliile
modelarii timpului, putem observa ca retelele semantice structurale sunt mai putin dependente
de timp (cu referire la fig. 3.5, un robot este întotdeauna un dispozitiv de automatizare), în
timp ce o retea semantica asertionala se refera la un eveniment având loc la un anume
moment de timp; de aceea, pentru acestea se foloseste si denumirea de retele evenimentiale.
Ele vor apare ca structuri de tip stea: un nod de tip eveniment din care pleaca arce spre
participantii la eveniment. Nu trebuie însa înteles despre cele doua clase de retele
(definitionale – asertionale ) ca sunt mutual exclusive, asa cum va rezulta si din exemplul
urmator, în care vor fi folosite ambele tipuri.
Exemplul 3.10. În fig. 3.7 este reprezentat printr-o retea semantica universul de discurs
pentru care în calculul cu predicate am folosit modelul dat de formulele (3.4), (3.5) si (3.8);
vom putea observa deosebiri între cele doua variante, ca si avantajele pe care le aduc fiecare.
În fig. 3.7 apare o retea la care portiunea de sus are un caracter structural, iar cea de jos unul
asertional. Apar o serie de completari în ceea ce priveste modelul de retea semantica.
Astfel, o problema care apare este aceea a aritatii relatiilor ce pot fi modelate în
aceasta varianta de reprezentare a cunoasterii. Într-o retea semantica, tinând seama ca folosim
arce legând doua noduri, sunt usor de exprimat relatiile binare (cu doua argumente); facând
corespondenta cu calculul cu predicate va fi vorba despre variabile functionale sau predicative
Sisteme bazate pe cunostinte 109
Componenta Robot
Baza
Brat_robot_1
Componenta Este-un
Apucator
Componenta
Componenta
Robot_1
Brat
Agent
Tip
2-Conjunctie Eveniment_2 Preconditie
Eveniment_1
Argument Argument
Actiune
Eveniment_4
Eveniment_3
Avanseaza
Agent
Actiune Obiect Agent Obiect
Actiune
binare. De exemplu, arcul care leaga în reteaua din fig. 3.7 Robot_1 de Brat_robot_1
corespunde unei variabile predicative cu doua argumente: Componenta(Robot_1,
Brat_robot_1). În practica vor apare însa si relatii cu un numar de argumente diferit de 2; fara
a exista o standardizare neta în acest sens, fig. 3.7 prezinta o solutie posibila. Astfel, formula
(3.5) din modelul din calculul cu predicate, care facea apel la o variabila predicativa cu un
singur argument, a fost modelata în reteaua semantica prin arcul Este-un aflat între nodurile
Robot_1 si Robot. Solutia a constat în introducerea unei noi primitive reprezentationale –
Este-un. Aceasta ne va ajuta sa modelam anumite tipuri de formule constituite din predicate
cu un singur argument. Într-un mod similar vom rezolva si o situatie de forma:
|= Sigur_în_functionare(Robot_industrial) (3.27)
Formula de mai sus va putea fi modelata prin una din cele doua variante din fig. 3.8.
De data aceasta a fost vorba de un arc ce reprezinta o proprietate care nu se refera la
apartenenta/incluziune si care ajunge în nodul valoare corespunzator. Cele doua solutii difera
prin aceea ca în cazul a) am descompus predicatul din formula (3.27) într-o proprietate si
valoarea acesteia, în timp ce în cazul b) am pastrat predicatul respectiv si am introdus eticheta
Proprietate pe arcul dintre cele doua noduri. Este de remarcat faptul ca în acest ultim caz, ca
si în situatia modelarii din fig. 3.7 a formulei (3.5), notiunile Proprietate si respectiv Este-un
110 Reprezentarea cunoasterii
au un caracter de metacunostinte,
Functionare fiind deasupra cunoasterii legate de
Robot_industrial Sigura
universul de discurs avut în lucru.
a)
Un aspect deosebit a fost si
Proprietate Sigur_în_ acela al transpunerii în reteaua
Robot_industrial functionare semantica a formulei (3.4). Fara a
b) mai lua în considerare cuantificatorul
Fig. 3.8. Doua posibilitati de modelare pentru universal, aici ar fi fost necesara o
un predicat de aritate 1 variabila predicativa cu 4 argumente:
Partea de jos a retelei semantice din fig. 3.7 corespunde unei retele de tip asertional
(evenimential); se reprezinta starea de fapt corespunzatoarea evenimentelor modelate în
calculul cu predicate prin formula (3.8). În retea exista dedicat câte un nod pentru un
eveniment si din acestea pleaca arce reprezentând elementele implicate în fiecare eveniment.
Arcele respective se numesc legaturi (relatii) cazuale, denumirea provenind de la cazurile
gramaticale; daca punctul de plecare a fost analiza gramaticala, ce poate facilita sistemele de
întelegere a limbajului natural, relatiile cazuale din retelele semantice sunt atasate în functie
Sisteme bazate pe cunostinte 111
de semnificatia (semantica, rolul) participantilor unui eveniment. Relatiile cazuale cele mai
des folosite sunt :
O parte din aceste tipuri de arce pot fi urmarite pe exemplul din fig. 3.7. Este de
remarcat felul în care sunt plasate în jurul unui nod care reprezinta un eveniment, cu ajutorul
arcelor reprezentând relatii cazuale, toate cunostintele cu privire la acel eveniment. În functie
de universul discursului descris vor
Aduce
putea fi necesare si alte tipuri de
Actiune relatii cazuale, ca: Scop, Loc, Timp,
Receptor Obiect Piesa Durata, Distanta, a caror definitie
Operatorul Eveniment_1
este evidenta. Felul în care sunt
Agent folosite relatiile cazuale este
G ilustrat si de exemplul urmator.
a)
Robotul
Exemplul 3.11. Sa se
Pune
reprezinte, prin retele semantice,
Actiune evenimentele corespunzatoare
Receptor Obiect urmatoarelor formulari în limbaj
Robotul Eveniment_2 Piesa
natural:
Agent
G a) Robotul aduce piesa
b)
Operatorul
operatorului.
Fig. 3.9. Retelele semantice asertionale b) Operatorul pune piesa
corespunzatoare exemplului 3.11 robotului.
Reprezentarile corespunzatoare sunt cele din fig. 3.9, remarcându-se felul în care au
intervenit relatiile cazuale Agent, Obiect si Receptor. Trebuie sa observam diferenta calitativa
între nodurile unei retele semantice structurale si cele ale unei retele asertionale. În primul caz
fiecare nod are si o semnificatie independenta de celelalte elemente ale retelei si aceasta
112 Reprezentarea cunoasterii
permite ca orice fragment de retea sa poata fi folosit într- un anume rationament (de exemplu,
în cazul din fig. 3.4 pot izola 3 noduri si spune ca: “PP1 este o presa si are actionare
hidraulica”), în timp ce într-o retea asertionala trebuie preluate într-un rationament toate
nodurile si arcele din jurul unui nod eveniment. În acest sens despre nodurile dintr-o retea
semantica structurala se spune ca sunt noduri individuale, în timp ce acelea dintr-o retea
evenimentiala sunt noduri propozitionale. Diferenta dintre acestea este explicabila prin aceea
ca unele reprezinta relatii binare, iar celelalte (în retelele asertionale) relatii n-are, privite în
forma binara a arcelor.
si o transpunere similara va avea orice arc Subset. Daca luam cazul unei proprietati atasate
unui concept, asa cum este în fig. 3.8a proprietatea Functionare atasata conceptului
Robot_industrial, formula corespunzatoare în calculul cu predicate este:
Din cele prezentate rezulta posibilitatea echivalarii între o retea semantica si un model
în calculul cu predicate. În practica o asemenea operatie nu este întotdeauna facila. Astfel,
sunt mai dificil de reprezentat într-o retea semantica cuantificatorii si operatiile logice. Fara a
intra în detalii [Sow 91], [Leh 92], [Fin 79], [Ric 91] negatia poate fi reprezentata printr-un
arc etichetat în mod corespunzator, care sa lege o entitate si negatia acesteia, iar în ceea ce
priveste conjunctia si disjunctia un exemplu de rezolvare este acela din fig. 3.7. Pentru
cuantificatori, materializarea este una implicita, asa dupa cum s-a explicat mai sus pentru ∀,
Sisteme bazate pe cunostinte 113
sau dupa cum, în mod implicit, cuantificatorul ∃ este subînteles pentru partea de retea
semantica evenimentiala a fig. 3.7 – a se face comparatia cu formula (3.8). De asemenea, vom
putea sa pune m în corespondenta un cuantificator ∃ dintr-o formula cu un nod instanta dintr-o
retea semantica. În legatura cu aceasta comparatie, mostenirea cu restrictii practicata într-o
retea semantica este un aspect care nu poate fi încadrat în logica predicatelor de ordin întâi
(este vorba despre folosirea unor logici de ordin superior, în combinatie cu un rationament de
tip nemonoton).
În ceea ce priveste inferentele care se pot face pe o retea semantica, un tip important se
refera la determinarea unei anumite proprietati pentru un nod, tinând seama de ierarhia din
reteaua semantica si de mostenirea proprietatilor. Implementarea unei asemenea inferente
înseamna de fapt gasirea unui algoritm, care primind la intrare numele unui nod si numele
unei proprietati, sa determine la iesire raspunsul DA si valoarea proprietatii, atunci când
conceptul sau instanta reprezentata prin acel nod are proprietatea specificata si raspunsul NU
în caz contrar. Algoritmul corespunzator, în care N este nodul de intrare si P numele
proprietatii, este de urmatoarea forma:
Algoritm 3.1.
În algoritmul de mai sus am marcat prin indentare corpul buclei de tip while si
respectiv portiunile cuprinse pe ramurile daca – atunci. Folosirea unei structurii de tip coada
(FIFO) în acest algoritm determina o cautare în largime, si nu în adâncime, în graful
reprezentat de reteaua semantica, varianta mai eficient în acest caz, în comparatie cu o cautare
în adâncime.
114 Reprezentarea cunoasterii
O alta modalitate de a efectua inferente pe o retea semantica se poate obtine prin asa
numitul mecanism de potrivire (în engleza: “matching” sau “pattern matching”). Astfel,
având o baza de cunostinte organizata ca retea semantica, se va construi un fragment de retea
de acelasi tip (folosind aceleasi primitive reprezentationale), drept rezultat al cautarii unei
piese de cunoastere, cum ar fi de exemplu cazul într-un sistem de interogare dintr- un anumit
domeniu. Întrebarea care a condus la fragmentul de retea semantica determina ca în aceasta sa
existe elemente – noduri si/sau arce neprecizate. Printr-un proces de potrivire între fragmentul
construit si reteaua semantica de baza rezulta atribuirea (legarea) de valori pentru elementele
neprecizate, dupa cum se ilustreaza în exemplul urmator.
Exemplul 3.12. Pe baza retelei semantice din fig. 3.7 se poate gasi raspunsul la
întrebarea: “Cine apasa
? butonul P ?” Corespunzator
acestei întrebari se
Agent construieste fragmentul de
Actiune Obiect retea semantica evenimentia-
Apasa Eveniment_? Buton_P la din fig. 3.10, în care nodul
eveniment nu are fixat un
Fig. 3.10. Fragment de retea semantica rezultat de la un index si nici nodul în care
sistem de interogare a unei baze de cunostinte
ajunge arcul Agent nu este
precizat. Prin potrivirea pe
reteaua din fig. 3.7, nodul eveniment se suprapune peste nodul Eveniment_3 din reteaua de
baza, iar nodul agent capata eticheta Operator, obtinându-se astfel raspunsul la întrebare.
În functie de specificul universului de discurs mai pot apare si alte tipuri de inferente
pe retelele semantice; materializarea acestora în programe va presupune construirea a diferiti
algoritmi de parcurgere a grafului retelei semantice, algoritmi ghidati de cunostintele
înmagazinate în retea. Daca retelele semantice reprezinte modele în care cunostintele apar
într-o maniera structurata, un grad sporit al acestei structurari se obtine în cazul reprezentarii
prin cadre.
Modelul de cadru (în engleza “frame”) a fost introdus de catre Minsky [Gia 89],
plecând de la ideea ca inteligenta presupune frecvent folosirea unor scheme de cunoastere,
bazate pe o experienta anterioara în domeniul problemei ce se rezolva, scheme cu ajutorul
carora se interpreteaza noile situatii ivite; adesea, comportarea inteligenta presupune, nu o
rezolvare “de la zero”, ci o adaptare a unor tipare (prototipuri) deja acumulate. Aceasta
înseamna ca acest model este mai ales adecvat pentru a reprezenta cunostinte cu un caracter
stereotip: caracteristici obisnuite ale obiectelor si relatii tipice între obiecte.
Sisteme bazate pe cunostinte 115
a) default
b) if-needed
c) if-added
d) if-removed
Fateta default este cea care precizeaza valoarea cea mai asteptata (probabila) a unei
caracteristici. Daca valoarea unei caracteristici nu este data explicit, sau nu apare o indicatie
de folosire a unei alte fatete, atunci valoarea ce va fi considerata va fi aceea data de fateta
default. De exemplu, cu referire la cadrul din fig. 3.11, Efectorul unui robot industrial va avea
valoarea Apucator, iar Nr_grade_mobilitate va avea valoarea 6, daca nu apare o indicatie de
folosire a fatetei if-needed.
Fateta if-needed, la activare, ceea ce se întâmpla conform denumirii “în caz de
nevoie”, adica de obicei atunci când apare o contraindicatie privind folosirea fatetei default,
va determina executia unei proceduri. Aceasta, folosind informatiile existente în baza de
cunostinte (de exemplu, în cadrul respectiv sau în alte cadre), poate sa determine valoarea
Sisteme bazate pe cunostinte 117
caracteristicii la care este atasata fateta if-needed. În cazul considerat în fig. 3.11, fateta if-
needed atasata caracteristicii Nr_grade_mobilitate va folosi, printr-o procedura
corespunzatoare, valorile caracteristicilor Nr_cuple si Nr_elemente_mobile.
Fatetele if-added si if-removed sunt activate la introducerea, respectiv îndepartarea
valorii caracteristicii la care sunt atasate; în acest sens, despre aceste fatete se spune ca au un
rol de triggere, deoarece sunt declansate de schimbarile care se produc în baza de cunostinte.
În exemplul anterior, fatetele if-added atasate caracteristicilor Producator si Tip_robot
determina la introducerea valorilor respective o verificare si o corelare a acestora. Pentru
aceasta poate exista un cadru privind producatorii de roboti industriali, care sa contina
informatiile necesare acestor doua proceduri. Caracteristica Limbaj_programare are atasata
atât o fateta if-added, care va verifica versiunea pentru valoarea adaugata, cât si o fateta if-
removed, care va fi activata la îndepartarea valorii caracteristicii respective. Într-o asemenea
situatie, adica atunci când este vorba despre un robot ce nu este dotat cu limbaj de
programare, procedura atasata fatetei if-removed va actualiza în mod corespunzator valoarea
caracteristicii Clasa_robot.
Procedurile atasate fatetelor unui cadru se numesc si demoni, ele intrând în executie la
momentul potrivit. Din acest punct de vedere cadrele pot fi folosite pentru materializarea
programarii orientate pe evenimente, în cazul în care evenimentele de interes determina
modificarea valorii acelor caracteristici care activeaza demonii. Putem concluziona asupra
existentei a sase modalitati distincte de obtinere a valorii unei caracteristici: cea explicita, cele
corespunzatoare celor patru tipuri de fatete enumerate mai sus, si cea prin mostenire. Din
punct de vedere al clasificarii cunoasterii (vezi paragraful 1.4), combinarea tuturor acestor
variante înseamna ca un cadru îmbina o cunoastere de tip declarativ, data prin continutul
initial al cadrelor si ceea ce se obtine prin mostenire, cu una de tip procedural, data prin
demoni.
Un cadru poate avea un caracter generic, asa cum este cel prezentat anterior, el
corespunzând întregii clase de roboti
Nume_cadru: Robot_IRB1400 industriali, sau poate fi un cadru
Este-un specific unei anumite instante. Astfel,
Robot_industrial
din cadrul anterior, poate fi generat un
Producator ABB Robotics cadru pentru o anumita instanta de
Tip_robot IRB1400 robot, prin completarea corespunza-
toare a valorilor caracteristicilor – vezi
Clasa_robot Programabil fig. 3.12. Aceasta se realizeaza fie de
catre cel care dezvolta baza de
Nr_grade_mobilitate 6
cunostinte, sau de catre partea de
Limbaj_programare RAPID 0.3 motor de inferente a bazei de
cunostinte, si va implica activarea
Fig. 3.12. Cadrul pentru robotul IRB 1400 diferitelor proceduri atasate fatetelor.
118 Reprezentarea cunoasterii
demonii pot cauza punerea în executie a unor reguli; exista sisteme de programare, ca de
exemplu KEE (Knowledge Engineering Environment) [Gia 89], [Pop 94] care îmbina cadrele
cu regulile de productie, acestea putând determina rezolvarea unei probleme, afisarea unor
explicatii sau adresarea de întrebari utilizatorului.
La fel cum la retelele semantice existau cele doua tipuri – structurale si asertionale – si
cadrele pot fi folosite pentru a reprezenta evenimente. Pentru cadrele destinate acestui scop se
foloseste denumirea de scenarii (în engleza: “scripts”). Exista unele aspecte particulare ale
cadrelor folosite ca scenarii; desi se pleaca de la aceeasi idee de baza, aceea a caracterului
stereotip al unor situatii, la scenarii se accentueaza asupra relatiei de cauzalitate, tinând seama
de faptul ca evenimentele apar cel mai frecvent într-o înlantuire conditionata cauzal si nu în
mod izolat.
Astfel, un scenariu este o structura prin care se descrie o secventa de evenimente,
secventa care are un caracter stereotip pentru un anumit context. Organizarea este aceea a
cadrelor, cu numele scenariului pentru identificarea structurii si perechile caracteristica –
valoare; de asemenea, vor fi folosite aceleasi tipuri de fatete ca la cadre. Un exemplu de
scenariu este prezentat în fig. 3.13.
Exista o serie de caracteristici specifice pentru evenimente (asa cum erau relatiile
cazuale în retelele semantice asertionale), pe care le vom regasi într-un scenariu; cele mai
frecvent utilizate sunt ilustrate în exemplul considerat pentru evenimentul cu numele Curs.
Acestea sunt:
Nume_scenariu: Curs
Tip Eveniment_educational
Default: {cadru_didactic, studenti}
Agenti
If-needed: Cursanti
Obiecte Sala_curs
Preconditii {programa_analitica, orar, prelegere}
Default: Agentii sunt obositi
Rezultate
If-needed: Chestionare agenti
Scena1 Intrare studenti în sala_curs
• Tip – care precizeaza categoria din care face parte evenimentul modelat; aceasta
caracteristica pare apropiata de Subset, folosita la cadre sau retele semantice. În adevar, ea
arata faptul ca exista trasaturi comune cu acelea ale unui concept mai general, dar spre
deosebire de cazul lui Subset, într-un scenariu nu mai sunt preluate toate caracteristicile de la
conceptul predecesor. În cazul considerat, pot fi caracteristici în scenariul pentru
Eveniment_educational care sa nu apara (sa nu fie mostenite) în scenariul Curs.
• Agenti – precizeaza agentii (ca elemente animate, cele care executa actiunile), care
participa la evenimentul modelat.
• Obiecte – precizeaza entitatile neanimate, care sunt implicate în evenimentul
respectiv.
• Preconditii – fixeaza conditiile ce trebuie îndeplinite înainte ca evenimentul
reprezentat sa poata avea loc. În exemplul din fig. 3.13 aceasta caracteristica are ca valoare o
multime formata din trei elemente; de fapt, exemplul este unul principial si în practica va
trebui sa existe o parte procedurala, care sa fie activata de elementele multimii respective,
verificând includerea cursului în programa analitica si în orar, si faptul ca exista o prelegere
pentru sustinere.
• Rezultate – arata conditiile care vor fi îndeplinite (vor fi valide) dupa producerea
evenimentului modelat.
• Scena – reprezinta, într-o secventa ordonata în conformitate cu desfasurarea
cronologica, elementele ce compun evenimentul. Acestea sunt la rândul lor evenimente, astfel
ca, la fel ca la cadre, putem avea drept valoare a unei caracteristici a unui scenariu un alt
scenariu.
Din fig. 3.13 se remarca prezenta si într-un scenariu a fatetelor default si if-nedeed, si
în functie de specificul evenimentului reprezentat pot apare si celelalte tipuri de fatete. Si aici
sunt prezente procedurile atasate (demonii); în exemplul comentat este vorba de procedurile
cu numele Cursanti, Chestionare_agenti si Insucces, care determina rezolvarea situatiilor în
care în desfasurarea evenimentului a aparut o contraindicatie fata de cazul cel mai obisnuit.
Este de observat ca în cazul procedurii Insucces, lansarea acesteia este precedata de testarea
unei conditii. Concluzia este cea mentionata deja la cadre: se obtine o combinatie între
reprezentarea si folosirea unor cunostinte de tip declarativ si procedural. Scenariile si cadrele
pot fi combinate; de exemplu, în fig. 3.13 Sala_curs poate fi numele unui cadru, ceea ce
înseamna ca un cadru este apelat din interiorul unui scenariu. Din punct de vedere al
organizarii, cele doua variante de model sunt identice si un scenariu poate fi privit ca un
cadru, în care aspectul deosebit este acela al indexarii dupa parametrul timp pentru
caracteristicile Scena. Atât prin aceasta ordonare, prin caracteristicile Preconditii si Rezultate,
cât si prin legaturile între diferite scenarii, determinate de aparitia numelui unui scenariu într-
un alt scenariu (de exemplu, Intrare studenti în sala_curs poate fi numele unui scenariu care
modeleaza tipicul acestui eveniment si care este invocat drept valoare pentru Scena1 în
exemplul din fig. 3.13) este posibila modelarea unor relatii de cauzalitate. De altfel, chiar
Sisteme bazate pe cunostinte 121
construirea unui scenariu se bazeaza pe cauzalitate, deoarece aceasta determina anumite tipare
în desfasurarea evenimentelor.
needed vor determina o cautare înapoi, în cursul careia se vor putea accesa mai multe
cadre/scenarii, pâna la satisfacerea scopului de gasire a valorii caracteristicii ce a declansat
cautarea. Cei corespunzatori fatetelor if-added si if-removed vor determina în mod frecvent o
cautare înainte, în sensul ca adaugarea/stergerea unei valori poate declansa o întreaga
secventa de reguli ale unor demoni ce actualizeaza valori din acelasi model sau din alte
cadre/scenarii, aflate în legatura cu elementul declansator. Aici procesul este condus de datele
adaugate sau eliminate din baza de cunostinte, adica principiul este acela al cautarii înainte.
Într-un SBC exista, conform celor precizate în primul capitol, cele doua parti
importante: baza de cunostinte si motorul de inferente, principial ele fiind responsabile de
modelarea universului de discurs si respectiv de efectuarea rationamentelor. Aceste doua
componente si aspectele pe care le rezolva se afla în interdependenta. Din acest punct de
vedere, folosirea în realizarea bazei de cunostinte a modelelor de tip structurat prezinta
avantajul ca acestea faciliteaza pentru multe cazuri de univers de discurs procesul de
inferenta. Ideea este aceea ca sintaxa acestor modele reflecta mai bine decât varianta
calculului cu predicate structura inferentiala a cunostintelor modelate. Este vorba de faptul ca
o reprezentare de tip graf (cadrele/scenariile pot fi si ele privite în acest fel, arcele fiind
subîntelese între caracteristici si valorile acestora, si între cadre care refera unul la altul)
faciliteaza inferentele, prin aceea ca arcele reprezinta în mod direct dependentele dintre
entitati, dependente ce vor putea fi folosite în efectuarea rationamentelor. În plus, reducerea
mecanismelor inferentiale la probleme de parcurgeri ale unor grafuri are si avantajul ca
permite implementarea eficienta prin programare. Preferarea modelelor de tip structurat poate
fi sustinuta si de o materializare de tip paralel [Sow 91], în care nodurile retelei semantice sa
reprezinte unitati de procesare.
Nu trebuie însa sa întelegem ca aceste modele rezolva chestiunea complexitatii
calculelor pentru problemele de IA; daca efectuarea rationamentelor, asa cum apare ea într-o
modelare în calculul cu predicate si într-o implementare de tip demonstrator automat de
teoreme, este de complexitate exponentiala, ea se va pastra si în cazul unei retele semantice,
prin numarul mare de noduri si arce la care se va ajunge în aceasta. De exemplu, se ajunge la
aceeasi explozie combinatoriala amintita la demonstrarea automata a teoremelor, în situatia în
care o retea semantica este folosita într-o baza de cunostinte a unui sistem de interogare, si
acesta a primit o întrebare la care raspunsul este negativ; într-un asemenea caz, toate, sau
majoritatea arcelor retelei vor trebui parcurse înainte de a se furniza raspunsul respectiv.
contradictia este eliminata. Se aplica regula precizata anterior pentru determinarea valorii unei
proprietati si prin aceasta, în mod univoc, un robot industrial are pret mare, iar un regulator
are pret mic.
Modelele structurate, si dintre ele în primul rând cadrele si scenariile, sunt adecvate
pentru a reprezenta cunostinte cauzale, prin aceea ca succesiunea scenelor sau legaturile care
se fixeaza între cadrele/scenariile ce compun baza de cunostinte pot fi realizate conform
relatiilor cauza efect. Tot un avantaj este si acela ca aceste modele pot ghida procesul de
inferenta si deci solutionarea unei probleme pe baza experientei în domeniul respectiv; din
acest punct de vedere aceste variante se apropie de modelul de reprezentare a cunoasterii
bazat pe reguli.
Se poate spune, în concluzie la aceste avantaje ale modelelor structurate, ca o parte din
elementele acestora s-au impus în prezent în programare; este vorba despre programarea
orientata pe obiecte, în care apar perechile atribut – valoare corespunzatoare organizarii
caracteristicilor din cadre si cu o comportare similara din punct de vedere al mostenirii cu
aceea a cadrelor si retelelor semantice; de asemenea, în programarea orientata pe obiecte se
folosesc frecvent elemente cu semnificatia fatetelor default si if- needed din cadre.
Sisteme bazate pe cunostinte 125
Aceasta varianta de model de reprezentare a cunoasterii este cea care sta la baza
functionarii SE. Din acest punct de vedere modelul respectiv a evoluat, o data cu dezvoltarea
SE, si a suferit completari în ideea cresterii performantelor SE. De asemenea, au aparut
influente asupra SE din partea celorlalte modele de reprezentare a cunoasterii; baza de fapte si
cea de reguli pot fi analizate pe baza modelului calculului cu predicate, si aceste componente
ale unui SE au preluat unele aspecte ale organizarii cunostintelor de la modelele structurate.
Se explica astfel de ce unii autori nu mai considera sistemele de reguli de productie ca o
varianta de model pe care sa o trateze distinct în capitolul de reprezentare a cunoasterii. În
plus, o justificare în acest sens provine si din aceea ca la acest tip de model partea de
reprezentare a cunoasterii este mai mult dependenta si influentata de partea de efectuare a
rationamentelor, astfel ca descrie rea sistemele de reguli de productie este uneori inclusa în
capitolul privind rationamentele în sistemele de IA.
Totusi, pentru o prezentare completa a metodelor de reprezentare a cunoasterii ramâne
utila includerea sistemelor de reguli de productie în acest capitol. Asa cum am mentionat si în
paragraful 1. 8, regulile de productie îsi au originea în sistemele care se bazeaza pe un set de
transformari succesive ale unui context initial, asa cum sunt gramaticile formale sau
automatele finite. Structura si principiul de utilizare a regulilor dintr-un SE sunt aceleasi cu
ale regulilor de productie (derivare) dintr-o gramatica [Rus 83], sau cu functia de tranzitie a
unui automat finit [Hut 83]. În acest sens, partea de conditie a unei reguli se mai numeste si
parte contextuala, ea indicând contextul (starea) în care regula este aplicabila, iar cea de
actiune se numeste si parte transformationala, prin aceea ca determina modificarea
contextului.
Ca forma sintactica, o regula poate fi comparata si cu o instructiune IF … THEN din
programarea conventionala. Din punct de vedere al functionalitatii, deosebirea este însa neta:
momentul în care se executa instructiunea IF … THEN este strict dependent de locul unde este
ea plasata în program; în contrast, într-un SE atât ordinea faptelor în baza de fapte, cât si a
regulilor în baza de reguli nu au nici o importanta; regulile devin active pe baza mecanismului
de control din motorul de inferente, care este complet separat de baza de cunostinte. Se
completeaza astfel ideea mentionata în 1.6, aceea ca în sistemele ce folosesc programarea
bazata pe reguli exista o separare între cunostintele privind domeniul problemei si cele de
control al executiei, ceea ce în cazul instructiunii IF … THEN, si în general în programarea
imperativa, nu se întâmpla.
Asa dupa cum am aratat în 3.2.3, partea de conditie si cea de actiune a unei reguli, ca
de altfel si faptele din memoria de lucru, pot fi privite ca formule din calculul cu predicate. O
alta legatura se poate face între tiparele unei reguli si perechile caracteristica – valoare
dintr- un cadru. De exemplu, asa stau lucrurile în regula urmatoare:
Sisteme bazate pe cunostinte 127
în care tiparele pot fi vazute ca si elemente (perechi caracteristica – valoare) ale unui cadru ce
reprezinta cunoasterea despre un sistem de fabricare a cimentului [Pan 98]. Daca în exemplu
de mai sus este vorba despre un cadru corespunzator unei instante, în situatia în care în
tiparele regulii sunt folosite variabile, corespondenta va fi cu un cadru generic, si procesul de
potrivire pe faptele din memoria de lucru (organizate dupa o structura de cadru) va determina
legarea (atribuirea) variabilelor. Se ilustreaza astfel cum pot fi combinate modelele de cadru si
reguli de productie.
Daca facem corelatia cu cele expuse în paragraful 3.1, atunci este de remarcat ca
pentru sintaxa modelului sistemelor de reguli de productie trebuie sa avem în vedere corelatia
128 Reprezentarea cunoasterii
cu partea de efectuare a inferentelor. Sintactic, regulile trebuie concepute în asa fel încât sa se
poata corela cu faptele si sa asigure functionarea motorului de inferente. Astfel, fara a intra în
detaliile de implementare ale unui sistem de reguli productie, un sistem construit dupa acest
model va contine componentele precizate în 1.8, cele care alcatuiesc cazul obisnuit de SE:
baza de fapte, baza de reguli si motorul de inferente. Acestea se gasesc în interdependenta
explicata în primul capitol, si obtinerea acestei corelatii va presupune ca la realizarea unui
sistem dupa modelul discutat sa fie parcurse urmatoarele etape:
Acesti trei pasi formeaza un ciclu si de obicei este necesar ca acesta sa se repete de
mai multe ori, pâna se ajunge la o varianta optima. Aceasta metoda va fi ilustrata pe un caz
concret, în capitolul al cincilea.
Deoarece în cazul organizarii cunostintelor dupa acest model exista cele trei unitati
distincte esentiale: baza de fapte, baza de reguli si motorul de inferente, sintaxa si semantica
pentru sistemele de reguli de productie pot fi întelease numai daca luam în considerare si felul
în care functioneaza motorul de inferente. Aici este vorba despre cele doua clase de metode de
control al procesului de efectuare a inferentelor în sistemele de IA, cautare înainte si cautare
înapoi. Principiile acestor doua variante au fost descrise în paragrafele 1.8, respectiv 1.4.2.
Trebuie observat ca, în prezent, un avantaj al folosirii acestei variante de model în realizarea
unui SBC este si acela ca exista medii software care pun la dispozitia programatorului
motoare de inferente performante. Asa este CLIPS, ca exemplu lucrând dupa cautarea înainte
(amanunte privind ciclul de lucru al acestui motor vor fi date în capitolul 5) si PROLOG
pentru cautarea înapoi. În aceste conditii utilizatorului îi ramâne numai sarcina de a construi
baza de cunostinte, iar mecanismul pentru efectuarea rationamentelor este deja codificat.
O problema care trebuie amintita este aceea a deosebirii de principiu între cele doua
tipuri de motoare de inferente. Aceasta ne va ajuta sa întelegem tipurile de probleme (tipurile
de cunoastere) care pot fi abordate printr-o cautare (înlantuire) înainte, respectiv cele pentru
care este eficient sa utilizam un sistem lucrând dupa cautarea înapoi. Distinctia este aceea a
punctului de plecare: strategia cautarii înainte pleaca de la fapte (date) si urmareste mai întâi
Sisteme bazate pe cunostinte 129
partile de conditie ale regulilor, iar strategia înapoi pleaca de la scop si urmareste mai întâi
partile de consecinta ale regulilor. De aceea pentru sistemele lucrând dupa strategia înainte se
foloseste si denumirea de sisteme de reguli de productie conduse de date, iar pentru cele
folosind strategia înapoi, termenul este de sisteme conduse de scop. Sunt necesare câteva
comentarii, pentru a întelege si alte elemente pe care le atrage deosebirea mentionata.
În cautarea înainte se pleaca de la faptele existente în memoria de lucru si se urmareste
deducerea tuturor concluziilor posibile, tinând seama de implicatiile modelate de regulile din
baza de reguli (vezi si 3.2.3); desigur, în efectuarea rationamentelor, regula de deductie care
se aplica este modus ponens. În mod obisnuit concluziile respective trebuie sa fie tot sub
forma de fapte si acestea, adaugate în memoria de lucru, vor putea initia noi aplicari ale
regulii modus ponens, situatia de oprire, daca nu intervin alte restrictii, fiind aceea când nici o
concluzie nu mai poate fi adaugata. În contrast, la strategia înapoi, plecam de la o singura
concluzie pe care vrem sa o dovedim. Acesta este asa numitul scop al sistemului de reguli de
productie lucrând dupa strategia înapoi, si cautarea ce se declanseaza este aceea a tuturor
implicatiilor (regulilor) care pot conduce la dovedirea scopului. Este vorba tot despre aplicare
regulii modus ponens, dar în forma în care sistemul constata coincidenta dintre un scop si
subformula implicata de regula modus ponens, încercând apoi, într-o înlantuire înapoi,
validarea deductie respective. Cu referire la formula (3.24), suntem aici în cazul în care scopul
este reprezentat de formula D, în baza de reguli existând implicatia:
C⇒D (3.31)
si atunci sistemul trebuind sa dovedeasca validitatea faptului exprimat prin formula C. Daca,
drept urmare a existentei unui fapt în memoria de lucru, sau prin folosirea altor reguli în
aceeasi înlantuire înapoi, se dovedeste ca formula C este valida, înseamna, conform regulii
modus ponens, ca scopul D este dovedit. De aici apare si deosebirea ca, la un sistem de reguli
lucrând dupa cautare înapoi, în memoria de lucru trebuie sa se gaseasca initial si scopul de
dovedit. Dupa cum la cautarea înainte un fapt putea declansa mai multe inferente, activând
mai multe reguli, tot asa si la cautarea înapoi un scop poate determina mai multe inferente.
Cazul banal este cel în care nu se activeaza nici o regula, prin aceea ca scopul coincide cu un
fapt deja prezent în baza de fapte si deci nu mai trebuie dovedit, sau scopul nu poate fi facut
sa coincida cu nici una din consecintele regulilor, când el este imposibil de dovedit;
corespondentul acestui caz în cautarea înainte este acela în care faptele din memoria de lucru
nu satisfac nici una din partile de conditie ale regulilor. Prin efectuarea mai multor inferente la
cautarea înapoi, va fi posibil, de exemplu, sa se gaseasca toate raspunsurile la o întrebare,
atunci când sunt mai multe fapte care sa dovedeasca scopul – întrebarea propusa.
130 Reprezentarea cunoasterii
Mai este de subliniat o diferenta privind acest mecanism al efectuarii inferentelor. Desi
în ambele variante este vorba de regula modus ponens, în cautarea înainte fiecare aplicare a ei
determina o concluzie valida, în timp ce la cautarea înapoi suntem în situatia de a dovedi
posibilitate de aplicare a regulii de deductie respective. Sistemul încearca probarea unui scop,
pleaca cu o implicatie de forma (3.31) si poate fi în cazul în care esueaza în dovedirea
validitatii formulei C. Într-o asemenea situatie sistemul trebuie sa revina la scopul (sau
subscopul) care a determinat esecul, sa gaseasca alte reguli ce l- ar putea dovedi (deci tot de
forma (3.31) dar cu alte subformule în locul lui C) si sa reia procesul. Din punctul de vedere
al implementarii, aceasta se traduce în aceea ca motorul de inferente al unui sistem de reguli
de productie lucrând dupa strategia înapoi trebuie sa fie capabil sa foloseasca un mecanism de
backtracking [Liv 86]; aceasta este o complicatie pentru motoarele de inferente respective,
care nu apare în cazul acelora destinate sistemelor lucrând dupa cautare înainte. Se obtine
totusi si un avantaj pentru sis temele cu cautare înapoi; pentru SBC folosind asemenea motoare
de inferente, datorita mecanismului de backtracking si felului în care punctul de start este unic
– scopul de dovedit (în cautarea înainte poate fi un set amplu de fapte initiale de la care pleaca
inferentele) este mai usor de realizat subsistemul de generare a explicatiilor.
+ + + + − − +
a) b)
+
Fig. 3.15. Comparatie între cele doua strategii de control
Aceste aspecte pot fi urmarite si pe fig. 3.15. Aici, cazul a) este acela al unui sistem cu
cautare înainte, iar b) pentru cautare înapoi. În primul caz, în radacina arborelui se gaseste
faptul initial aflat în memoria de lucru, sagetile fiind regulile care se aplica, iar cu semnul +
am marcat concluziile la care se opreste procesul de inferenta. Se observa ca un fapt poate
declansa mai multe reguli si într-un caz real starea initiala va putea fi descrisa prin mai multe
fapte (elipsele marcate cu linie întrerupta), astfel ca vor exista mai multi arbori de tipul
respectiv. În plus si elipsele nemarcate cu + pot fi fapte care, ramânând în baza de fapte, pot
contribui la completarea multimii concluziilor. În cazul b), cel corespunzator strategiei înapoi,
radacina arborelui este scopul de dovedit, iar regulile sunt marcate tot cu sageti. Aici elipsele
sunt subscopuri (premise, subformule ale unor implicatii) care trebuie dovedite, dintre care
cele marcate cu – reprezinta esecuri, astfel ca prin sagetile întrerupte am reprezentat procesul
de backtracking. Inferentele se opresc pe o ramura în care scopul este dovedit; aceasta este
cea marcata cu + în fig. 3.15b, în care trebuie sa întelegem ca scopul de plecare poate fi
Sisteme bazate pe cunostinte 131
dovedit prin unul din cele doua subscopuri ale nivelului întâi al arborelui, din care numai al
doilea se dovedeste valid în problema în lucru.
Întrebarea care se pune este aceea a tipului de cunoastere care se preteaza a fi abordata
prin fiecare din cele doua variante de sistem de reguli de productie. Astfel, sistemele lucrând
dupa cautare înainte sunt recomandate pentru problemele de monitorizare. Aici trebuie sa
plecam de la datele culese din proces si sa deducem toate concluziile (comenzile)
corespunzatoare acestora, ceea ce va face un SE folosind înlantuire înainte. În schimb, pentru
o problema de diagnoza va fi de preferat o cautare înapoi; se pleaca de la un defect si se fac
presupuneri asupra cauzelor care l-au generat, pâna se gaseste înlantuirea de reguli (de
inferente) care sa explice defectul avut ca scop în lucru. Este însa de observat ca aceasta
împartire a domeniilor nu este întotdeauna una neta si trebuie tinut seama si de contextul în
care se lucreaza [Gia 89], [Har 90].
Fie de exemplu, cazul unui sistem destinat alegerii microprocesorului care este cel mai
convenabil unei anumite aplicatii. Sistemul, aplicând cunostintele specifice domeniului,
trebuie sa gaseasca o solutie care sa satisfaca specificatiile impuse, dar si restrictiile
determinate de componentele avute la dispozitie. Sa luam în considerare doua cazuri extreme.
În prima situatie sunt disponibile doar doua tipuri de microprocesoare. În acest caz este
normal ca sistemul sa lucreze dupa o cautare înapoi, plecând de la scop – de la
microprocesorul de ales, si sa foloseasca regulile astfel încât acestea sa valideze, pe
specificatiile impuse, unul din cele doua microprocesoare.
Daca însa sunt în cazul în care avem la dispozitie 100 de tipuri de microprocesoare
este ineficient sa plecam de la scop, si vom pleca de la date, aici specificatiile corespunzatoare
destinatiei sistemului cu microprocesor. Prin aplicarea regulilor într-o înlantuire înainte, vom
construi o varianta care se va potrivi pe caracteristicile unuia dintre microprocesoarele
disponibile. Concluzia este acea ca alegerea unui anume tip de sistem de reguli de productie
este dependenta de specificul problemei de rezolvat. Exemplul dat ne arata si faptul ca un
element calauzitor poate fi acela conform caruia, daca în problema sunt un numar mic de
iesiri (scopuri) si un numar mare de intrari, o cautare înapoi poate fi favorabila, iar daca
raportul se inverseaza – un numar mare de iesiri posibile si putine intrari, va fi de ales o
cautare înainte. Aceasta clasificare conduce la faptul ca o problema de planificare [Pan 92], în
functie de raportul date de intrare/date de iesire poate fi abordata fie în PROLOG, daca sunt
putine scopuri, sau în CLIPS (asa cum vom face în capitolul al cincilea), atunci când sunt
putine date de intrare.
Reprezentarea prin sisteme de reguli este cea care se gaseste sub incidenta tendintei
actuale de folosire a unor sisteme hibride [Tza 93], [Dav 93]; aici este vorba despre
combinarea mai multor tipuri de cunoastere, a mai multor variante de reprezentare (modelare)
a cunoasterii, ceea ce va conduce si la mai multe posibilitati de efectuare a rationamentelor si
în final la o codificare multipla (sisteme bazate pe reguli, programare orientata pe obiecte, etc)
132 Reprezentarea cunoasterii
[Wat 99]. Sistemele respective vor respecta arhitectura generala a SBC, cea data în fig. 1. 10,
în care baza de reguli va fi organizata tinând seama de elementele date în acest paragraf. În
schimb, pentru baza de fapte se va folosi o structurare conform retelelor semantice sau
cadrelor. Chiar regulile vor putea fi grupate în ierarhii de tipul celor din modelele structurate,
facilitând astfel activitatea motorului de inferente în privinta gasirii pieselor de cunoastere
relevante pentru problema în lucru si în privinta determinarii corelatiilor dintre baza de fapte
si cea de reguli. De exemplu, o clasificare a regulilor poate ajuta efectuarea pasului de alegere
a regulii de executat din multimea regulilor activate la un moment dat (asa zisa rezolvare a
conflictului) în cazul strategiei înainte, iar o clasificare a scopurilor poate ajuta aceeasi
selectie a regulilor în cazul unei cautari înapoi. Toate aspectele discutate în acest paragraf îsi
gasesc ilustrarea si completarea în elementele de implementare în CLIPS, date în ultimul
capitol al lucrarii.
Sisteme bazate pe cunostinte 133
Întrebari si probleme
14. Care este mecanismul de efectuare a inferentelor pe baza mostenirii într-o retea
semantica? Dar într- un cadru?
15. Ce înseamna mostenire simpla si multipla într-o retea semantica?
16. Ce reprezinta fatetele într-o retea semantica, respectiv într-un cadru?
17. Care este deosebirea dintre o retea semantica structurala si una asertionala?
18. Cum pot fi modelate într-o retea semantica relatii având o aritate mai mare decât 2?
19. Ce înseamna relatii cazuale?
20. Pot fi modelati cuantificatorii într-o retea semantica? Dar în modelul bazat pe cadre?
21. Ce înseamna mecanismul de potrivire în retelele semantice? Dar în sistemele de
reguli de productie?
22. Care este rolul demonilor într-un cadru si cele legatura exista între acestia si
programarea orientata pe evenimente?
23. Faceti o comparatie între o retea semantica asertionala si un scenariu.
24. Care sunt tipurile de inferente care se pot face într- un model bazat pe cadre.
25. Construiti un scenariu pentru evenimentul “ora_laborator”.
26. Dati exemple de probleme care sunt potrivite pentru o rezolvare printr-un sistem
bazat pe reguli folosind strategia de cautare înainte, respectiv aceea de cautare înapoi.
27. Sa se reprezinte, prin diferite modele de reprezentare a cunoasterii, universul de
discurs din fig. 3.16. Se stie ca obiectele care apar, cei doi roboti si presa, sunt utilaje si au
alcatuirea si caracteristicile din desen; se impune reprezentarea inclusiv a relatiilor spatiale
între acestea – de exemplu, robotul_1 este plasat în stânga presei_1, s.a.m.d.
cilindru_4 cilindru_5
29. Construiti, prin modele adecvate de reprezentare a cunoasterii, clasificari ale tipurilor
de microprocesoare pe care le cunoasteti, respectiv pentru tipurile de regulatoare.
4.1. Introducere. Principiul si necesitatea achizitiei de cunostinte
Asa cum am precizat si în paragraful 4.1, trebuie înteles ca aceste doua aspecte –
achizitie de cunostinte, codificare a cunostintelor, sunt distincte si totodata aflate în corelatie.
Desi ele sunt cunoscute din fazele initiale ale IA [New 82], semnificatia achizitiei si
importanta corelarii cu reprezentarea cunoasterii s-au pus recent, o data cu a doua generatie de
SE. Pentru rezolvarea unei probleme trebuie pusa în evidenta existenta cunoasterii specifice
universului de discurs si a felului în care aceasta se manifesta. Este vorba despre asa numitul
principiu al rationalitatii [Wie 93]. Astfel, în rezolvarea unei probleme un expert lucreaza cu
138 Achizitia de cunostinte
un scop, un set de actiuni si un corp de cunostinte. Dupa principiului mentionat, de îndata ce,
în conformitate cu corpul de cunoastere, expertul stie ca o actiune va determina îndeplinirea
unui scop, iar scopul respectiv este în lucru, o va alege pe aceasta. În acest fel cunoasterea
apare ca elementul potential pentru generarea actiunilor. Ideea este simpla, dar importanta, ea
aratând pe de o parte independenta cunostintelor de forma de reprezentare a acestora, dar si
aceea ca o data o cunoastere captata, trebuie alese variantele de reprezentare si codificare ale
IA care sa reproduca o asemenea comportare, de tipul generarii ghidate de scop a unor actiuni.
Aceste aspecte sunt schematizate în fig. 4.1. În aceasta, observatorul implicat în
realizarea unui SBC, urmareste comportarea expertului, si activitatea observatorului trebuie
Nivelul cunoasterii
Expert (Agent)
Întelegere
Comportare
Observator
Modelare si
Achizitie de cunostinte codificare
Achizitia de cunostinte are unele aspecte comune cu analiza de sistem, cea efectuata,
de exemplu, la proiectarea sistemului de control necesar într-un proces tehnologic; la un
asemenea caz ne vom referi în continuare, principiile fiind însa general valabile – nu apar
modificari de esenta daca ar fi vorba de achizitia de cunostinte, de exemplu, în domeniul
medical. Exista însa si elemente deosebite fata de analiza de sistem, unele generate chiar de
diferentele dintre programarea traditionala (cea care poate fi implicata în materializarea
Sisteme bazate pe cunostinte 139
Ca elemente mai de detaliu si mai specifice pentru cazul SBC/SE, scopul pe care
trebuie sa îl urmareasca sistemul este de identificat de la început (vezi principiul rationalitatii
din paragraful anterior). Apoi, trebuie observate actiunile expertului si gasita rationalitatea
acestora, adica precizate corelatiile scopuri – actiuni. Aceasta va presupune o interactiune
complexa cu expertul, o serie de întrebari cu caracter de generalitate (în sensul ca trebuie
rezolvate pentru majoritatea tipurilor de aplicatii), fiind urmatoarele:
transforma cunostinte de tip tacit într-o forma declarativa sau procedurala, varianta care sa
poata fi validata de expert, sa poata apoi fi folosita în construirea SBC, si eventual consultata
de beneficiarul acestuia pentru actualizari si dezvoltari.
Pentru reusita achizitiei de cunostinte sunt cerute anumite însusiri persoanei care
rezolva aceasta faza (acel “kno wledge engineer”). Astfel, acesta trebuie sa aiba o abilitate
deosebita pentru stabilirea si dezvoltarea de relatii interumane, sa posede flexibilitate si
creativitate. Necesitatea realizarii unei bune relatii interumane cu expertul este clara, atâta
timp cât este vorba de a capta cunoasterea acestuia, de obicei într-o perioada de timp de
ordinul saptamânilor. Discutiile purtate cu expertul trebuie înregistrate în forme adecvate
(tipare specifice domeniului, diagrame), acestea trebuind a fi validate, pas cu pas, de catre
expert. Este vorba despre un proces consumator de timp, în care este esentiala încrederea
reciproca stabilita cu expertul si în care, este rolul persoanei care face achizitia ca, prin
interactiuni repetate, sa descopere elementele lipsa si eventual pe cele contradictorii.
Flexibilitatea si creativitatea sunt si ele cerute persoanei respective pentru a selecta metodele
cele mai potrivite pentru interactiunea cu expertul sau, în anumite situatii, pentru a crea noi
instrumente de lucru, adecvate domeniului sau expertului cu care interactioneaza. Persoana
respectiva trebuie sa înteleaga limbajul expertului si sa se adapteze la acesta. Numai în acest
fel va putea pune întrebarile adecvate si va întelege modul în care expertul ia deciziile.
Este de mentionat, ca o situatie deosebita si care determina o complicatie în plus,
aceea în care expertul este diferit de beneficiarul SE. În acest caz achizitia de cunostinte
trebuie sa tina seama si de necesitatile utilizatorului, de multe ori expertul nefacând de la sine
aceasta corelatie. În plus, putem fi si în cazul în care chiar beneficiarul nu este hotarât asupra
cerintelor pe care sa le adopte. Într-un asemenea caz, tot în faza de achizitie a cunostintelor, se
vor face experimente pe mai multe prototipur i ale SBC, pe baza carora utilizatorul sa poata
decide cerintele finale. Aceste încercari trebuie conduse cu atentie, în asa fel încât beneficiarul
sa înteleaga capabilitatile reale ale SBC (exista pericolul ca acesta sa le supraaprecieze), dar si
sa capete încredere în functionarea acestuia. Este si momentul în care proiectantul SBC, cel
care realizeaza codificarea si care este sau nu acelasi cu cel care face achizitia, poate sa
determine fazele si instrumentele de dezvoltare a SBC. Unele elementele dificile, deja
evidentiate în acest paragraf, sunt explicate în continuare.
cunostintele sunt exprimabile prin limbaj, fiind vorba despre o varianta de cunoastere
declarativa. Apoi, urmeaza o faza în care sunt detectate relatii si asocieri între diferitele
elemente de cunoastere acumulate, facându-se trecerea spre o cunoastere de tip procedural.
Prin repetitie si feedback, persoana respectiva va utiliza cunoasterea tot mai eficient si fluent.
Se ajunge în faza finala când, printr-o “compilare” a procedurilor învatate, actiunile sunt
întreprinse fara o supraveghere constienta aprofundata si fara a mai fi legate de o exprimare
prin limbaj. O data înteles acest proces al evolutiei spre cunoasterea de tip tacit, înseamna ca
în achizitia de cunostinte expertul va trebui sa faca trecerea inversa, de la cunoasterea tacita
spre cea procedurala si declarativa necesara SBC.
Exista mai multe variante pentru achizitia de cunostinte, fiind vorba de diferite tipuri
de tehnici, unele preluate din psihologie. Nu exista înca un protocol general utilizabil si este în
sarcina persoanei care face achizitia sa decida între diferitele variante. Sunt totusi valabile
pentru majoritatea cazurilor câteva principii, precizate în continuare.
Denumirea metodei provine din limba engleza, unde apare ca: “Focused Meetings and
Discussions – FMD”. Metoda este apropiata de aceea anterioara, prin faptul ca se bazeaza tot
pe o colectare a unor informatii obtinute pe cale orala de la expert. Diferenta fata de cazul
anterior consta în aceea ca este vorba despre o discutie pe un subiect clar definit si specific. S-
ar apropia de un interviu de tip focalizat si structurat, în care întrebarile trebuie sa fie cât de
simple posibil, existând însa o serie de elemente particulare în aceasta metoda. Ea are mai
multe variante, dintre care cele mai cunoscute sunt: tehnica studiului de caz si tehnica ghidata
de scop.
nu simta aceeasi responsabilitate ca atunci când rezolva o situatie reala si astfel sa fie
introduse elemente de aproximare. Un avantaj pe care îl poate determina aceasta tehnica, în
comparatie cu tehnica interviului, este acela ca, parcurgându-se în simularea respectiva
întreaga rezolvare a problemei, nu vor mai fi scapate elemente pe care într-un interviu
expertul le poate omite, parând ca neesentiale.
În varianta descrierii retrospective de caz este vorba, ca si în cea anterioara, de un
studiu de caz. Deosebirea fata de metoda scenariului simulat este aceea ca se lucreaza pe
cazuri reale si nu ipotetice. Acestea sunt alese din istoria privind domeniul pentru care se
realizeaza SBC si indicat este ca alegerea sa fie facuta de comun acord de cel care face
achizitia si de expert, dintre cazurile recente. În legatura cu selectia cazurilor, aceasta este cea
care influenteaza într-o mare masura succesul ambelor variante ale tehnicii discutate. În acest
sens, în functie de specificul domeniului, pot fi avute în vedere problemele cele mai
complicate, sau cele a caror solutie este cea mai consumatoare de timp, sau situatiile
considerate a fi cele mai importante din punct de vedere al consecintelor pe care le determina.
Indiferent de criteriul de alegere folosit, trebuie ca sa fie cazuri reprezentative si sa acopere
întreg domeniul de expertiza.
Tehnica ghidata de scop, care este cea de-a doua în categoria întâlnirilor si discutiilor
focalizate, are la rândul ei mai multe variante. În cazul divizarii domeniului, expertul primeste
un scop (subproblema din domeniu) si i se cere sa defineasca un set de informatii (de
exemplu, simptome în cazul unei probleme de diagnoza), care sa formeze conditii necesare si
suficiente pentru a discrimina scopul respectiv de celelalte situatii posibile. Avantajul metodei
este acela ca, atunci când întreg domeniul de expertiza poate fi descompus într- un set
consistent de scopuri, ceea ce se obtine în urma achizitiei este o varianta de reprezentare a
cunoasterii de tip structurat; ceea ce usureaza faza de modelare si codificare a cunostintelor.
Ca dezavantaj, sunt necesare niste criterii de discriminare pe baza carora sa se faca împartirea
domeniului de lucru în subprobleme, ceea ce nu este întotdeauna facil. De exemplu, într-o
problema de diagnoza abordata în acest fel, expertul ar trebui sa furnizeze numai acele
simptome care individualizeaza un defect fata de altele si garanteaza o diagnosticare corecta.
Expertul poate fi însa în situatia în care va dori sa expuna toate simptomele, dintre care unele
sa fie comune pentru mai multe tipuri de defecte, si ramâne în sarcina celui care face achizitia
sa faca selectia respectiva, analizând informatiilor preluate. În ceea ce priveste divizarea
domeniului, mai trebuie mentionat ca aceasta poate fi facuta într-unul din doua sensuri
posibile: de jos în sus – când se pleaca de la datele primare (semnale de la proces, simptome,
etc.) si acestea sunt grupate pâna se ajunge la punerea în evidenta a unei probleme, sau de sus
în jos – când se pleaca de la un scop final, gasindu-se din aproape în aproape datele care îl
individualizeaza.
Tot în categoria tehnicilor ghidate de scop exista si varianta combinarii
caracteristicilor si deciziilor. Este vorba de situatii în care expertul nu poate furniza initial
regulile de lucru pentru un SE, dar este capabil sa dea, sub forma de liste, tabele, etc., tipurile
Sisteme bazate pe cunostinte 147
Tehnica feedback-ului sau învatarii inversate (în engleza: “teachback”) este aceea în
care rolurile între expert si cel ce face achizitia se inverseaza. Dupa ce s-a efectuat achizitia
pentru o parte din cunostinte, folosind de exemplu tehnica interviului, i se “explica”
expertului felul în care se rezolva o problema. În acest fel, pe de o parte se face o validare a
unor cunostinte preluate, iar pe de alta parte se poate corecta si completa cunoasterea
domeniului. Este o varianta care poate scoate în evidenta scaparile unei alte metode de
achizitie. Se ajunge astfel la o procedura, continând tehnica interviului, discutii focalizate,
alternate cu învatare inversata, procedura ce poate determina succesul achizitiei de cunostinte.
În tehnica celor 20 de întrebari cel care face achizitia trebuie sa selecteze un element
din cunoasterea domeniului: un anume defect, o anume situatie de lucru, un rezultat al
functionarii unei instalatii. Expertul trebuie sa determine, printr-un set limitat de întrebari (de
exemplu, 20 de întrebari) chestiunea aleasa, în situatia în care întrebarile sunt de tipul celor
care conduc numai la un raspuns Da/N u. Metoda favorizeaza detectarea unor conflicte în
cunoasterea acumulata, împartirea pe categorii a domeniului, descoperirea euristicii pe care
expertul a capatat-o, prin experienta, pentru a judeca problemele de lucru. Ca si metoda
anterioara, varianta presupune ca o parte din cunoastere sa fi fost deja acumulata printr-o alta
metoda, astfel ca sa poata fi identificate chestiunile care se preteaza a fi alese.
de felul în care expertul estimeaza valoarea consecintelor unei decizii pe care o ia, si respectiv
dependenta de probabilitatile de aparitie a consecintelor; mai mult, este posibil ca expertul sa
nu fie obisnuit cu asemenea evaluari cantitative, sau sa nu le poata efectua.
Exista un numar de tehnici de achizitie folosite în cercetarea din psihologie si care au
fost preluate în domeniul dezvoltarii SBC. Una dintre cele mai cunoscute de acest fel este
aceea a analizei protocoalelor. Ea presupune ca expertul sa fie observat în timpul unui
protocol de rezolvare a unei probleme, reala sau simulata, în functie de posibilitati. I se cere sa
vorbeasca în timpul lucrului, exprimând felul în care ia deciziile. Ideea este aceea ca
activitatea expertului sa se desfasoare cât mai aproape de modul firesc; în acest sens el va
enunta scopurile si informatiile considerate, fara a dezvolta rationa mentele, ceea ce ar altera
cursul activitatii normale. Rezultatul primar al achizitiei este un protocol verbal, care
urmareste actiunile expertului. Acesta va fi folosit de cel ce face achizitia pentru a încorpora
în baza de cunostinte modalitatea de rezolvare a problemei studiate. Desi ar parea ca metoda
determina o cale fidela de preluare a cunostintelor, ea are si deficiente, legate de elementele
care pot sa lipseasca din baza de cunostinte, nefiind povestite în timpul lucrului de expert, si
care vor trebui preluate prin alte tehnici (de exemplu interviu), sau legate de faptul ca expertul
este afectat în activitatea sa de cerinta de a povesti în timp ce rezolva o problema.
Analiza protocoalelor
Un exemplu care se apropie de aceste deziderate este asa zisa tehnica de achizitie si
structurare a cunostintelor (“Knowledge Acquisition and Design Structuring” – KADS) care
presupune o structurare a cunostintelor sub forma a patru straturi; realizarea lor poate fi
obtinuta atunci când cel ce face achizitia si-a lamurit, pentru domeniul de expertiza, atât
nivelul cunoasteri, cât si pe cel al reprezentarii . Cele patru straturi vor ghida procesul de
construire a bazei de cunostinte pe baza informatiilor preluate de la expert. Un prim strat este
cel al domeniului, în care apare o organizare a cunostintelor sub forma de concepte si relatii.
Acestea trebuie sa se refere la întreg domeniul de lucru. Un al doilea strat este cel al
inferentelor. Acesta trebuie sa contina elementele de baza pentru rationamentele efectuate de
expert. Este vorba despre meta-concepte (acele concepte care îndeplinesc roluri distincte în
rezolvarea unei probleme a domeniului) si despre elementele de rationament care pun în
legatura meta-conceptele în timpul rezolvarii. De exemplu, “dezlipirea unui contact” poate
constitui o metaclasa, legata printr- un element de rationament de tip cauza – efect de
metaclasa “absenta semnalului de iesire”, într-un sistem de diagnoza a circuitelor electrice. Al
treilea strat este cel al sarcinii, acesta specificând secventa în care sunt apelate elementele de
pe nivelul inferentelor în timpul rezolvarii unui anume tip de problema. Facând o comparatie
cu programarea clasica, acest strat este cel care contine elementele privind controlul rularii
programului. Mai exista si un ultim strat, cel al strategiei, care permite schimbarea dinamica a
secventelor de control de la nivelul sarcinii în functie de contextul evolutiei SBC. Dupa ce au
fost create aceste patru straturi, care modeleaza expertiza într-o forma transferabila pe
calculator, pe baza lor se poate trece la implementarea propriu- zisa a bazei de cunostinte.
Rezulta ca tehnica este una de ghidare, care determina structurarea cunoasterii într-o forma
consistenta, dar transformarea celor patru straturi într- un sistem functional ramâne dependenta
de priceperea programatorului.
etapa, când, pe baza textelor preluate din fisiere si ghidat de cel ce face achizitia, se creeaza
ierarhii sau retele (de tip retea semantica) între notiunile care apar cu frecventa mare în texte.
De exemplu, fie urmatorul text: “Cimentul este produs prin macinarea fina a
clincherului, care rezulta în urma unei prelucrari termice într-un cuptor. Cimentul se produce
în fabrici de ciment. Exemple de fabrici de ciment sunt: Hoghiz, Medgidia”. Ceea ce rezulta
prin analiza de text din fragmentul respectiv, este de tipul retelei din fig. 4.4.
Fabrica
Unde se
produce de ciment
Este o
Cimentul Hoghiz
Cum este
Din ce Este o
produs este produs
Macinare Medgidia
fina Clincher
generator de fapte, cel care completeaza parte de baza de fapte a bazei de cunostinte. Astfel,
prin constituirea de fapte si reguli, care intra în baza de cunostinte, se finalizeaza procesul de
achizitie, si este parcursa si o parte importanta din dezvoltarea SBC.
Este de mentionat ca utilizatorul are acces la reprezentarea intermediara si poate
introduce direct noi noduri si arce în reteaua semantica, sau noi structuri operator-argument,
elemente care se vor reflecta apoi în completari ale bazei de cunostinte. În plus, evolutia
sistemului nu este una într-o secventa fixa, ci pot apare reveniri. În acest sens pe fig. 4.3 s-au
marcat cu sageti duble legaturile între reprezentarea cunoasterii intermediara si cele trei
tehnici folosite pentru extragerea cunostintelor, pentru a se arata faptul ca acestea nu sunt
aplicate într-o ordine stricta. De exemplu, dupa analiza protocoalelor poate apare necesitatea
revenirii la tehnica interviului, pentru completarea întelesului si conexiunilor unor notiuni
folosite de expert în timpul unui protocol.
sisteme, cele doua parti sunt combinate, trebuind sa alcatuiasca împreuna un model coerent al
sarcinii. În acest fel se tine seama de cerinta ghidarii dupa scop si în modelul sarcinii sunt
facute corelatiile între cunostintele referitoare la elementele de schimbare si cele privind
structura domeniului, astfel încât sa se obtina un sistem operational pentru sarcina de
îndeplinit, adica sa se obtina un SBC. Cele doua submodele se dezvolta în paralel si se
influenteaza reciproc: domeniul furnizeaza elemente utilizabile de catre metoda de rezolvare,
iar metoda indica, atunci când este cazul, noi elemente ale domeniului ce trebuie
achizitionate; în acest fel se explica sageata dubla care apare în fig. 4.5 între cele doua
submodele. De exemplu, atunci când în domeniu apare o organizare ierarhica a conceptelor,
aceasta poate conduce spre folosirea unei metode de rezolvare de tip clasificare.
Modelul sarcinii este cel care foloseste elementele celorlalte doua submodele pentru a
rezolva sarcina specifica propusa. De exemplu, într-o problema de diagnoza, scopul este de
identificare a defectelor si cauzelor acestora, si pe baza acestui scop sunt combinate
conceptele domeniului cu deciziile luate de expert, folosind metoda de rezolvare potrivita, de
exemplu o cautare înapoi bazata pe reguli. În momentul în care modelul sarcinii este
completat, sistemul este si operational: s-au achizitionat cunostintele necesare pentru definirea
domeniului, cele pentru evidentierea metodei de rezolvare si în plus acestea au fost si
combinate, în conformitate cu sarcina de rezolvat. Aceasta înseamna, din punct de vedere al
SBC, ca atunci când modelul sarcinii este rezolvat, SBC are baza de cunostinte completata si
functionala.
Elementele prezentate mai sus sunt valabile în general în ceea ce priveste achizitia de
cunostinte necesare construirii SBC, indiferent de domeniul aplicatiei (de exemplu, mediul
industrial, diagnoza medicala, domeniul financiar – bancar, etc.). O serie de particularitati
privind desfasurarea achizitiei de cunostinte în aplicatiile industriale sunt discutate în
continuare.
Un alt domeniu de aplicare a SBC, unde achizitia de cunostinte are aspecte particulare,
este acela al planificarii productiei. Considerând un caz generic si fara a intra în detalii cu
privire la obiectele produse, achizitia poate urma o varianta de tehnica de tipul divizarii
domeniului. Într-o abordare de sus în jos, avem într-o prima iteratie ca element de intrare,
scopul de atins – numar si tip de produse, timpul pâna la care trebuie terminate acestea, iar ca
element de iesire planul de productie; aceasta prima divizare este ilustrata în fig. 4.6a.
În continuare, în functie de scop pot fi detaliate operatiile impuse pentru fiecare tip de
produs si ordinea necesara a acestor operatii. Acum se poate observa ca trebuie cunoscute, ca
elemente de intrare, si masinilor disponibile. Toate acestea pot concura la obtinerea planului
de productie; în acest fel am ajuns la divizarea din fig. 4.6b. La acest grad de detaliere, deja
am constatat ca este necesara achizitia operatiilor prin care se obtine fiecare produs, a ordinii
în care acestea trebuie executate si a masinilor disponibile, cu observatia ca în modelul
masinilor introdus în calculator trebuie sa se regaseasca operatia sau operatiile pe care le
poate executa fiecare din ele.
Urmeaza constatarea ca planul de productie poate fi creat daca realizam o cuplare a
operatiilor necesare cu masinile disponibile si care sa tina seama de restrictiile impuse de
ordinea operatiilor. Aici lucrurile pot varia de la cazul banal în care scopul se refera la un
singur produs si fiecare masina poate executa o singura operatie, când planificarea va putea fi
liniara, aceasta însemnând gasirea unei succesiuni de perechi operatie de efectuat – masina
disponibila, în care operatiile se succed liniar în timp, într-o ordonare totala, pâna la cazul în
care scopul presupune mai multe produse si masinile sunt capabile sa execute mai multe
operatii, când rezolvarea se poate obtine, de exemplu, prin tehnici de IA de planificare
156 Achizitia de cunostinte
neliniara, sau de satisfacere a restrictiilor [Pan 94], [Fre 94]. Am constatat astfel necesitatea
achizitiei unui nou element, acela al metodei de împerechere a operatiilor si masinilor,
împerechere care sa tina seama de restrictiile specifice operatiilor necesare unui anume
produs. Ajungem astfel la schema din fig. 4.6c, care poate ghida procesul de achizitie.
b) Plan de productie
Scop
Metoda de alocare
operatii - masini
c)
Plan de productie
La rândul lor, masinile pot fi modelate prin perechi de forma nume masina – set de
operatii posibile de efectuat. Un exemplu în acest sens este: Masina_1 – {taiere, gaurire}. O
data ce au fost stabilite toate modelele necesare, achizitia poate urma schema din fig. 4.6c, iar
pentru un SBC operational vor trebui realizate si interfetele catre utilizator, care sa preia
scopul, sa extraga din acesta informatiile necesare pentru completarea modelor care compun
baza de cunostinte si respectiv sa transmita spre utilizator, într-o forma convenabila, planul de
productie dezvoltat.
situatie si a luat o anumita decizie de actiune, în conditiile în care aceasta informatie este
disponibila.
Doua situatii sunt de nedistins în cazul în care toate conditiile în proces sunt identice.
În tab. 1, doua asemenea situatii sunt S1 si S3 , ca si S2 si S5 . Doua situatii de nedistins sunt
echivalente, daca satisfac conditia: A(Si) = A(Sj ), unde am notat cu A(Si) actiunea
corespunzatoare situatiei Si. În tab. 1, sunt echivalente starile S2 si S5 , în timp ce S1 si S3 nu
Tabelul 4.1.
Conditii
Situatia Timpul Actiunea
C1 C2 C3 C4 C5
S1 1 2 1 3 -2 1 1,5
S2 2 1 3 3 -2 2 2
S3 1 2 1 3 -2 3 2,5
S4 2 2 3 3 0 4 0
S5 2 1 3 3 -2 5 2
S6 3 2 1 2 -1 6 1
S7 2 2 2 -1 2 7 0
S8 4 1 0 2 1 8 3
sunt echivalente, actiunile întreprinse de expert fiind diferite. Doua stari echivalente se vor
putea reuni în tabelul achizitiei de cunostinte, ele caracterizând de fapt o unica situatie a
procesului si a comportarii expertului, produsa la mai multe momente de timp; aceasta
înseamna ca în cazul studiat se vor putea reuni într-o stare unica S2 si S5 .
Un asemenea tip de achizitie va putea fi folosit în mod eficient pentru construirea SE.
Astfel, pe baza tabelului se vor putea construi regulile din baza de reguli. Dupa reunirea
starilor echivalente, fiecare linie a tabelului va corespunde unei reguli a SE; de exemplu,
pentru situatia S1 din cazul analizat vom avea regula:
O problema care poate apare este aceea a situatiilor care sunt de nedistins si nu sunt
echivalente (situatii de dubiu); în cazul prezentat asa sunt S1 si S3 . Daca în urma achizitiei se
constata existenta unor asemenea cazuri, aceasta înseamna ca procesul tehnologic, sau mai
degraba procesul decizional al expertului nu este de tip determinist: pentru doua situatii
identice în proces expertul ia decizii diferite. Se va proceda la remedierea situatiei de catre
expert, prin eliminarea uneia din cele doua situatii si a actiunii corespunzatoare, transformând
Sisteme bazate pe cunostinte 159
procesul în unul determinist. Daca totusi expertul nu poate decide în acest sens, ceea ce arata
o incapacitate a sa de discriminare a unor diferente în proces, atunci fie se va încerca o
corelatie a actiunilor cu momentul de timp al întreprinderii acestora (folosind coloana
“Timpul” a tabelului de achizitie), fie SE va determina trecerea controlului spre operator în
momentul când detecteaza o situatie de dubiu.
Asa cum a fost descrisa, metoda este sistematica (ea are conexiuni si cu o tehnica a IA
folosita, de exemplu, în cazul robotilor industriali si numita învatarea din exemple [Fu 87]),
dar poate ridica impedimente atunci când expertul nu poate cuantifica precis, numeric,
conditiile care disting situatiile din proces sau actiunile întreprinse. O solutie într- un asemenea
caz poate fi aceea în care, în locul tabelului de mai sus, sa apara unul continând termeni si
variabile lingvistice, modelate prin multimi fuzzy, varianta care poate rezolva cazurile de
apreciere calitativa, eventual aproximativa, a procesului.
O concluzie este aceea a necesitatii unei abordari mixte. Rareori si de obicei pentru
probleme simple este suficienta folosirea unei singure tehnici de extragere a cunostintelor.
Frecvent acestea trebuie îmbinate; analiza de texte, interviul, tehnica întâlnirilor si discutiilor
focalizate, analiza protocoalelor sunt fiecare adecvate pentru un anumit tip de cunostinte si
numai combinarea lor poate conduce la preluarea abilitatilor expertului uman.
O concluzie cu privire la acest proces este si aceea ca el trebuie privit si rezolvat prin
prisma a trei perspective diferite: una este aceea a domeniului, numita si a modelelor,
deoarece este cea care trebuie sa determine preluarea cunostintelor de baza ale domeniului de
lucru, obtinând totodata organizarea acestora într- un model coerent si eficient din punct de
vedere computational – modelul de reprezentare a cunoasterii; a doua este aceea a scopului
(sarcinii) de îndeplinit, cea care trebuie sa determine achizitia a ceea ce trebuie sa
îndeplineasca SBC; a treia este perspectiva metodelor de rezolvare, cea care trebuie sa
acumuleze caile prin care, folosind cunostintele existente la un moment dat asupra mediului,
sa se poata îndeplini scopul propus (vezi fig. 4.8). Aceste trei perspective trebuie luate în
considerare în mod iterativ. Evolutia o putem imagina ca fiind una în spirala, determinând în
fiecare etapa o rafinare dintr-un anumit punct de vedere, iar în final obtinerea bazei de
cunostinte a SBC. De exemplu, un scenariu posibil este acela în care cel care face achizitia
Sisteme bazate pe cunostinte 161
1. Apelul unei functii – functiile se scriu în CLIPS în forma prefixata, fiecare apel al
unei functii trebuind sa fie plasat într-o pereche de paranteze. Interpretorul evalueaza functia
respectiva, cu argumentele ei si afiseaza rezultatul evaluarii. De exemplu, calculul sumei
7 + 5 se va scrie în CLIPS: (+ 7 5).
Este de retinut ca, atunci când se dau mai multe comenzi pe aceeasi linie (fara a da
“Enter” între ele), numai prima este luata în considerare si evaluata de interpretor.
2. Definitia unei constructii – are drept efect crearea unei noi constructii, care tine
seama de definitia respectiva. Se obtine astfel posibilitatea de construire a faptelor si regulilor
dintr- un SE.
3. Numele unei variabile globale – în CLIPS se pot folosi variabile globale; daca
utilizatorul transmite drept comanda numele unei variabile globale, interpretorul determina
valoarea acelei variabile la momentul respectiv si o afiseaza.
c) Sir de caractere – este o succesiune de zero sau mai multe caractere, incluse între
ghilimele. Daca vrem sa includem într- un sir de caractere si ghilimelele trebuie sa folosim
caracterul de control \ ("backslash") înaintea ghilimelelor. Daca un sir de caractere trebuie sa
Sisteme bazate pe cunostinte 165
contina \ atunci acesta trebuie dublat. Într-un sir de caractere poate apare si spatiul, sfârsitul
sirului fiind marcat de ghilimele. Exemple de siruri de caractere sunt:
“ab1”, “a:\\user\\a.clp”.
O constanta CLIPS (numar, simbol sau sir de caractere) se numeste si câmp CLIPS
sau data primitiva CLIPS. Câmpurile CLIPS sunt separate prin delimitatori, care sunt cei
amintiti mai sus.
166 Reprezentarea cunoasterii folosind mediul CLIPS
Pentru a întelege si urmari mai usor sintaxa CLIPS facem câteva conventii de notatie;
acestea nu sunt elemente ale sintaxei CLIPS, ci doar conventii care vor facilita explicarea
programelor scrise în CLIPS (sunt ca si regulile unui pseudo-cod).
Vom nota comanda “Enter” cu ¶. Orice nu apare inclus între perechile de semne: < >,
[ ], { }, este un cuvânt cheie si trebuie folosit ca atare. Perechile respective vor fi folosite cu
semnificatiile urmatoare.
(data [1])
Perechea < > indica necesitatea substituirii cu un element (unul singur) de tipul
indicat. De exemplu, pentru cazul:
(exemplul <întreg>)
Succesiunea << >> indica necesitatea unei substituiri cu zero sau mai multe aparitii
ale unui element de tipul specificat. Daca este vorba de mai multe aparitii, acestea vor fi
separate prin spatiu. De exemplu, pentru cazul:
(relatie <<întreg>>)
variante corecte în program pot fi: (relatie –2); (relatie 23 145 –3); (relatie).
Succesiunea <<< >>> indica necesitatea unei substituiri cu una sau mai multe aparitii
de tipul specificat (nu zero aparitii). Situatia:
(data <<<întreg>>>)
va avea ca variante corecte în program: (data 20); (data 23 145 –3).
Perechea { } indica faptul ca unul singur din elementele dintre acolade va trebui sa fie
folosit. Daca într-o explicatie apare:
Sisteme bazate pe cunostinte 167
aceasta înseamna ca variante corecte în program pot fi numai: (exemplul 1); (exemplul 2);
(exemplul abc).
Pentru a iesi de sub interpretorul CLIPS se foloseste comanda: (exit), sau din fereastra
“File”, comanda “quit”.
Exercitiul 5.1.
a. Raspundeti la întrebarile:
• Cum se poate interactiona cu mediul CLIPS ?
• Care sunt tipurile de câmpuri CLIPS ?
Un fapt CLIPS este o lista de unul sau mai multe câmpuri. În CLIPS o lista un
continut delimitat prin perechea de paranteze ( ); deci un fapt este unul sau mai multe câmpuri
incluse între paranteze. Conform conventiilor de notatie avem urmatoarea definitie a faptului
CLIPS:
Folosirea unui acelasi tipar pentru toate faptele din baza de fapte va determina usurinta
în urmarirea si întelegerea bazei de fapte de catre programator si de catre utilizator, cât si
usurinta în actualizarea acesteia. Faptele (5.2) si (5.4) de mai sus respecta tiparul (5.5), în timp
ce faptul (5.3) nu respecta acest tipar; el poate fi rescris, conform tiparului (5.5), ajungându-se
la forma:
De remarcat numarul diferit de câmpuri din cele doua forme (5.3) si (5.6); de
asemenea, forma (5.3) este mai apropiata de limbajul natural si poate fi de preferat în anumite
cazuri.
Concluzia este aceea ca programatorul, într-o etapa preliminara scrierii programului,
trebuie sa stabileasca tipare pe care, atât pentru consecventa, cât si pentru conceperea mai
usoara a regulilor, le vor urma faptele din baza de fapte; aceste tipare trebuie sa fie cât mai
inteligibile si pentru beneficiarul SE.
Mai exista si unele aspecte de optimalitate care vor fi lamurite ulterior, referitoare la
interdependenta între forma faptelor din baza de fapte si regulile din baza de reguli, cât si la
ocuparea memoriei. Legat de acest ultim aspect, se poate ca într-un fapt numele relatiei sa nu
mai fie înscris, fiind subînteles, aceasta omisiune determinând o reducere a numarului de
câmpuri.
Toate faptele cunoscute la un moment dat de interpretorul CLIPS sunt mentinute într-o
colectie – baza de fapte (BF), sau memoria de lucru, care în CLIPS se mai nume ste si lista de
fapte (“fact list”). Exista mai multe posibilitati de a introduce fapte în BF.
Varianta a). Se pot introduce unul sau mai multe fapte în BF de la nivel superficial sau
dintr-o regula, din partea de actiune a acesteia, prin comanda “assert”. Aceasta are sintaxa (ne
bazam pe definitia (5.1) a faptului CLIPS):
Se remarca introducerea unui singur fapt în cazul (5.8) si a trei fapte în cazul (5.9).
Comanda “assert” poate fi folosita nu numai la nivel superficial, ci si în partea de actiune a
unei reguli, asa cum se va explica ulterior. Din punct de vedere al clasificarii ce a fost data în
paragraful 5.1, comanda "assert" va fi încadrata în categoria functiilor; "assert" este numele
functiei, argumetele sunt faptele care sunt delimitate de închiderea parantezei, iar efectul
evaluarii functiei este acela de modificare a BF.
170 Reprezentarea cunoasterii folosind mediul CLIPS
Utilizatorul are mai multe posibilitati de a vedea starea BF la un moment dat. Astfel,
exista comanda:
unde parametrii start, end si maxim sunt întregi pozitivi. Semnificatia este aceea ca aceasta
comanda poate fi folosit a cu 0 pâna la 3 argumente. Daca sunt 0 argumente atunci se afiseaza
întreaga BF; daca se foloseste numai start atunci se listeaza toate faptele având contorul
identificatorului mai mare sau egal cu start; daca se foloseste si start si end atunci se afiseaza
toate faptele al caror contor satisface rela tia:
Daca apare si maxim, împreuna cu start si end, atunci vor fi listate cel mult maxim
fapte (primele), care respecta conditia (5.11).
Exercitiul 5.2.
a. Introduceti de la nivel superficial mai multe fapte în BF.
b. Urmariti faptele introduse prin comanda “facts”, folosita cu un numar diferit de
argumente, cât si prin deschiderea ferestrei de fapte.
unde argumentul respectiv trebuie sa fie de tip sir de caractere sau simbol. El va preciza
numele fisierului pe care îl dorim a fi încarcat; în functie de plasarea acestui fisier, va fi
necesar eventual sa precizam si calea, tinând seama de regulile de scriere a sirurilor de
caractere. De exemplu, comanda (5.13) fiind înscrisa în fisierul fisier1.clp (de obicei extensia
fisierelor în care înscriem programe CLIPS este .clp), atunci, de sub interpretorul CLIPS,
putem încarca acest fisier prin comanda (am presupus ca a fost necesara precizarea caii):
(load “d:\\users\\fisier1.clp”)
sau, daca suntem într-un mediu care lucreaza cu meniuri, putem folosi direct comanda Load
constructs, din meniul File. Mai mentionam ca într-un fisier pot fi înscrise oricâte comenzi de
172 Reprezentarea cunoasterii folosind mediul CLIPS
definire de constructii, dupa cum putem pastra construc tii în mai multe fisiere, pe care sa le
încarcam atunci când este necesar. Un efect invers fa ta de “load” are comanda:
unde argumentul trebuie sa fie de tip sir de caractere sau simbol. Efectul este de salvare în
fisierul respectiv a tuturor definitiilor de constructii existente în sistem în acel moment.
Faptele din BF pot fi sterse, atunci când ele nu mai sunt adecvate (formulele pe care le
reprezinta nu mai sunt valide), cu ajutorul comenzii:
(retract <<<contor>>>)
unde contor trebuie sa fie un întreg pozitiv, reprezentând contorul din identificatorul faptului
care trebuie sters. Exemple de utilizare a acestei comenzi sunt:
(retract 1)
(retract 5 23 25)
Daca se cere stergerea unui fapt care nu exista (locul respectiv este gol), se afiseaza
eroare. Exista si urmatoarea forma a comenzii “retract”:
(retract *)
Exercitiul 5.3.
a. Raspundeti la urmatoarele întrebari:
• Care sunt deosebirile dintre comenzile "deffacts" si "assert" ?
• Câte fapte se pot afla într-o BF, dupa rularea unui program, între identificatorii
f-10 si f-15 ?
• Cum poate utilizatorul vedea primele 25 fapte aflate între identificatorii f-15 si
f-80 ?
Pentru a introduce o regula în baza de reguli (BR) se poate folosi comanda “defrule”,
care fiind de tip definire de constructie are o forma similara cu comanda “deffacts”. Sintaxa
pentru “defrule” este:
Pentru fiecare regula trebuie folosita o comanda “defrule”; daca o comanda “defrule”
se foloseste succesiv cu acelasi nume de regula, atunci ultima definitie o înlocuieste pe cea
anterioara. Regulile se introduc în BR prin folosirea comenzilor “defrule” la nivel superficial,
sau prin înscierea acestor comenzi în fisiere si încarcarea acestora prin comanda “load”.
O regula din BR se poate gasi în una din starile: inactivata, activata si în executie. O
regula este activata daca toate tiparele ei pot fi potrivite pe faptele din BF din momentul
respectiv; în caz contrar regula este inactivata. Aceasta înseamna ca în CLIPS se respecta
chestiunea formala discutata în capitolele anterioare, anume ca partea de conditie a regulilor
este sub forma de formula conjunctiva. De exemplu, fiind data regula cu numele
“regula_exemplu”, introdusa prin definitia:
Observatia 5.1.
a. Se constata cum din punct de vedere al sintaxei CLIPS faptele au aceeasi forma cu
tiparele regulilor, chestiune explicabila teoretic prin felul în care trebuie sa lucreze motorul de
inferente.
b. O regula poate sa aiba si zero tipare; felul în care este activata o asemenea regula va
fi explicat la comanda “reset”.
c. Din punct de vedere al sintaxei este permis ca o regula sa nu aiba nici o actiune, desi
asa ceva nu este util; în programarea bazata reguli, acestea sunt cele care determina evolutia
programului, prin actiunile pe care le produc, cu efecte fie asupra bazei de cunostinte, fie în
exteriorul SBC.
d. Ca un caz particular, agenda poate contine si zero reguli (atunci când nici o regula
din BR nu este satisfacuta de faptele prezente în BF).
e. În definitia unei reguli acesteia i se poate atasa un nivel de prioritate. Daca unei
reguli nu i s-a fixat în mod explicit o prioritate, interpretorul CLIPS îi va da în mod implicit
prioritatea 0. Atasarea prioritatii se face prin declaratia:
unde întreg trebuie sa fie un numar întreg cuprins între –10000 si 10000. Declaratia
(5.15) trebuie sa apara în definitia regulii dupa comentariul optional (daca acesta exista) si
înainte oricarui tipar. Prioritatea atasata unei reguli este luata în considerare de motorul de
inferente, dupa cum se va arata în continuare.
Executia unei reguli înseamna executia, în ordinea în care apar, a actiunilor din partea
dreapta a regulii. Actiunile sunt reprezentate de comenzi CLIPS de tip functie, iar în CLIPS
versiunea 6 sunt admise drept actiuni si definitiile de constructii. În exemplul dat prin regula
(5.14), partea de actiune a acesteia contine o singura comanda “assert”, astfel ca dupa executia
regulii vom constata ca în BF a fost introdus un nou fapt – ( c 3). Executia regulilor în
CLIPS nu se face în mod automat, ci numai daca utilizatorul transmite comanda:
(run [<limita>])
Argumentul respectiv trebuie sa fie un întreg, mai mare sau egal cu -1 si el da numarul
maxim de reguli care sa fie executate. Daca argumentul “limita” nu este prevazut, sau are
valoarea -1, atunci executia regulilor va continua pâna când nu mai exista nici o regula în
176 Reprezentarea cunoasterii folosind mediul CLIPS
agenda (dupa ce o regula este executata ea este scoasa din agenda); daca argumentul este
prevazut, atunci executia va înceta dupa cel mult un numar de executii de reguli egal cu
“limita”.
Din cele prezentate pâna aici rezulta ca apare o interdependenta între reguli si BF :
regulile sunt activate sau nu, în functie de faptele prezente în momentul respectiv în BF.
Aceasta interdependenta este sub controlul motorului de inferente.
Sisteme bazate pe cunostinte 177
Pas 1. Se determina toate regulile care au partea de conditie satisfacuta, tinând seama
de starea BF din momentul respectiv; regulile activate sunt trecute în agenda.
Pas 2. Daca este admisa o evaluare dinamica a prioritatilor regulilor, atunci se
reevalueaza prioritatile tuturor regulilor din agenda. Se ordoneaza regulile din agenda în
functie de valorile prioritatilor acestora si de strategia de rezolvare a conflictului folosita
(setata). Daca agenda este vida, sau s-a atins numarul impus de reguli de executat, atunci
ciclul (rularea) se opreste.
Pas 3. Se executa actiunea/actiunile din partea dreapta a regulii aflate pe prima pozitie
în agenda (regula respectiva este eliminata din agenda, aspect aflat în legatura cu proprietatea
de refractie a sistemelor bazate pe reguli – vezi paragraful 5.6). Se incrementeaza contorul cu
privire la numarul regulilor executate si se revine la pasul 1 (prin executia regulii baza de
cunostinte poate fi modificata, astfel ca la revenirea la pasul 1 este justificata).
Observatia 5.2.
a. Daca pasii 1 si 2 se executa de la sine, de îndata ce exista BR si BF, fara nici o alta
comanda suplimentara, pasul 3 intra în functiune (si cu aceasta rularea, repetarea ciclului)
numai daca utilizatorul transmite comanda “run”. Dupa ce a fost data aceasta comanda, ciclul
de mai sus se este declansat, oprirea putând sa apara în conformitate cu conditia precizata la
pasul 2.
b. Cei trei pasi de mai sus au denumiri în functie de scopul lor. Pasul 1 se numeste de
potrivire, fiind vorba de gasirea regulilor ale caror tipare se potrivesc pe faptele din BF.
Procesul de potrivire are o serie de aspecte specifice, ce vor fi discutate separat. Pasul 2 se
numeste de rezolvare a conflictului; denumirea provine din aceea ca multimea regulilor
activate la un moment dat (agenda) se mai numeste si multime conflictuala; explicatia
denumirii este aceea ca regulile din agenda sunt în conflict, în ceea ce priveste obtinerea
executiei; rezolvarea conflictului se face în conformitate cu o anumita strategie si exista mai
multe strategii, ce vor fi prezentate ulterior. Pasul 3 se numeste de executie.
c. Prin repetarea ciclului de mai sus se produce o evolutie a BF: dupa fiecare executie
a unei reguli BF se poate modifica, deoarece în majoritatea cazurilor actiunile regulilor sunt si
de tipul celor care afecteaza BF (de exemplu, “assert”, “retract”). Dupa efectuarea pasului 3,
BF putând fi modificata, pasul 1 are consistenta, în sensul ca noi reguli pot fi satisfacute, în
timp ce altele nu mai sunt satisfacute.
178 Reprezentarea cunoasterii folosind mediul CLIPS
(agenda)
în care nr indica prioritatea ce a fost atribuita regulii respective, iar f - ij sunt identificatorii
faptelor care au satisfacut tiparele regulii (acestia apar în ordinea tiparelor din regula).
Afisarea agendei se poate obtine si activând optiunea corespunzatoare din meniul Window.
Exercitiul 5.4.
Scrieti regula care sa fie activata daca în BF se gasesc faptele (a), (b) si (c) (activarea
sa se produca numai daca sunt prezente toate trei în BF) si care sa introduca în BF, la
executie, faptul (d) . Urmariti BF si agenda. Efectuati rularea.
Observatia 5.3.
180 Reprezentarea cunoasterii folosind mediul CLIPS
Ceea ce retine motorul de inferente sunt faptele care au determinat activarea, împreuna
cu identificatorii acestor fapte. Aceeasi combina tie de identificatori nu va putea face o noua
activare, în schimb în combinatia respectiva ordinea conteaza, astfel ca aceleasi fapte pot
determina mai multe activari, considerate în ordini diferite, evident cu conditia asigurarii
potrivirilor necesare. De exemplu, asa cum vom vedea ulterior, agenda ar putea arata la un
moment dat în forma:
0 R1 f - 1, f - 2
0 R1 f - 2, f - 1
aceasta însemnând ca regula R1, de prioritate 0, este activata de doua ori de aceleasi fapte, cu
identificatorii f - 1 si f - 2. În aceasta situatie, la comanda (run) regula R1 va fi în principiu
executata de doua ori, conform celor doua plasari ale ei în agenda.
Exercitiul 5.6.
a. Care este conditia pe care trebuie sa o îndeplineasca faptele din explicatia de mai
sus, din punct de vedere al procesului de potrivire ?
b. Tinând seama de raspunsul la întrebarea anterioara, rezulta ca mai pot fi posibile si
alte plasari ale lui R1 în agenda, tot datorit a faptelor f - 1 si f - 2. Care sunt acestea ?
c. În ce conditii se poate întâmpla ca dupa prima executie a regulii R1 din explicatia de
mai sus, urmatoarea sau urmatoarele executii sa nu se mai produca ?
(refresh <nume-regula>)
efectul fiind de replasare în agenda a regulii precizate prin argumentul respectiv, în conditiile
în care potrivirea pentru acea regula este satisfacuta, iar neactivarea ei se datoreste refractiei.
Sisteme bazate pe cunostinte 181
Comanda “reset” este cea care poate fi folosita în CLIPS pentru a obtine un efect de
initializare (aducerea bazei de cunostinte într-o stare initiala, prestabilita de programator). Ea
are forma:
(reset)
adica introduce de la sine o comand a “deffacts” în interiorul careia se afla un singur fapt, cu
un singur câmp: initial- fact. Rezulta ca dupa efectuarea comenzii “reset”,vom gasi în BF, în
mod automat, faptul (initial- fact), care va fi plasat la identificatorul f - 0. Astfel, chiar daca
utilizatorul nu a introdus în sistem nici o comanda “deffacts”, dupa “reset” BF va contine un
fapt. Rolul lui “initial- fact” este de crea o posibilitate de începere a unui program scris în
CLIPS. În acest sens, este de observat ca rularea în CLIPS nu se produce daca nu exista reguli
plasate în agenda, iar daca BF nu contine fapte, regulile nu pot fi activate. Totusi, daca în BR
exista reguli cu partea de conditie vida (zero tipare – ceea ce este admis de sintaxa comenzii
“defrule”), motorul de inferente le considera ca si cum ar avea în partea stânga un singur tipar,
de forma:
(initial- fact)
În acest fel, dup a “reset”, toate regulile cu partea stânga vida vor fi plasate în agenda,
deoarece în BF exista faptul preluat din definitia implicita (5.16), introdusa în mod automat de
sistem. Asemenea reguli vor putea fi folosite de utilizator, printr-o parte de actiune
corespunzatoare, încât ele sa efectueze actiunile de pornire pentru SE (de exemplu, primirea
datelor initiale de la utilizator).
182 Reprezentarea cunoasterii folosind mediul CLIPS
În afara de comenzile deja descrise (“facts”, “agenda”) exista si alte comenzi care pot
ajuta utilizatorul în construirea si urmarirea BF si a BR. Astfel, se poate afla continutul BR
prin comanda:
(rules)
care va avea ca efect afisarea numelor tuturor regulilor prezente în BR. Putem vedea întreg
continutul unei reguli prin comanda:
(pprule <nume-regula>)
singurul argument specificând numele regulii pe care o vrem afisata integral (denumirea este
o prescurtare de la formularea în engleza “pretty print rule” – afisare “frumoasa”; în CLIPS
exista mai multe comenzi a caror denumire începe cu "pp" si care au o actiune similara - de
afisare a continutului unei constuctii) . Efectele comenzilor “rules” si “pprule” (ca si cel al
comenzii “refresh”) se pot obtine si folosind meniul Browse.
Comenzi similare exista si pentru “deffacts”. Astfel putem vedea numele tuturor
comenzilor “deffacts” existente prin:
(list-deffacts)
(ppdeffacts <nume-deffacts>)
efectul fiind acela de stergere a regulii specificate, respectiv a comenzii “deffacts” cu numele
precizat prin argumentul respectiv (stergerea se poate face si din meniul Browse). Este de
observat ca în cazul stergerii unei comenzi “deffacts” nu se produce stergerea faptelor din BF,
ci stergerea definitiei construc tiei “deffacts” respective. De asemenea, este de observat ca
utilizatorul, intrat sub interpretorul CLIPS, poate sterge si constructia “deffacts” introdusa
automat de sistem (cea cu numele “initial- fact”); evident utilizatorul va face asa ceva daca
Sisteme bazate pe cunostinte 183
vrea sa elimine efectul pe care îl are comanda respectiva – cel provocat de “reset”. O comanda
de stergere generala este comanda:
“reset”
“assert”
BF
Baza de definitii de constructii
Grupuri de Reguli
fapte (deffacts) (defrule) - BR Motor de inferente
(clear)
care sterge toate informa tiile din sistem: se videaza BF, BR, agenda si sunt sterse toate
comenzile de definire de constructii (în particular toate comenzile “deffacts”), adica sistemul
devine ca în momentul pornirii (comanda “clear” este disponibila si din meniul Execution).
Efectele tuturor acestor comenzi se pot întelege mai bine daca luam în considerare
entitatile cu care lucreaza mediul CLIPS, conform fig. 5.1. Se pot observa aspectele comune
cu arhitectura generala a unui SE data în primul capitol, dar si unele particularitati ale
mediului CLIPS. Astfel, acesta mentine într-o colectie – Baza de definitii de constructii –
toate definitiile (comenzile care încep cu “def”) introduse în sistem (fie de la nivel superficial,
din fisiere încarcate cu “load”, sau ca rezultat al actiunii unor reguli). În aceasta colectie exista
separat o submultime a tuturor definitiilor “deffacts” – accesibila prin “list-deffats”, sau din
meniul Browse, o submultime a tuturor definitiilor de reguli – accesibila prin “rules” si care
are rolul BR din arhitectura de SE, dupa cum mai sunt si seturile definitiilor de variabile
globale, de fapte structurate, asupra carora vom reveni, sau definitiile de obiecte
(nereprezentate în fig. 5.1) din modulul destinat programarii orientate pe obiecte. Separat de
aceasta multime exista BF, care poate fi vizualizata într-o fereastra separata si în care faptele
ajung pe cele doua cai deja prezentate: din definitiile “deffacts”, dupa o comanda “reset”, sau
din comenzile “assert”. De asemenea exista agenda, care contine regulile activate, adica
elementele din BR aflate în situatia de a avea partea de conditie verificata de faptele din BF,
chestiune rezolvata de motorul de inferente.
184 Reprezentarea cunoasterii folosind mediul CLIPS
Una din comenzile ce este frecvent folosita în partea de actiune a regulilor este:
unde <nume- logic> indica destina tia iesirii; pentru ca initial vom folosi aceasta comanda
numai pentru afisarea pe terminal, argumentul nume-logic va fi t (iesirea se poate face si la
imprimanta sau într-un fisier, asa cum vom arata ulterior); rezultatul acestei comenzi va fi
înscrierea elementelor de iesire; acestea pot fi în principiu orice comenzi CLIPS, cu exceptia
definitiilor de construc tie. Daca drept element de iesire se foloseste apelul unei func tii sau
numele unei variabile globale, atunci se afiseaza rezultatul evaluarii elementului respectiv.
• o constanta de tip sir de caractere este afisata fara ghilimelele de început si de sfârsit;
• între mai multe elemente afisate nu se introduce în mod automat nici un spatiu; de aceea
programatorul trebuie sa aiba grija de obtinerea spatierii, de exemplu prin introducerea unui
element de ie sire de forma “ ”;
• dupa executia comenzii “printout” prompterul nu trece la o line noua în mod automat si
de aceea, aproape întotdeauna, ultimul element de iesire într-o comanda printout va fi
constanta crlf, care va avea drept efect trecerea prompterului pe o linie noua.
Exercitiul 5.7.
a. Verificati efectul urmatoarelor comenzi:
• (printout t (+ 12 13))
• (printout t (+ 12 13) crlf)
• (printout t CLIPS e bun crlf)
• (printout t “CLIPS e bun” 23 “ ” OK (* 2 2) crlf)
• (prinout t (assert (a) ) crlf)
• (printout t (facts) crlf)
b. Scrieti o regula care sa afiseze un mesaj de pornire a functionarii unui SE atunci
când în BF se gaseste un anumit fapt de începere a lucrului.
186 Reprezentarea cunoasterii folosind mediul CLIPS
Exercitiul 5.8.
Verificati explicatia de mai sus pe un exemplu, obtinut prin urmatoarele comenzi:
Mai sunt si alti câtiva parametri care pot interveni în comanda “watch”, dar care nu se
refera la BF si BR (urmarirea variabilelor globale, a obiectelor, a functiilor). Comanda
“watch” are drept efect urmarirea anumitor elemente ale programului CLIPS în timpul
lucrului cu interpretorul. Daca parametrul folosit în comanda este “all” atunci vor fi urmarite
toate elementele. Efectul de dezactivare se poate obtine prin comanda:
pentru elementul respectiv. De observat ca, atât la activarea urmaririi cât si la dezactivarea
acesteia, daca ne intereseaza efectul asupra a doua elemente, atunci comanda va trebui
transmisa de doua ori, cu folosirea parametrilor corespunzatori. De altfel, comanda watch cu
parametrii ei poate fi selectata si din meniul Execution.
Daca se urmaresc faptele (s-a dat comanda (watch facts)), atunci utilizatorul va fi
informat, printr-un mesaj, ori de câte ori un fapt este introdus sau scos din BF. Daca se
urmaresc activarile (comanda (watch activations) ), atunci se va afisa un mesaj ori de câte ori
o regula este introdusa sau scoasa din agenda. Daca se urmaresc regulile (comanda (watch
rules) ), atunci se afiseaza un mesaj de fiecare data când o regula este executata. Daca se
urmaresc compilarile (comanda (watch compilations) ), atunci se afiseaza mesaje la
încarcarea unor definitii de constructii dintr- un fisier (interpretorul face un fel de compilare la
încarcarea definitiilor de construc tii, de exemplu pregatind pasul de potrivire al motorului de
inferente, în conformitate cu algoritmul RETE). Daca se urmaresc statisticile (comanda
(watch statistics) ), atunci se afiseaza mesaje, dupa rulare, cu privire la numarul de fapte din
BF, numarul de reguli din age nda, numarul de reguli executate si timpul de rulare.
(matches <nume-regula> )
Ea este utila atunci când în BR exista reguli cu multe tipare si dorim sa stim care tipare
au fost satisfacute si care nu la un moment dat. Argumentul va fi numele regulii care vrem sa
fie urmarita din punct de vedere al potrivirilor. Comanda “matches” este accesibila si din
meniul Browse, optiunea Rule Manager. Pentru a ilustra efectul acestei comenzi se poate
folosi urmatorul exemplu:
Mesajele afisate se refera la felul în care se potrivesc tiparele regulii urmarite, în ordinea în
care apar ele în definitia regulii, cât si la felul în care sunt potrivite grupurile de tipare luate
împreuna: primele doua tipare luate împreuna, primele trei tipare luate împreuna, s.a.m.d.
Aceasta urmarire a grupurilor de tipare devine importanta atunci când în tiparele regulii
se folosesc si variabile. Ultimul mesaj afisat la comanda “matches” se refera la activarile
regulii (plasarea sau nu, a acesteia, în agenda).
188 Reprezentarea cunoasterii folosind mediul CLIPS
(set-break <nume-regula> )
Efectul este de stabilire a unui punct de oprire (“break-point”) la regula cu numele dat
prin argument. În acest caz rularea se va opri (iata un alt caz de stopare a ciclului de lucru al
motorului de inferente, neluat în considerare în paragraful 5.5) înainte de executia regulii
respective, cu observa tia ca este necesar ca macar o regula sa fie executata (prin comanda
“run”), înainte ca un punct de oprire sa poata opri executia. De altfel, în acest fel, un punct de
oprire poate fi depasit prin repetarea comenzii de rulare. Dupa fiecare oprire, pentru depanare,
utilizatorul poate cerceta BF si agenda.
Putem lista toate punctele de oprire prin comanda:
(show-breaks)
(remove-break [ <nume-regula> ] )
Daca argumentul exista atunci se va îndeparta numai punctul de oprire corespunzator regulii
indicate, iar daca argumentul lipseste sunt eliminate toate punctele de oprire. Mai mentionam
ca punctele de oprire pot fi manevrate si din meniul Browse, optiunea Defrule Manager.
Un efect de oprire dupa rularea unui anumit numar de reguli se poate obtine si prin
comanda “run”, data cu un argument corespunzator; în plus, în meniul Execution exista si
optiunea Step care are un efect de rulare pas cu pas (este echivalenta lui (run 1), cu observatia
ca pasul poate fi si schimbat la o valoare mai mare ca 1, în optiunea Preferences).
Exercitiul 5.9.
a. Raspundeti la urmatoarele întrebari:
F ( x, y, z ) = x ⋅ y ⋅ z U x ⋅ y ⋅ z
x S0 S1 S2 S3
0 S1 S1 S3 S3
1 S2 S0 S2 S0
?<nume-variabila>
unde nume- variabila trebuie sa fie un simbol CLIPS care sa înceapa cu o litera si între ? si
numele variabilei nu trebuie sa existe nici un spatiu.
Eroarea este aceea ca a fost folosit a variabila ?x în partea de actiune a regulii, fara ca
aceasta sa fi fost legata în prealabil (fara sa- i fi atribuit o valoare). Variabilele locale pot fi
folosite în partea dreapta a unei reguli numai dupa ce au primit o valoare în partea stânga a
regulii respective. Astfel, un exemplu de folosire corecta a unei variabile într-o regula este
urmatorul:
Observatia 5.4.
a. O variabila locala simpla prezenta într-un tipar în partea de conditie a unei reguli va
putea fi potrivita de un singur câmp, indiferent de valoarea acestuia (o variabila simpla nu se
poate lega la doua câmpuri). De exemplu, în regula r de mai sus, un fapt de forma (este-
student Ion Ionescu) nu va determina activarea regulii, deoarece variabila simpla ?nume nu
Sisteme bazate pe cunostinte 191
Desi în cele doua reguli s-a folosit acelasi nume de variabila, între regulile respective
nu va exista nici o legatura, pentru ca o variabila ramâne legata numai pe durata de actiune a
regulii.
c. O variabila poate fi folosita de mai multe ori în partea de actiune a unei reguli
(respectând conditia de a fi deja legata) si poate fi folosita si în operatii diferite, ca în
exemplul urmator:
Exercitiul 5.10.
a. Introduceti regula de mai sus, “determinare-autor-curs”, într- un fisier, împreuna cu
un grup de fapte care sa satisfaca partea de conditie a regulii, în asa fel încât sa obtineti macar
doua activari ale acesteia. Verificati rezultatele prin rulare.
(defrule bunic
(este-bunic-al ?nume ?nume)
=>
(assert (are-nepot ?nume pe ?nume) ) )
(defrule determinare-bunic
(tatal- lui ?copil este ?tata)
(tatal- lui ?tata este ?bunic)
=>
(printout t “Bunicul lui ” ?copil “este” ?bunic crlf) )
(deffacts relatii-rudenie
(tatal- lui Ion este Mihai)
(tatal- lui Vasile este Mihai)
(tatal- lui Mihai este Andrei)
(tatal- lui Gh este 10)
(tatal- lui Maria este 10)
(tatal- lui 10 este 20)
(tatal- lui Ion este Ion) )
câte activari ale regulii determinare-bunic veti obtine dupa resetare ? (explicati de ce).
0 R1 f - 1, f - 2
0 R1 f - 1, f - 1
0 R1 f - 2, f - 1
0 R1 f - 2, f - 2
Adesea este necesar ca un fapt sa fie sters din BF în timpul lucrului unui SE, prin
actiunea unei reguli. Un exemplu în acest sens ar fi regula:
operatorul special <- care permite legarea valorii contorului din identificatorul unui fapt la o
variabila, în partea de conditie a unei reguli; astfel legata, variabila va putea fi folosita în
partea de actiune, într-o operatie de stergere a faptului respectiv. O asemenea situatie este
ilustrata în exemplul urmator:
(defrule Rr
?adresa <- (a 1)
(b 2)
=>
(retract ?adresa)
(assert (c 3) ) )
Partea de conditie a regulii Rr trebuie înteleasa în felul urmator. Regula cere existenta
în BF a doua fapte: (a 1) si (b 2). Daca regula este activata, variabila ?adresa va fi legata la
contorul din identificatorul faptului (a 1) – în conformitate cu plasarea faptului respectiv în
BF, iar la executie, comanda “retract” va determina stergerea faptului (a 1) din BF. Este de
remarcat ca aici programatorului i- a fost necesara numai cunoasterea continutului faptelor si
nu a locului (adresei) acestora în BF; se ilustreaza astfel una din caracteristicile limbajelor de
IA, aceea ca programatorii nu trebuie sa se mai preocupe de calculul adreselor. Pentru
conciziunea exprimarii vom numi în cele ce urmeaza contorul din identificatorul unui fapt ca
fiind adresa acelui fapt.
Este admisa si folosirea variabilelor în tiparul care se foloseste pentru atribuirea unei
adrese de fapt, dupa cum este posibila efectuarea mai multor atribuiri de adrese în partea de
conditie a unei reguli. Iata un exemplu în acest sens:
(defrule regula-ilustrativa
?a <- (A ?x)
?b <- (b ?y ?x)
=>
(retract ?a ?b) (printout t ?x “ “ ?y crlf) )
Exercitiul 5.11.
Verificati prin încarcarea regulii de mai sus în BR si a faptelo r necesare activarii în
BF, în ce conditii este regula plasata în agenda si care sunt efectele executiei ei. Explicati
functionarea.
Observatia 5.5.
a. Se poate formula o concluzie privind forma (sintaxa) comenzii “retract”; aceasta
este:
Sisteme bazate pe cunostinte 195
unde adresa-fapt poate fi un întreg pozitiv, reprezentând contorul din identificatorul unui fapt
ce trebuie sters, sau o variabila legata la adresa unui fapt ce va fi sters.
b. Variabilele legate la adrese de fapte nu pot fi folosite pentru adaugarea de fapte în
BF prin comenzi “assert”, adica o comanda de forma (assert ?x) unde ?x este legata la adresa
unui fapt este gresita.
Pot fi scrise reguli care sa determine faptele ce satisfac anumite conditii. De exemplu,
regula ce determina toti studentii ce au domiciliul în Iasi poate fi:
(defrule domiciliul_in_Iasi
(student ?nume ?facultatea ? ? Iasi)
=>
(printout t ?nume “ de la faculatea ” ?facultatea “ are domiciliul in Iasi” crlf))
Explicatia poate fi obtinuta facând corespondenta între tiparul (5.17) si ceea ce apare
în partea de conditie a regulii. Astfel, regula determina toate faptele pentru care câmpul
<domiciliul-stabil> este simbolul Iasi, urmând sa afiseze, la executie, câmpurile <nume> si
<facultatea>, fara sa intereseze valoarea câmpurilor <an-de-studii> si <grupa>; de aceea în
tiparul regulii s-a folosit în pozitiile care nu intereseaza variabila nespecificata simpla.
Observatia 5.6.
a. Într- un tipar variabila nespecificata poate fi folosita de mai multe ori; de asemenea
ea poate fi folosita de mai multe ori în mai multe tipare; toate aceste situatii nu introduc
196 Reprezentarea cunoasterii folosind mediul CLIPS
restrictii de potrivire. De exemplu, în regula de mai sus, folosirea repetata a lui ?, pentru
câmpurile 4 si 5 nu introduce nici o dependenta de potrivire între aceste câmpuri.
b. Chiar daca valoarea unui câmp dintr-un tipar nu intereseaza din punct de vedere al
procesului de potrivire, atunci când acel câmp este necesar în partea de actiune a regulii, nu se
va folosi variabila nespecificata, ci se va folosi o variabila specificata. Asa s-a procedat în
cazul de mai sus cu câmpurile <nume> si <facultatea>.
Exercitiul 5.12.
a. Precizati care este deosebirea în functionare între urmatoarele doua reguli:
(defrule R1 (persoana ?nume are copii ?x) => )
(defrule R2 (persoana ?nume are copii ? x) => )
Variabilele folosite pâna aici au fost variabile simple (specificate sau nu); aceasta se
refera la aceea ca aceste variabile, în procesul de potrivire, tin locul unui singur câmp si se pot
lega la un singur câmp.
Variabila nespecificata multipla este $?. Ea poate fi folosita pentru potrivirea a zero
sau mai multe câmpuri dintr-un tipar, câmpuri care nu ne intereseaza.
conform caruia putem reprezenta multimile prin fapte. Ne intereseaza regula care sa
determine toate multimile pentru care avem fapte în BF, aceasta trebuie sa fie activata
indiferent de numarul de elemente ale multimii respective (în particular aceasta poate fi si
vida). Regula respectiva este:
Exercitiul 5.13.
Introduceti regula de mai sus într-un fisier, împreuna cu urmatorul grup de fapte:
(deffacts Multimi
(multime M1 3)
(multime M2)
(multime M3 1 3 5)
(multime M4 1 2 3)
(multime M5 1 3 3 5)
(multime M6 3 4 2)
(multime M7 3 4)
(multime M8 1 3 4 2)
(multime M9 1 4 3 2) )
Mai facem observatia ca variabilele simple si multiple, specificate sau nu, pot fi
folosite împreuna, ceea ce va permite verificarea unor conditii de potrivire complexe. În ceea
ce priveste decizia de folosire a unei variabile multiple specificate sau a uneia nespecificate,
aceasta se ia dupa acelasi criteriu ca la variabilele simple.
Exercitiul 5.14.
a. Cu referire la exemplul din exercitiul 5.13, sa se scrie regula care sa gaseasca toate
multimile ce contin elemetul 3, indiferent de pozitia acestuia în multime, si sa afiseze
198 Reprezentarea cunoasterii folosind mediul CLIPS
elementele aflate în multime înaintea lui 3 si dupa acesta. Verificati functionarea pe grupul de
fapte “Multimi” folosit în exercitiul 5.13 si comentati numarul de activari ale regulii.
Este de subliniat ca faptul (multime M5 1 3 3 5) va determina doua activari ale
regulii care rezolva acest exercitiu. Am obtinut astfel un caz când un acelasi fapt a determinat
plasarea de doua ori pentru o aceeasi regula în agenda. Asa ceva s-a întâmplat deoarece a fost
vorba despre doua potriviri diferite pentru variabilele din partea de conditie a regulii.
Observatia 5.7.
a. Variabilele discutate pâna aici (simple - multiple, specificate - nespecificate) au fost
variabile locale. Acestea au o anumita semnificatie numai în interiorul unei reguli,
semnificatia pierzându-se în afara acesteia. Astfel, daca de la nivel superficial se da comanda:
?x, se va afisa eroare. Atunci când o regula este activata, o variabila locala folosita în partea ei
de conditie pastreaza o anumita valoare, obtinuta prin procesul de potrivire si care se mentine
pâna la sfârsitul executiei regulii.
b. Desi folosirea variabilelor multiple poate fi esentiala în anumite cazuri în
conducerea procesului de potrivire, utilizarea lor excesiva conduce la ineficienta deoarece ele
determina un consum important de memorie ca si cresterea timpului de rulare. Explicatia este
aceea ca, de exemplu, tiparul (a $?x) va fi încercat pe fapte cu 1, 2, ..., n câmpuri, iar
variabila multipla $?x va trebui sa memoreze 0, 1, 2, ... , n câmpuri, în functie si de faptele
existente în BF.
Ca o regula, o variabila multipla specificata sau nespecificata va fi folosita numai
atunci când numarul de câmpuri dintr- un tipar nu se cunoaste a priori, iar în cazul când acest
numar este cunoscut, se va prefera folosirea repetata a unei variabile simple, chiar daca
aceasta trebuie scrisa de mai multe ori.
c. O variabila multipla specificata, fie aceasta $?x, introdusa în partea de conditie a
unei reguli, poate fi numita în partea de actiune a acelei reguli fara semnul $, adica poate fi
scrisa ?x. Semnul $ are importanta numai în partea stânga a regulii, acolo unde se produce
procesul de potrivire, iar în partea dreapta, variabila fiind deja legata, semnul $ nu mai este
necesar. Un exemplu în acest sens este regula:
lor distinct, iar pentru partea de actiune tipul este dat de prima aparitie în partea stânga a
regulii, a variabilei respective.
Exercitiul 5.15.
Studiati comportarea legata de observatia de mai sus pe urmatorul exemplu:
(defrule rr1 (fapt $?x) (fapt1 ?x) => (printout t ?x " " $?x crlf) )
(defrule rr2 (fapt ?x) (fapt1 $?x) => (printout t $?x " " ?x crlf) )
(defrule rr3 (fapt ?x) (fapt1 $?x) => (printout t ?x " " $?x crlf) )
(defrule rr4 (fapt $?x) (fapt1 $?x) => (printout t ?x crlf) )
(deffacts initial
(fapt 1) (fapt 2) (fapt 1 2) (fapt 1 2 3)
(fapt1 1) (fapt1 2) (fapt1 3) (fapt1 1 2 3) (fapt1 1 2) (fapt1 1 3) )
În cele prezentate pâna aici variabilele se legau în partea stânga a regulilor, prin
procesul de potrivire. Daca este necesar, exista si posibilitatea ca o variabila sa se lege în
partea de actiune a regulilor (reamintim ca legarea în CLIPS este corespondentul atribuirii din
limbajele conventionale). În acest sens exista comanda:
Drept argument variabila se poate folosi o variabila locala, simpla sau multipla, sau o
variabila globala (acestea din urma vor fi prezentate în paragraful urmator). Argumentul
expresie poate fi o constanta, o functie, sau o variabila globala. Daca legarea se face pentru o
variabila locala simpla, atunci expresia poate fi o constanta, sau o functie/variabila globala
care sa se evalueze la o valoare cu un singur câmp. Daca functia “bind” se foloseste pentru
legarea unei variabile multiple, atunci cel de-al doilea argument poate fi o constanta (caz în
care variabila multipla se leaga la un singur câmp) sau poate fi o functie/variabila globala care
sa se evalueze la o valoare cu zero, unul sau mai multe câmpuri.
Exercitiul 5.16.
Introduceti urmatoarea regula si comentati functionarea ei, corectând eroarea care
apare (veti crea conditiile ca regula sa fie activata).
Pentru a putea lega o variabila multipla la o valoare cu mai multe câmpuri va trebui
folosita o functie care sa determine drept rezultat o asemenea valoare. Exista mai multe functii
CLIPS pentru valori multicâmp, dintre care cea mai utila este:
(mv-append <<element>>)
Efectul acestei functii este acela de construire a unei valori multicâmp din elementele
care sunt argumente. Aceste elemente pot fi constante, variabile legate simple sau multiple,
sau functii care sa determine drept rezultat o valoare cu zero, unul sau mai multe câmpuri.
Pentru a vedea efectul acestei comenzi efectuati de la nivel superficial:
Observatia 5.8.
a. În exemplul de mai sus între argumentele lui “mv-append” nu au aparut si variabile;
pot fi însa folosite si acestea, sub forma de variabile globale; variabilele locale pot apare ca
argumente ale lui “mv-append”, daca aceasta este utilizata în partea de actiune a unei reguli,
acolo unde o variabila locala este deja legata.
b. Functia “bind” poate fi folosita atât pentru legarea unei variabile care a fost deja
folosita în partea stânga a regulii, cât si pentru legarea unei variabile nou introdusa în partea
de actiune a regulii, atunci când o asemenea noua variabila este necesara.
Exercitiul 5.17.
Verificati si comentati functionarea urmatoarei reguli (veti crea conditiile ca regula sa
fie activata prin comanda “assert” sugerata, sau printr- un alt fapt corespunzator, introdus în
BF).
(assert (2 as 34 6) )
Variabilele globale vor pastra valori atât timp cât interpretorul este lansat. O variabila
globala se noteaza prin: ?*<nume-variabila>*, unde nume-variabila trebuie sa fie un simbol
care sa respecte aceleasi conditii ca la variabilele simple specificate. Pentru a putea folosi o
variabila globala aceasta trebuie în prealabil declarata prin definitia de constructie:
Sisteme bazate pe cunostinte 201
?*<nume-variabila>* = <expresie>.
S-au definit trei variabile globale care s-au si initializat (legat), conform sintaxei cerute
în comanda “defglobal”.
Observatia 5.9.
a. Într-o definitie “defglobal”, în operatia de legare trebuie lasat un spatiu înainte si
dupa semnul =.
b. O variabila globala se poate lega în definitia ei si la o valoare multicâmp, ca în
exemplul urmator:
d. O variabila globala se poate lega la o noua valoare fata de cea din definitia
“defglobal” prin folosirea functiei “bind” (cea descrisa în paragraful anterior) folosita la nivel
superficial sau în interiorul unei reguli, în partea de actiune. De exemplu, dupa comenzile:
(list-defglobals)
va determina listarea numelor pentru toate variabilele globale existente în sistem. De altfel,
exista si posibilitatea sa cream o fereastra în care sa avem afisate toate variabilele globale,
împreuna cu valorile lor, prin activarea optiunii respective în meniul Window. În plus,
variabilele globale pot fi urmarite prin comanda:
(watch globals)
situatie în care utilizatorul este anuntat prin mesaje asupra schimbarii valorilor variabilelor
globale; aceasta optiune se poate activa si din meniul Execution.
Comanda “reset” nu sterge variabilele globale. Felul în care actioneaza “reset” asupra
valorilor variabilelor globale depinde de starea unui bistabil (“flag”) al interpretorului CLIPS,
care poate fi trecut pe TRUE sau FALSE, prin comanda:
Variabilele globale pot fi eliminate toate din sistem prin comanda “clear”, cea care
sterge toate definitiile de constructii, sau câte una, prin comanda:
unde argumentul trebuie sa fie numele variabilei globale, ca atare, adica fara caracterele ? si *.
De exemplu, vom putea elimina definitia variabilei globale folosite în observatia 5.9, punctul
d, prin comanda:
(undefglobal A)
Exercitiul 5.18.
a. Raspundeti la urmatoarele întrebari.
• Care este rolul variabilelor într- un SE ?
• Care este diferenta între o variabila locala si una globala ?
• Care este diferenta între o variabila specificata si una nespecificata ? Când se va
folosi un tip si când celalalt ?
• Care sunt diferentele între urmatoarele doua reguli:
(defrule rr1 (a ?x) (b $?y) => (printout t ?x crlf ?y crlf) )
(defrule rr2 (a $?x) (b ?y) => (printout t ?x crlf ?y crlf) )
(defrule r ?a <- (a) => (retract ?a) (bind ?a 10) (printout t ?a crlf) )
(defrule R1 (multime ?nume ? ? ?) => (printout t “S-a gasit o multime cu 3 elemente” crlf) )
(defrule R2 (multime ?nume $?) => (printout t “S-a gasit o multime cu 3 elemente” crlf) )
b. Cu referire la sablonul (5.17), scrieti o regula care sa determine toti studentii din
anul V de la facultatea de mecanica; regula va afisa numele studentilor gasiti si domiciliul lor.
204 Reprezentarea cunoasterii folosind mediul CLIPS
• testarea valorii unui câmp dintr-un tipar, în sensul ca acesta sa fie identic cu o valoare
constanta; de exemplu, în regula (defrule r (a 12) => ) se cere ca faptul care satisface tiparul
regulii sa aiba primul câmp egal cu constanta a, iar al doilea câmp egal cu constanta 12;
• testarea ca valoarea a doua sau mai multe câmpuri din acelasi tipar, sau din tipare
diferite din partea de conditie a unei aceleiasi reguli sa fie egale, prin folosirea repetata a unei
aceleiasi variabile specificate; de exemplu, în regula (defrule r (a ?x ?x) (b ?x ?x) => ) se
cere ca faptele care satisfac cele doua tipare sa aiba câmpurile doi si trei egale între ele si
egale în cele doua fapte, valoarea respectiva urmând a se lega la variabila ?x.
În afara acestor tipuri de teste, CLIPS mai ofera si alte posibilitati discutate în
continuare.
5.12.1. Operatii logice asupra câmpurilor dintr-un tipar
În partea de conditie a unei reguli, asupra câmpurilor unui tipar se vor putea efectua
operatiile logice conjunctie, disjunctie, negare. Le vom ilustra folosind exemple care se refera
la sablonul (5.17).
cu observatia ca între simbolul ~ si valoarea care se neaga nu trebuie lasat nici un spatiu. În
regula respectiva nu ne-au interesat valorile câmpurilor în care este precizat anul de studii si
grupa, astfel ca am folosit pentru pozitiile respective variabila simpla nespecificata.
cu observatia ca înainte si dupa simbolul | poate fi, sau nu, lasat un spatiu, deoarece | este el
însusi un delimitator.
ar fi activata daca în BF ar putea exista un fapt de forma (5.17) care sa aiba pe ultimul câmp si
valoarea Iasi si valoarea Pascani, ceea ce evident este imposibil. Astfel regula cu numele
eronata, desi va fi acceptata de sintaxa CLIPS, nu va putea fi activata si deci este inutila.
Prima regula determina toti studentii de la AC care nu au domiciliul în Iasi si, spre
deosebire de regula r1, în partea de actiune afiseaza localitatea de domiciliu, deoarece aceasta
a fost pastrata în variabila ?x. Regula r4 determina toti studentii de la AC care au domiciliul în
Iasi sau Pascani, la fel ca regula r2, dar în plus afiseaza localitatea de domiciliu, a carei
valoare este pastrata în variabila ?x.
Un alt exemplu de folosire este urmatorul, în care regula r5 determina doi studenti de la
facultatea de AC, care nu locuiesc în Iasi, sunt din grupe diferite, din anul V, afisând numele
studentilor respectivi si grupele din care fac parte:
(defrule r5
(student ?nume1 AC V ?x ~Iasi)
(student ?nume2 AC V ?y&~?x ~Iasi) =>
(printout t ?nume1 “ de la grupa ” ?x “ si ” ?nume2 “ de la grupa ” ?y
Sisteme bazate pe cunostinte 207
activeaza regula r5, cu variabilele ?x si ?y legate la valorile 1501 si respectiv 1502, în timp ce
faptele:
nu activeaza regula r5, deoarece nu se respecta conditia ca valoarea lui ?y sa fie diferita de
valoarea lui ?x.
În concluzie, în cazul tratat la punctul i) operatorul & asigura legarea unei variabile
într- un tipar al unei reguli, legare care sa urmareasca si satisfacerea unei anumite conditii.
ii) În cazul în care trebuie sa realizam teste compuse, în care sa fie combinate mai multe
operatii logice, poate apare necesitatea folosirii operatiei SI. De exemplu, regula de
determinare a studentilor care sa nu aiba domiciliul nici în Iasi si nici în Pascani este:
(defrule r6 (student ?nume AC ? ? ?x & ~Iasi & ~Pascani) => (printout t ?nume
“ este student la AC si nu are domiciliul in Iasi sau Pascani, ci in” ?x crlf) )
Se observa ca în cazul de mai sus operatia & a fost folosita atât pentru legarea variabilei
?x la rezultatul unui test, cât si la obtinerea conjunctiei între cele doua negatii.
Operatiile logice asupra câmpurilor tiparelor se pot combina, creând posibilitatea testarii
unor conditii complexe. De exemplu, regula r7 va determina daca exista în BF doua fapte
(respectând tiparul (5.17)) cu privire la doua persoane, ce satisfac urmatoarele conditii:
• prima persoana este student la AC în grupa 1501 sau 1502 si nu locuieste în Iasi;
• a doua persoana este student la AC, în aceeasi grupa cu prima persoana si locuieste
sau în Bucuresti sau în aceeasi localitate ca si prima persoana.
208 Reprezentarea cunoasterii folosind mediul CLIPS
(defrule r7
(student ?nume1 AC ? ?gr&1501|1502 ?dom&~Iasi)
(student ?nume2&~?nume1 AC ? ?gr ?dom | Bucuresti)
=>
(printout t “Studentii ” ?nume1 “ si ” ?nume2 “ din grupa ” ?gr
“ indeplinesc conditiile cerute” crlf) )
Este de observat ca în al doilea tipar s-a verificat si conditia ca a doua persoana sa aiba
nume diferit fata de prima persoana, în acest fel împiedic ând activarea regulii cu cele doua
tipare potrivite pe acelasi fapt. De retinut aceasta modalitate de a nu permite ca un acelasi fapt
sa verifice doua tipare dintr-o regula, atunci când ne intereseaza asa ceva.
Exercitiul 5.19.
a. Verificati functionarea regulii r7, creând o BF cu fapte care sa restecte tiparul (5.17)
si în asa fel încât regula sa fie plasata în agenda de câteva ori.
b. Daca în BF cu referire la informa tiile despre studenti (fapte dupa sablonul (5.17))
apare un fapt de forma:
în care în câmpurile doi si trei sunt precizate grupa, respectiv domiciliul dorit, sa se scrie
programul care sa gaseasca în BF studentii care satisfac conditia de domiciliu ceruta si nu
satisfac conditia privind grupa, studentii care satisfac conditia de grupa ceruta si nu satisfac
conditia privind domiciliul, si respectiv studentii care satis fac ambele conditii.
În CLIPS notiunea de predicat este aceeasi cu aceea din logica: un predicat este o
functie care are drept rezultat o valoare de adevar, adevarat sau fals. În CLIPS valoarea fals
este reprezentata de simbolul FALSE (numai în aceasta scriere, cu majuscule), iar valoarea
adevarat este reprezentata de orice alta constanta, diferita de FALSE. Atunci când
Sisteme bazate pe cunostinte 209
interpretorul CLIPS afiseaza o valoare de adevar foloseste TRUE pentru adevarat si FALSE
pentru fals.
(and <<<predicat>>>)
(or <<<predicat>>>)
(not <predicat>)
Tinând seama de felul în care interpreteaza CLIPS valorile de adevar (orice este diferit
de FALSE este adevarat), rezulta ca orice functie CLIPS care întoarce un rezultat, sau orice
constanta CLIPS, poate fi privita si ca predicat. În acest sens, transmise de la nivel superficial
urmatoarele expresii:
(or 12 “logica”)
(and bun (+ 11 2))
(numberp <argument>)
care va determina rezultatul TRUE daca argumentul are ca valoare un numar si rezultatul
FALSE în caz contrar.
Pentru efectuarea de comparatii sunt utile urmatoarele predicate: eq - testarea
egalitatii, neq - testarea ne-egalitatii, = - testarea egalitatii, <> - testarea inegalitatii, >= - mai
mare sau egal, > - mai mare, <= - mai mic egal, < - mai mic. Toate aceste predicate au aceeasi
sintaxa, ilustrata pe exemplul urmator:
care va determina rezultatul TRUE daca valorile celor doua argumente sunt egale. Predicatele
eq si neq pot fi folosite pentru testarea a doua valori oarecare, în timp ce toate celelalte pot fi
folosite numai pentru cazul în care valorile argumentelor care se testeaza sunt numere. Daca
suntem în situatia de testare a egalitatii a doua valori al caror tip nu îl cunoastem, va trebui sa
folosim predicatul eq.
(test <predicat>)
Se creeaza în acest fel un tipar în partea stânga a unei reguli care se va considera
satisfacut, daca rezultatul pe care îl furnizeaza argumentul predicat este TRUE. Sa consideram
în acest sens regula r8:
(defrule r8
(a 1)
(b ?x)
(test (> ?x 0))
=> (printout t ?x crlf))
Aceasta va fi activata daca în BF exista faptul (a 1) si un alt fapt care sa aiba drept prim
câmp simbolul b; al doilea câmp din faptul respectiv se leaga la variabila ?x. În conformitate
cu tiparul de test, regula este activata numai daca, în plus fata de cele spuse, valoarea legata la
variabila ?x este un numar (predicatul > da eroare daca argumentele sale nu sunt numere)
strict mai mare ca 0.
Un alt exemplu este acela al regulii r9, care este activata de fapte cu trei câmpuri, în
care: primul trebuie sa fie constanta data, al doilea trebuie sa fie un sir de caractere, iar al
treilea câmp trebuie sa fie un numar impar, mai mare sau egal cu 5 si strict mai mic ca 89;
valorile câmpurilor doi si trei sunt afisate la executia regulii.
(defrule r9
(data ?x ?y)
(test (and (stringp ?x)
(oddp ?y)
(>= ?y 5)
(< ?y 89)
)
)
=> (printout t ?x “ si ” ?y “ satisfac restrictiile cerute” crlf) )
Sisteme bazate pe cunostinte 211
Exercitiul 5.20.
a. Scrieti regula care sa determine faptele din BF care sunt de forma:
în care sau câmpurile doi si trei sunt numere ce satisfac conditia ca valoare1 este un multiplu
al lui valoare2, sau câmpurile doi si trei sunt doua simboluri egale.
Pentru testarea conditiei ca un numar sa fie multiplu al altuia se poate folosi functia
CLIPS:
în care cele doua argumente trebuie sa fie numere, si rezultatul va fi restul împartirii întregi a
primului argument la al doilea.
b. Scrieti regula care sa determine perechile de fapte din BF ce sunt ambele de câte trei
câmpuri, primul câmp fiind în amândoua constanta “exemplu”, iar urmatoarele doua câmpuri
sa satisfaca restrictiile:
• câmpul doi din primul fapt sa fie un numar si sa nu fie egal cu al treilea câmp din al
doilea fapt;
• al treilea câmp din primul fapt sa nu fie numar si sa fie egal cu câmp doi din al doilea
fapt.
Acest operator este simbolizat prin : si permite efectuarea de teste direct asupra
câmpurilor tiparelor. Operatorul : trebuie sa fie urmat de un predicat CLIPS si efectul sau este
cel mai bine ilustrat printr- un exemplu. Fie urmatoarea regula:
(defrule r10
(numar ?nr)
(test (> ?nr 100) )
=>
(prinout t ?nr “ satisface restrictia impusa ” crlf) )
mai mare ca 100. Cu ajutorul operatorului de restrictie asupra câmpurilor tiparelor, regula
poate fi rescrisa într-o forma cu un singur tipar:
(defrule r11
(numar ?nr&:(> ?nr 100) )
=>
(printout t ?nr “ satisface restrictia impusa ” crlf) )
În regula scrisa în acest fel operatorul & are rolul de a asigura legarea variabilei ?nr la
valoarea celui de-al doilea câmp din faptul ce satisface tiparul regulii (conform paragrafului
5.12.1), iar prin folosirea operatorlui : se cere si verificarea unei conditii asupra valorii
variabilei respective, conditie determinata aici de predicatul >. Deci, regula r11 este activata
numai daca predicatul care urmeaza dupa operatorul : determina valoarea adevarat, ceea ce
înseamna ca regula r11 este echivalenta cu regula r10. Despre succesiunea &: se spune ca are
întelesul lui “astfel înc ât”.
Observatia 5.10.
a. Operatorul : trebuie sa fie întotdeauna urmat de un predicat, adica de o functie
având drept rezultat o valoare de adevar.
b. Din punct de vedere al eficientei (timp de executie si memorie ocupata) regula r11
este mai buna decât r10; ea are un singur tipar, în comparatie cu prima varianta, care are doua
tipare - cel obisnuit si cel de test. Deci, pentru eficienta, vor fi de preferat testele efectuate
direct asupra câmpurilor tiparelor, fata de cele efectuate într-un tipar suplimentar de test.
c. Una din utilizarile obisnuite pentru operatorul : este aceea a verificarii corectitudinii
datelor de intrare. În CLIPS datele de intrare sunt sub forma de fapte si verificarea va însemna
efectuarea unor teste asupra câmpurilor din fapte. Un exemplu ilustrativ este urmatorul.
Regula urmatoare este activata de fapte cu trei câmpuri. Primul câmp trebuie sa fie
simbolul data, al doilea câmp trebuie sa fie un numar întreg, iar al treilea câmp trebuie sa fie
un sir de caractere sau un simbol. Vom da mai multe variante ale acestei reguli.
(defrule r12
(data ?n&:(integerp ?n) ?x&:(stringp ?x) |: (symbolp ?x))
=>
(printout t “data ” ?n “ este ” ?x crlf) )
În aceasta varianta am realizat operatia SAU între cele doua conditii, privind tipul
admisibil pentru ultimul câmp, cu ajutorul operatorului | . Deoarece în cazul regulii de mai sus
Sisteme bazate pe cunostinte 213
acest operator nu este urmat de o constanta (ca în utilizarile din paragraful 5.12.1), el a fost
succedat de operatorul : care poate fi urmat de un predicat.
(defrule r13
(data ?n&:(integerp ?n) ?x&:(or (stringp ?x) (symbolp ?x)) )
=>
(printout t “data ” ?n “ este ” ?x crlf) )
(defrule r14
(data ?n&:(integerp ?n) ?x&:(not (numberp ?x) ) )
=>
(printout t “data ” ?n “ este ” ?x crlf) )
Aici am tinut seama de faptul ca exista numai trei tipuri de constante (date primitive în
CLIPS): simboluri, siruri de caractere si numere. Atunci, se poate rescrie conditia ca un câmp
sa fie de tip sir de caractere sau simbol, sub forma conditiei ca acel câmp sa nu fie numar.
(defrule r15
(data ?n&:(integerp ?n) ?x&~: (numberp ?x) )
=>
(printout t “data ” ?n “ este ” ?x crlf) )
(defrule r16
(data ?n ?x )
(test (and (integerp ?n)
(or (stringp ?x) (symbolp ?x) )
)
)
=> (printout t “data ” ?n “ este ” ?x crlf) )
Aceasta ultima varianta se bazeaza pe folosirea unui tipar de test, în care se verifica
toate conditiile pe care trebuie sa le îndeplineasca valorile variabilelor ?n si ?x. Ar mai putea
fi scrisa o varianta, de acelasi fel cu ultima, în care în tiparul de test, în loc de predicatul “or”
sa apara (not (numberp ?x)).
214 Reprezentarea cunoasterii folosind mediul CLIPS
Din punct de vedere al eficientei variantele r12 - r15 sunt echivalente si mai bune
decât r16, care are un tipar în plus, cel de test.
Exercitiul 5.21.
Rezolvati cele doua probleme de la exercitiul 5.20, rescriind regulile care apar în asa
fel încât acestea sa nu mai foloseasca tipare de test.
Exista trei utilizari distincte ale lui = în CLIPS, dupa cum urmeaza.
(defrule r17
(fapt1 ?n1&:(numberp ?n1))
(fapt2 ?n2&:(numberp ?n2))
=>
(assert (fapt-suma = (+ ?n1 ?n2)) ) )
b) Se poate utiliza = în partea de conditie a unei reguli, în interiorul unui tipar în fata
unei expresii, expresie prin a carei evaluare trebuie sa se obtina o constanta. În acest fel,
cerinta de potrivire este ca în faptul care va satisface tiparul, pe pozitia respectiva sa fie
constanta rezultata prin evaluarea mentionata. Daca luam în considerare regula r18:
(defrule r18
(a ?x =(+ ?x 10) )
(b =(* ?x 5))
=>
Sisteme bazate pe cunostinte 215
Exercitiul 5.22.
Verificati functionarea regulii r18, introducând în BF faptele: (a 2 12)(b 10)(a abc 3).
(defrule r19
(a ?x&:(numberp ?x) =(+ ?x 10) )
(b =(* ?x 5))
=>
(printout t ?x “Satisface restrictiile cerute ” crlf))
Observatia 5.11.
a. Operatorul = se poate folosi împreuna cu operatorii logici în crearea conditiilor de
potrivire în partea stânga a regulilor. Un exemplu este urmatorul:
(defrule r20
(a ?x ~=(/ ?x 10))
(b ?y&=(+ 5 ?x)|=(- 12 ?x)) => )
(defrule r-gresita
(a =(+ ?x 3))
216 Reprezentarea cunoasterii folosind mediul CLIPS
(b ?x)
=> )
în care variabila ?x folosita în expresia de sumare din primul tipar nu este legata (interpretorul
va semnala eroare). Daca se inverseaza ordinea tiparelor regula devine corecta:
c) Cea de-a treia utilizare a lui = este aceea deja precizata în paragraful 5.12.2, de
predicat de testare a egalitatii a doua valori numerice; aceasta utilizare este ilustrata în
exemplul urmator.
(defrule r21
(dreptunghi ?identificator lungime ?x)
(dreptunghi ?identificator latime ?y)
(test (or (= ?y (+ 8 ?x))
(= ?y (- 20 ?x)) ) )
=>
(printout t “S-a gasit un dreptunghi cu identificatorul ” ?identificator crlf
“ care satisface conditiile cerute: lungime = ” ?x “ latime = ” ?y crlf) )
Pentru întelegerea elementelor din ultimele paragrafe se mai dau alte trei variante de
scriere a regulii r21.
(defrule r22
(dreptunghi ?identificator lungime ?x)
(dreptunghi ?identificator latime ?y&: (= ?y (+ 8 ?x)) |: ( = ?y (- 20 ?x)) )
=>
(printout t “S-a gasit un dreptunghi cu identificatorul ” ?identificator crlf
“ care satisface conditiile cerute: lungime = ” ?x “ latime = ” ?y crlf) )
Aici = s-a folosit tot ca predicat, dar nu într-un tipar de test ca în varianta anterioara, ci
într- un tipar obisnuit, determinând o restrictie asupra variabilei ?y, împreuna cu operatorul : .
O varianta apropiata de aceasta este:
(defrule r23
Sisteme bazate pe cunostinte 217
în care deosebirea fata de varianta anterioara este aceea ca operatia SAU a fost realizata cu
predicatul “or” în locul operatorului |.
(defrule r24
(dreptunghi ?identificator lungime ?x)
(dreptunghi ?identificator latime ?y& = (+ 8 ?x) | = (- 20 ?x))
=>
(printout t “S-a gasit un dreptunghi cu identificatorul ” ?identificator crlf
“ care satisface conditiile cerute: lungime = ” ?x “ latime = ” ?y crlf) )
În aceasta varianta = s-a folosit în sensul de la punctul b), în fata unei expresii,
împreuna cu &, care asigura legarea vaiabilei ?y si cu | pentru realizarea operatiei SAU.
Pe baza paragrafelor 5.12.1 – 5.12.4 se pot formula urmatoarele observatii în legatura
cu realizarea testelor în interiorul tiparelor (în aceste observatii facem referire la regulile date
în paragrafele mentionate, reguli notate în ordine: r1, r2, …).
Observatia 5.12.
a. Desi tiparele de test sunt mai usor de scris, din punct de vedere al eficientei va fi
bine sa efectuam testele în interiorul tiparelor, fara a adauga tiparul suplimentar de test (de
exemplu, regula r22 este mai eficienta decât r21).
b. Dupa operatorul de negare ~ poate sa urmeze o constanta (simbol, sir de caractere
sau numar). În acest caz semnificatia este aceea ca se cere o potrivire care sa fie diferita de
câmpul care urmeaza dupa operatorul de negare, ca de exemplu în regula r1. Dupa ~ poate sa
urmeze si o variabila, care trebuie sa fie deja legata la momentul respectiv, semnificatia fiind
aceea ca se cere o potrivire diferita de valoarea variabilei. Un exemplu în acest sens, este
regula r5, în care se cere ca acel câmp care se va lega la ?y sa fie diferit de valoarea variabilei
?x, ce este deja legata, din potrivirea pentru primul tipar al regulii r5. De asemenea, dupa ~
poate sa urmeze :, ca în regula r15, sau =, ca în regula r20. De subliniat ca operatorul de
negare ~ realizeaza numai negarea unui singur operand (urmatorul operand), adica ~ nu poate
nega o expresie logica de tip compus. Un exemplu în acest sens este urmatorul.
(defrule r25
(data ?x&~:(stringp ?x) |: (eq ?x “abc”) )
=> (printout t “Data ” ?x “ satisface restrictiile ” crlf) )
218 Reprezentarea cunoasterii folosind mediul CLIPS
Regula r25 este activata de un fapt care are pe prima pozitie simbolul data, iar pe a
doua pozitie trebuie sa nu fie un sir de caractere, sau sa fie sirul de caractere “abc”. Daca
dorim scrierea unei reguli care sa fie activata de un fapt ce are ca prim câmp simbolul data, iar
al doilea câmp sa nu fie de tip sir de caractere si nici sa nu fie egal cu simbolul abc, atunci
regula este:
(defrule r26
(data ?x&:(not (or (stringp ?x) (eq ?x abc) )) )
=> (printout t “Data ” ?x “ satisface restrictiile ” crlf) )
(defrule R-exemplu
(data ?x&:(> ?x ?*A*) ) => (printout t “Valoare camp doi: ” ?x crlf) )
Folosirea regulii respective presupune ca, anterior introducerii definitiei ei, sa fi fost
definita variabila globala ?*A*, si aceasta sa aiba la momentul curent drept valoare un numar.
În aceasta situatie regula R-exemplu va fi activata de orice fapt cu doua câmpuri, primul egal
cu constanta data, iar al doilea câmp o valoare numerica mai mare decât valoarea variabilei
?*A*.
f. În teste pot fi folosite si variabilele legate la adresele faptelor, aspect necesar în
anumite situatii. Astfel, regula “determinare-bunic” din exercitiul 5.10 punctul c, avea ca
element nefavorabil activarea sa de catre un singur fapt, de exemplu (tatal- lui Ion este Ion).
Acesta, datorita egalitatii câmpurilor 2 si 4, este în situatia de a se potrivi pe ambele tipare ale
regulii. Daca este necesara eliminarea acestei situatii, regula respectiva se poate rescrie în
forma:
Sisteme bazate pe cunostinte 219
(defrule determinare-bunic
?a1 <- (tatal- lui ?copil este ?tata)
?a2 <- (tatal- lui ?tata este ?bunic)
(test (neq ?a1 ?a2) )
=>
(printout t “Bunicul lui ” ?copil “este” ?bunic crlf) )
Folosirea predicatului “neq” în regula de mai sus este justificata prin aceea ca adresele
faptelor din baza de fapte sunt simboluri (f – i) si nu numere.
Exercitiul 5.23.
a. Daca în regula r26, conditia “or” devine “and” se ajunge la regula:
(defrule r-exercitiu1
(data ?x&:(not (and (stringp ?x) (eq ?x abc) )) )
=>
(printout t “Data ” ?x “ satisface restrictiile ” crlf) )
Explicati când este activata aceasta regula si respectiv când este activata regula:
(defrule r-exercitiu2
(data ?x&:(not (and (stringp ?x) (eq ?x “abc”) )) )
=>
(printout t “Data ” ?x “ satisface restrictiile ” crlf) )
Care sunt formele echivalente, mai simple, pentru regulile r-exercitiu1 si r-exercitiu2 ?
(defrule r27
(masina_unealta gata)
=> (printout t “Porneste transportorul” crlf) )
(defrule r28
(robot gata)
=> (printout t “Porneste transportorul” crlf) )
(defrule r29
(evacuare piese)
=> (printout t “Porneste transportorul” crlf) )
Se observa cum cele trei reguli au aceeasi parte de actiune. Într-un asemenea caz, în
locul scrierii acestor reguli, se poate folosi una singura având operatia de disjunctie (SAU)
între tipare:
(defrule r30
(or (masina_unealta gata) (robot gata) (evacuare piese) )
=> (printout t “Porneste transportorul” crlf) )
Din acest exemplu, rezulta sintaxa operatiei de disjunctie între tiparele unei reguli:
(or <<<tipar>>>)
Sisteme bazate pe cunostinte 221
unde tipar poate fi un tipar simplu, sau unul compus prin folosirea operatiilor logice
între tipare; de asemenea, sub operatia “or” se poate si prelua adresa unui fapt ce satisface un
tipar, ca în exemplul care va urma la observatia 4 (regula r33).
Observatia 5.13.
a. Regula r30 trebuie înteleasa în sensul existentei a trei reguli distincte în BR. Astfel,
daca în BF exista concomitent trei fapte care sa satisfaca tiparele de sub conditia or, regula
r30 va fi activata de trei ori, câte o data pentru fiecare fapt.
b. Într-o regula, în afara operatiei SAU, pot fi incluse si alte tipare, legatura fiind
asigurata implicit de operatia SI, ca în urmatorul exemplu:
(defrule r31
(mesaj netransmis)
(or (masina_unealta gata) (robot gata) (evacuare piese) )
=> (printout t “Porneste transportorul” crlf) )
Din nou trebuie înteles ca aceasta regula este echivalenta cu trei reguli distincte.
c. Activarea si apoi executia succesiva a unei reguli ce contine o operatie SAU între
tipare, de mai multe ori (datorita satisfacerii mai multor tipare de sub “or”) poate fi
suparatoare (nedorita). Acest inconvenient poate fi eliminat, ca în exemplul urmator:
(defrule r32
?x <- (mesaj netransmis)
(or (masina_unealta gata) (robot gata) (evacuare piese) )
=>
(retract ?x)
(assert (mesaj transmis))
(printout t “Porneste transportorul” crlf) )
În acest caz regula r32 va fi executata doar o data, chiar daca în BF exista faptele care
sa satisfaca toate cele trei tipare de sub SAU, deoarece stergerea faptului (mesaj netransmis)
în partea de actiune a regulii r32, determina ca dupa prima executie, regula sa nu mai fie
activata.
Daca se pune problema sa rescriem regula r32 în asa fel încât, în partea de actiune ea
sa determine si stergerea din BF a faptului care a determinat satisfacerea conditiei SAU,
varianta corecta este:
(defrule r33
?x <- (mesaj netransmis)
222 Reprezentarea cunoasterii folosind mediul CLIPS
(or
?motiv <- (masina_unealta gata)
?motiv <- (robot gata)
?motiv <- (evacuare piese) )
=>
(retract ?x ?motiv)
(assert (mesaj transmis))
(printout t “Porneste transportorul” crlf) )
Se remarca felul în care pentru adresele faptelor care satisfac tiparele de sub conditia
SAU s-a folosit o variabila unica, si anume: ?motiv. La prima vedere aceasta poate parea
incorect, dar trebuie sa tinem seama ca regula de mai sus este echivalenta a trei reguli
distincte. Daca s-ar fi folosit trei variabile diferite nu s-ar fi putut scrie în mod corect actiunea
“retract”, adica varianta urmatoare este gresita:
(defrule r-gresita
?x <- (mesaj netransmis)
(or
?motiv1 <- (masina_unealta gata)
?motiv2 <- (robot gata)
?motiv3 <- (evacuare piese) )
=>
(retract ?x ?motiv1 ?motiv2 ?motiv3)
(assert (mesaj transmis))
(printout t “Porneste transportorul” crlf) )
Eroarea este aceea ca daca, de exemplu, regula este activata de faptele (mesaj
netransmis) si (masina_unealta gata), în partea de actiune a regulii doua din cele trei variabile
“motiv” nu vor fi legate (variabilele ?motiv2 si ?motiv3 nu sunt legate).
Exercitiul 5.24.
Precizati care este grupul celor 3 reguli echivalente cu r31; aceeasi chestiune pentru
r33 (observati în acest fel greseala facuta în regula r-gresita).
(defrule r34
?x <- (mesaj netransmis)
(or
(masina_unealta gata)
(and (evacuare piese)
(depozit gol) )
(robot gata) )
=>
(retract ?x) (assert (mesaj transmis))
(printout t “Porneste transportorul” crlf) )
Observatia 5.14.
a. Datorita folosirii conditiei SAU, regula r34 este echivalenta cu trei reguli.
b. Fara a avea nici un avantaj, în loc de
putem scrie:
(defrule RR (and (a) (b) ) => )
Exercitiul 5.25.
a. Scrieti cele trei reguli echivalente cu r34.
b. Cum se poate obtine ca în exemplul cu regula r34 sa se realizeze pe lânga stergerea
din BF a faptului (mesaj netransmis) si stergerea celuilalt/celorlalte fapte care au determinat
executia regulii ?
Aceasta operatie permite scrierea regulilor care sa fie activate atunci când un anume
fapt lipseste din BF. De exemplu, fie regulile:
(defrule r37
(faza informare-operator)
(alarma ?tip)
=>
(printout t “Exista in sistem alarma ” ?tip crlf) )
(defrule r38
(faza informare-operator)
(not (alarma ?) )
224 Reprezentarea cunoasterii folosind mediul CLIPS
=>
(printout t “Nu exista in sistem nici o alarma ” crlf) )
(not <tipar-simplu>)
unde tipar-simplu trebuie sa fie un tipar simplu si nu unul compus cu ajutorul operatiilor
disjunctie, conjunctie.
Ca un exemplu, regula care determina cel mai mare numar dintr-o colectie de fapte de
forma (numar <valoare-numerica>) este:
(defrule maximum
(numar ?x)
(not (numar ?y&:(> ?y ?x)))
=>
(printout t “Maximum = ” ?x crlf) )
Observatia 5.15.
a. Din punct de vedere al bazei logice a IA, felul în care se interpreteaza în CLIPS
negatia asupra unui tipar, înseamna folosirea asa numitei “presupuneri a lumii închise” (în
engleza – “closed world assumption”) [Kir 92], [Gia 89]. Pentru SBC construite în CLIPS
aceasta înseamna ca un fapt care lipseste din baza de fapte reprezinta o formula nesatisfaibila
(informal, este “falsa”). Evident, aceasta este doar o presupunere a modelului de reprezentare
a cunoasterii subînteles în CLIPS, facuta pentru a simplifica mecanismul de efectuare a
inferentelor. Greseala pe care o putem face este aceea ca, o piesa de cunoastere asupra careia
nu avem cunostinte, deci nu stim daca este adevarata sau falsa, în presupunerea lumii închise
este interpretata ca fiind falsa. Ulterior ea se poate dovedi ca adevarata, si deci ne înscriem în
clasa rationamentelor de tip nemonoton.
b. Este important locul plasarii unei operatii “not” în sirul de tipare din partea stânga a
unei reguli. De exemplu, fie urmatoarele doua reguli:
(defrule r39
Sisteme bazate pe cunostinte 225
(pereche ?x ?y)
(pereche ?y ?z)
(not (triplet ?x ?x ?z))
=>)
(defrule r40
(not (triplet ?x ?x ?z))
(pereche ?x ?y)
(pereche ?y ?z)
=>)
Vom constata ca regula r39 este activata, iar r40 nu. Explicatia este urmatoarea. Pentru
regula r39 faptul de la identificatorul f - 0 satisface primul tipar, cu le garea variabilei ?x la
valoarea 3 si a variabilei ?y la valoarea 4. Atunci, faptul de la identificatorul f - 1 satisface al
doilea tipar, cu legarea variabilei ?z la valoarea 5. Cu aceasta legare a variabilelor, cum în BF
nu exista faptul (triplet 3 3 5) si al treilea tipar al lui r39 (cel de tip “not”) este satisfacut si
regula este activata. În schimb, regula r40 nu este activata deoarece faptul de la identificatorul
f - 2 determina nesatisfacerea primului tipar al acestei reguli (acesta cere ca în BF sa nu existe
un fapt de forma “triplet” în care câmpurile doi si trei sa fie egale).
O concluzie importanta care se desprinde din acest exemplu, cât si din cele prezentate
în 5.12, este si aceea ca, atunci când scriem o regula trebuie sa tinem seama de felul în care se
produce procesul de potrivire:
(defrule r- incorecta
(not (data ?x))
=>
(printout t ?x crlf) )
226 Reprezentarea cunoasterii folosind mediul CLIPS
(defrule r41
(not (or (a) (b) ) ) => )
Exemplul 5.1.
În BF se gasesc fapte care reprezinta multimi, urmând urmatorul tipar:
în care câmpurile doi si trei vor contine numele multimilor a caror intersectie se cere a se
calcula. Pentru a nu complica rezolvarea, vom admite ca rezultatul sa nu respecte tiparul
(5.19), ci sa fie de forma sablonului:
Solutia presupune folosirea a doua reguli, si o prima varianta de scriere a acestora este:
(defrule R- initializare
?a <- (determinare- intersectie ?nume1 ?nume2)
(multime ?nume1 $?)
(multime ?nume2 $?)
=> (retract ?a)
(assert (multime rezultat- intersectie ?nume1 ?nume2) ) )
(defrule R-calcul
?a <- (multime rezultat- intersectie ?nume1 ?nume2 $?rest)
?b <- (multime ?nume1 $?x1 ?x $?x2)
Sisteme bazate pe cunostinte 227
(defrule R-calcul-optimizat
(multime ?nume1 $? ?x $?)
(multime ?nume2 $? ?x $?)
(not (multime rezultat- intersectie ?nume1 ?nume2 $? ?x $?) )
?a <- (multime rezultat- intersectie ?nume1 ?nume2 $?rest)
=> (retract ?a)
(assert (multime rezultat- intersectie ?nume1 ?nume2 ?rest ?x) ) )
în care conditia “not” asigura faptul ca în rezultat un element sa fie pus o singura data, si
eliminând astfel afectarea informatiei initiale din BF.
Exercitiul 5.26.
a. Raspundeti la urmatoarele întrebari.
• Care sunt operatiile logice care se pot efectua asupra câmpurilor tiparelor si
respectiv între tipare ?
• Precizati când sunt activate urmatoarele reguli:
228 Reprezentarea cunoasterii folosind mediul CLIPS
(defrule r48
(data ?x&:(integerp ?x) ?y&:(numberp ?y) )
(data ?z&=(+ ?x 1) =(+ ?z 1)|=(- ?y 1) ) => )
• Este corecta regula r49?
• Când este necesara folosirea operatiei SAU între tiparele unei reguli ?
• Când este necesara folosirea operatiei SI între tiparele unei reguli ?
• Când este necesara folosirea operatiei de negatie asupra unui tipar al unei reguli?
• Precizati care dintre urmatoarele reguli este corecta si care nu. Explicati de ce.
b. Rescrieti regula r47 în asa fel încât sa nu mai apara tiparul de test.
Sisteme bazate pe cunostinte 229
c. Deoarece operatia “not” nu poate fi aplicata decât unui tipar simplu, urmatoarea
regula este gresita în sintaxa CLIPS:
(defrule eroare
(not (and (a ?x) (b ?x) ) )
=>
(assert (c) ) )
Transformati regula de mai sus într-un program CLIPS care sa rezolve situatia ceruta
(aceasta înseamna ca daca în BF nu sunt în acelasi timp doua fapte care sa aiba a, respectiv b,
pe primul câmp si sa aiba aceeasi valoare pe pozitia câmpului doi, atunci trebuie introdus în
BF faptul (c) ).
(defrule r7
(student ?nume1 AC ? ?gr&1501|1502 ?dom&~Iasi)
(student ?nume2&~?nume1 AC ? ?gr ?dom | Bucuresti)
=> (printout t “Studentii ” ?nume1 “ si ” ?nume2 “ din grupa ” ?gr
“ indeplinesc conditiile cerute” crlf) )
regula care determina o pereche de fapte din BF ce satisfac anumite conditii, aparea deficienta
ca anumite perechi de fapte puteau activa regula de doua ori. De exemplu, faptele:
(student Ion AC 5 1501 Bucuresti) si (student Gelu AC 5 1501 Bucuresti)
activeaza regula r7 de doua ori, si la rulare determina afisarea mesajului de doua ori. Eliminati
aceasta deficienta.
f. Scrie ti programul CLIPS care sa determine toate permutarile unei multimi cu trei
elemente.
h. Scrieti programul CLIPS (se vor concepe faptele si regulile necesare) care sa
determine:
ii) reuniunea a doua multimi;
iii) diferenta a doua multimi.
Sisteme bazate pe cunostinte 231
În CLIPS se pot utiliza fisiere care trebuie în prealabil deschise, folosind functia:
nume-fisier – trebuie sa fie de tip simbol sau sir de caractere si va reprezenta numele
sub care este cunoscut fisierul respectiv de catre sistemul de operare;
nume-logic – trebuie sa fie o constanta CLIPS (simbol, sir de caractere sau numar) si
va reprezenta numele sub care interpretorul CLIPS recunoaste fisierul în cauza; acesta este
identificatorul pe care îl vom folosi în programele CLIPS atunci când ne referim la un fisier
(este numele care va fi utilizat, de exemplu, în reguli, în partea de actiune, sau în comenzi date
la nivel superficial, cu privire la un fisier). Un acelasi nume- logic nu trebuie sa fie folosit de
mai multe ori pentru fisiere diferite.
Un avantaj al folosirii celor doua argumente – nume-fisier, pentru sistemul de operare
si nume- logic, pentru interpretorul CLIPS, este acela ca putem usor înlocui un fisier cu altul
într-o aplicatie scrisa în CLIPS, fara a trebui sa facem schimbari majore în program. Deoarece
în program se foloseste numai numele-logic, iar numele propriu- zis apare numai o singura
data, în comanda “open”, rezulta ca putem substitui un fisier cu altul, facând o singura
modificare: se schimba în functia “open” argumentul “nume- fisier”.
acces – este un argument optional si fixeaza modul de acces la fisier; trebuie sa fie de
tip sir de caractere, fiind posibile urmatoarele patru cazuri: “r” – fisier deschis numai pentru
citire; “w” - fisier deschis numai pentru scriere; “r+” - fisier deschis pentru citire si scriere;
“a” - fisier deschis numai pentru concatenare (scriere la sfârsitul fisierului). Daca argumentul
acces lipseste, se va da de catre sistem valoarea implicita “r”.
Observatia 5.15.
a. Consecinta operatiei “open” depinde si de sistemul de operare în care se lucreaza.
De exemplu, în DOS sau în Windows, sisteme de operare care nu lucreaza cu versiuni
multiple ale fisierelor, redeschiderea pentru scriere a unui fisier existent va determina
înlocuirea acestuia cu unul nou.
b. Functia “open” lucreaza ca un predicat, în sensul ca determina ca rezultat TRUE
daca deschiderea fisierului s-a facut cu succes si FALSE în caz contrar. De exemplu, daca se
foloseste într-o comanda “open” numele unui fisier inexistent, cu argumentul acces egal cu
“r” (deschidere pentru citire), atunci rezultatul obtinut va fi FALSE: nu poate fi deschis pentru
citire un fisier care nu exista. În acest fel, functia “open” poate fi inclusa în teste, care sa
transmita mesajele corespunzatoare în cazul aparitiei unor erori.
Atunci când accesul la un fisier nu mai este necesar se va folosi functia “close”, pentru
închiderea acestuia. Daca fisierul nu se închide, nu avem garantia ca datele din el sunt salvate
232 Reprezentarea cunoasterii folosind mediul CLIPS
în mod corect. De asemenea, cu cât un fisier este deschis un timp mai mare, cu atât el este mai
expus pericolului ca o cadere de tensiune sa- l afecteze. De aceea, într- un program CLIPS, de
îndata ce nu mai avem nevoie de un fisier, îl vom închide cu functia “close”. Sintaxa pentru
aceasta este:
unde argumentul nume-logic este optional si specifica numele logic (acelasi cu cel declarat în
“open”) al fisierului care va fi închis. Daca argumentul lipseste, CLIPS va închide toate
fisierele deschise. Functia “close” determina rezultatul TRUE daca fisierul specificat a putut fi
închis, sau atunci când argumentul nume- logic lipseste, rezultatul furnizat de “close” este
TRUE daca macar un fisier a putut fi închis; într-un caz contrar rezultatul lui “close” este
FALSE.
Conform celor mentionate mai sus este bine sa existe o regula actionând, daca nu se
poate mai devreme, în finalul rularii programului CLIPS si care sa închida toate fisierele
deschise în timpul executiei acelui program. În legatura cu acest aspect, chiar interpretorul
CLIPS va închide, la executia comenzii “exit” de parasire a interpretorului, toate fisierele
ramase deschise (lucru care nu se mai întâmpla daca parasim interpretorul cu ctrl-c).
Înscrierea si citirea datelor din fisiere se poate face cu ajutorul functiilor “printout” si
“read”. În exemplele anterioare “printout” a fost folosita numai pentru transmiterea de
informatii pe terminal; în acest sens, reamintim forma generala a comenzii “printout”:
Daca argumentul optional nume- logic este prezent atunci citirea se face din fiserul
identificat prin numele- logic respectiv, iar daca argumentul lipseste sau este simbolul t atunci
informatia este preluata de la tastatura (elementul standard de intrare). Este de mentionat ca
“read” permite introducerea unui singur câmp. De exemplu, fie urmatoarea succesiune de
comenzi, date la nivel superficial:
(read) ¶
abc 12¶
abc¶
În aceasta succesiune, cea de-a treia linie, formata din simbolul abc, este raspunsul
interpretorului, care dupa comanda “read” preia de la tastatura numai primul câmp, astfel ca
numarul 12, care este al doilea câmp introdus pe aceeasi linie, se pierde; aceasta înseamna ca
daca folosim comanda “read” pentru a prelua date de la tastatura, la fiecare introducere
trebuie sa dam ¶ dupa fiecare câmp.
În schimb, daca se executa comanda:
(read intrari)
atunci va fi preluat din fisierul respectiv, cel cu numele-logic intrari, un câmp, pentru ca la
repetarea comenzii sa se citeasca urmatorul câmp din fisier, de pe aceeasi linie cu primul, sau
de pe urmatoarea, în functie de felul în care este plasat acest al doilea câmp.
Comanda “read” permite si preluarea unor câmpuri care nu sunt simboluri, siruri de
caractere sau numere, cum ar fi parantezele; acestea vor fi tratate ca siruri de caractere si deci
introduse între ghilimele. Felul în care se poate lucra cu fisiere în CLIPS este ilustrat prin
urmatorul exemplu.
Exemplul 5.2.
Sa se scrie programul CLIPS care sa foloseasca doua fisiere în felul urmator. Din
primul fisier vor fi citite numere; daca numarul preluat este mai mare sau egal cu 0 atunci
numarul respectiv este transmis pe monitor si în fisierul de iesire, însotit de cuvântul pozitiv,
iar daca numarul este strict mai mic ca 0, atunci este transmis pe monitor si în fisierul de iesire
însotit de cuvântul negativ.
Fara sa mai notam forma faptelor pe care le vom folosi, expresiile acestora fiind
simple, vom scrie direct regulile necesare. Programul care rezolva problema trebuie sa aiba o
desfasurare secventiala, fiind organizat în urmatoarele faze: initializare, citire date din fisierul
de intrare, prelucrare date, transmitere date în fisierul de iesire, terminare program. Daca
234 Reprezentarea cunoasterii folosind mediul CLIPS
prima si ultima faza trebuie sa se execute o singura data, la începutul si respectiv sfârsitul
lucrului, celelalte trei faze (citire, prelucrare, transmitere rezultate) trebuie sa se execute în
mod repetat, într- un ciclu care sa se încheie atunci când nu mai sunt date de citit din fisierul
de intrare. Din acest punct de vedere, exemplul considerat arata si felul în care se poate
solutiona în programarea bazata pe reguli, fara elemente procedurale pentru controlul
executiei, o asemenea ciclare.
Faza de initializare are de rezolvat deschiderea fisierelor pe care le vom folosi în
program, ceea ce presupune folosirea urmatoarei reguli:
(defrule citire
?a <- (faza citire)
=>
(retract ?a)
(bind ?x (read date))
(if (eq ?x EOF)
then (assert (faza oprire) )
else (assert (valoare- numerica ?x) ) ) )
În aceasta regula, dupa ce un câmp este citit din fisierul având numele- logic date (prin
functia “read”), valoarea respectiva, pastrata în variabila ?x, este comparata cu simbolul EOF,
în interiorul unei functii “if”; aceasta functie are în CLIPS semnificatia cunoscuta din
programarea procedurala si asupra ei se va reveni ulterior. Sistemul CLIPS returneaza
valoarea EOF atunci când printr-o operatie de citire se ajunge la sfârsitul unui fisier. În acest
fel am putut controla momentul terminarii citirii din fisier, prin functia “if” din regula de mai
sus: daca fisierul s-a terminat se introduce în BF faptul (faza oprire), iar în caz contrar se
introduce în BF un fapt cu primul câmp simbolul valoare-numerica, iar al doilea câmp,
numarul citit din fisier. Este usor de scris regula care sa rezolve terminarea programului,
operatia de efectuat fiind cea de închidere a fisierelor:
Sisteme bazate pe cunostinte 235
(defrule terminare
?a <- (faza oprire)
=>
(retract ?a) (close date) (close iesire) )
În locul celor doua comenzi “close” am fi putut folosi una singura, fara nici un
argument - adica (close) - situatie în care interpretorul CLIPS ar fi închis toate fisierele
deschise în acel moment.
Pentru rezolvarea fazei de prelucrare a datelor citite din fisier vom folosi doua reguli,
corespunzatoare celor doua situatii posibile:
(defrule r1 “regula ce actioneaza atunci cand valoarea citita din fisier este >= 0”
?a <- (valoare-numerica ?v&:(>= ?v 0) )
=>
(retract ?a)
(printout t “S-a gasit o valoare pozitiva: ” ?v crlf)
(printout iesire ?v “ pozitiv” crlf)
(assert (faza citire) ) )
(defrule r2 “regula ce actioneaza atunci cand valoarea citita din fisier este < 0”
?a <- (valoare-numerica ?v&:(< ?v 0) )
=>
(retract ?a)
(printout t “S-a gasit o valoare negativa: ” ?v crlf)
(printout iesire ?v “ negativ” crlf)
(assert (faza citire) ) )
Este de observat ca în programul astfel scris faptele (faza citire) si (faza oprire) au
rolul de a asigura secventierea necesara; ele sunt introduse în BF atunci când se doreste
trecerea la o anumita faza (de exemplu, dupa executia uneia din regulile r1, r2 se va reveni la
activarea regulii citire, adica la faza de citire); în acest sens ele se numesc si fapte de control
al executiei.
Pentru citirea unei date de intrare, functia “read” prezentata anterior are dezavantajul
ca nu permite decât preluarea unui singur câmp o data. Atunci când vrem sa preluam o linie
întreaga, fie de la tastatura fie dintr- un fisier, vom folosi functia urmatoare:
Aceasta functie determina citirea unei întregi linii de intrare, continutul respectiv fiind
preluat sub forma unui singur câmp, de tip sir de caractere (adica inclus între ghilimele). Daca
argumentul nume-logic este absent sau este t, citirea se face de la tastaura, iar daca este
prezent, citirea se face din fisierul indicat prin numele- logic respectiv. La fel ca si în cazul
functiei “read”, atunci când citirea se face dintr-un fisier si s-a atins sfârsitul acestuia
rezultatul returnat este simbolul EOF. Modul de utilizare a acestei comenzi este ilustrat pe
exemplul urmator:
determina încarcarea în BF a faptelor din fisierul specificat (argumentul nume- fisier poate fi
de tip sir de caractere sau simbol). Fisierul respectiv poate fi scris cu un editor de texte, dar
trebuie sa contina faptele organizate în formatul corespunzator. De exemplu, daca în fisierul
f1.fap se gaseste continutul:
(save-facts <nume-fisier>)
Sisteme bazate pe cunostinte 237
determina salvarea tuturor faptelor din BF în fisierul precizat prin argument. Salvarea se face
în formatul corespunzator faptelor în CLIPS, astfel ca o folosire a comenzii “save-facts” va
permite o încarcare ulterioara a faptelor astfel salvate, prin folosirea lui “load- facts”.
Exercitiul 5.27.
Scrieti programul CLIPS care sa salveze într-un fisier un anume grup de fapte din BF
de la momentul curent. În acest sens mai întâi se va prelua de la utilizator numele fisierului în
care sa se faca salvarea si primul câmp al faptelor care trebuie salvate (de exemplu, daca
utilizatorul introduce de la tastatura: data, nume si timp, atunci în fisierul indicat vor fi salvate
toate faptele din BF care încep cu unul din simbolurile data, nume, timp).
238 Reprezentarea cunoasterii folosind mediul CLIPS
(str-assert <sir-de-caractere>)
Determina introducerea unui fapt în BF pe baza sirului de caractere primit ca
argument. Sirul respectiv trebuie sa contina si parantezele ce delimiteaza faptul, iar spatiile
din interiorul sirului de caractere sunt delimitatorii care determina câmpurile din faptul ce se
creeaza. Daca dorim ca un câmp al faptului ce se formeaza sa fie de tip sir de caractere atunci
trebuie sa folosim înaintea ghilimelelor caracterul de control \ (“back-slash”). Un exemplu de
utilizare este urmatorul:
obtinându-se introducerea în BF a unui fapt cu 4 câmpuri, dintre care ultimul este de tip sir de
caractere. Evident functia “str-assert” poate fi folosita nu numai la nivel superficial ci si în
reguli, în partea de actiune, când argumentul va putea fi obtinut si prin folosirea unor variabile
sau functii. În CLIPS versiunea 6 exista si functia:
(assert-string <sir-de-caractere>)
(str-cat <<element>>)
Construieste un singur sir de caractere din elementele care sunt parametri în comanda
respectiva (elementele furnizate ca parametri pot fi constante CLIPS, variabile simple legate,
sau functii ce determina ca rezultat un singur câmp).
Ca exemplu, se poate construi o noua varianta a regulii “citire-nume” în care, fata de
solutia data în paragrafului anterior, sa se introduca în BF un fapt având un numar de câmpuri
corespunzator numarului de câmpuri introduse de la tastatura; aceasta se va face folosind cele
doua functii descrise în acest paragraf:
Exista mai multe functii CLIPS pentru valori multicâmp, dintre care functia
“mv-append” a fost deja prezentata în 5.11.5; o reamintim aici:
(mv-append <<element>>)
ea creând o valoare multicâmp din elementele care sunt argumente. Un caz particular este
acela al apelului acestei functii cu zero argumente, caz în care se obtine valoarea multicâmp
cu zero câmpuri. Alte functii pentru valori multicâmp sunt date în continuare.
Efectul este de stergere (eliminare) a câmpului indicat prin indice din valoarea
multicâmp data ca al doilea argument; acest ultim argument trebuie sa fie o valoare
multicâmp. De exemplu comanda:
(mv-delete 1 (mv-append a b 1 2) )
determina rezultatul (b 1 2); în acest exemplu functia “mv-append” este folosita pentru a crea
o valoare multicâmp; într- un program CLIPS, valorile multicâmp vor putea fi obtinute si din
legari ale variabilelor multiple petrecute si în timpul rularii, sau ca valori ale variabilelor
globale.
Întoarce drept rezultat câmpul din cel de-al doilea argument ce are pozitia data prin
primul argument. Daca pozitia respectiva nu exista rezultatul ce se obtine este nil.
Determina ca rezultat pozitia câmpului dat de primul argument în cel de-al doilea
argument, care trebuie sa fie o valoare multicâmp. Daca primul argument este un câmp care
nu exista în valoarea multicâmp ce este al doilea argument, atunci rezultatul ce se obtine este
FALSE.
240 Reprezentarea cunoasterii folosind mediul CLIPS
Întoarce rezultatul TRUE daca câmpurile care apar în primul argument se regasesc
toate printre câmpurile din cel de-al doilea argument si FALSE în caz contrar (ambele
argumente trebuie sa fie valori multicâmp). Este de observat ca valoarea multicâmp cu zero
câmpuri se regaseste în orice alta valoare multicâmp. De exemplu, apelul:
(subset (mv-append) (mv-append 1 2 3) )
(str-explode <sir-de-caractere>)
Converteste un sir de caractere într-o valoare multicâmp (delimitatorii sunt spatiile din
interiorul sirului de caractere). Functia inversa este:
care converteste o valoare multicâmp într- un singur câmp, de tip sir de caractere.
CLIPS poseda câteva functii de tipul celor care în limbajele imperative permit
controlul executiei programelor. Desi acestea pot fi folosite si la nivel superficial, ele îsi
gasesc utilitatea în scrierea unor reguli care pot deveni mai eficiente prin folosirea în partea de
actiune a functiilor procedurale de control al executiei; de altfel, functiile pe care le prezentam
în continuare pot fi folosite în reguli numai în partea de actiune (nu si în partea de conditie).
Exista în CLIPS trei asemenea functii, prezentate în cele ce urmeaza.
Când se întâlneste aceasta functie (în partea dreapta a unei reguli sau la nivel
superficial), mai întâi se evalueaza predicatul. Daca rezultatul evaluarii este TRUE se executa
actiunea/actiunile de dupa “then”, iar daca rezultatul evaluarii predicatului este FALSE si
daca exista clauza “else”, atunci se executa actiunea/actiunile de dupa “else”. Daca predicatul
determina rezultatul FALSE si nu exista clauza “else” atunci nu se executa nici o actiune si se
trece la urmatoarea comanda.
Functia “if” poate fi utila pentru efectuarea unor teste în partea de actiune a unei
reguli, evitând în acest fel scrierea unor reguli suplimentare. Ca exemplu, regula de mai jos
are rolul de a ghida continuarea unui program, în functie de continutul unui fapt din BF. Daca
Sisteme bazate pe cunostinte 241
faptul care activeaza regula are pe pozitia a doua un simbol sau sir de caractere se introduce
un fapt de control ce va determina activarea regulilor corespunzatoare prelucrarilor simbolice,
iar în cazul în care câmpul este numar, sunt lansate alte reguli, de un alt fapt de control.
(defrule verificare-continuare
(data ?x)
=>
(if (or (symbolp ?x) (stringp ?x) )
then (assert (faza prelucrare-simbolica) )
else (assert (faza prelucrare-numerica) ) ) )
Este evident ca regula de mai sus nu este în spiritul programarii bazate pe reguli. De
aceea se propune urmatorul exercitiu.
Exercitiul 5.28.
Înlocuiti regula de mai sus cu un grup de reguli care sa determine aceleasi consecinte
si care sa nu mai foloseasca functia “if”.
(defrule r-alegere-continuare
?a <- (faza verificare-continuare) =>
(retract ?a)
(printout t “Introduceti data: ” crlf)
(bind ?x (read))
(while (not (numberp ?x) )
do (printout t “Introduceti data: (valoare numerica) ” crlf)
(bind ?x (read) ) )
(if (> ?x 0)
then (assert (faza valoare-pozitiva) )
242 Reprezentarea cunoasterii folosind mediul CLIPS
Este de subliniat ca functiile “if” si “while” nu sunt obisnuite într- un program bazat pe
reguli. Scrierea unei parti ample procedurale, în partea de actiune a unei reguli, prin folosirea
lui “if” si “while” determina pierderea caracterului de program bazat pe reguli. Într-un SE
functiile “if” si “while” vor fi folosite numai pentru efectuarea unor teste si bucle simple;
pentru obtinerea anumitor secventieri vor fi de preferat faptele (respectiv tiparele) de control.
O alta functie de control al executiei programului este:
(halt)
Aceasta determina oprirea executiei unui program CLIPS (se opreste executia
regulilor, inclusiv a regulii curente) si se revine la nivel superficial. Agenda va continua sa
pastreze regulile ce eventual existau în ea, astfel ca o comanda “run” care va urma le va putea
pune în executie. În acest fel, comanda “halt” poate fi utila în depanare; dupa o oprire datorata
acestei comenzi utilizatorul poate urmari starea agendei, a BF, pentru ca apoi sa reia rularea
programului.
Desi nu sunt strict încadrate în aceasta categorie, mai amintim aici alte doua functii,
importante pentru programarea în CLIPS.
(system <<<valoare>>>)
(gensym)
Este o functie fara argumente si care la fiecare apel determina ca rezultat un nou
simbol de forma: gen<întreg>. Astfel, la primul apel al acestei functii rezultatul obtinut va fi:
gen1, urmat la apelurile urmatoare de gen2, gen3, s.a.m.d. Importanta ei este aceea ca
genereaza de fiecare data un simbol nou. Asa ceva poate fi util, de exemplu, în cazul în care
mai multe fapte au un continut comun si pentru a le face distincte introducem în ele un câmp
care sa fie completat de functia “gensym”. Putem seta la o anumita valoare contorul functiei
“gensym” prin comanda:
Sisteme bazate pe cunostinte 243
(setgen <întreg>)
Exercitiul 5.29.
a. Raspundeti la urmatoarele întrebari:
• Care este deosebirea între argumentele nume-fisier si nume-logic într-o
comanda “open” ?
• Care este deosebirea între comenzile “load” si “load-facts” si respectiv între
“save” si “save- facts” ?
• Care este rezultatul urmatoarei comenzilor:
În CLIPS exista doua tipuri de fapte: nestructurate (toate cele folosite pâna acum) si
structurate. Într-un fapt nestructurat ordinea câmpurilor poate fi oarecare, aceasta fiind aleasa
de programator, dar o data ordinea fixata, ea trebuie respectata în întreg programul CLIPS.
Altfel spus, într-un fapt nestructurat conteaza atât continutul fiecarui câmp, cât si ordinea
câmpurilor. De exemplu, în urma comenzii (assert (a b c) (a c b)) în BF vor fi introduse
doua fapte distincte. În acest sens, faptele nestructurate se numesc si fapte de tip ordonat, în
ideea ca au câmpurile asezate într-o ordine bine stabilita si, în principiu, pentru a avea acces la
o anumita informatie programatorul trebuie sa stie al câtelea câmp din fapt contine informatia
respectiva (atunci când ordinea câmpurilor nu este cunoscuta a priori, folosirea variabilelor
multiple poate rezolva, în anumite situatii, gasirea unui anumit câmp). Spre deosebire de acest
caz, în faptele structurate ordinea în care sunt plasate informatiile nu mai are importanta; de
aceea, acestea se numesc si fapte de tip neordonat.
Faptele de tip structurat sunt asemanatoare cu tipurile structurate din programarea
imperativa, urmarind si caracteristicile modelului de cadru din IA.
Pentru a putea fi folosit un fapt de tip structurat trebuie mai întâi definit, prin comanda
de definitie de constructie:
Argumentul nume- fateta trebuie sa fie un simbol. Prin argumentele specificare- fateta
se vor preciza caracteristicile informatiei care poate fi pastrata într-o fateta a unui fapt
structurat. Mai este de mentionat ca în CLIPS versiunea 6 în loc de cuvântul cheie “field”
poate fi folosit si cuvântul “slot”, iar în loc de “multifield” se va putea folosi si “multislot”.
Exista mai multe tipuri de specificari de fateta, ele putând fi împartite în doua
categorii: specificari pentru valoarea cea mai asteptata si specificari de restrictionare.
A. Specificarea de valoare cea mai asteptata este cea care corespunde fatetei default
din modelul de reprezentare a cunoasterii de cadru – vezi 3.3.2, având întelesul precizat la
acea varianta de model. Astfel, daca se stie valoarea cea mai plauzibila pentru o fateta, aceasta
valoare va fi data într-o specificare “default”. Totodata, exact ca în modelul de cadru,
specificarea “default” are rolul de a furniza valoarea unei fatete atunci când utilizatorul nu da
pentru fateta respectiva o valoare explicita (de exemplu, una corespunzatoare unui caz de
exceptie). Sintaxa acestei specificari este:
(default <valoare-asteptata>)
În acest exemplu s-a definit faptul structurat cu numele microprocesor, având doua
fatete: nume si magistrala. Pentru fateta magistrala s-a introdus si o specificare default.
Aceasta determina ca, atunci când utilizatorul nu precizeaza valoarea explicita a acestei fatete,
sistemul sa introduca de la sine valoarea data în “default”, adica valoarea 8 în cazul nostru.
246 Reprezentarea cunoasterii folosind mediul CLIPS
Daca pentru fateta magistrala este data o valoare explicita, atunci valoarea din default este
ignorata. Toate acestea se pot verifica prin comanda:
(type <<<tip>>> )
unde argumentul tip poate fi unul din urmatoarele: INTEGER, FLOAT, NUMBER,
SYMBOL, STRING, LEXEME (tipurile trebuie scrise în mod obligatoriu cu majuscule) sau
poate fi ?VARIABLE. Atunci când într-o fateta apare o asemenea specificare, informatia care
va putea fi pastrata în fateta este restrictionata la tipul indicat. Semnificatiile sunt: INTEGER
înseamna restrictionare la numere întregi, FLOAT la numere reale, NUMBER la orice fel de
numere, SYMBOL restrictionare la simboluri CLIPS, STRING la siruri de caracter,
LEXEME la simboluri sau siruri de caractere, iar daca se foloseste ?VARIABLE atunci nu se
produce nici o restrictionare de tip (orice tip este admis, situatia fiind aceeasi cu aceea în care
specificarea de tip nu este folosita). Într-o specificare de tip pot fi prevazute si mai multe
argumente tip. De exemplu, daca în faptul structurat microprocesor vrem ca numele sa poata
fi numai de tip simbol sau sir de caractere, atunci putem reface definitia anterioara:
Atunci când valoarea memorata într-o fateta vrem sa fie sau un întreg sau un real vom
putea folosi (type NUMBER); daca folosim (type FLOAT) atunci o valoare întreaga va
însemna eroare, ca în exemplul ur mator:
Sisteme bazate pe cunostinte 247
(deftemplate oscilator
(field frecventa (type FLOAT) ) )
Restrictionarea care se face în acest caz este la valorile din însiruirea ce este argument,
trebuind evident sa existe o concordanta între elementele din însiruire si varianta “allowed”
care se foloseste; de exemplu, se poate utiliza (allowed-symbols microprocesor
microcontroler), dar nu se poate folosi (allowed-symbols 12 -34). Specificarea “allowed-
values” face o restrictionare stricta, la valorile din însiruirea care urmeaza; în celelalte cazuri
restrictia apare numai pentru tipul specificat, asa cum se arata în exemplul urmator.
(deftemplate microprocesor1
(field nume (allowed-symbols I8086 I80286) ) )
(deftemplate microprocesor2
(field nume (allowed- values I8086 I80286) ) )
Pe baza acestor doua definitii putem da comanda:
Vom constata ca ambele fapte sunt introduse în BF. Explicatia este aceea ca primul
fapt satisface restrictia de simboluri impusa, iar al doilea are valoarea fatetei nume un numar,
iar restrictia specificata se refera numai la simboluri. În acest sens, daca se da comanda:
se va semnala eroare, deoarece valoarea fatetei nume este un simbol si acesta nu este printre
cele din însiruirea “allowed-symbols”. Tot eroare se obtine si în cazul comenzii:
nu introduce nici o restrictie asupra valorii care va fi introdusa în fateta nume. Conform cu
sintaxa pentru fatete, specificarile de restrictionare de tip si de valori permise pot fi si
combinate ca în exemplul urmator:
(deftemplate identificator
(field nume (type SYMBOL) (allowed-symbols I1 I2 I3) )
(field val1 (type NUMBER SYMBOL) (allowed-symbols a1 a2) )
(field val2 (type LEXEME) )
(multifield val3 (type STRING) (allowed-values “1” “2”) ) )
Exercitiul 5.30.
Comentati restrictiile care apar în definitia de mai sus. Gasiti o definitie logic
echivalenta cu aceea a faptului identificator si care sa aiba mai putine specificari de
restrictionare. Introduceti în BF fapte structurate de tip identificator.
Parametrii min si max pot fi numere întregi sau pot fi ?VARIABLE. Ei precizeaza
numarul minim, respectiv numarul maxim de câmpuri care pot fi pastrate în fateta multicâmp
respectiva. Daca pentru min, în locul unui întreg, se foloseste ?VARIABLE, atunci înseamna
ca numarul minim posibil de câmpuri este fixat la zero. Daca ?VARIABLE se foloseste
pentru max, atunci numarul maxim de câmpuri din fateta este, în principiu, +∞. Daca
specificarea de cardinalitate nu este prezenta între specificarile unei fatete de tip multicâmp,
atunci, în mod implicit, se stabileste ca numarul de câmpuri poate fi între 0 si +∞.
O problema care poate apare este aceea a determinarii pentru o fateta a valorii celei
mai asteptate (default), atunci când specificarea “default” nu exista pentru acea fateta. Într-un
asemenea caz, valoarea cea mai asteptata se va deduce de catre interpretorul CLIPS dupa
urmatoarele reguli, care se aplica în ordinea în care sunt enumerate:
1. Tipul pentru valoarea cea mai asteptata este ales din lista de tipuri permise pentru
fateta, în urmatoarea ordine de preferinte: SYMBOL, STRING, INTEGER, FLOAT.
2. Daca tipul rezultat dupa regula 1 are o specificare “allowed” (de exemplu, fateta are
specificarile (type INTEGER) si (allowed- integers -4 0 34) ) atunci prima valoare din lista
“allowed” este aleasa ca valoare default (în cazul considerat, valoarea default ar fi –4).
3. Daca tipul fixat pentru fateta este INTEGER, FLOAT sau NUMBER si exista
specificarea “range” atunci valoarea minima a domeniului devine valoare default, daca nu este
250 Reprezentarea cunoasterii folosind mediul CLIPS
-∞; daca valoarea minima a domeniului este -∞ si valoarea maxima a domeniului nu este +∞,
atunci valoarea maxima a domeniului se considera ca valoare default.
4. Daca fateta nu are tipul precizat, dar are o specificare “allowed-symbols”, atunci
prima valoare din lista respectiva se ia ca valoare default.
5. Daca valoarea default nu este determinata prin una din regulile de mai sus, atunci ea
se fixeaza în functie de tipul fatetei, dupa cum urmeaza: pentru tipul STRING este “” (sirul de
caractere vid), pentru INTEGER este 0, pentru FLOAT este 0.0, iar pentru tipul SYMBOL
sau atunci când tipul nu este precizat este simbolul nil.
6. Daca fateta este de tip multicâmp atunci valoarea multicâmp cu 0 câmpuri este
folosita, daca nu suntem în cazul în care pentru fateta respectiva s-a fixat printr-o specificare
de cardinalitate un numar minim de câmpuri mai mare ca 0. Într-un asemenea caz valoarea
default va avea un numar de câmpuri egal cu minimul permis prin specificarea “cardinality” si
valoarea din fiecare câmp va fi aceea calculata dupa regulile 1 ÷ 5, ca si în cazul în care fateta
respectiva ar fi de tipul cu un câmp.
În CLIPS versiunea 5 intra în functiune numai regula 5 si regula 6 (aceasta din urma
fara cazul în care apare si specificarea “cardinality”). Regulile de mai sus exprima felul în
care în CLIPS se încearca rezolvarea eficienta, chiar si atunci când informatiile sunt restrânse,
a calculului valorii celei mai asteptate (este vorba si de acele cunostinte numite de “bun-simt”
în capitolul al treilea).
Exercitiul 5.31.
Fie urmatoarea definitie de fapt structurat:
(deftemplate Microprocesor
(multifield nume (type LEXEME) )
(field bus (allowed-values 1 4 8 16 32) )
(field viteza (type STRING NUMBER) )
(field tehnologie (allowed-symbols CMOS NMOS PMOS) )
(field putere (type NUMBER) (range ?VARIABLE 10) )
(field stare (allowed-values actual depasit) (default actual) ) )
Determinati continutul faptului care se introduce în BF la comanda: (assert
(Microprocesor) ).
Asa dupa cum s-a vazut si din paragrafele anterioare, introducerea faptelor structurate
în BF se face prin aceleasi procedee ca si pentru faptele nestructurate: prin comenzi “assert”
(date la nivel superficial sau din partea de actiune a regulilor), respectiv prin comenzi
“deffacts” (date la nivel superficial sau încarcate din fisiere). Deosebirea fata de faptele
Sisteme bazate pe cunostinte 251
nestructurate este accea ca pentru a putea folosi un fapt structurat într-o operatie de
introducere în BF este necesar ca în prealabil acesta sa fi fost definit printr-o definitie
“deftemplate”. Aceasta, fiind definitie de constructie, poate fi data la nivel superficial sau
înscrisa în fisiere. Asa cum se vede si din exemplele anterioare, într-o comanda “assert” (si la
fel stau lucrurile si pentru comanda “deffacts”) se va prevedea, într-o pereche de paranteze,
numele faptului structurat si 0 ÷ n din fatetele acestuia, unde n este numarul de fatete care
apare la definitia faptului structurat respectiv. Fatetele care sunt prevazute sunt acelea pentru
care vrem sa fixam o valoare diferita de valoarea “default”, în timp ce fatetele care nu sunt
prezente vor lua în mod implicit valoarea “default”. Fiecare fateta trebuie inclusa într-o
pereche de paranteze.
Drept exemple, având definitia faptului structurat din exercitiul 5.31, adaugari în BF
ale unor fapte structurate cu numele Microprocesor sunt:
Observatia 5.16.
a. Conform celor stiute pentru comanda “deffacts”, aceasta determina introducerea
faptelor din interiorul ei în BF numai dupa un “reset”.
b. Este de notat ca în cazul faptelor structurate ordinea fatetelor nu are nici o
importanta, asa cum se vede si din cele doua situatii de mai sus.
Pentru faptele structurate exista câteva noi posibilitati de introducere în BF. Astfel,
atunci când în BF exista deja un fapt structurat si vrem sa introducem unul asemanator, putem
folosi comanda:
unde am notat prin index- fapt-structurat contorul din identificatorul ce însoteste faptul
structurat în BF (este aceeasi identificare, de forma f – i, ca la faptele nestructurate). Efectul
este acela de introducere a unui nou fapt structurat în BF, cu acelasi continut ca si cel al
faptului deja existent si care are indexul precizat prin primul argument, mai putin fatetele care
apar explicit în comanda respectiva si pentru care se folosesc valorile date în comanda.
De exemplu, conform definitiei “deftemplate” din exercitiul 5.31, daca avem în BF
faptul structurat “Microprocesor” cu fateta nume Intel I80286 (acesta fiind plasat la
identificatorul f- 1), si daca ne intereseaza sa introducem în BF un nou fapt structurat, cu
acelasi continut, mai putin fatetele nume si putere, care trebuie sa devina I80386, respectiv 3,
vom putea folosi comanda:
Efectul este acela de stergere din BF a faptului structurat având indexul precizat prin
primul argument al comenzii si de introducere a unui nou fapt, cu un continut identic cu cel al
faptului sters, mai putin fatetele de modificat, care iau valorile indicate în comanda. Astfel,
daca în BF, la identificatorul f-2, se gaseste faptul “Microprocesor”, cu fateta nume I8080 si
fateta stare depasit, comanda:
(defrule determinare-uP-depasit1
(Microprocesor (nume $?n)
(bus 8)
(putere ?x&:(> ?x 2) )
Sisteme bazate pe cunostinte 253
(stare depasit) )
=> (printout t ?n “este un microprocesor depasit” crlf) )
De observat cum tiparul din partea de conditie a regulii de mai sus contine atât
perechea de paranteze corespunzatoare faptului structurat, precum si perechile de paranteze
corespunzatoare fatetelor care sunt folosite în crearea conditiei respective. Nu este necesar ca
într- un tipar dintr-o regula sa apara toate fatetele unui fapt structurat, ci numai acele pentru
care vrem sa impunem conditii de potrivire. Ordinea fatetelor neavând importanta, regula de
mai sus este echivalenta cu urmatoarea:
(defrule determinare-uP-depasit2
(Microprocesor
(putere ?x&:(> ?x 2) )
(bus 8)
(stare depasit)
(nume $?n) )
=> (printout t ?n “este un microprocesor depasit” crlf) )
Nu exista nici o restrictie privind tiparele referitoare la faptele structurate, care pot fi
folosite la fel ca si tiparele pentru faptele nestructurate (pot fi folosite si împreuna cu acestea)
si pot fi folosite în conditii privind stergerea faptelor din BF, ca în exemplul urmator.
(defrule actualizare
(faza actualizare BF)
(or ?a <- (Microprocesor
(bus ?b&:(< ?b 8) )
(stare depasit)
(nume $?n) )
?a <- (Microprocesor
(putere ?x&:(> ?x 5) )
(nume $?n) ) )
=> (retract ?a)
(printout t ?n “este un microprocesor depasit sau de putere mare” crlf) )
Noi posibilitati de programare sunt create pentru faptele structurate prin folosirea
comenzilor “duplicate” si “modify”.
Exemplul 5.4.
Sa se scrie regula care sa gaseasca o pereche de microprocesoare respectând conditia
ca primul sa aiba puterea mai mica sau egala cu 4, al doilea sa aiba puterea mai mare decât 4,
254 Reprezentarea cunoasterii folosind mediul CLIPS
ambele sa fie în tehnologia CMOS si sa aiba starea depasit. Pentru primul, daca fateta viteza
este data ca numar, aceasta se va modifica, trebuind sa devina cu 1 mai mica, iar pentru al
doilea se va mai introduce în BF înca un fapt similar, dar cu fateta tehnologie la valoarea
NMOS si cu puterea având vechea valoare plus 2.
(defrule R
?a <- (Microprocesor (tehnologie CMOS)
(stare depasit)
(viteza ?v)
(putere ?p1&:(<= ?p1 4) ) )
?b <- (Microprocesor (tehnologie CMOS)
(stare depasit)
(putere ?p2&:(> ?p2 4) ) )
=>
(if (numberp ?v) then (modify ?a (viteza =(- ?v 1) ) ) )
(duplicate ?b (tehnologie NMOS) (putere =(+ ?p2 2) ) ) )
Exercitiul 5.32.
Experimentati functionarea regulii de mai sus, creând conditiile pentru activarea ei.
Explicati efectul negativ care apare si modificati regula pentru a- l înlatura.
(set-dynamic-deftemplate-checking {TRUE,FALSE})
sau în CLIPS versiunea 6:
(set-dynamic-constraint-checking {TRUE,FALSE})
Exemplul 5.5.
Fie urmatoarea definitie de fapt structurat:
definitie care este gresita prin aceea ca determina doua restrictii neconcordante în privinta
tipului admis si a valorilor admise pentru fateta abc. Eroarea este semnalata la încercarea de
introducere a unui fapt Greseala în BF – de exemplu la comanda (assert (Greseala (abc 1) ) )
– când pe verificarea statica se semnaleaza eroare si faptul nu este adaugat în BF, iar pe cea
dinamica se face introducerea în BF, dar se semnaleaza eroare.
Exemplul 5.6.
Fie urmatoarea definitie:
Exemplul 5.7.
Fie urmatoarea definitie de fapt structurat:
Exemplul 5.8.
256 Reprezentarea cunoasterii folosind mediul CLIPS
Daca dintr-un fisier, sau de la nivel superficial se introduc urmatoarele doua definitii:
atunci, indiferent de tipul setarii, se semnaleaza eroare pentru regula r1, datorita tiparului
regulii care nu respecta cerinta privind domeniul fixat pentru fateta a; în consecinta, regula r1
nu este luata în considerare (nu este introdusa în BR).
Exemplul 5.9.
Daca sunt introduse urmatoarele doua definitii:
iar apoi se da comanda (assert (Simbol (val abc) ) ), atunci se va semnala eroare în legatura
cu regula r2. Aceasta pentru ca faptul introdus creeaza o eroare în privinta apelului
predicatului >, care nu poate face o comparatie asupra unei valori nenumerice. Aceasta
comportare se produce în CLIPS versiunea 5, indiferent de setarea în care se lucreaza. În
CLIPS versiunea 6, comportarea este chiar mai buna, în sensul ca interpretorul determina
neconcordanta între tiparul regulii r2 si restrictia din fateta val chiar de la introducerea regulii,
semnalând eroarea respectiva si neacceptând introducerea regulii r2 în BR. Mai trebuie
mentionat cu privire la acest exemplu, ca ordinea în care sunt date cele doua definitii este
stricta; daca am încerca ordinea inversata, definind întâi regula r2, si apoi faptul structurat
Simbol, atunci se va semnala eroare: apare în partea de conditie a regulii o referire la un fapt
structurat a carui definitie nu se cunoaste.
Exemplul 5.10.
Fie urmatoarele doua definitii:
(deftemplate Fapt (field a1 (type STRING) ) (field a2 (type NUMBER) ) )
(defrule R
(Fapt (a1 ?x) )
(Fapt (a2 ?x) )
=> )
Regula este gresita prin aceea ca tiparele ei nu vor putea fi niciodata satisfacute
datorita restrictiilor impuse pentru cele doua fatete ale faptului structurat. Aceasta eroare este
semnalata numai în CLIPS versiunea 6, pe verificare statica.
Exemplul 5.11.
Sisteme bazate pe cunostinte 257
(deftemplate F (field a) )
258 Reprezentarea cunoasterii folosind mediul CLIPS
Daca se da apoi comanda (assert (F) ), atunci stergerea definitiei faptului structurat F
sau redefinirea acestuia se pot face numai dupa eliminarea din BF a faptului introdus prin
comanda “assert”. De asemenea, daca dupa definitia de mai sus se definesc urmatoarele doua
reguli:
atunci redefinirea sau stergerea definitiei lui F nu mai este posibila. Mai întâi trebuie sterse
cele doua reguli si abia apoi se va putea redefini F sau sterge definitiei sa.
O situatie deosebita (care în principiu este bine a se evita si care în CLIPS versiunea 6
nici nu poate apare) este aceea când un acelasi simbol CLIPS este folosit si ca prim câmp într-
un fapt nestructurat si ca argument nume-deftemplate într- un fapt structurat. O asemenea
situatie ar putea fi generata prin urmatoarele comenzi:
Exercitiul 5.33.
a. Raspundeti la urmatoarele întrebari:
• Care sunt deosebirile dintre faptele structurate si cele nestructurate ?
• Când va trebui preferata folosirea faptelor structurate ?
• Care este valoarea default pentru urmatorul fapt structurat:
(defrule R
(student (domiciliul Iasi) (nume $?n) )
(not (student (nume $?n) (domiciliul Vaslui) ) ) => )
Sisteme bazate pe cunostinte 259
(logical <tipar>)
În partea de conditie a unei reguli pot fi folosite oricâte tipare de tip “logical”, cu
singura restrictie ca acestea sa fie plasate pe primele pozitii, putând fi urmate de tipare
obisnuite. Efectul folosirii tiparelor “logical” este acela ca faptele care sunt introduse în BF
prin partea de actiune a regulii respective devin sustinute logic de faptele care verifica tiparul
sau tiparele de tip “logical”. Aceasta înseamna ca atunci când faptul sau faptele de sustinere
sunt sterse din BF si faptele sustinute sunt eliminate din BF, în mod automat. Explicatia este
aceea ca se invalideaza efectul unei deductii anterioare, deoarece una din ipoteze nu mai este
valida. Modul de functionare a sustinerii logice se va ilustra pe mai multe exemple.
Exemplul 5.12.
Fie regula:
(defrule R1
(logical (a) )
(b)
=>
(assert (c) ) )
Exemplul 5.13.
Urmatoarele doua reguli sunt echivalente:
(defrule R2 (defrule R3
(logical (a1) (a2) ) (logical (a1) )
=> (logical (a2) )
(assert (A1) ) ) =>
(assert (A1) ) )
Exemplul 5.14.
Urmatoarea regula este gresita sintactic:
(defrule R- gresita
(a)
(logical (b) ) => )
Exemplul 5.15.
Sub o conditie “logical” poate fi plasata o operatie SAU între mai multe tipare, ca în
cazul regulii R4:
(defrule R4
(logical (or (b1) (b2) ) )
(b3)
=> (assert (B1) ) )
Exercitiul 5.33.
Verificati functionarea regulii R4, observând felul în care se produce sustinerea logica
în acest caz. Scrieti cele doua reguli care sa nu mai foloseasca conditia SAU între tipare si
care împreuna sa fie echivalente cu regula R4.
Exemplul 5.16.
Desi un tipar de tip “not” poate fi plasat sub “logical”, nu se produce nici un efect de
sustinere. Fie în acest sens regula:
(defrule R5
(logical (a)
(not (b) ) )
=> (assert (c) ) )
Sisteme bazate pe cunostinte 261
(assert (a) )
(run)
(assert (b) )
vom constata ca faptul (c) nu este scos din BF, desi prin introducerea lui (b) în BF partea de
conditie a regulii R5 nu mai este satisfacuta (în CLIPS versiunea 5 se transmite doar un mesaj
de avertizare – “warning”).
Exemplul 5.17.
Un fapt poate fi în situatia de a fi sustinut logic de diferite grupuri de fapte, provenite
din mai multe reguli. Într- un asemenea caz faptul respectiv va fi eliminat automat din BF
numai atunci când îsi pierde sustinerea din toate grupurile (ceea ce este în concordanta cu
teoria deductiei), asa cum se ilustreaza prin urmatoarele doua reguli:
(defrule R6 (defrule R7
(logical (a) ) (logical (e)
(b) (f) )
=> (assert (c) (d) ) ) => (assert (c) ) )
Exercitiul 5.34.
Introduceti regulile R6 si R7 în BR, activati- le si executati- le, iar apoi verificati
momentul când faptul (c), respectiv faptul (d), îsi pierd sustinerea logica. Explicati
comportarea obtinuta.
Exemplul 5.18.
Daca un fapt este introdus în BF printr-o modalitate independenta de sustinerea logica
(aceasta poate fi o comanda “deffacts” urmata de “reset”, sau “assert” data la nivel superficial,
sau din partea de actiune a unei reguli), atunci sustinerea logica nu mai este luata în
considerare. Aceasta situatie este ilustrata prin urmatoarele doua reguli:
(defrule R8 (defrule R9
(logical (y1) ) (y2)
=> =>
(assert (Y) ) ) (assert (Y) ) )
Daca în urma executiei celor doua reguli faptul (Y) este prezent în BF, iar ulterior
faptul (y1) este scos din BF, asupra lui (Y) nu se întâmpla nimic; aceasta deoarece el este
rezultatul si al regulii R9, adica al unei adaugari în BF independenta de sustinerea logica.
262 Reprezentarea cunoasterii folosind mediul CLIPS
Exemplul 5.19.
Daca o regula care a generat sustinerea logica pentru un fapt este stearsa din BR,
atunci sustinerea logica respectiva este anulata. Aceasta înseamna ca faptul nu va mai fi sters
din BF la pierderea sustinerei logice, asa cum se ilustreaza în cazul urmator.
(defrule R10
(logical (t1) )
=>
(assert (t2) ) )
La comenzile:
(assert (t1) )
(run)
(undefrule R10)
(retract 0)
daca f-0 este identificatorul la care se afla faptul (t1), vom constata ca faptul (t2) nu este
eliminat din BF, sustinerea sa logica anulându-se odata cu stergerea regulii R10 din BR.
Exemplul 5.20.
O regula în care exista un tipar “logical” creeaza o dependenta numai în legatura cu
comenzile “assert” existente în partea ei de actiune, nu si cu comenzile de stergere a faptelor
din BF - “retract”. De exemplu, considerând regula:
(defrule R11
(logical (h1) )
?a <- (h2)
=>
(retract ?a) (assert (h3) ) )
la activarea si executia ei faptul (h2) este scos din BF, iar (h3) este adaugat. La o scoatere
ulterioara din BF a lui (h1), faptul (h3) îsi pierde sustinerea logica si este sters din BF, dar nu
trebuie sa ne asteptam ca se produce o readucere automata a faptului (h2) în BF.
Exemplul 5.21.
Sustinerea logica se produce si în legatura cu faptele structurate, ca în cazul urmator:
(deftemplate F (field f) )
(defrule R12
Sisteme bazate pe cunostinte 263
(logical (F (f 1) )
(fa) )
=> (assert (Aa) ) )
Exercitiul 5.35.
Verificati modul de manifestare a sustinerii logice în cazul regulii de mai sus.
Exista o serie de comenzi ajutatoare pentru urmarirea sustinerii logice. Acestea sunt
urmatoarele.
Drept argument se poate folosi indexul unui fapt din BF sau o variabila legata la
indexul unui fapt (un caz de folosire a unei variabile în acest scop este cel din exercitiul 5.37
punctul d). Efectul este acela de listare a identificatorilor faptelor care asigura sustinerea
logica pentru faptul precizat prin argument.
Argumentul poate fi indexul uni fapt din BF sau o variabila legata la indexul unui fapt.
Rezultatul care se obtine este acela de listare a identificatorilor faptelor care primesc suportul
logic de la faptul indicat prin argument.
Exercitiul 5.36.
Construiti un exemplu în care sa verificati modul de functionare pentru comenzile
“dependencies” si “dependents”.
Exercitiul 5.37.
a. Raspundeti la urmatoarele întrebari.
• Ce înseamna în IA rationament monoton si respectiv nemonoton si care sunt
cazurile în care trebuie sa intervina sistemul de mentinere a consistentei?
• Ce se întâmpla atunci când un fapt este sustinut logic din mai multe reguli ?
• Ce se întâmpla atunci când un tipar de tip “not” apare sub “logical” ?
• Care este efectul comenzilor “dependencies” si “dependents” ?
• Care este rezultatul ce se obtine dupa activarea si executia regulii urmatoare:
(defrule regula
(logical ?a <- (b) )
=>
(retract ?a)
(assert (c) ) )
264 Reprezentarea cunoasterii folosind mediul CLIPS
(defrule rr
(logical ?a <- (A ?)
?b <- (A ?) )
(test (neq ?a ?b) )
=> (assert (c)))
Este regula respectiva corecta? Daca da, când este regula activata, ce se întâmpla dupa
executia ei si dupa eliminarea din BF a unuia din cele doua fapte care au determinat activarea.
c. Fie urmatoarele definitii de constructii (de observat ca numele unui fapt structurat
este acelasi cu numele unei reguli, fara sa existe vreo restrictie în acest sens, sau vreo
posibilitate de confuzie):
(deftemplate M (field m) )
(defrule M
(logical ?a <- (M (m 1) )
(b) )
=> (duplicate ?a (m 2) ) )
Cum se manifesta sustinerea logica în acest caz? Aceeasi întrebare pentru cazul în care
în partea de actiune a regulii M, actiunea “duplicate” este înlocuita cu una “modify”, adica
partea dreapta a regulii devine: (modify ?a (m 2) ) ).
d. Care este rezultatul care se obtine dupa efectuarea comenzilor (observati modul de
folosire a variabilei globale ?*A*) ?
(defglobal ?*A* = 0)
(defrule D1 (logical (d1) ) => (assert (d2) ) )
(defrule D2 ?a <- (d2) => (bind ?*A* ?a) )
(assert (d1) )
(run)
(dependencies ?*A*)
Sisteme bazate pe cunostinte 265
Interpretorul CLIPS poseda câteva optiuni, permitând utilizatorului sa aleaga între mai
multe variante în functionare, în functie de specificul problemei pe care o rezolva (una a fost
deja discutata, în 5.11.6, si anume bistabilul referitor la comportarea variabilelor globale la
comanda “reset”). Aceste optiuni se gasesc în meniul Execution, optiunea Options. Exista
doua optiuni cu privire la BF si BR:
sau din meniul Execution, conform mentiunii anterioare (rezultatul acestei comenzi, ca si la
toate comenzile de tip “set”, este vechea valoare a bistabilului respectiv). Valoarea implicita a
bistabilului este FALSE, situatie în care un fapt, cu un anume continut, este admis o singura
data în BF. În acest caz, daca de la nivel superficial sau din partea de actiune a unei reguli se
executa o comanda de introducere în BF a unui fapt care deja exista în BF atunci faptul
respectiv nu mai este înscris în BF, fara ca interpretorul sa semnaleze situatia respectiva. În
situatia în care bistabilul este pus pe TRUE, un fapt poate fi introdus în BF de ori câte ori
(evident la identificatori – adrese diferite), cu consecintele care pot apare în ceea ce priveste
procesul de potrivire. Starea bistabilului la un moment dat se poate vedea din meniul
Execution, optiunea Options sau cu comanda:
(get- fact-duplication)
Valoarea implicita a bistabilului este TRUE, situatie în care regulile “vad” faptele (în
sensul ca sunt activate de ele) indiferent de momentul în care au fost introduse faptele în BF.
Daca bistabilul este pus pe FALSE, atunci regulile nu mai “vad” (în sensul ca nu sunt
activate) decât faptele care au fost introduse în BF dupa definitia lor. Starea bistabilului poate
fi determinata din meniul Execution sau prin comanda:
(get- incremental-reset)
266 Reprezentarea cunoasterii folosind mediul CLIPS
Exercitiul 5.38.
Verificati influenta celor doua optiuni discutate mai sus folosind comenzile urmatoare
(în timpul experimentelor se va urmari si agenda). Se vor explica rezultatele obtinute.
(get- fact-duplication)¶
(get- incremental-reset)¶
(set- incremental-reset FALSE)¶
(assert (a))¶
(assert (a))¶
(defrule r (a) => (assert (b)) )¶
(retract 0)¶
(assert (a))¶
(run)¶
(set- incremental-reset TRUE)¶
(clear)¶
(set- incremental-reset TRUE)¶
(set- fact-duplication TRUE)¶
(assert (a) )¶
(defrule r (a) => (assert (b)) )¶
(assert (a) )¶
(run)¶
Exercitiul 5.39.
În cazul în care se lucreaza cu admiterea faptelor duplicat în BF (prin trecerea pe
TRUE a bistabilului “Fact Duplication”), se vor obtine efecte deosebite privind activarea
regulilor si privind sustinerea logica.
Verificati acest lucru, trecând pe TRUE bistabilul “Fact Duplication”, folosind regula:
(defrule R8
(logical (P1) (P2) )
=>
(assert (P) ) )
si introducând comenzile:
Explicati felul în care faptele din BF îsi pierde sustinerea logica, eliminând din BF, pe
rând, diferitele fapte (P1) si (P2). (obtineti explicatia tinând seama ca faptele identice din
punct de vedere al continutului sunt deosebite dupa indexul lor).
268 Reprezentarea cunoasterii folosind mediul CLIPS
În privinta ciclului de lucru al motorului de inferente din CLIPS, se pot face unele
“reglaje” ale acestuia, care se refera la pasul al doilea (cel de rezolvare a conflictului – vezi
paragraful 5.5). Astfel, regulile sunt plasate în agenda în functie de prioritatile atasate explicit
(conform declaratiei “salience” – relatia 5.15, paragraful 5.4) sau implicit. Din acest punct de
vedere exista doua comportari posibile pentru motorul de inferente: evaluarea statica si
respectiv dinamica a prioritatilor regulilor.
În cazul variantei statice, prioritatile regulilor sunt stabilite la definirea acestora, si
schimbarea prioritatii fixate pentru o regula se poate face numai prin redefinirea ei; de aceea,
interpretorul CLIPS numeste aceasta situatie ca evaluarea “la definire” (în engleza: “when
defined”).
În cazul evaluarii dinamice, exista doua subvariante:
a) se reevalueaza prioritatile regulilor de fiecare data când acestea sunt plasate în
agenda (activate); de aceea denumirea variantei este “la activare” (în engleza: “when
activated”);
b) se reevalueaza prioritatile tuturor regulilor din agenda dupa fiecare executie a unei
reguli, adica la fiecare ciclu de lucru al motorului de inferente; de aici denumirea variantei, ca
“la fiecare ciclu” (în engleza “every cycle”).
Aceste variante pot fi alese din meniul Execution, optiunea Options, sau folosind
comanda:
Observatia 5.17.
a. O regula de forma:
este evident gresita, variabila locala, nelegata la momentul respectiv, neavând cum sa
furnizeze valoarea prioritatii.
b. La comportarea dinamica privind prioritatile, numai declaratia “salience” este
reevaluata. Plasarea sau nu în agenda este legata de mecanismul de potrivire si de cel de
refractie (fortarea replasarii în agenda, în sensul depasirii refractiei, se poate obtine prin
comanda “refresh” – vezi paragraful 5.6).
c. Exista comanda (refresh-agenda) care determina, la executie, reevaluarea
prioritatilor regulilor din agenda, indiferent de tipul de comportare setat pentru motorul de
inferente la momentul respectiv. Folosind-o în partea de actiune a unei reguli, vom putea
obtine adaptarea programului la anumite momente, acelea ale executiei regulii respective.
1. O regula nou activata este plasata în agenda deasupra tuturor regulilor de prioritate
mai mica decât a ei, si sub regulile de prioritate mai mare decât a ei.
2. Între regulile de prioritate egala plasarea se face în conformitate cu tipul de strategie
de rezolvare a conflictului care este activata (setata).
Trebuie mentionat ca, în cazul în care mai multe reguli sunt activate de aceeasi
introducere sau stergere a unui fapt sau a unor fapte din BF si criteriile de mai sus nu
determina fixarea ordinii între regulile respective, atunci plasarea lor în agenda se face într-o
ordine arbitrara, care nu este influentata de ordinea în care au fost definite regulile respective.
Aceasta înseamna ca metoda de rezolvare a problemei nu trebuie sa depinda de o anumita
ordine de executie a regulilor care se afla în situatia mentionata.
270 Reprezentarea cunoasterii folosind mediul CLIPS
1. Strategia în adâncime (în engleza: “depth”) – o regula nou activata este plasata
înaintea oricarei reguli existente în agenda; aceasta înseamna ca agenda se comporta ca o stiva
(LIFO).
2. Strategia în largime (în engleza: “breadth”) – o regula nou activata este plasata dupa
regulile existente în agenda; aceasta înseamna ca agenda se comporta ca o coada (FIFO).
3. Strategia simplitatii (în engleza: “simplicity”) – o regula nou activa ta este plasata
deasupra tuturor regulilor care au un coeficient de simplitate strict mai mare decât al ei si sub
regulile având un coeficient de simplitate egal, sau mai mic. Coeficientul de simplitate este
dat, în principiu, de numarul de comparatii care se efectueaza în partea de conditie a regulii, în
procesul de potrivire. Practic acest coeficient se calculeaza în felul urmator. Se pleaca de la
valoarea 0. Fiecare comparatie în procesul de potrivire al unui tipar cu o constanta sau o
variabila deja legata adauga 1 la coeficientul de simplitate. Fiecare apel al unei functii într-un
tipar, în cadrul operatorilor =, :, test, adauga 1 la coeficientul de simplitate. Apelul
predicatelor “and”, “or”, “not” nu adauga nimic la coeficientul de simplitate; în schimb,
argumentele lor adauga 1 la coeficientul de simplitate. Apelul unei functii în interiorul altei
functii nu adauga nimic la coeficientul de simplitate.
Fie, ca exemplu, regula:
(defrule exemplu
(a ?x ?y ?x)
(test (and (numberp ?x) (> ?x (+ 10 ?y) ) (< ?x 100) ) ) =>. . .)
Se observa ca în vârful agendei apare regula R-6, în a carei activare a intervenit faptul
de la identificatorul f-4, adica faptul cel mai recent din BF. Regula R-5 este pusa înainte de
regula R-1, deoarece are un coeficient de simplitate mai mare, având un tipar în plus, de tip
“not”. Prezenta acestuia este identificata prin “,” care apare dupa f- 3 (un tipar “not” dintr-o
regula activata este marcat prin semnul “,” în vizualizare agendei). La fel (prin complexitatea
mai mare) se explica ordonarea între R-1 si R-2, si respectiv între R-4 si R-3.
Aceste strategii au caracter de generalitate, fiind cele mai întâlnite pentru motoarele de
inferente ale SE. În enumerarea lo r s-au facut unele aprecieri privind adecvarea la anumite
tipuri de probleme. Situatia ideala, aceea în care regulile unui SE sunt total independente, ar
însemna ca motorul de inferente poate determina solutia indiferent cu care strategie se
lucreaza. În realitate, se poate întâmpla ca natura problemei sa faca foarte dificila sau
imposibila obtinerea solutiei pe anumite strategii (a se vedea exemplul din paragraful
urmator). De aceea, cunoasterea lor poate permite adaptarea functionarii motorului de
inferente la specificul problemei, si în plus, experimentele facute cu diferite strategii ne pot
ajuta sa întelegem interdependentele care exista între reguli, punctele slabe ale functionarii
SE.
(defrule r-adaptare
(faza adaptare)
(valoare-senzor S ?x&:(or (and (numberp ?x)(> ?x 100))
(and (symbolp ?x) (eq ?x mare))) )
=>
(assert (urgenta) )
(build “(defrule r- urgenta
(urgenta)
=>
(refresh-agenda)
(set-strategy lex) )” ) )
Vom parcurge cele 3 etape ale metodei descrise în paragraful 3.4 pentru
implementarea unui sistem bazat pe reguli. În primul pas scriem regulile necesare în
rezolvarea problemei într-o prima forma, de tip pseudocod.
1) În situatia în care se cere printr- un scop ca un bloc sa fie deasupra altui bloc si atât
blocul care se muta (blocul sursa) cât si cel destinatie sunt libere, adica se afla în vârful
stivelor din care fac parte, robotul poate face miscarea de mutare. Rezolvarea acestei situatii
este concretizata în urmatoarea regula, numita Mutare-directa:
2) Deoarece podeaua are o situatie deosebita fata de blocuri (poate primi deasupra ei
oricâte blocuri), vom prevedea o regula distincta pentru mutarea unui bloc pe podea, numita
Mutare-pe-podea.
Sisteme bazate pe cunostinte 275
Daca scopul este de a muta blocul ?sursa pe podea si blocul ?sursa este liber
atunci muta blocul ?sursa pe podea.
3) O regula care sa permita eliberarea unui bloc care nu este liber si care printr-un
scop existent urmeaza a fi mutat este urmatoarea (o numim regula Eliberare-sursa):
4) O regula similara cu aceea de mai sus este cea de eliberare a destinatiei unui scop
(regula Eliberare-destinatie):
În aceasta regula nu a interesat care este blocul care urmeaza a fi mutat pe blocul ?x.
Dupa ce a fost stabilita forma principiala a regulilor putem trece la pasul al doilea al
metodei, acela de fixare a formei faptelor prin care sa se descrie starea initiala din problema
respectiva. Tinând seama de fig. 5.2, de felul în care am conceput cele patru reguli
preliminare, rezulta ca necesare urmatoarele tipuri de fapte.
Exemple de folosire a acestui sablon pe fapte din problema noastra sunt: (pe A B)
(pe F podea) (pe nimic D).
b) Cuvintele nimic, podea, trebuie sa aiba un înteles deosebit fata de cuvintele care
reprezinta blocurile, pentru a nu putea fi interpretate ca blocuri. De aceea, ca masura de
precaut ie, vom preciza blocurile prin fapte de forma:
276 Reprezentarea cunoasterii folosind mediul CLIPS
(este-bloc <nume-bloc>)
c) În regulile stabilite anterior este necesara precizarea scopurilor; în acest sens vom
folosi fapte de forma:
Trecem acum la pasul al treilea al metodei, acela în care tinând seama de cele stabilite
în cele doua etape anterioare, cât si de sintaxa limbajului, scriem forma finala a regulilor.
Regula Mutare-directa, scrisa în CLIPS, este:
(defrule mutare-directa “aceasta regula intra in executie cand sursa si destinatia sunt
libere si destinatia este un bloc”
?scop <- (scop muta ?bloc1 pe ?bloc2)
(este-bloc ?bloc1)
(este-bloc ?bloc2)
(pe nimic ?bloc1)
?stiva1 <- (pe nimic ?bloc2)
?stiva2 <- (pe ?bloc1 ?bloc3)
=> (retract ?scop ?stiva1 ?stiva2)
(assert (pe ?bloc1 ?bloc2) (pe nimic ?bloc3) )
(printout t “blocul ” ?bloc1 “ este mutat pe blocul ” ?bloc2 crlf) )
Se pot face urmatoarele observatii în legatura cu aceasta regula. Ea are mai multe
roluri.
Partea de conditie si cea de actiune a acestei reguli sunt usor de urmarit, explicatiile
fiind similare cu acelea de la regula anterioara, cu observatia ca regula Mutare-pe-podea are
mai putine tipare si actiuni, deoarece în ceea ce priveste podeaua nu mai sunt necesare
verificari (conform uneia din specificatii, podeaua poate primi oricâte blocuri).
(defrule eliberare-sursa “aceasta regula intra in executie cand un bloc trebuie mutat
undeva si deasupra sa se afla alt bloc”
(scop muta ?bloc1 pe ?)
(este-bloc ?bloc1)
(pe ?bloc2 ?bloc1)
(este-bloc ?bloc2)
278 Reprezentarea cunoasterii folosind mediul CLIPS
Exercitiul 5.40.
a. Sa se scrie în CLIPS regula Eliberare-distinatie.
b. Sa se experimenteze functionarea programului format din cele 4 reguli, având grija
sa fie introduse în BF faptele corespunzatoare starii initiale si scopul, de exemplu cel propus
anterior: (scop muta C pe E).
c. Verificati starea BF dupa rularea programului, observati faptul incorect care apare si
modificati programul în asa fel încât sa nu mai apara eroarea respectiva.
(stiva <<element-stiva>>)
O data stabilita forma acestui fapt vor fi usor de scris regulile care sa realizeze
operatiile de prelucrare a stivei - introducere si scoaterea de elemente din aceasta. Deoarece
numarul de elemente din stiva nu se cunoaste a priori, în scrierea regulilor vom folosi
variabilele multiple. Pentru regula de introducere în stiva consideram ca va exista un fapt de
declansare a acestei operatii, de forma:
(push <valoare>)
unde câmpul al doilea va contine valoarea ce se doreste a se adauga în stiva. Astfel, regula
(scrisa direct în CLIPS) rezulta de forma:
Pentru operatia de extragere din stiva trebuie sa concepem doua reguli care sa intre în
actiune în cele doua cazuri posibile: se cere o extragere din stiva ce contine macar un element
si respectiv cazul în care se cere extragerea dintr-o stiva vida. Pentru prima situatie regula
este:
În regula de mai sus faptul (pop) va apare în BF atunci când utilizatorul doreste
efectuarea unei extrageri din stiva (evident, am presupus ca în BF exista o singur a stiva).
Exercitiul 5.41.
a. Scrie ti regula pentru cazul în care se cere extragerea dintr-o stiva vida (observati
caracterul disjunct al acestei reguli cu cea scrisa mai sus, în sensul neactivarii simultane a
celor doua reguli).
b. Rescrie ti regulile de extragere din stiva în asa fel încât utilizatorul sa fie anuntat
atunci când se extrage ultimul element din stiva.
c. Rescrieti regulile de lucru cu stive pentru cazul în care în BF se pot afla mai multe
stive.
d. Scrieti regulile pentru lucrul cu o structura de date de tip coada.
elementul aflat pe podea, acesta fiind ultimul din stiva; de asemenea podeaua nu a mai fost
reprezentata explicit. Regula Mutare-directa devine în noua abordare:
(defrule mutare-directa
?scop <- (scop muta ?bloc1 pe ?bloc2)
?stiva1 <- (stiva ?bloc1 $?rest1)
?stiva2 <- (stiva ?bloc2 $?rest2)
=> (5.24)
(retract ?scop ?stiva1 ?stiva2)
(assert (stiva $?rest1) (stiva ?bloc1 ?bloc2 $?rest2) )
(printout t “blocul ” ?bloc1 “ este mutat pe blocul ” ?bloc2 crlf) )
Exercitiul 5.41.
Scrieti celelalte trei reguli de planificare a actiunilor unui robot în noua varianta, aceea
a lucrului cu stive.
Starea finala, cea scop, o vom reprezenta dupa acelasi principiu, dar, pentru a o
distinge de cea initiala, vom adauga cuvântul “scop” pe prima pozitie a faptelor respective.
Înseamna ca tiparul folosit este:
Pentru a putea folosi, cu eventuale adaptari, cele 4 reguli din vechea solutie, ar fi
necesar ca scopurile sa apara în vechea forma, aceea data prin (5.23), aceasta fiind forma
pentru care sunt construite partile lor de conditie si de actiune. În consecinta, vom scrie niste
reguli care sa transforme scopurile date în forma concisa (5.25) în vechea forma (5.23). Una
din aceste reguli este:
(defrule initiala1
(declare (salience 10))
(scop stiva $? ?bl1 ?bl2 $?)
=> (assert (scop muta ?bl1 pe ?bl2)))
Regula “initiala1” preia un scop de forma (5.25) si, prin activari si executii repetate,
determinate de diferitele legari ale variabilelor ?bl1 si ?bl2, produce introducerea în BF a
tuturor scopurilor (în forma veche) care deriva dintr-un scop în noua reprezentare. Mai trebuie
mentionat ca am atasat acestei reguli o prioritate mai mare, pentru ca ea corespunde unei
prime faze a rularii, aceea în care se pregatesc conditiile pentru actiunea propriu- zisa a
regulilor de planificare.
Exercitiul 5.42.
Scrieti cea de-a doua regula necesara pentru aducerea scopurilor la vechea forma,
aceea corespunzatoare scopurilor de plasare a unui bloc pe podea.
Executia celor doua reguli discutate mai sus se va produce fara vreo precautie asupra
faptului ca anumite scopuri de plasare a unor blocuri ar putea fi deja îndeplinite din momentul
initial, fiind vorba de cazuri în care blocurile au aceeasi asezare atât în starea initiala, cât si în
cea finala. De exemplu, pentru situatia din fig. 5.3, acesta este cazul pentru blocurile B si C.
În consecinta trebuie concepute niste reguli, actionând dupa cele de initializare, si care sa
282 Reprezentarea cunoasterii folosind mediul CLIPS
elimine din BF scopurile create nejustificat (redundant). Acestea sunt cele doua reguli
prezentate în continuare:
(defrule scop-gata1
(declare (salience 5))
?sc <- (scop muta ?bl1 pe ?bl2)
(stiva $? ?bl1 ?bl2 $?)
(not (scop muta ?bl2 pe ?))
=> (retract ?sc))
(defrule scop-gata2
(declare (salience 5))
?sc <- (scop muta ?bl pe podea)
(stiva $? ?bl)
=> (retract ?sc))
(defrule mutare-directa
?sc <- (scop muta ?bl1 pe ?bl2)
(not (scop muta ?bl2 pe ?))
?st1 <-(stiva ?bl1 $?rest1)
?st2 <-(stiva ?bl2 $?rest2)
=> (retract ?sc ?st1 ?st2)
(assert (stiva ?bl1 ?bl2 $?rest2))
(if (neq $?rest1 (mv-append)) then (assert (stiva $?rest1)))
(printout t "blocul " ?bl1 " este mutat pe blocul " ?bl2 crlf))
Sisteme bazate pe cunostinte 283
(defrule eliberare-sursa
(scop muta ?bl pe ?)
(stiva ?virf $? ?bl $?)
(not (scop muta ?virf pe podea))
=> (assert (scop muta ?virf pe podea)))
Exercitiul 5.43.
a. Scrieti pentru noua abordare a programului de planificare a miscarilor robotului
regulile “mutare-pe-podea” si “eliberare-destinatie”.
284 Reprezentarea cunoasterii folosind mediul CLIPS
(deffacts problema-test
(stiva d c b a)
(stiva f e)
(stiva g k l j) (5.26)
(scop stiva d j f e)
(scop stiva c k g l b a))
si rulând programul cu motorul de inferente fixat pe strategia în adâncime, vom constata ca se
obtine solutia corecta, listata în continuare:
a) un bloc este mutat pe altul într-o situatie în care pentru el exista creat si un scop de
mutare pe podea, scop pe care regula trebuie sa-l elimine,
b) nu exista la momentul mutarii directe si scopul de mutare pe podea a blocului
deplasat, caz în care regula “mutare-directa” îsi pastreaza vechea forma.
(defrule mutare-directa1
(declare (salience 1))
?sc <- (scop muta ?bl1 pe ?bl2)
(not (scop muta ?bl2 pe ?))
?st1 <- (stiva ?bl1 $?rest1)
?st2 <- (stiva ?bl2 $?rest2)
286 Reprezentarea cunoasterii folosind mediul CLIPS
(defrule mutare-directa2
(declare (salience 1))
?sc <- (scop muta ?bl1 pe ?bl2)
(not (scop muta ?bl2 pe ?))
?st1 <- (stiva ?bl1 $?rest1)
?st2 <- (stiva ?bl2 $?rest2)
(not (scop muta ?bl1 pe podea))
=> (retract ?sc ?st1 ?st2)
(assert (stiva ?bl1 ?bl2 $?rest2))
(if (neq $?rest1 (mv-append)) then (assert (stiva $?rest1)))
(printout t "blocul " ?bl1 " este mutat pe blocul " ?bl2 crlf))
Este de observat caracterul mutual exclusiv al celor doua reguli de mai sus, asigurat
prin folosirea unui tipar într-una, si a aceluiasi tipar, sub un “not” în cealalta, ceea ce este în
concordanta cu logica rezolvarii.
Exercitiul 5.44.
Introduceti cele doua reguli “mutare-directa” în ultima versiune a programului si
experimentati programul pe problema propusa prin grupul de fapte (5.26). Rulati programul
pe toate cele 7 strategii de rezolvare a conflictului. Veti constata obtinerea unor solutii
corecte.
Exercitiul 5.45.
Refaceti programul de planificare a actiunilor robotului folosind tipare de tip “logical”
(vezi paragraful 5.17). În acest sens, se poate obtine o noua solutie, în care sa se renunte la
regula mutare-directa1, prin folosirea tiparelor de tip “logical”. Ca indicatie, tiparele “logical”
vor fi folosite în regulile “eliberare-sursa” si “eliberare-destinatie”.
În final sunt propuse câteva probleme a caror rezolvare va presupune atât aplicarea
modelelor teoretice de reprezentare a cunoasterii, cât si a
3
n4 n5 principiilor programarii bazate pe reguli pentru implementarea în
CLIPS.
-1 -2 -1
1 Problema 1.
n2 n3
Sa se scrie un program CLIPS care sa simuleze
2 1 functionarea retelei neuronale de tip Hopfield din fig. 5.4.
Programul trebuie sa preia de la utilizator informatia cu privire la
n1 nodurile care sunt active si cele care nu sunt active, si sa
determine starea stabila în care ajunge reteaua neuronala.
Fig. 5.4.
Problema 2.
a. Materializati în CLIPS retelele semantice din fig. 3.4 si fig. 3.7.
b. Folosind reprezentarea de la punctul a, scrieti programul CLIPS care sa determine
valoarea unei proprietati specificate pentru un nod precizat dintr-o retea semantica (va puteti
ghida dupa algoritmul 3.1, dar materializarea nu trebuie sa fie procedurala, ci prin
programarea bazata pe reguli).
c. Scrieti programul CLIPS care sa gaseasca toate nodurile dintr-o retea semantica ce
au o anumita valoare a unei proprietati date.
Problema 3.
Construiti, cu ajutorul unor fapte structurate, reprezentarea în CLIPS a modelului de
cadru pentru un robot industrial (va puteti ghida dupa modelele date în fig. 3.11 si 3.12).
Problema 4.
Implementati în CLIPS modelul de reprezentare a cunoasterii corespunzator
exercitiului 27, pg. 128 (fig. 3.16).
Problema 5.
Creati o BF cu privire la studentii unei grupe. Scrieti programul CLIPS care sa
determine localitatea unde îsi au domiciliul cei mai multi studenti, studentul care are media
cea mai mare pentru semestrul curent (vor fi prezente informatii cu privire la notele din
288 Reprezentarea cunoasterii folosind mediul CLIPS
semestrul respectiv, media calculându-se numai pentru acei studenti care au cel mult o
restanta), numarul studentilor integralisti, numarul studentilor care nu au luat un examen, al
celor care nu au luat doua examene, respectiv al celor care nu au luat mai mult de doua
examene, si obiectul la care sunt cei mai multi restantieri.
Indicatie. Se vor putea folosi fapte structurate, care sa fie realizate în asa fel încât sa se
preîntâmpine introducerea de informatii incorecte în BF (de exemplu, o nota poate fi un
numar întreg între 1 si 10, numele disciplinelor de studiu sunt a priori cunoscute). Se va putea
folosi pentru pastrarea informatiilor cu privire la notele unui student o fateta multicâmp, în
care sa fie trecute, în perechi de câmpuri alaturate, numele disciplinei si nota obtinuta, sau
simbolul absent.
` Problema 6.
Concepeti un program în CLIPS care sa determine orarul unei facultati.
Indicatie. Se vor scrie mai întâi regulile principiale care ghideaza realizarea orarului,
apoi se vor concepe faptele necesare si regulile în CLIPS.