Sunteți pe pagina 1din 7

Inteligen Artificial

6. Programare bazat pe reguli

CURS 6. Programarea bazat pe reguli Primii pai


Limbajul CLIPS
CLIPS este un shell evoluat pentru dezvoltarea de sisteme expert. El se ncadreaz n paradigma limbajelor bazate pe reguli de producie i implementeaz o cutare nainte. CLIPS a fost dezvoltat de Software Technology Branch la NATO Lyndon B. Johnson Space Center. Prima versiune aprnd n 1986, n august 1998 ajunsese la versiunea 6.10, aceast evoluie semnificnd un ir impresionant de mbuntiri i extinderi ale limbajului. Pentru a rezolva o problem n CLIPS programatorul definete baza de cunotine i alege strategia de cutare iar sistemul dezvolt un proces de aplicare a regulilor care se perpetueaz att timp ct mai exist reguli de aplicat. Prezentarea care urmeaz nu este propriu-zis o introducere n CLIPS ct o introducere n programarea bazat pe reguli. Ca urmare nu vom insista asupra elementelor de limbaj, ce pot fi oricnd gsite n documentaia interactiv a limbajului1 ct asupra manierei n care se rezolv probleme utiliznd paradigma de programare bazat pe reguli de producie. Prezentarea care urmeaz este una tributar credinei mele c un limbaj nou se nva cel mai eficient i mai rapid cnd ai de rezolvat o problem. Ca urmare elementele limbajului vor fi predate ntr-o ordine indus de exemplele pe care le vom considera, pe msur ce vom fi silii la aceasta de complexitatea mereu mai crescnd a problemelor tratate. Efectul imediat al acestei filozofii se va oglindi n cuprins ce va lista mai degrab o colecie de probleme dect o serie de elemente de limbaj, aa cum se procedeaz in orice carte serioas care introduce un limbaj de programare. Vom semnala totui elementele de limbaj introduce prin nsemne pe maneta crii de forma celui din dreptul acestui paragraf. CLIPS-ul, ca i alte shell-uri de sisteme expert este un limbaj interpretat. Asta nseamn c o comand dat la prompter este executat imediat i rezultatul ntors. Prompterul CLIPs este:

Maniera de prezentare

S facem o adunare
Comanda dat direct la prompter Cum scriem n CLIPS c 2+1=3? Operaia de adunare se realizeaz prin operatorul de adunare +, deci scriind: urmat de un <Enter> (orice comand se termin cu <Enter>), interpretorul va ntoarce dup care vom avea din nou un prompter:

Fapte S presupunem acum c dorim ca numerele pe care vrem s le adunm s fie indicate ca date de intrare. Precizarea intrrii ntr-un program CLIPS se face prin completarea unor fapte. De exemplu am putea s avem dou fapte ce conin numerele de adunat: Un fapt poate fi de dou feluri: fie este o construcie multi-cmp, n care cmpurile nu au nume i ordinea lor este semnificativ (fapte ordonate), fie una n care cmpurile au nume i, ca urmare, ordinea lor nu mai e important. n acest capitol vom lucra numai cu fapte ordonate. Un fapt este reprezentat cu unicitate n baz (introducerea n baz a unui al doilea fapt identic cu un altul nu este posibil).

Site-ul CLIPS de la NASA este la adresa: http://www.siliconvalleyone.com/clips.htm.

31

Inteligen Artificial

6. Programare bazat pe reguli

Dar cum facem ca interpretorul s ia cunotin de aceste fapte? Cum la prompter el se ateapt s primeasc comenzi, ncercarea de a le scrie direct acolo va eua pentru c el nu cunoate nici o comand nmr :u a Comanda care comunic interpretorului un grup de fapte este d :e

Definirea faptelor

un comentariu primul fapt al doilea fapt un nume de grup (opional) de fapte Scriind la prompter acest rnd, aparent nu se ntmpl nimic. Faptele au fost interpretate dar nc nu snt depozitate n baza de fapte a sistemului. Trebuie s-i spunem explicit c faptele declarate prin definiiile de grupuri de fapte dfa fie depozitate n baza de fapte, prin comanda (ee s ec f s rt st i verificm acest lucru cu (Deci, s relum secvena: .f a c n afara faptelor pe care le-am depus noi, ne este raportat nc un fapt asupra cruia nu avem nici un merit: i Utilitatea acestui fapt, pe care sistemul l introduce ntotdeauna, st n .n nceperea execuiei programului (lucru care va deveni clar mai trziu). Acum avem faptele n baz. Cum procedm pentru a aduna cele dou numere? Va trebui s construim o regul capabil a prelua numerele din cele dou fapte i a le aduna. Aceast regul va trebuie s fie att de general nct ori de cte ori coninutul acestor dou fapte din baz s-ar modifica, ea s produc noua sum. Reguli Pentru a defini o regul folosim construcia dfu :e r l

Definirea regulilor

orice regul trebuie s aib un nume

pot s scriu un comentariu care s descrie ce face regula (opional)

partea stng: un ir de pattern-uri

partea dreapt: un ir de aciuni

Un ablon (n englez pattern) este o construcie care imit mai mult sau mai puin un fapt ce ar trebuie s fie gsit n baz. n extremis un ablon poate s fie identic cu un fapt, caz n care el se va potrivi numai nu acesta. Cel mai adesea ns un ablon permite anumite grade de libertate n structura faptelor cu care se intenioneaz a se potrivi. Termenul englezesc pentru operaia de confruntare dintre un ablon i un fapt este pattern-matching. Structura unui pattern pentru fapte ordonate este ceva de genul: pattern ::= (<element-pattern>*) element-pattern ::= <atom> | ? | ?<var> | $? | $?<var> Un element-pattern atomic poate fi un ntreg, un real, sau un simbol. Celelalte construcii se refer la cmpurile ce pot fi variabile n pattern. Confruntare dintre un pattern i un fapt nseamn o parcurgere a pattern-ului n paralel cu faptul i confruntarea fiecrui cmp din pattern cu unul sau mai multe cmpuri din fapt:

Pattern-uri

32

Inteligen Artificial

6. Programare bazat pe reguli

dac elementul-pattern e un atom, atunci operaia de confruntare reuete cnd cmpul respectiv din fapt este identic cu acesta; dac elementul-pattern e ?atunci operaia reuete; , dac elementul-pattern e ?vr i variabila <a e legat, atunci operaia reuete iar variabila <a> < a nu v r > ,v r ca efect lateral, va fi legat la valoarea din cmp; dac elementul-pattern e ?vr variabila <e > ,<> i a v legat la o valoare <atunci operaia reuete a r v a l dac i numai dac valoarea din cmp este <a ;v l dac elementul-pattern e $ atunci operaia reuete, i un numr de zero sau mai multe ,? cmpuri snt avansate n fapt; dac elementul-pattern e $<a i r ? variabila <a e legat, atunci operaia reuete, un numr de v nu v r zero sau mai multe cmpuri snt avansate n fapt, i, ca efect lateral, variabila ?vr fi legat va <> a la acestea; dac elementul-pattern e $i variabila <e > v la<un ir ? valori (n 0), atunci operaia v legat a r n reuete dac i numai dac urmtoarele n cmpuri din fapt snt identice cu acestea; n plus n cmpuri snt avansate n fapt.

Pn acum am definit construcii ce pot apare n partea stng a unei reguli. Ce aciuni pot s apar n partea dreapt? Pentru moment orice ieire a programelor pe care le construim se va manifesta prin modificri n baza de fapte. Putem modifica colecia de fapte din baz n dou moduri: adugnd noi fapte sau retrgnd fapte existente acolo. Ca s adaug scriu: (se .fs <Ca ar s retrag trebuie ns s precizez despre ce fapt e vorba. Nu se pune problema a identifica din nou un fapt n partea dreapt a regulii prin intermediul unui pattern: un pattern nu poate aciona dect n partea stng. Ca urmare faptul ce trebuie retras trebuie s fi fost deja identificat printr-un pattern, i un index al lui reinut. Ca s rein indexul unui fapt n baza de Asertarea i fapte folosesc construcia:
retragerea faptelor

care poate s apar doar n partea stng a regulii. Variabila ?v va lega la indexul unui fapt se < a peste care se potrivete pattern-ul <a e un index de fapt putem comanda retragerea lui din . pt Avnd t baz printr-o comad (retract ?<var>) ce trebuie s apar n partea dreapt a regulii. Revenind la exemplul de adunare a celor dou numere, o prim tentativ ar putea fi urmtoarea: Faptul nou introdus cu (conine activarea unei evaluri a operatorului de adunare (=n faa a s s apelului de funcie). Scriind un df prompter ncarc o regul n baza de reguli. Ca s lansez n execuie regulile e la r asupra faptelor, o comand (trebuie executat. n cazul derfa, ne ateptm ca activarea acestei reguli s produc urmtoarea modificare n baza de fapte (vizualizat cu (a ): c f

Ateptarea nu se confirm ntr-adevr, afiarea bazei de fapte, relev, urmtoarele fapte: Care este motivul? Cum de au aprut acolo i sumele 2 i 4? Rspunsul st n mecanismul de aplicare a regulilor. Cum se aplic regulile asupra faptelor? S presupunem c o regul R i satisface toate pattern-urile asupra unei configuraii de fapte din baz. Spunem c s-a creat o activare a respectivei reguli. O activare este format dintr-o pereche ce asociaz unui nume de regul o secven de fapte, cte unul pentru fiecare pattern din partea de condiii a regulii. Aceeai regul mpreun cu o alt secven a unor fapte ce se potrivesc cu secvena de pattern-uri a prii stngi va genera o alt activare. E posibil deci inclusiv situaia ca n activri diferite s participe aceleai fapte dar ntr-o alt ordine. Spre exemplu, n exemplu nostru, n care avem regula a faptele iniiale n i a (ur partea de condiii a regulii, respectiv perechea de pattern-uri: ia ur n (n m m, a va crea urmtoarele activri:

33

Inteligen Artificial

6. Programare bazat pe reguli

act1:

act2:

act3:

act4: Figura 1: Activri Ca urmare, pentru fiecare dintre aceste activri, legrile variabilelor ? ? faptul calculat snt: i i x y act1: ?x 2, ?y 2 (ua = = s m act2: ?x 2, ?y 1 (u = = s m act3: ?x 1, ?y 2 (deja existent = = ,s u m act4: ?x 1, ?y 1 (ua = = s m Un program care nu se mai termin Modificnd un singur simbol n regula aputem face ca ea s se aplice la nesfrit. d u n Acest lucru se ntmpl, de exemplu dac n loc de fapte (ua crea tot fapte ( m am s :) r) a m Bucla infinit e datorat faptului c, la crearea fiecrui nou element din baz, de forma (ur ,na m acesta va participa n attea activri cte fapte snt deja n baz, ceea ce va duce la apariia a tot attea fapte noi, .a.m.d. Dac programul a intrat ntr-o bucl infinit nu avem alt soluie dect s oprim programul prin mijloace brutale (<CTRL>C, sau, n extremis, <CTRL><ALT><DEL>). n realitate, lsat s mearg, programul se va opri datorit epuizrii memoriei de lucru. i atunci, care e soluia? Exerciiul de adunare a dou numere, n varianta n care am ncercam s-l rezolvm pn acum, este mai mult un exemplu de contra-problem, pentru a nva din eecuri. Dei lipsit de elegan, o soluie ar fi una n care separm din capul locului cele dou numere n fapte distincte: Mai jos vom considera o alt soluie care simuleaz o iteraie. ncrcarea dintr-un fiier Pn acum programul nostru a constat dintr-o singur regul. Pe aceasta am putut-o scrie direct la prompter. Dar cnd dimensiunea unui program e mai mare dect o singur linie de comand, lucrul direct la prompter devine greoi i preferm s ncrcm programul dintrun fiier. Pentru aceasta utilizm comanda (l ad <nume. o fiier>) u n 4 )

34

Inteligen Artificial

6. Programare bazat pe reguli

Cum realizm o iteraie?


S calculm o sum Primul exemplu de iteraie ce se d de obicei ntr-o carte de prezentare a unui limbaj imperativ este unul n care se parcurg elementele unei liste. S ncepem prin cel mai banal dintre ele: adunarea unui ir de numere. De data aceasta vom reprezenta irul de numere printr-un unic fapt nmr simuleaz un vector. Mai avem nevoie de un fel de registru care s care u e e memoreze rezultate pariale ale sumei, la fiecare pas n iteraie, i care s fie iniializat cu 0: Regula urmtoare realizeaz iteraia de sumare: Cum funcioneaz ea? Partea de condiie a regulii conine o secven de dou pattern-uri. Primul verific existena n baz a unui fapt nm e urmat de cel puin un simbol (s observm care u e c nimic n regul nu ncearc s valideze c ceea ce urmeaz dup simbolul nm simboluri snt u e ntr-adevr de natur numeric; pentru nceput nu ne vom lua aceast precauie). Condiia de lungime a irului de numere cel puin egal cu unu, este realizat prin variabila de pattern ? urmat de variabila multicmp $r .? Reinei aceast secven, pentru ca ea este comun multor e operaii de iteraii pe ir. Pattern-ul: pune n eviden dup simbolul numere obligator un simbol i eventual altele. n urma confruntrii, variabila simpl ?x se va lega la primul numr din secven, iar variabila multipl $?y la restul lor, posibil nici unul. Odat gsit un astfel de fapt, variabila ?r se va lega la indexul lui din baz. Acest lucru este datorat construciei: Indexul faptelor care semnific o legare a variabilei ? indexul faptului descoperit de ablon. Indexul este un la r fel de adres a faptului n memorie. Legnd o variabil la adresa unui fapt, putem s retragem faptul din baz printr-o aciune ce are loc n partea dreapt a regulii. Ce de-al doilea pattern din regul caut n baz un fapt sm leag variabila ?de simbolul de u i dup el, pe care din nou, fr nici o alt precauie suplimentar, vom considera c este un numr ce reprezint suma deja realizat. Variabilei ?s se va lega la indexul acestui fapt din baz. Dac aceste dou condiii snt ndeplinite, n partea a doua a regulii cele dou fapte snt retrase i nlocuite, respectiv, cu un fapt nm scurt cu o poziie i o sum actualizat. mai u e Pentru o ipostaz dat a bazei de date exist o unic activare, ce este evident asociat acestei reguli, i, datorit acestui lucru, ea se aplic de fiecare dat. Acest lucru se ntmpl pn cnd faptul nmr mai conine nici un numr, caz n care programul se oprete de la sine. n nu ue e acel moment faptul s conine rezultatul. va u
ncrcarea unui fiier program

Presupunnd c programul nostru, constnd din declaraiile dfa df afl ntr-un fiier po ec e i se f r , r1 g ncrcarea lui n memorie se face astfel: Odat ncrcat n memorie putem verifica faptele iniiale: La comanda: Programul este lansat n execuie, iar pentru a verifica rezultatul vom controla din nou faptele:

Calculul unui maxim S presupunem c ne propunem s calculm maximul dintr-o secven de numere. Numerele snt definite de data aceasta printr-un unic fapt nm u care simuleaz un vector, iar un e fapt mx conine iniial primul numr din secven. Prima soluie este urmtoarea: a Regula anlocuiete faptul ma un altul dac primul numr din secven e mai mare dect _a m c cu vechiul mx .a Construcia (et tot un pattern dar care realizeaz o comparaie prin activarea unui s este t) Cum facem verific condiia complementar, situaie n care las aza o comparaie operator de comparare. Regula pastre _max neschimbat mx elimin un element din vector. n ambele reguli nlocuirea vectorului cu unul a dar

35

Inteligen Artificial

6. Programare bazat pe reguli

mai scurt cu un element se face prin retragerea faptului (u vechi i asertarea altuia nou care are ner m toate elementele vechi cu excepia primului. n toate cazurile, variabila multi-cmp $r leag la se ? e restul elementelor vectorului. Reguli ce se activeaz doar cnd altele nu se pot aplica (prin default) Ceea ce deranjeaz n aceast soluie este necesitatea de a preciza att condiia > ct i pe cea complementar . Urmtoarea variant elimin testul complementar, care este unul redundant: Din regula pae disprut pattern-ul care identific elementul mx baz ct i testul de . ata sa rm z _ a din Problema acum este: cum tim c psa aplic exact n cazurile n care nu se poate aplica aa ata sem r_ e z ? _ m c Prioritatea Rspunsul este: fcnd ca as fie mai prioritar dect pastreaza_ rostul declaraiei sdin _a m c . Acesta este max a l i regulilor capul regulii aa .m _Fcnd acest lucru form ca pastreaza_m x n faza de selecie care urmeaz c s fie eliminat a filtrrii. ntr-adevr, dup filtrare ambele snt activate. Declaraiile de sprovoac o sortare a a l i regulilor activate la oricare pas. Prioritatea mai mic a regulii pastreaza_ma se aplice numai face ca ea s x n cazurile n care a se mai poate aplica. _ nu c m Exemplul arat c pentru a face ca o condiie de complementaritate s poat fi implementat printr-o declaraie de prioritate trebuie s facem ca regula cu prioritate mai mic s aib o condiie de aplicabilitate mai larg sau cel puin egal cu cele ale regulilor cu care intr n competiie. Numai n acest fel ne asigurm c n cazurile n care celelalte nu se aplic, aceasta i va satisface nc condiiile. Revenind la exemplul nostru, realizarea condiiei de terminare a iteraiei se face prin impunerea ca faptul nmr mai conin cel puin o poziie (variabila ? Doar acest lucru face ca s ue e ). ambele reguli s se mai aplice att ct mai exist mcar un numr neprocesat. Revenind la o schem logic imperativ Un sistem bazat pe reguli de producie e n general orientat spre alte tipuri de activiti dect cele ce se preteaz la o soluie imperativ. Acest lucru nu nseamn ns c el e incapabil a efectua unele tipuri de prelucrri ce snt specifice unui sistem imperativ. S ncercm n aceast seciune s nelegem cum trebuie procedat dac am dori s utilizm un sistem bazat pe reguli pentru a implementa o secven imperativ. Motivaia acestei tentative este aceea c pe parcursul rezolvrii unei probleme care s necesite utilizarea mainriei bazate pe reguli poate s apar o subproblem care necesit o soluie imperativ. Cum procedm? Prsim sistemul bazat pe reguli pentru a construi o procedur imperativ ce s fie apelat din acesta? E i aceasta o posibilitate, dar uneori e mai comod s gndim n maniera bazat pe reguli nsi acea secven. Soluia imperativ a problemei de maxim este cea din Figura 2. iniializri x

C1 ?

C2 ?

S1

36

S2

Inteligen Artificial

6. Programare bazat pe reguli

Figura 2: Decuparea unei secvene iterative n reguli n Figura 2, C1 este testul de terminare iteraie, C2 cel care verific ?S1 reprezint nlocuirea > , lui max baz, iar S2 semnific scurtarea vectorului de numere cu un element. Decuparea din acestui algoritm n reguli este indicat n figur prin zone colorate. ntr-adevr ai pau n _a ata m sa c rm e z _ comun testul C1 cu ieire True i secvena S2, n timp ce aconine n plus secvena de _a m c actualizare a lui mx .a Iniializrile snt realizate direct de declaraiile df includere de fapte n baz de e f iar terminarea iteraiei (ieirea din testul C1 pe False) se realizeaz automat n momentul n care nici una dintre regulile aa pa tea mai satisfac condiiile, lucru care se ntmpl cnd faptul _ nu-i m srz c i a_ m ce conine numerele a ajuns la forma: ( .n Utilizarea semafoarelor Cea de a treia soluie pe care o propunem e iscat din observaia c exist o anumit redundan a operaiunilor desfurate n cele dou reguli, manifestat n secvena S2, preocupare ce n cazul de fa poate prea forat. Ea evideniaz o opiune ce poate deveni necesitate n alte ocazii. Aadar s ncercm s reducem redundana din cele dou reguli. Pentru aceasta va trebui s individualizm ntr-o regul separat operaia comun, minisecvena S2, decrementarea vectorului de numere. S introducem o secven st face care e _ acest lucru. Secvenierea regulilor devine acum cea din Figura 3, adic a psa _ urmat de st ori ata c rm ea z _ .e _ x

Figura 3: O alt soluie de decupare De data aceasta nu mai e posibil s umblm la prioriti pentru a impune o secven, fcnd de exemplu ca st aib o prioritate mai mic att dect at i dect past a a_mastabilirea acestei s e _ ct c u , pentru c x re z secvene nu se face n faza de selecie, ci ea ine de cicluri separate ale motorului. O soluie o constituie introducerea unui semafor (flag) pe care ai ps-lzseteze, iar ss-l reseteze de ca lsa i t atx u rm ea z a _ e t _ fiecare dat, ca n Figura 4.

Figura 4: secveniere prin semafoare

37

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