Sunteți pe pagina 1din 10

LUCRAREA NR.

Definirea regulilor în CLIPS


1. Comanda de construire a unei reguli

Pentru a introduce o regulă în baza de reguli (BR) se poate folosi comanda “defrule”,
care fiind de tip definire de construcţie are o formă similară cu comanda “deffacts”. Sintaxa
pentru “defrule” este:

(defrule <nume-regulă> [<comentariu-opţional>] [(declare (salience <întreg>) )]


<<tipar>> => <<acţiune>> )

nume-regulă - trebuie să fie un simbol şi va fi identificatorul regulii respective;


comentariu-opţional - trebuie să fie un şir de caractere şi va fi folosit pentru a documenta
programul; aici se vor înscrie eventualele explicaţii necesare în legătură cu regula;
partea stângă a regulii poate conţine o declaraţie privind prioritatea ataşată regulii
(declaraţie de tip ”salience”); argumentul care apare trebuie să fie un număr întreg cuprins
între -10000 şi 10000 şi stabileşte prioritatea ataşată regulii; declaraţia respectivă poate lipsi din
definiţia regulii, caz în care regula va primi implicit prioritatea zero, adică o prioritate medie.
tipar - este un element al părţii de condiţie a regulii şi are forma unei liste cu una sau mai
multe poziţii (deci conform definiţiei pentru o listă în CLIPS, un tipar este delimitat de
paranteze);
acţiune - este o comandă CLIPS, care va fi de tip funcţie şi va fi executată atunci când
regula este executată; totalitatea acţiunilor unei reguli constituie partea dreaptă a regulii; aşa cum
apare în sintaxa dată mai sus, partea de condiţie este separată de cea de acţiune prin succesiunea:
=>

Pentru fiecare regulă trebuie folosită o comandă “defrule”; dacă o comandă “defrule” se
foloseşte succesiv cu acelaşi nume de regulă, atunci ultima definiţie o înlocuieşte pe cea
anterioară. Regulile se introduc în BR prin folosirea comenzilor “defrule” la nivel superficial,
sau prin înscrierea acestor comenzi în fişiere şi încărcarea prin “load”.
O regulă din BR se poate găsi în una din stările: inactivată, activată şi în execuţie.
O regulă este activată dacă toate tiparele ei pot fi potrivite pe faptele din BF din
momentul respectiv; în caz contrar regula este inactivată. Aceasta înseamnă că partea de condiţie
a regulilor este în CLIPS sub formă de condiţie AND. De exemplu, fiind dată regula R introdusă
prin definiţia:

(defrule R “acesta este¶


un exempluӦ
(a 1)¶
(b 2)¶
=>¶
(assert (c 3) )

ea va fi activată dacă în BF se găsesc faptele (a 1) şi (b 2).

O regulă activată este una pregătită pentru execuţie; la un moment dat, în timpul lucrului
SE, mai multe reguli pot fi activate. Astfel, se defineşte agenda ca fiind mulţimea tuturor
regulilor activate la un moment dat.

14
Observaţii
1. O regulă poate să aibă şi zero tipare; felul în care este activată o asemenea regulă va fi
explicat ulterior.
2. Din punct de vedere al sintaxei este permis ca o regulă să nu aibă nicio acţiune, deşi
aşa ceva nu este util.
3. Ca un caz particular, agenda poate conţine şi zero reguli, atunci când nicio regulă din
BR nu este satisfăcută de faptele prezente în BF.

Execuţia unei reguli înseamnă execuţia, în ordinea în care apar, a acţiunilor din partea
dreaptă a regulii. Acţiunile sunt reprezentate de comenzi CLIPS de tip funcţie. În exemplul de
mai sus, partea de acţiune a regulii R conţine o singură comandă “assert”, astfel că după execuţia
regulii vom constata că în BF a fost introdus un nou fapt: (c 3). Execuţia regulilor în CLIPS nu
se face în mod automat, ci numai dacă utilizatorul transmite comanda:

(run [<limita>])

Argumentul respectiv trebuie să fie un număr întreg mai mare sau egal cu -1 şi el dă
numărul maxim de reguli care să fie executate. Dacă argumentul “limita” nu este prevăzut sau
are valoarea -1, atunci execuţia regulilor va continua până când nu mai există nicio regulă în
agendă (după ce o regulă este executată ea este scoasă din agendă); dacă argumentul este
prevăzut, atunci execuţia va înceta după cel mult un număr de execuţii de reguli egal cu “limita”.
Comanda ”run” se poate da şi din meniul Execution.
Din cele prezentate până aici rezultă că apare o interdependenţă între reguli şi BF:
regulile sunt activate sau nu, în funcţie de faptele prezente în momentul respectiv în BF. Această
interdependenţă este sub controlul motorului de inferenţe.

2. Ciclul de lucru al motorului de inferenţe în CLIPS

În CLIPS motorul de inferenţe lucrează ciclic, conform paşilor precizaţi în continuare


(este de menţionat că acest ciclu de lucru are un caracter de generalitate pentru felul în care
lucrează SE folosind mecanismul de căutare înainte):

Pas 1. Determină regulile care au partea de condiţie satisfăcută, ţinând seama de starea
BF din momentul respectiv, adică determină agenda.
Pas 2. Ordonează regulile din agendă şi selectează regula aflată pe prima poziţie în
agendă.
Pas 3. Execută acţiunea/acţiunile din partea dreaptă a regulii selectate; apoi se revine la
pasul 1 (oprirea se produce în conformitate cu explicaţiile următoare).

În legătură cu acest ciclu de lucru se pot face mai multe observaţii.


1. Dacă paşii 1 şi 2 se execută de îndată ce există BR şi BF, fără nicio altă comandă
suplimentară, pasul 3 intră în funcţiune numai dacă utilizatorul transmite comanda “run”. După
ce a fost dată această comandă, ciclul de mai sus se execută în mod repetat, oprirea putând să
apară în conformitate cu explicaţiile date la comanda “run”.
2. Cei trei paşi de mai sus au denumiri în funcţie de scopul lor. Pasul 1 se numeşte de
potrivire, fiind vorba de găsirea regulilor ale căror tipare se potrivesc pe faptele din BF. Procesul
de potrivire are o serie de aspecte specifice, ce vor fi discutate separat. Pasul 2 se numeşte de
rezolvare a conflictului; denumirea provine din aceea că mulţimea regulilor satisfăcute la un
moment dat (agenda) se mai numeşte şi mulţime conflictuală, deoarece regulile din agendă sunt
în conflict, în ceea ce priveşte obţinerea execuţiei. Rezolvarea conflictului se face în funcţie de
două criterii; primul este cel dat de prioritatea ataşată regulii. Din acest punct de vedere există în

15
CLIPS şi posibilitatea de a aloca regulilor o prioritate de tip dinamic (Meniul Execution,
Options, Salience Evaluation), caz în care pasul de rezolvare a conflictului este mai complicat;
acest aspect nu este prezentat în acest referat. Cel de-al doilea criteriu de rezolvare a
conflictului se referă la o anumită strategie pe care o foloseşte motorul de inferenţe pentru a
ordona regulile în agendă; fără a intra în detalii, există şapte asemenea strategii, care pot fi fixate
din meniul Execution, opţiunea Options, Strategy. Pasul 3 se numeşte de execuţie.
3. Prin repetarea ciclului de mai sus se produce o evoluţie a BF: după fiecare execuţie a
unei reguli BF se poate modifica, deoarece în majoritatea cazurilor acţiunile regulilor sunt şi de
tipul celor care afectează BF (de exemplu, “assert”, “retract”). După efectuarea pasului 3, BF
putând fi modificată, pasul 1 are consistenţă, în sensul că noi reguli pot fi satisfăcute, în timp ce
altele nu mai sunt satisfăcute.

3. Urmărirea agendei; proprietatea de refracţie

În timpul evoluţiei unui SE apare frecvent ca necesară urmărirea agendei şi în acest sens
există în CLIPS comanda:

(agenda)

Rezultatul va fi afişarea conţinutului agendei, adică a regulilor aflate în agendă, în forma:

nr nume-regulă: f - i1, f - i2, ...f - ij, ... , f - in

în care nr indică prioritatea ce a fost atribuită regulii respective, iar f - ij sunt identificatorii
faptelor care au satisfăcut tiparele regulii (aceştia apar în ordinea tiparelor din regulă). Afişarea
agendei se poate obţine şi activând fereastra corespunzătoare din meniul Window.

Exerciţiu
Scrieţi regula care să fie activată dacă în BF se găsesc faptele (a), (b) şi (c) (activarea să
se producă numai dacă sunt prezente toate cele trei fapte în BF) şi care să introducă în BF, la
execuţie, faptul (d) . Urmăriţi BF şi agenda. Efectuaţi rularea.

CLIPS este dotat cu o caracteristică importantă pentru SE numită refracţie. Se consideră


că această proprietate a fost copiată de la celula nervoasă (după ce un neuron a transmis un
impuls ca urmare a unui stimul, acelaşi stimul nu-l va mai putea excita din nou, pentru o anumită
perioadă de timp). În cazul unui SE refracţia înseamnă că o regulă nu va fi activată de un acelaşi
fapt sau acelaşi grup de fapte în mod repetat. Fără această proprietate un SE ar fi blocat într-o
buclă infinită, chestiune ce se poate ilustra chiar cu regula din exerciţiul precedent, sau cu regula
R dată anterior.

Exerciţiu
Dacă aşa ceva este necesar, cum poate fi depăşită refracţia? Exemplificaţi pe cazul din
exerciţiul anterior (pentru rezolvare urmăriţi şi prima din observaţiile următoare).

Observaţii
1. Ceea ce reţine motorul de inferenţe din punct de vedere de al refracţiei sunt faptele
care au determinat activarea, împreună cu identificatorii acestora din BF. Aceeaşi combinaţie de
identificatori nu va putea face o nouă activare, în schimb în combinaţia respectivă ordinea
contează, astfel că aceleaşi fapte pot determina mai multe activări, considerate în ordini diferite,
evident cu condiţia asigurării potrivirilor necesare. De exemplu, aşa cum vom vedea ulterior,
agenda ar putea arăta la un moment dat de forma:

16
0 R1 f - 1, f - 2
0 R1 f - 2, f - 1

aceasta însemnând că regula R1 este activată de două ori de aceleaşi fapte, cu identificatorii f - 1
şi f - 2. În această situaţie, la comanda (run) regula R1 va fi în principiu executată de două ori,
conform celor două plasări ale ei în agendă.

Exerciţiu
1. Care este condiţia pe care trebuie să o îndeplinească faptele din explicaţia de mai sus,
din punct de vedere al procesului de potrivire?
2. Ţinând seama de răspunsul la întrebarea 1, rezultă că mai pot fi posibile şi alte plasări
ale lui R1 în agendă, tot datorită faptelor f - 1 şi f - 2. Care sunt acestea?
3. În ce condiţii se poate întâmpla ca după prima execuţie a regulii R1 din explicaţia de
mai sus, următoarea sau următoarele execuţii să nu se mai producă?

2. Dacă la un moment dat este necesară depăşirea refracţiei, în legătură cu o anumită


regulă, o posibilitate este şi folosirea comenzii:

(refresh <nume-regulă>)

efectul fiind de replasare în agendă a regulii precizate prin argumentul respectiv, în condiţiile în
care potrivirea pentru acea regulă este satisfăcută, iar neactivarea ei se datorează refracţiei.

Exerciţiu
Verificaţi efectul comenzii "refresh".

4. Iniţializarea în CLIPS

Comanda “reset” este cea care poate fi folosită în CLIPS pentru a obţine un efect de
iniţializare. Ea are forma:

(reset)

şi are următoarele efecte:

• videază BF;
• elimină toate regulile din agendă;
• introduce în BF toate faptele din toate comenzile “deffacts” existente în sistem.

Evident, conform ultimului efect de mai sus, după o comandă ”reset” agenda va fi
recalculată. Comanda “reset” poate fi activată şi din opţiunea corespunzătoare din meniul
Execution.
Datorită efectelor sale, comanda “reset” este cea care se foloseşte de obicei pentru a lansa
în lucru un SE/un program scris în CLIPS. În acest sens mai există un efect, obţinut tot în urma
execuţiei acestei comenzi şi care poate fi util pentru rezolvarea “pornirii” unui SE. Astfel,
interpretorul CLIPS introduce în mod automat următoarea comandă:

(deffacts initial-fact (initial-fact) )

adică introduce de la sine o comandă “deffacts” în interiorul căreia se află un singur fapt, cu un
singur câmp: initial-fact. Rezultă că după efectuarea comenzii “reset”, vom găsi în BF, în mod
automat, faptul (initial-fact), care va fi plasat la identificatorul f – 0 (evident, conform celor

17
spuse anterior, vor exista în BF după ”reset” şi faptele din toate comenzile ”deffacts” introduse
de programator). Astfel, chiar dacă utilizatorul nu a introdus în sistem nicio comandă “deffacts”,
după “reset” BF va conţine un fapt; este de menţionat că (initial-fact) apare în BF şi după
comanda ”clear”, cea care va prezentată în continuare. Rolul lui “initial-fact” este de crea o
posibilitate de începere a unui program scris în CLIPS. În acest sens, este de observat că rularea
în CLIPS nu se produce dacă nu există reguli plasate în agendă, iar dacă BF nu conţine fapte,
regulile având tipare în partea de condiţie nu pot fi activate. Totuşi, dacă în BR există reguli cu
partea de condiţie vidă (zero tipare), motorul de inferenţe le consideră activate indiferent de
faptele existente în BF, adică asemenea reguli vor fi activate şi dacă în BF nu există niciun fapt.
De asemenea, programatorul poate concepe reguli care să aibă în partea de condiţie doar tiparul
(initial-fact), iar aceste reguli vor fi activate de faptul implicit ce va exista în BF la
identificatorul f – 0. Regulile de pornire pentru un SE vor avea o parte de acţiune
corespunzătoare, încât ele să efectueze acţiunile de startare pentru SE (de exemplu, primirea
datelor iniţiale de la utilizator).

Exerciţiu
1. Scrieţi o regulă de pornire şi observaţi comportarea ei după comanda “reset”.

5. Comenzi utilitare pentru reguli şi fapte

În afară de comenzile deja descrise (“facts”, “agenda”) există şi alte comenzi care pot
ajuta utilizatorul în construirea şi urmărirea BF şi a BR.
Se poate afla conţinutul BR prin comanda:

(rules)

care va avea ca efect afişarea numelor tuturor regulilor prezente în BR. Putem vedea întreg
conţinutul unei reguli prin comanda:

(ppdefrule <nume-regulă>)

singurul argument specificând numele regulii pe care o vrem afişată integral (denumirea este o
prescurtare de la “pretty print defrule”; în CLIPS există mai multe comenzi a căror denumire
începe cu "pp" şi care au o acţiune similară - de tipărire a conţinutului unei constucţii). Efectele
comenzilor “rules” şi “ppdefrule” (ca şi cel al comenzii “refresh”) se pot obţine şi folosind
meniul Browse, opţiunea Defrule Manager.
Comenzi similare există şi pentru “deffacts”. Astfel putem vedea numele tuturor
comenzilor “deffacts” existente prin:

(list-deffacts)

iar conţinutul unui “deffacts” prin:

(ppdeffacts <nume-deffacts>)

şi aceste comenzi fiind accesibile şi din meniul Browse, opţiunea Deffacts Manager.
Comenzile “defrule” şi “deffacts” pot fi şterse prin:

(undefrule <nume-regulă>) şi respectiv (undeffacts <nume-deffacts>)

efectul fiind acela de ştergere a regulii specificate, respectiv a comenzii “deffacts” cu numele
precizat prin argumentul respectiv (ştergerea se poate face şi din meniul Browse). Este de

18
observat că în cazul ştergerii unei comenzi “deffacts” nu se produce ştergerea faptelor din BF, ci
ştergerea definiţiei construcţiei “deffacts” respective. De asemenea, este de observat că
utilizatorul, intrat sub interpretorul CLIPS, poate şterge şi construcţia “deffacts” introdusă
automat de sistem (cea cu numele “initial-fact”); evident utilizatorul va face aşa ceva dacă vrea
să elimine efectul pe care îl are comanda respectivă, adică introducerea lui (initial-fact) în BF
după ”reset”. O comandă de ştergere generală este comanda:

(clear)

care şterge toate informaţiile din sistem: se videază BF, BR, agenda şi sunt şterse toate
comenzile de definire de construcţii (în particular toate comenzile “deffacts”, dar nu şi cea
implicită privind faptul (initial-fact)), adică sistemul devine ca în momentul pornirii (comanda
“clear” este disponibilă şi din meniul Execution).
Evident, definiţiile de construcţii şterse prin comanda “clear” vor putea fi reîncărcate din
fişierele unde sunt păstrate. Astfel, reamintim că definiţiile de reguli, ca şi comenzile “deffacts”,
fiind comenzi de definire de construcţii, pot fi înscrise în fişiere şi apoi încărcate prin comanda
“load”; de asemenea, acestea pot fi salvate în fişiere prin comanda “save” (de observat că o
comandă “save” are un efect de salvare a întregii BR existente în acel moment, ca şi salvarea
tuturor celorlalte comenzi de definire de construcţii, într-un singur fişier; dacă se doreşte o
salvare preferenţială, de exemplu numai pentru anumite reguli, atunci trebuie conceput un
program corespunzător).

6. Comanda de afişare

Una din comenzile care este frecvent folosită în partea de acţiune a regulilor este:

(printout <nume-logic> <<element-de-ieşire>>)

unde <nume-logic> indică destinaţia ieşirii; pentru că iniţial vom folosi această comandă numai
pentru afişarea pe terminal, argumentul nume-logic va fi t (ieşirea se poate face şi la alte canale
de ieşire sau într-un fişier, aşa cum vom arăta ulterior); rezultatul acestei comenzi va fi înscrierea
elementelor de ieşire; acestea pot fi în principiu orice comenzi CLIPS, cu excepţia definiţiilor de
construcţie. Dacă drept element de ieşire se foloseşte apelul unei funcţii sau numele unei
variabile globale, atunci se afişează rezultatul evaluării elementului respectiv. Cele mai folosite
elemente de ieşire în comanda “printout” vor fi constantele, de exemplu pentru afişarea unor
mesaje. În acest sens sunt de reţinut următoarele:

• o constantă de tip şir de caractere este afişată fără ghilimelele de început şi de sfârşit;
• între mai multe elemente afişate nu se introduce în mod automat niciun spaţiu; de aceea
programatorul trebuie să aibă grijă de obţinerea spaţierii, de exemplu prin introducerea unui
element de ieşire de forma “ ” (un spaţiu plasat între ghilimele);
• după execuţia comenzii “printout” prompterul nu trece la o line nouă în mod automat şi de
aceea, aproape întotdeauna, ultimul element de ieşire într-o comandă printout va fi constanta
crlf, care va avea drept efect trecerea prompterului pe o linie nouă.

Exerciţii
1. Verificaţi efectul următoarelor 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)

19
• (printout t (facts) crlf)
2. Scrieţi o regulă care să afişeze un mesaj de pornire a funcţionării unui SE atunci când
în BF se găseşte un anumit fapt de începere a lucrului.

7. Documentarea programelor în CLIPS; comenzi pentru depanare în CLIPS

O primă posibilitate de documentare în ceea ce priveşte regulile şi faptele (numai pentru


cele introduse prin “deffacts”) este aceea de a folosi parametrul opţional (cel sub formă de şir de
caractere) ce apare în comenzile de definire de construcţii respective. O a doua posibilitate este
aceea de a folosi caracterul rezervat ;. Astfel un comentariu începe cu ; şi se încheie cu ¶. Tot ce
apare după ; nu este luat în considerare de interpretor. Există o deosebire între comentariul scris
între ghilimele într-o definiţie de construcţie şi cel care începe cu ; . Aceasta se referă la
comportarea în raport cu comenzile de tip “pretty print” (“ppdefrule”, “ppdefacts”): la afişarea
conţinutului unei construcţii cu o asemenea comandă, comentariul scris între ghilimele apare, în
timp ce acela prevăzut după ; nu.

Exerciţiu
Verificaţi explicaţia de mai sus pe un exemplu, obţinut prin următoarele comenzi (veţi
respecta întocmai scrierea din referat, pe rânduri):

(defrule R1 “Acesta e exemplul meu” => ; el merge grozav (assert (a)) ¶


(assert (b)) ) ¶
(ppdefrule R1) ¶
(reset) ¶
(run) ¶

Concluzia după acest exemplu este aceea că în programele CLIPS vom folosi pentru
documentare mai ales comentariul inclus între ghilimele, deoarece acela introdus prin ; se pierde.

Exerciţiu
Când poate fi util un comentariu care este introdus prin ; ?

În ceea ce priveşte depanarea, o posibilitate este de a urmări BF şi agenda prin comenzile


“facts”, “agenda” sau prin deschiderea ferestrelor respective.
O comandă utilă în depanarea programelor este:

(watch {facts, rules, activations, compilations, statistics, all})

Mai sunt şi alţi câţiva parametri care pot interveni în comanda “watch”, dar care nu se
referă la BF şi BR (urmărirea variabilelor globale, a obiectelor, a funcţiilor). Comanda “watch”
are drept efect urmărirea anumitor elemente ale programului CLIPS în timpul lucrului cu
interpretorul. Dacă parametrul folosit în comandă este “all” atunci vor fi urmărite toate
elementele. Efectul de dezactivare se poate obţine prin comanda:

(unwatch {facts, rules, activations, compilations, statistics, all})

în care dacă parametrul folosit este “all” dezactivarea se face pentru toate elementele, iar dacă se
foloseşte un alt parametru (de exemplu, (unwatch facts) ), atunci dezactivarea se face pentru
elementul respectiv. De observat că, atât la activarea urmăririi cât şi la dezactivarea acesteia,
dacă ne interesează efectul asupra a două elemente, atunci comanda va trebui transmisă de două
ori, cu folosirea parametrilor corespunzători. De altfel, comanda ”watch” cu parametrii ei poate
fi selectată mai uşor din meniul Execution.

20
Dacă se urmăresc 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. Dacă se urmăresc
activările (comanda (watch activations) ), atunci se va afişa un mesaj ori de câte ori o regulă
este introdusă sau scoasă din agendă. Dacă se urmăresc regulile (comanda (watch rules) ),
atunci se afişează un mesaj de fiecare dată când o regulă este executată. Dacă se urmăresc
compilările (comanda (watch compilations) ), atunci se afişează mesaje la încărcarea unor
definiţii de construcţii dintr-un fişier (interpretorul face un fel de compilare la încărcarea
definiţiilor de construcţii). Dacă se urmăresc statisticile (comanda (watch statistics) ), atunci
se afişează mesaje, după rulare, cu privire la numărul de fapte din BF, numărul de reguli din
agendă, numărul de reguli executate şi timpul de rulare.
O altă comandă de depanare este:

(matches <nume-regulă> )

Ea este utilă atunci când în BR există reguli cu multe tipare şi dorim să ştim care tipare au fost
satisfăcute şi care nu la un moment dat. Argumentul va fi numele regulii care vrem să fie
urmărită din punct de vedere al potrivirilor. Comanda “matches” este accesibilă şi din meniul
Browse, opţiunea Defrule Manager. Pentru a ilustra efectul acestei comenzi se va folosi
următorul exemplu:

(defrule Aa (a) (b) (c) => )¶


(assert (b) )¶
(matches Aa)¶
(assert (a) )¶
(matches Aa)¶
(assert (c) )¶
(matches Aa)¶

Mesajele afişate se referă la felul în care se potrivesc tiparele regulii urmărite, în ordinea în care
apar ele în definiţia regulii, cât şi la felul în care sunt potrivite grupurile de tipare luate împreună:
primele două tipare luate împreună, primele trei tipare luate împreună, ş.a.m.d. Această urmărire
a grupurilor de tipare devine importantă atunci când în tiparele regulii se folosesc şi variabile.
Ultimul mesaj afişat la comanda “matches” se referă la activările regulii (plasarea sau nu, a
acesteia în agendă).
Tot pentru depanare este utilă şi comanda:

(set-break <nume-regulă> )

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 înainte de execuţia regulii respective, cu observaţia că
este necesar ca măcar o regulă să fie executată (prin comanda “run”), înainte ca un punct de
oprire să poată opri execuţia. De altfel, în acest fel, un punct de oprire poate fi depăşit prin
repetarea comenzii de rulare. După fiecare oprire, pentru depanare, utilizatorul poate cerceta BF
şi agenda.
Putem lista toate punctele de oprire prin comanda:

(show-breaks)

şi putem îndepărta un punct de oprire, sau pe toate, prin comanda:

(remove-break [ <nume-regulă> ] )

21
Dacă argumentul există atunci se va îndepărta numai punctul de oprire corespunzător regulii
indicate, iar dacă argumentul lipseşte sunt eliminate toate punctele de oprire. Mai menţionăm că
punctele de oprire pot fi ataşate regulilor şi din meniul Browse, opţiunea Defrule Manager.
Pentru a ilustra efectul punctelor de oprire efectuaţi următorul experiment:

1. Încărcaţi dintr-un fişier, sau de la nivel superficial următoarele trei reguli:

(defrule unu => (assert (doi) ) )


(defrule doi (doi) => (assert (trei) ) )
(defrule trei (trei) => )

2. Transmiteţi comenzile:

(set-break unu)¶
(set-break doi)¶
(set-break trei)¶
(run)¶
(run)¶
(run)¶

3. Explicaţi rezultatele obţinute.

După cum s-a mai spus, un efect de oprire după rularea unui anumit număr de reguli se
poate obţine şi prin comanda “run”, dată cu un argument corespunzător; în plus, în meniul
Execution există şi opţiunea Step care are un efect de rulare pas cu pas (este echivalentă lui (run
1), cu observaţia că pasul poate fi şi schimbat la o valoare mai mare ca 1, în opţiunea
Preferences, din acelaşi meniu Execution).

Exerciţii
1. Răspundeţi la următoarele întrebări:
• Cum pot fi introduse regulile în BR?
• Care este deosebirea între BR şi agendă?
• Care este ciclul de lucru al motorului de inferenţe în CLIPS?
• După comanda (run 10) câte execuţii de reguli s-ar putea produce?
• Care sunt situaţiile în care se opreşte rularea în CLIPS?
• Ce înseamnă refracţia în domeniul programării bazate pe reguli?
• Când este activată o regulă care are zero tipare?
• Câte reguli se execută simultan în CLIPS?
• Ce posibilităţi sunt pentru documentarea programelor în CLIPS? Explicaţi diferenţa
între ele.
• Ce posibilităţi pentru depanare oferă CLIPS?

2. Verificaţi funcţionarea programului CLIPS format din următoarea regulă:


(defrule r (a) => (printout t “Ura!” crlf) (refresh r) )
Experimentul se va face creând condiţiile ca regula să fie activată şi efecuând rularea cu
comanda (run 25).

3. Scrieţi programul CLIPS (aceasta înseamnă BF şi BR) care să materializeze


următoarea funcţie binară:

F ( x , y ,z )= x⋅ y⋅ zUx⋅ y⋅ z

22
4. Scrieţi programul CLIPS care să simuleze funcţionarea automatului secvenţial
specificat prin următorul tabel de tranziţie:

x S0 S1 S2 S3
0 S1 S1 S3 S3
1 S2 S0 S2 S0

unde am notat cu x variabila de intrare şi cu Si stările automatului.

5. Agenţii software pot fi clasificaţi în următoarele categorii, în funcţie de proprietăţile


pe care le îndeplinesc:

• Agenţi reactivi sunt cei care reacţionează la schimbările din mediu.


• Agenţi planificatori sunt cei care sunt capabili să determine un plan de rezolvare a unui
scop primit.
• Agenţi de tip hibrid sunt cei care reacţionează atât la schimbările din mediu, cât şi la
scopurile primite, fiind capabili să rezolve ambele tipuri de situaţii.

a) Concepeţi faptele şi regulile CLIPS care să poată determina pentru un agent tipul său, în
funcţie de informaţiile care există despre acesta în BF.

b) Un agent de tip reactiv este indicat pentru a rezolva probleme de monitorizare, un agent
planificator este indicat pentru a rezolva probleme de fabricaţie, iar un agent hibrid poate rezolva
ambele tipuri de probleme. Scrieţi regulile CLIPS care preluând rezultatul de la punctul anterior
să precizeze care sunt tipurile de probleme ce pot fi rezolvate conform tipului agentului pentru
care există informaţii în BF.

23

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