Documente Academic
Documente Profesional
Documente Cultură
Programare
bazat pe reguli
ndrumar de laborator
EDITURA
CONSPRESS
2013
CONSPRESS
B-dul Lacul Tei nr 124, sector 2
cod 020396, Bucureti
Tel: (021) 242 2719 / 300; Fax: (021) 242 0781
Prefa
Lucrarea este un ndrumar de lucrri practice n domeniul Programrii bazate pe reguli.
Aceasta a rezultat n urma orelor de laborator i proiect desfurate la o serie de discipline din
domeniul Inteligenei artificiale, i anume: Sisteme bazate pe cunoatere, Reprezentarea
cunoaterii i raionament, Inteligena artificial, Sisteme de inteligen artificial distribuite.
Acestea au fost i sunt susinute n cadrul Departamentului de Automatic i Informatic
Aplicat, Facultatea de Automatic i Calculatoare de la Universitatea Tehnic Gheorghe
Asachi din Iai. Programarea bazat pe reguli i n particular limbajul CLIPS, cel tratat n
prezentul ndrumar, reprezint un instrument care permite materializarea a diferite metode din
Inteligena artificial. Se explic astfel felul n care aplicaii dezvoltate n CLIPS au fost tratate n
cadrul mai multor obiecte de studiu, att din programul de licen Automatic i Informatic
Aplicat, din domeniul Ingineriei sistemelor, ct i la programe de masterat ce au inclus obiecte
din aria Inteligenei artificiale.
Fr a fi o tratare exhaustiv, lucrarea cuprinde aspectele eseniale pentru nelegerea
programrii bazate pe reguli, n varianta n care motorul de inferene folosit este unul lucrnd
dup cutare nainte (aa numitul mecanism forward chaining). CLIPS este un reprezentant
semnificativ al clasei de limbaje folosind un motor de inferene cu cutare nainte. Acesta are
i avantajul c este un mediu de programare liber, care dup mai bine de 25 de ani de la creare
a ajuns s fie bine documentat i validat n numeroase aplicaii. Lucrarea este util n special
studenilor care au ore de laborator i proiect la disciplinele menionate, dar i n general celor
care vor s nvee sau s-i completeze cunotinele privind programarea bazat pe reguli.
ntrebarea care s-ar putea pune ar fi aceea dac, n condiiile unei adevrate explozii a
tehnicilor i instrumentelor de programare, mai este de actualitate programarea bazat pe
reguli. Principala utilitate a acestei metode i n particular a limbajului CLIPS este aceea
privind realizarea sistemelor expert. Acestea reprezint unul din rezultatele semnificative ale
Inteligenei artificiale, existnd aplicaii cu sisteme expert n domenii diferite (exemple
semnificative se regsesc n industrie, medicin, domeniul financiar). n sprijinul ideii
utilitii programrii bazate pe reguli poate fi considerat eficiena cu care metoda respectiv
poate rezolva anumite tipuri de probleme: cele nestructurate (greu de algoritmizat), cele care
implic o cunoatere de tip logic. Ca un singur exemplu, una din marile companii din
domeniul sistemelor de control a lansat, n urm cu un an, un nou sistem expert dedicat
optimizrii produciei de ciment; este vorba despre un domeniu n care folosirea unei variante
clasice, algoritmice, dac nu este imposibil, este oricum ineficient n comparaie cu soluia
bazat pe reguli.
Volumul conine un numr de nou lucrri, organizate ntr-o succesiune n care se
parcurg mai nti aspectele elementare, privind organizarea bazei de fapte, a celei de reguli,
realizarea mecanismului de potrivire ntr-un program bazat pe reguli i se finalizeaz cu un
aspect de luat n considerare n probleme complexe, n care sunt necesare precauii pentru
pstrarea corectitudinii bazei de cunotine. Fiecare lucrare este nsoit de probleme propuse,
deprinderea programrii bazate pe reguli, ca i a oricrei alte variante de programare,
presupunnd nelegerea unor exemple i rezolvarea de probleme.
Iai, martie 2013
Autorii
Cuprins
Lucrarea nr. 1. Domeniul sistemelor expert. Mediul CLIPS. Baza de fapte n
CLIPS ..........................5
LUCRAREA NR. 1
Domeniul sistemelor expert. Mediul CLIPS. Baza de fapte n CLIPS
1. Introducere n domeniul sistemelor expert
Un sistem expert (SE) este un program sau un sistem de programe care nmagazinnd
cunotine ale unor experi umani poate rezolva probleme complexe dintr-un domeniu de
expertiz. n definiia de mai sus expertul trebuie neles ca fiind o persoan ce are cunotine
deosebite ntr-un anumit domeniu, adic este capabil s fac o expertiz n acel domeniu.
Aceasta nseamn c expertul poate rezolva probleme pe care alii nu le pot rezolva deloc, sau nu
le pot rezolva n mod eficient.
Arhitectura unui SE este prezentat n fig.1. Baza de cunotine conine dou pri care se
refer la cunotine generale din domeniul de expertiz, aflate n baza de reguli i respectiv la
cunotine specifice problemei care se rezolv, aflate n baza de fapte.
Baza de cunotine
Intrri
(fapte)
Ieiri
(expertiz)
Baza de fapte
Baza de reguli
Motor de inferene
SE
Reprezentare
a
cunoaterii
Efectuare
de
raionamente
Partea de condiie se mai numete i parte stng a regulii sau antecedent; partea de
aciune se mai numete i consecin (concluzie) sau parte dreapt a regulii. Baza de fapte
conine fapte, adic afirmaii considerate adevrate la momentul respectiv pentru problema aflat
n lucru. Faptele trebuie s aib aceeai form ca i componentele prilor de condiie ale
regulilor.
Un exemplu principial de regul este:
Dac granulaie-material este mare
i curent-motor-grila1 este 10 A
i mecanism-grila1 este n funciune
atunci grosime-strat-ciment este mare
i crete-viteza motor-grila1
(R)
ce trebuie s fie activate la un moment dat i apoi tot el selecteaz una singur dintre regulile
activate, pe care o pune n execuie. Declanarea unei reguli nseamn punerea n aplicare a prii
de aciune, ceea ce poate avea unul sau mai multe efecte de genul modificrii bazei de cunotine
(de exemplu, primul element din partea de aciune a regulii (R) determin adugarea n baza
de fapte a faptului grosime-strat-ciment este mare), sau transmiterii de informaii spre
exterior - spre operator i/sau spre procesul condus (aa cum este al doilea element din partea de
aciune a regulii (R)). Mecanismul de funcionare astfel explicat se refer la SE folosind un
motor de inferene cu cutare nainte (n limba englez: forward chaining).
Pentru ca SE s nceap lucrul este necesar s primeasc n baza de fapte situaia iniial
valabil pentru problema care urmeaz a fi rezolvat. De asemenea, mai ales n cazul unui SE
care conduce un proces industrial, intrrile n baza de fapte apar i n timpul rulrii, atunci cnd
sunt actualizate unele fapte n conformitate cu schimbrile din proces. Aceste intrri vor proveni
de la sistemul de achiziie de cunotine, subsistem care nu a fost reprezentat n fig. 1, dar care va
exista n cazul unor aplicaii, asigurnd una din posibilitile de actualizare a bazei de cunotine.
Dac un program convenional se limiteaz la a scoate la ieire rezultatele problemei,
aceasta fiind rezolvat dup algoritmul coninut n program, un SE poate furniza la ieire o
expertiz. Aceasta nseamn c SE ia decizii n funcie de problema pe care o rezolv i conduce
rezolvarea de fiecare dat ntr-un mod particular, n funcie de situaia specific a problemei de
rezolvat. n plus, este posibil ca ntr-un sistem bazat pe cunotine, ce conine drept component
i un SE, acesta s fie conectat cu un sistem de generare a explicaiilor; pe baza rezultatelor
furnizate de SE i urmrind ordinea de execuie a regulilor, se explic raionamentele prin care a
fost gsit soluia furnizat. Aceasta este o deosebire important fa de programarea
convenional.
Exist ns i un alt aspect care se constituie ntr-o deosebire esenial a unui program ce
este un SE fa de un program convenional. Este vorba despre separarea ntre cunotinele
domeniului problemei care se rezolv i elementele de control al programului (elementele care
ghideaz rularea programului pe calculator). Aceast separare este net n cazul unui SE, n
conformitate cu cele dou componente ale sale - baza de cunotine i motorul de inferene:
cunotinele din domeniul de expertiz apar numai n baza de cunotine, fie n fapte sau n
reguli;
elementele de control, care determin felul n care se produce rularea, se gsesc numai n
motorul de inferene; motorul de inferene conine un algoritm generic, care este acelai,
indiferent de coninutul bazei de cunotine.
n programarea convenional elementele de cunoatere din domeniul problemei i cele
de control al rulrii programului sunt strns ntreptrunse, neexistnd o separare vizibil. De
exemplu, n principiu, regula (R) s-ar putea scrie ntr-un limbaj de programare clasic sub forma:
If granulaie-material == mare and curent-motor-grila1 == 10A
and mecanism-grila1 == n funciune
then grosime-strat-ciment = mare and crete-viteza-motor-grila1
Deosebirea este aceea c momentul n care se execut instruciunea de mai sus este strict
dependent de locul unde este ea plasat n program; n contrast, ntr-un SE ordinea faptelor n
baza de fapte sau a regulilor n baza de reguli nu are nicio importan; ele devin active pe baza
mecanismului de control din motorul de inferene, care este complet separat de baza de
cunotine. n schimb, n expresia de mai sus, considerat n programarea convenional, sunt
amestecate cunotine de control al rulrii programului (cuvintele cheie if, then, and), cu acelea
din domeniul problemei (granulaie-material = = mare).
Aceast separare a cunotinelor ntr-un SE atrage dup sine i alte deosebiri fa de
programarea convenional:
stocarea cunotinelor domeniului problemei se face n cazul unui SE ntr-o form uor
accesibil modificrilor, dezvoltrilor, actualizrilor; operatorul va aciona numai n baza de
6
(1)
(2)
(3)
Limbajul CLIPS, ca limbaj de IA, nu introduce restricii n ceea ce privete felul n care
este organizat un fapt (numrul cmpurilor, ordinea acestora). Totui, la fel cum n limbajele
convenionale exist metode de organizare eficient a programelor, tot aa i ntr-un program
CLIPS, n ceea ce privete baza de fapte, va fi de preferat o scriere a faptelor dup anumite
tipare. Cum de obicei un fapt reprezint o relaie ntre mai multe elemente, relaie adevrat la
momentul respectiv, este util s se respecte tiparul:
(<nume-relaie> <<<elemente-aflate-n-relaie>>)
(*)
Folosirea unui acelai tipar pentru toate faptele din baza de fapte va determina uurin n
urmrirea i nelegerea bazei de fapte de ctre utilizator i programator, ct i n actualizarea
acesteia. Faptele (1) i (3) de mai sus respect tiparul (*), n timp ce faptul (2) nu respect acest
tipar; el poate fi rescris, conform tiparului (*), ajungndu-se la forma:
(este-tatal-lui Ion Vasile)
(4)
De remarcat numrul diferit de cmpuri din cele dou forme (2) i (4). Forma pe care o
stabilim pentru tiparele faptelor este important i din punctul de vedere al corelaiei care trebuie
creat n programarea bazat pe reguli ntre fapte i reguli, aa cum se va vedea ulterior. innd
seama de aceast relaie este important ca pe prima poziie a faptelor s apar o valoare
cunoscut a priori (o valoare constant), conform mecanismelor de potrivire a faptelor pe reguli
i de efectuare a testelor n CLIPS, aspecte prezentate ulterior.
Concluzia este aceea c programatorul trebuie s stabileasc tipare pe care, att pentru
consecven, ct i pentru conceperea mai uoar a regulilor, le vor urma faptele din baza de
fapte, tipare care trebuie s fie ct mai inteligibile i de ctre beneficiarul SE. Din mai multe
considerente, inclusiv cele privind corelarea faptelor cu regulile, tiparele de forma (*) vor fi cele
preferate.
10
(5)
(6)
Se remarc introducerea unui singur fapt n cazul (5) i a trei fapte n cazul (6). Comanda
assert poate fi folosit nu numai la nivel superficial, ci i n partea de aciune a unei reguli, aa
cum se va explica ulterior. Din punct de vedere al clasificrii ce a fost dat n paragraful 3,
comanda "assert" va fi ncadrat n categoria funciilor; "assert" este numele funciei, argumetele
sunt faptele care sunt delimitate de paranteze, iar efectul evalurii funciei este acela de
modificare a BF.
Faptele sunt prezente n BF mpreun cu un identificator (adres) care ajut la gsirea
acestora. Identificatorul este de forma: f - i, unde i este un contor, incrementat la fiecare
introducere a unui nou fapt n BF. Este de remarcat c, n cazul unor operaii repetate de
introducere i tergere de fapte din BF, aceasta va rmne cu guri, n sensul incrementrii
continue a contorului i, fr a se reveni la poziiile din care au fost terse fapte.
Utilizatorul are mai multe posibiliti de a vedea starea BF la un moment dat. Astfel,
exist comanda:
(facts [<start> [<end> [<maxim>] ] ] )
unde parametrii start, end i maxim sunt ntregi pozitivi. Semnificaia este aceea c aceast
comand poate fi folosit cu 0 pn la 3 argumente. Dac sunt 0 argumente atunci se afieaz
ntreaga BF; dac se folosete numai start atunci se listeaz toate faptele avnd contorul
11
identificatorului mai mare sau egal cu start; dac se folosete i start i end atunci se afieaz
toate faptele al cror contor satisface relaia:
start i end
(**)
Dac apare i maxim mpreun cu start i end, atunci vor fi listate cel mult maxim fapte
(primele), care respect condiia (**).
Alt posibilitate mai simpl de a vedea BF este s se deschid fereastra pentru fapte
(meniul Window, opiunea Facts), n care se va afia continuu starea BF.
Exerciii
1. Introducei de la nivel superficial mai multe fapte n BF.
2. Urmrii faptele introduse prin comanda facts, folosit cu un numr diferit de
argumente, ct i prin deschiderea ferestrei de fapte.
b) Introducerea faptelor prin comanda deffacts
Comanda deffacts este o comand de definire a unei construcii. n CLIPS exist
posibilitatea ca utilizatorul s creeze construcii (reguli, obiecte, grupuri de fapte, variabile
globale, .a.) prin folosirea unor comenzi corespunztoare. Toate comenzile de definire de
construcii au o form sintactic apropiat i vor putea fi folosite la nivel superficial, sau vor
putea fi nscrise ntr-un fiier, cu ajutorul unui editor de texte avut la dispoziie i apoi aduse sub
interpretorul CLIPS, printr-o comand adecvat, de ncrcare a fiierului respectiv.
Comanda deffacts este aceea care permite utilizatorului s defineasc un grup de fapte.
Sintaxa acestei comenzi este:
(deffacts <nume-deffacts> [<comentariu-opional>] <<fapt>>)
nume-deffacts - trebuie s fie un simbol i va fi un identificator al grupului respectiv de
fapte;
comentariu-opional - trebuie s fie un ir de caractere i va fi folosit pentru a documenta
programul, n sensul c utilizatorul poate nota explicaii care s ajute nelegerea programului.
Mai menionm c toate comenzile CLIPS pot fi nscrise pe oricte linii, cu respectarea
condiiei de nchidere corect a tuturor parantezelor.
Exemplu de utilizare:
(deffacts stare-initiala aceasta este starea initiala a problemei
(temperatura intrare-cuptor 1050)
(presiune fluid-lucru 240)
(stare contactor1 buna)
)
n legtur cu comanda deffacts mai trebuie fcute urmtoarele observaii. Faptele
nscrise ntr-o comand deffacts sunt introduse n BF numai dup o comand (reset); asupra
altor efecte ale acestei comenzi vom reveni. Comenzile deffacts pot fi plasate i n fiiere,
create cu ajutorul editoarelor de texte; n mod obinuit, fiierele respective trebuie s aib
extensia: .clp (comenzi "assert" nu pot fi puse ntr-un fiier din care vrem s ncrcm fapte).
Pentru a ncrca sub interpretorul CLIPS coninutul unui asemenea fiier se va folosi comanda:
(load <nume-fiier>)
unde argumentul respectiv trebuie s fie de tip ir de caractere sau simbol. El va preciza numele
fiierului pe care l dorim a fi ncrcat; n funcie de plasarea acestui fiier ntr-un anumit
12
LUCRAREA NR. 2
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 construcie are o form similar cu comanda deffacts. Sintaxa
pentru defrule este:
(defrule <nume-regul> [<comentariu-opional>]
<<tipar>> => <<aciune>> )
acesta este
un exemplu
(a 1)
(b 2)
=>
(assert (c 3) )
)
ea va fi activat dac n BF se gsesc faptele (a 1) i (b 2).
O regul activat este una pregtit pentru execuie; la un moment dat, n timpul lucrului
SE, mai multe reguli pot fi activate. Astfel, se definete agenda ca fiind mulimea tuturor
regulilor activate la un moment dat.
14
Observaii
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 aciune, dei
aa ceva nu este util.
3. Ca un caz particular, agenda poate conine i zero reguli, atunci cnd nicio regul din
BR nu este satisfcut de faptele prezente n BF.
Execuia unei reguli nseamn execuia, n ordinea n care apar, a aciunilor din partea
dreapt a regulii. Aciunile sunt reprezentate de comenzi CLIPS de tip funcie. n exemplul de
mai sus, partea de aciune a regulii R conine o singur comand assert, astfel c dup execuia
regulii vom constata c n BF a fost introdus un nou fapt: (c 3). Execuia regulilor n CLIPS nu
se face n mod automat, ci numai dac utilizatorul transmite comanda:
(run
[<limita>])
Argumentul respectiv trebuie s fie un numr ntreg mai mare sau egal cu -1 i el d
numrul maxim de reguli care s fie executate. Dac argumentul limita nu este prevzut sau
are valoarea -1, atunci execuia regulilor va continua pn cnd nu mai exist nicio regul n
agend (dup ce o regul este executat ea este scoas din agend); dac argumentul este
prevzut, atunci execuia va nceta dup cel mult un numr de execuii de reguli egal cu limita.
Comanda run se poate da i din meniul Execution.
Din cele prezentate pn aici rezult c apare o interdependen ntre reguli i BF:
regulile sunt activate sau nu, n funcie de faptele prezente n momentul respectiv n BF. Aceast
interdependen este sub controlul motorului de inferene.
2. Ciclul de lucru al motorului de inferene n CLIPS
n CLIPS motorul de inferene lucreaz ciclic, conform pailor precizai n continuare
(este de menionat c acest ciclu de lucru are un caracter de generalitate pentru felul n care
lucreaz SE folosind mecanismul de cutare nainte):
Pas 1. Determin regulile care au partea de condiie satisfcut, innd seama de starea
BF din momentul respectiv, adic determin agenda.
Pas 2. Ordoneaz regulile din agend i selecteaz regula aflat pe prima poziie n
agend.
Pas 3. Execut aciunea/aciunile din partea dreapt a regulii selectate; apoi se revine la
pasul 1 (oprirea se produce n conformitate cu explicaiile urmtoare).
n legtur cu acest ciclu de lucru se pot face mai multe observaii.
1. Dac paii 1 i 2 se execut de ndat ce exist BR i BF, fr nicio alt comand
suplimentar, pasul 3 intr n funciune numai dac utilizatorul transmite comanda run. Dup
ce a fost dat aceast comand, ciclul de mai sus se execut n mod repetat, oprirea putnd s
apar n conformitate cu explicaiile date la comanda run.
2. Cei trei pai de mai sus au denumiri n funcie de scopul lor. Pasul 1 se numete de
potrivire, fiind vorba de gsirea regulilor ale cror tipare se potrivesc pe faptele din BF. Procesul
de potrivire are o serie de aspecte specifice, ce vor fi discutate separat. Pasul 2 se numete de
rezolvare a conflictului; denumirea provine din aceea c mulimea regulilor satisfcute la un
moment dat (agenda) se mai numete i mulime conflictual, deoarece regulile din agend sunt
n conflict, n ceea ce privete obinerea execuiei. Rezolvarea conflictului se face n funcie de
dou criterii; primul este cel dat de prioritatea ataat regulii. Din acest punct de vedere exist n
15
n care nr indic prioritatea ce a fost atribuit regulii respective, iar f - ij sunt identificatorii
faptelor care au satisfcut tiparele regulii (acetia apar n ordinea tiparelor din regul). Afiarea
agendei se poate obine i activnd fereastra corespunztoare din meniul Window.
Exerciiu
Scriei regula care s fie activat dac n BF se gsesc 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
execuie, faptul (d) . Urmrii BF i agenda. Efectuai rularea.
CLIPS este dotat cu o caracteristic important pentru SE numit refracie. 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, acelai stimul nu-l va mai putea excita din nou, pentru o anumit
perioad de timp). n cazul unui SE refracia nseamn c o regul nu va fi activat de un acelai
fapt sau acelai grup de fapte n mod repetat. Fr aceast proprietate un SE ar fi blocat ntr-o
bucl infinit, chestiune ce se poate ilustra chiar cu regula din exerciiul precedent, sau cu regula
R dat anterior.
Exerciiu
Dac aa ceva este necesar, cum poate fi depit refracia? Exemplificai pe cazul din
exerciiul anterior (pentru rezolvare urmrii i prima din observaiile urmtoare).
Observaii
1. Ceea ce reine motorul de inferene din punct de vedere de al refraciei sunt faptele
care au determinat activarea, mpreun cu identificatorii acestora din BF. Aceeai combinaie de
identificatori nu va putea face o nou activare, n schimb n combinaia respectiv ordinea
conteaz, astfel c aceleai fapte pot determina mai multe activri, considerate n ordini diferite,
evident cu condiia asigurrii potrivirilor necesare. De exemplu, aa cum vom vedea ulterior,
agenda ar putea arta la un moment dat de forma:
16
0
0
R1
R1
f - 1, f - 2
f - 2, f - 1
aceasta nsemnnd c regula R1 este activat de dou ori de aceleai fapte, cu identificatorii f - 1
i f - 2. n aceast situaie, la comanda (run) regula R1 va fi n principiu executat de dou ori,
conform celor dou plasri ale ei n agend.
Exerciiu
1. Care este condiia pe care trebuie s o ndeplineasc faptele din explicaia de mai sus,
din punct de vedere al procesului de potrivire?
2. innd seama de rspunsul la ntrebarea 1, rezult c mai pot fi posibile i alte plasri
ale lui R1 n agend, tot datorit faptelor f - 1 i f - 2. Care sunt acestea?
3. n ce condiii se poate ntmpla ca dup prima execuie a regulii R1 din explicaia de
mai sus, urmtoarea sau urmtoarele execuii s nu se mai produc?
2. Dac la un moment dat este necesar depirea refraciei, n legtur 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 condiiile n
care potrivirea pentru acea regul este satisfcut, iar neactivarea ei se datoreaz refraciei.
Exerciiu
Verificai efectul comenzii "refresh".
4. Iniializarea n CLIPS
Comanda reset este cea care poate fi folosit n CLIPS pentru a obine un efect de
iniializare. Ea are forma:
(reset)
i are urmtoarele 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 opiunea corespunztoare din meniul
Execution.
Datorit efectelor sale, comanda reset este cea care se folosete de obicei pentru a lansa
n lucru un SE/un program scris n CLIPS. n acest sens mai exist un efect, obinut tot n urma
execuiei acestei comenzi i care poate fi util pentru rezolvarea pornirii unui SE. Astfel,
interpretorul CLIPS introduce n mod automat urmtoarea comand:
(deffacts initial-fact (initial-fact) )
adic introduce de la sine o comand deffacts n interiorul creia se afl un singur fapt, cu un
singur cmp: initial-fact. Rezult c dup efectuarea comenzii reset, vom gsi 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 conine un fapt; este de menionat 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 conine fapte,
regulile avnd tipare n partea de condiie nu pot fi activate. Totui, dac n BR exist reguli cu
partea de condiie vid (zero tipare), motorul de inferene 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 condiie 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 aciune
corespunztoare, nct ele s efectueze aciunile de startare pentru SE (de exemplu, primirea
datelor iniiale de la utilizator).
Exerciiu
1. Scriei o regul de pornire i observai 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 urmrirea BF i a BR.
Se poate afla coninutul BR prin comanda:
(rules)
care va avea ca efect afiarea numelor tuturor regulilor prezente n BR. Putem vedea ntreg
coninutul unei reguli prin comanda:
(ppdefrule
<nume-regul>)
singurul argument specificnd numele regulii pe care o vrem afiat integral (denumirea este o
prescurtare de la pretty print defrule; n CLIPS exist mai multe comenzi a cror denumire
ncepe cu "pp" i care au o aciune similar - de tiprire a coninutului unei constucii). Efectele
comenzilor rules i ppdefrule (ca i cel al comenzii refresh) se pot obine i folosind
meniul Browse, opiunea Defrule Manager.
Comenzi similare exist i pentru deffacts. Astfel putem vedea numele tuturor
comenzilor deffacts existente prin:
(list-deffacts)
iar coninutul unui deffacts prin:
(ppdeffacts <nume-deffacts>)
i aceste comenzi fiind accesibile i din meniul Browse, opiunea 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 definiiei construciei deffacts respective. De asemenea, este de observat c
utilizatorul, intrat sub interpretorul CLIPS, poate terge i construcia deffacts introdus
automat de sistem (cea cu numele initial-fact); evident utilizatorul va face aa 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 informaiile din sistem: se videaz BF, BR, agenda i sunt terse toate
comenzile de definire de construcii (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, definiiile de construcii terse prin comanda clear vor putea fi rencrcate din
fiierele unde sunt pstrate. Astfel, reamintim c definiiile de reguli, ca i comenzile deffacts,
fiind comenzi de definire de construcii, pot fi nscrise n fiiere i apoi ncrcate prin comanda
load; de asemenea, acestea pot fi salvate n fiiere 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 construcii, ntr-un singur fiier; dac se dorete o
salvare preferenial, de exemplu numai pentru anumite reguli, atunci trebuie conceput un
program corespunztor).
6. Comanda de afiare
Una din comenzile care este frecvent folosit n partea de aciune a regulilor este:
(printout <nume-logic> <<element-de-ieire>>)
unde <nume-logic> indic destinaia ieirii; pentru c iniial vom folosi aceast comand numai
pentru afiarea pe terminal, argumentul nume-logic va fi t (ieirea se poate face i la alte canale
de ieire sau ntr-un fiier, aa cum vom arta ulterior); rezultatul acestei comenzi va fi nscrierea
elementelor de ieire; acestea pot fi n principiu orice comenzi CLIPS, cu excepia definiiilor de
construcie. Dac drept element de ieire se folosete apelul unei funcii sau numele unei
variabile globale, atunci se afieaz rezultatul evalurii elementului respectiv. Cele mai folosite
elemente de ieire n comanda printout vor fi constantele, de exemplu pentru afiarea unor
mesaje. n acest sens sunt de reinut urmtoarele:
o constant de tip ir de caractere este afiat fr ghilimelele de nceput i de sfrit;
ntre mai multe elemente afiate nu se introduce n mod automat niciun spaiu; de aceea
programatorul trebuie s aib grij de obinerea spaierii, de exemplu prin introducerea unui
element de ieire de forma (un spaiu plasat ntre ghilimele);
dup execuia comenzii printout prompterul nu trece la o line nou n mod automat i de
aceea, aproape ntotdeauna, ultimul element de ieire ntr-o comand printout va fi constanta
crlf, care va avea drept efect trecerea prompterului pe o linie nou.
Exerciii
1. Verificai efectul urmtoarelor 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
Dac se urmresc faptele (s-a dat comanda (watch facts)), atunci utilizatorul va fi
informat, printr-un mesaj, ori de cte ori un fapt este introdus sau scos din BF. Dac se urmresc
activrile (comanda (watch activations) ), atunci se va afia un mesaj ori de cte ori o regul
este introdus sau scoas din agend. Dac se urmresc regulile (comanda (watch rules) ),
atunci se afieaz un mesaj de fiecare dat cnd o regul este executat. Dac se urmresc
compilrile (comanda (watch compilations) ), atunci se afieaz mesaje la ncrcarea unor
definiii de construcii dintr-un fiier (interpretorul face un fel de compilare la ncrcarea
definiiilor de construcii). Dac se urmresc statisticile (comanda (watch statistics) ), atunci
se afieaz mesaje, dup rulare, cu privire la numrul de fapte din BF, numrul de reguli din
agend, numrul de reguli executate i timpul de rulare.
O alt comand de depanare este:
(matches <nume-regul> )
Ea este util atunci cnd n BR exist reguli cu multe tipare i dorim s tim care tipare au fost
satisfcute i care nu la un moment dat. Argumentul va fi numele regulii care vrem s fie
urmrit din punct de vedere al potrivirilor. Comanda matches este accesibil i din meniul
Browse, opiunea Defrule Manager. Pentru a ilustra efectul acestei comenzi se va folosi
urmtorul exemplu:
(defrule Aa (a) (b) (c) => )
(assert (b) )
(matches Aa)
(assert (a) )
(matches Aa)
(assert (c) )
(matches Aa)
Mesajele afiate se refer la felul n care se potrivesc tiparele regulii urmrite, n ordinea n care
apar ele n definiia regulii, ct 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 urmrire
a grupurilor de tipare devine important atunci cnd n tiparele regulii se folosesc i variabile.
Ultimul mesaj afiat la comanda matches se refer la activrile 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 execuia regulii respective, cu observaia c
este necesar ca mcar o regul s fie executat (prin comanda run), nainte ca un punct de
oprire s poat opri execuia. De altfel, n acest fel, un punct de oprire poate fi depit 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 ndeprta un punct de oprire, sau pe toate, prin comanda:
(remove-break [ <nume-regul> ] )
21
Dac argumentul exist atunci se va ndeprta numai punctul de oprire corespunztor regulii
indicate, iar dac argumentul lipsete sunt eliminate toate punctele de oprire. Mai menionm c
punctele de oprire pot fi ataate regulilor i din meniul Browse, opiunea Defrule Manager.
Pentru a ilustra efectul punctelor de oprire efectuai urmtorul experiment:
22
S0
S1
S2
S1
S1
S0
S2
S3
S2
S3
S3
S0
a) Concepei faptele i regulile CLIPS care s poat determina pentru un agent tipul su, n
funcie de informaiile 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 fabricaie, iar un agent hibrid poate rezolva
ambele tipuri de probleme. Scriei regulile CLIPS care prelund rezultatul de la punctul anterior
s precizeze care sunt tipurile de probleme ce pot fi rezolvate conform tipului agentului pentru
care exist informaii n BF.
23
LUCRAREA NR. 3
Procesul de potrivire n CLIPS; variabilele n CLIPS
1. Variabile locale simple; mecanismul de potrivire n cazul folosirii variabilelor
Precum n general n programare, variabilele sunt folosite n programarea bazat pe reguli
pentru a pstra valori; n plus, aici ele vor juca un rol important n procesul de potrivire.
Variabilele n CLIPS se pot clasifica dup mai multe criterii. Astfel, dup scopul lor (modul n
care sunt vizibile i produc efecte) variabilele sunt locale i globale. Dup numrul de cmpuri
care pot fi pstrate/preluate de o variabil acestea sunt simple i multiple. Dup felul n care au
un nume de identificare i pstreaz efectiv valori sau nu au un nume i sunt doar folosite pentru
procesul de potrivire, variabilele pot fi specificate i nespecificate.
O variabil CLIPS local, simpl, specificat este reprezentat sub forma:
?<nume-variabil>
unde nume-variabil trebuie s fie un simbol CLIPS care s nceap cu o liter i ntre ? i
numele variabilei nu trebuie s existe niciun spaiu.
Exemple de variabile CLIPS sunt: ?x, ?tensiunea_in_A, ?A21, ?curent-grila.
nainte ca o variabil s poat fi folosit trebuie s fi primit o valoare; n programarea
bazat pe reguli se spune c variabila a fost legat. De exemplu, la introducerea urmtoarei
definiii, interpretorul va semnala eroare:
(defrule regula-gresita => (printout t ?x crlf) )
Eroarea este aceea c a fost folosit variabila ?x n partea de aciune a regulii, fr ca aceasta s
fi fost legat n prealabil (fr s-i fi atribuit o valoare). Variabilele locale pot fi folosite n partea
dreapt a unei reguli numai dup ce au primit o valoare n partea stng a regulii respective.
Astfel, un exemplu de folosire corect a unei variabile ntr-o regul este urmtorul:
(defrule R1 (este-student ?nume) => (assert (a terminat liceul ?nume) ) )
Dac n BF este introdus faptul (este-student Ion) regula R1 va fi activat i dac se d i
comanda run vom constata c n BF este introdus un nou fapt: (a terminat liceul Ion).
Explicaia este aceea c o variabil folosit n partea de condiie a unei reguli se va lega n
procesul de potrivire la o anumit valoare, n conformitate cu faptele existente n BF, i apoi
variabila poate fi folosit n partea de aciune a regulii, ea pstrnd valoarea la care a fost legat.
Sunt de reinut urmtoarele observaii n legtur cu folosirea variabilelor.
1. O variabil local, simpl prezent ntr-un tipar n partea de condiie a unei reguli va
putea fi potrivit de un singur cmp, indiferent de valoarea acestuia (o variabil simpl nu se
poate lega la dou cmpuri). De exemplu, n regula R1 de mai sus, un fapt de forma (este-student
Ion Ionescu) nu va determina activarea regulii, deoarece variabila simpl ?nume nu se poate
lega la dou cmpuri. n schimb, faptul (este-student -234.45) va determina activarea regulii,
deoarece variabila ?nume se leag la un cmp fr a introduce restricii asupra tipului acestuia
(vom arta ulterior cum se pot introduce asemenea restricii).
2. O variabil local rmne legat numai pe durata de aciune a regulii n care apare; n
acest sens nu va fi creat nicio legtur ntre dou reguli care folosesc aceeai variabil. Astfel,
fie urmtorul exemplu:
24
25
R8
R8
R8
R8
f - 1, f - 2
f - 1, f - 1
f - 2, f - 1
f - 2, f - 2
26
(defrule R10
?adresa <- (a 1)
(b 2)
=>
(retract ?adresa)
(assert (c 3) )
)
Partea de condiie a regulii R10 trebuie neleas n felul urmtor. Regula cere existena n BF a
doua fapte: (a 1) i (b 2). Dac regula este activat, variabila ?adresa va fi legat la contorul
din identificatorul faptului (a 1), iar la execuie, comanda retract va determina tergerea
faptului (a 1) din BF. Este de remarcat c aici programatorului i-a fost necesar numai
cunoaterea coninutului faptelor i nu a locului (adresei) acestora n BF; se ilustreaz astfel una
din caracteristicile limbajelor de inteligen artificial, aceea c programatorii nu trebuie s se
mai preocupe de calculul adreselor. Pentru conciziunea exprimrii vom numi n cele ce urmeaz
contorul din identificatorul unui fapt ca fiind adresa acelui fapt.
Este admis i folosirea variabilelor n tiparul care se folosete pentru atribuirea unei
adrese a unui fapt, dup cum este posibil efectuarea mai multor atribuiri de adrese n partea de
condiie a unei reguli. Iat un exemplu n acest sens:
(defrule R11
?a <- (a ?x)
?b <- (b ?y ?x)
=>
(retract ?a ?b) (printout t ?x ?y crlf)
Exerciiu
Verificai prin ncrcarea regulii de mai sus n BR i a faptelor necesare activrii n BF, n
ce condiii este regula plasat n agend i care sunt efectele execuiei ei. Explicai funcionarea.
Observaii
Se poate formula o concluzie privind forma comenzii retract:
(retract <<<adresa-fapt>>>)
unde adresa-fapt poate fi un ntreg pozitiv, reprezentnd contorul din identificatorul unui fapt
ce trebuie ters, sau o variabil legat la adresa unui fapt ce va fi ters.
Variabilele legate la adrese de fapte nu pot fi folosite pentru adugarea de fapte n BF cu un
coninut similar cu acela al faptului avnd adresa pstrat ntr-o variabil. n schimb,
coninutul unei variabile ce este legat la adresa unui fapt poate fi folosit n partea de aciune
a unei reguli. n acest sens fie urmtoarele dou reguli:
(defrule R12
?a <- (a ?x)
?b <- (b ?y ?x)
=>
(retract ?b) (assert (fapt ?a))
(defrule R13
?ad <- (a ?x)
(fapt ?ad)
=>
(printout t ?x " " ?ad crlf))
27
Exerciiu
ncrcai regulile R12 i R13 n CLIPS i experimentai funcionarea lor.
3. Variabile simple nespecificate
Exist situaii cnd n procesul de potrivire nu ne intereseaz valoarea unui cmp dintr-un
tipar. ntr-un asemenea caz va fi util folosirea variabilelor nespecificate (fr nume). Variabila
simpl nespecificat are forma: ?. Fie urmtorul exemplu. O BF conine informaii cu privire la
studenii unei universiti. Faptele sunt de forma:
(student <nume> <facultatea> <an-de-studii> <grupa> <domiciliul-stabil>)
Pot fi scrise reguli care s determine faptele ce satisfac anumite condiii. De exemplu, regula ce
determin toi studenii ce au domiciliul n Iai este:
(defrule R14
(student ?nume ?facultatea ? ? Iasi)
=>
(printout t ?nume de la faculatea ?facultatea are domiciliul in Iasi crlf) )
Explicaia este urmtoarea. Regula determin toate faptele pentru care cmpul <domiciliulstabil> este simbolul Iasi, urmnd s afieze, la execuie, cmpurile <nume> i <facultatea>,
fr s intereseze valorile cmpurilor <an-de-studii> i <grupa>; de aceea n tiparul regulii s-a
folosit n poziiile care nu intereseaz variabila nespecificat simpl. n concluzie, variabila
nespecificat simpl se va folosi atunci cnd potrivirea dintr-un cmp al unui tipar al unei reguli
nu ne intereseaz i valoarea respectiv nu trebuie folosit n partea de aciune a regulii. n
legtur cu variabila ? mai sunt de fcut observaiile urmtoare.
ntr-un tipar variabila nespecificat poate fi folosit de mai multe ori; de asemenea ea poate fi
folosit de mai multe ori n mai multe tipare; toate aceste situaii nu introduc restricii de
potrivire. De exemplu, n regula de mai sus, folosirea repetat a lui ?, pentru cmpurile 4 i 5,
nu introduce nicio dependen de potrivire ntre aceste cmpuri.
Chiar dac valoarea unui cmp dintr-un tipar nu intereseaz din punct de vedere al procesului
de potrivire, atunci cnd acel cmp este necesar n partea de aciune a regulii, nu se va folosi
variabila nespecificat, ci se va folosi o variabil specificat. Aa s-a procedat n cazul de mai
sus cu cmpurile <nume> i <facultatea>.
Exerciii
1. Precizai care este deosebirea n funcionare ntre urmtoarele dou reguli:
(defrule R15 (persoana ?nume are copii ?x) => )
(defrule R16 (persoana ?nume are copii ? x) => )
2. Continund exemplul de la nceputul acestui paragraf, scriei regula care s afieze toi
studenii de la facultatea de AC, din anul V. Verificai funcionarea introducnd n BF
un grup de fapte potrivite.
4. Variabile multiple specificate i nespecificate
Variabilele folosite pn aici au fost variabile simple (specificate sau nu); aceasta se
refer la aceea c aceste variabile, n procesul de potrivire, in locul unui singur cmp i se pot
lega la un singur cmp.
28
Variabila nespecificat multipl este $?. Ea poate fi folosit pentru potrivirea a zero sau
mai multe cmpuri dintr-un tipar, cmpuri care nu ne intereseaz.
Exemplu
Urmtoarea regul vrem s fie activat ori de cte ori n BF apar fapte de forma:
(lista <nume-lista> <<element>>)
adic s determine toate faptele care reprezint liste n BF, indiferent de numrul de elemente ale
listei respective (n particular lista poate fi i vid). Aceast regul este:
(defrule R17
(lista ?nume $?)
=>
(printout t S-a gasit lista cu numele ?nume crlf)
)
Exerciiu
Introducei regula de mai sus ntr-un fiier, mpreun cu urmtorul grup de fapte:
(deffacts Liste
(lista L1
(lista L2)
(lista L3
(lista L4
(lista L5
(lista L6
(lista L7
(lista L8
(lista L9
3)
1
1
1
3
3
1
1
3 5)
2 3)
3 3 5)
4 2)
4)
3 4 2)
4 3 2)
29
Exerciii
1. Cu referire la acelai exemplu din exerciiul anterior, s se scrie regula care s
gseasc toate listele ce conin elementul 3, indiferent de poziia acestuia n list, i s afieze
elementele aflate n list naintea lui 3 i dup acesta. Verificai funcionarea pe grupul de fapte
Liste folosit n exerciiul anterior i comentai numrul de activri ale regulii.
Observaie
Este de subliniat c faptul (lista L5 1 3 3 5) a determinat dou activri ale regulii
care rezolv exerciiul anterior. Am obinut astfel un exemplu cnd un acelai fapt a determinat
plasarea de dou ori pentru o aceeai regul n agend. Aa ceva s-a ntmplat deoarece a fost
vorba despre dou potriviri diferite.
2. Referitor la acelai exemplu cu liste, scriei regula care s determine toate listele ce
conin elementul 3 pe penultima poziie i care s mai aib cel puin un element n faa lui 3.
Observaii n legtur cu variabilele locale
1. Variabilele discutate pn aici (simple - multiple, specificate - nespecificate) au fost
variabile locale. Acestea au o anumit semnificaie numai n interiorul unei reguli, semnificaia
pierzndu-se n afara acesteia. Astfel, dac de la nivel superficial se d comanda: ?x, se va afia
eroare. Atunci cnd o regul este activat, o variabil local folosit n partea ei de condiie
pstreaz o anumit valoare, obinut prin procesul de potrivire i care se menine pn la
sfritul execuiei regulii.
2. Dei folosirea variabilelor multiple poate fi esenial n anumite cazuri n conducerea
procesului de potrivire, utilizarea lor excesiv conduce la ineficien, deoarece ele determin un
consum important de memorie ca i creterea timpului de rulare. Explicaia este aceea c, de
exemplu, tiparul (a $?x) va fi ncercat pe fapte cu 1, 2, ..., n cmpuri, iar variabila multipl $?x
va trebui s memoreze 0, 1, 2, ... , n cmpuri, n funcie i de faptele existente n BF.
Ca o idee general, o variabil multipl specificat sau nespecificat va fi folosit numai
atunci cnd numrul de cmpuri dintr-un tipar nu se cunoate a priori, iar n cazul cnd acest
numr este cunoscut, se va prefera folosirea repetat a unei variabile simple, chiar dac aceasta
trebuie scris de mai multe ori.
3. O variabil multipl specificat, fie aceasta $?x, introdus n partea de condiie a unei
reguli, poate fi numit n partea de aciune a acelei reguli fr semnul $, adic ?x. Semnul $ are
importan numai n partea stng a regulii, acolo unde se produce procesul de potrivire, iar n
partea dreapt, variabila fiind deja legat, semnul $ nu mai este necesar. Un exemplu n acest
sens este regula:
(defrule R19 (fapt $?a1) => (printout t ?a1 crlf) )
n care, n partea de aciune a regulii variabila a fost numit fr $.
5. Legarea variabilelor n partea de aciune a regulilor
n cele prezentate pn aici variabilele se legau n partea stng a regulilor, prin procesul
de potrivire. Dac este necesar, exist i posibilitatea ca o variabil s se lege n partea de aciune
a regulilor (reamintim c legarea n CLIPS este corespondentul atribuirii din limbajele
convenionale). n acest sens exist urmtoarea comand, care corespunde unei atribuiri ntr-un
limbaj procedural:
(bind <variabil> <expresie>)
30
Drept argument variabil se poate folosi o variabil local, specificat, simpl sau multipl, sau o
variabil global (acestea vor fi prezentate n seciunea urmtoare). Argumentul expresie poate fi
o constant, o funcie, sau o variabil global.
Exerciiu
Introducei urmtoarea regul i comentai funcionarea ei (vei crea condiiile ca regula
s fie activat).
(defrule R20
(a ?x ?y ?z ?t)
=>
(bind ?y as) (bind ?z (* (+ 1 3) 2)) (bind ?t Ion Ion)
(printout t ?x ?y ?z ?t crlf) )
Pentru a lega o variabil multipl la o valoare cu mai multe cmpuri va putea fi folosit o
funcie care s determine drept rezultat o asemenea valoare. Exist mai multe funcii CLIPS
pentru valori multicmp; una dintre acestea este:
(mv-append <<element>>)
Efectul acestei funcii este acela de construire a unei valori multicmp din elementele care sunt
argumente. Aceste elemente pot fi constante, variabile legate simple sau multiple, sau funcii
care s determine drept rezultat o valoare cu zero, unul sau mai multe cmpuri. Pentru a vedea
efectul acestei comenzi efectuai de la nivel superficial:
(mv-append 1 (+ 12 13) asa (mv-append 2 an))
Observaie
Funcia bind poate fi folosit att pentru legarea unei variabile care a fost deja folosit
n partea stng a regulii, ct i pentru legarea unei variabile nou introdus n partea de aciune a
regulii, atunci cnd o asemenea nou variabil este necesar.
Exerciiu
Introducei urmtoarea regul i comentai funcionarea ei (vei crea condiiile ca regula
s fie activat prin comanda assert sugerat, sau printr-un alt fapt corespunztor, introdus n
BF).
(defrule R21
(fapt ?x $?y ?z) =>
(bind $?y (mv-append Rezultatul este))
(bind ?a 12)
(printout t noua variabila este a= ?a crlf ?y (+ ?x ?z ?a) crlf) )
(assert (fapt 2 as 34 6) )
6. Variabile globale CLIPS
Variabilele globale vor pstra valori att timp ct interpretorul este lansat. O variabil
global se noteaz prin: ?*<nume-variabil>*, unde nume-variabil trebuie s fie un simbol
care s respecte aceleai condiii ca la numele variabilelor locale, specificate. Pentru a putea
folosi o variabil global aceasta trebuie n prealabil declarat prin definiia de construcie:
31
(defglobal <<<atribuire-variabil-global>>>)
unde atribuire-variabil-global este de forma:
Exemplu
?*<nume-variabil>* = <expresie>.
va determina listarea numelor i valorilor pentru toate variabilele globale existente n sistem. De
altfel, exist i posibilitatea s crem o fereastr n care s avem afiate toate variabilele globale,
prin activarea opiunii respective (Globals) din meniul Window. n plus, variabilele globale pot fi
urmrite prin comanda:
(watch globals)
situaie n care utilizatorul este anunat prin mesaje asupra schimbrii valorilor variabilelor
globale; aceast opiune se poate activa i din meniul Execution.
Exerciiu
Introducei cteva definiii de variabile globale, urmrii-le i schimbai-le valorile.
6. Comanda reset nu terge variabilele globale. Felul n care acioneaz reset asupra
valorilor variabilelor globale depinde de starea unui bistabil (flag), care poate fi trecut pe
TRUE sau FALSE, prin comanda:
(set-reset-globals {TRUE, FALSE})
Aceast funcie determin drept rezultat vechea valoare a bistabilului. Valoarea implicit a
acestuia (cea cu care se intr dup lansarea interpretorului) este TRUE. Atunci cnd bistabilul
este pe TRUE efectul comenzii reset este de aducere a variabilelor globale pe valorile lor
iniiale, cele din definiia defglobal. Dac bistabilul este pe FALSE atunci comanda reset nu
modific valorile variabilelor globale (acestea rmn la valorile de la ultimele legri). Starea
bistabilului la un moment dat poate fi determinat prin comanda: (get-reset-globals) sau din
meniul Execution activnd opiunea Options i urmrind marcajul lui Reset Global Variables.
De altfel, ajungnd n acea fereastr se poate i schimba starea flag-ului, fr a mai apela la
comanda set-reset-globals. Mai menionm c n CLIPS exist mai multe bistabile care permit
comutarea funcionrii pe varianta convenabil utilizatorului i pentru toate vor exista comenzi
de tipul set i get, respectiv vor putea fi comutate i urmrite din anumite meniuri.
Exerciiu
Urmrii efectul comenzii reset asupra variabilelor globale n cele dou cazuri privind
starea bistabilului de resetare a variabilelor globale.
7. Variabilele globale pot fi eliminate din sistem prin comanda clear, cea care terge
toate informaiile din sistem sau folosind comanda undefglobal avnd ca parametru numele
unei variabile globale, fr semnele distinctive ? i *. De exemplu, pentru variabila global
anterior definit ?*A* putem folosim comanda (undefglobal A). De asemenea, coninutul
definiiei unei variabile globale poate fi vizualizat din meniul Browse, opiunea Defglobal
Manager, de unde se poate obine i tergerea unei variabile globale.
Exerciii
1. Rspundei la urmtoarele ntrebri.
Care este rolul variabilelor n programarea bazat pe reguli?
Care este diferena ntre o variabil local i una global?
Care este diferena ntre o variabil specificat i una nespecificat? Cnd se va folosi
un tip i cnd cellalt ?
Care sunt diferenele ntre urmtoarele dou reguli:
(defrule R24 (a ?x) (b $?y) => (printout t ?x crlf ?y crlf) )
(defrule R25 (a $?x) (b ?y) => (printout t ?x crlf ?y crlf) )
33
34
LUCRAREA NR. 4
Realizarea unui program de planificare a aciunilor n CLIPS; elemente de
interdependen ntre baza de fapte i baza de reguli
1. O metodologie de realizare a unui program n CLIPS
Pentru a obine un program CLIPS, mai ales n cazul rezolvrii unor probleme complexe,
este util s se foloseasc urmtoarea secven de pai:
Pas 1. Se transpune cunoaterea asupra metodei de rezolvare a problemei respective
ntr-un grup de reguli, scrise ntr-o form de tip pseudocod.
Pas 2. Se stabilete forma faptelor (abloanele pentru acestea), pentru acele fapte ce sunt
necesare pentru a descrie starea iniial din problema n lucru, eventual forma altor fapte care
trebuie utilizate n rezolvarea problemei, lund n considerare i forma preliminar a regulilor.
Pas 3. innd seama de forma stabilit a faptelor, de forma regulilor n pseudocod i de
sintaxa limbajului, se scrie forma final a regulilor.
De obicei este necesar ca acest ciclu s se repete de mai multe ori, pn se ajunge la o
variant optim. De asemenea trebuie menionat c ordinea primilor doi pai nu este una strict;
vom avea n vedere interdependena cunoscut ntre fapte i reguli, i vom putea pleca fie de la
forma principial a regulilor (partea de condiie a acestora), fie de la forma faptelor. Aceast
metod va fi utilizat n continuare pe un caz concret, constnd n planificarea aciunilor unui
robot.
2. Planificarea aciunilor unui robot ntr-un mediu format din corpuri cu forme
geometrice simple
D
A
B
C
E
F
podea
35
Parcurgem primul pas al metodei date n seciunea anterioar, scriind regulile necesare n
rezolvarea problemei ntr-o prim form, de tip pseudocod.
1) n situaia n care se cere printr-un scop ca un bloc s fie deasupra altui bloc i att
blocul care se mut (blocul surs) ct i cel destinaie sunt libere, adic se afl n vrful stivelor
din care fac parte, atunci robotul poate face micarea de mutare. Rezolvarea acestei situaii este
concretizat n urmtoarea regul, numit Mutare-direct:
liber
Dac scopul este de a muta blocul ?sursa pe blocul ?destinatie i blocul ?sursa este
i blocul ?destinatie este liber atunci mut blocul ?sursa pe blocul ?destinatie.
36
fapte n BF, n partea de aciune a regulii, n conformitate cu noua situaie a stivelor afectate
de micarea respectiv.
Mai menionm c programul nefiind conectat efectiv cu un robot, comanda micrii este
nlocuit cu mesajul transmis pe terminal, prin partea de aciune a regulii.
O form similar are regula Mutare-pe-podea:
(defrule mutare-pe-podea aceasta regula intra in executie cand un bloc trebuie mutat
pe podea si blocul respectiv este liber
?scop <- (scop muta ?bloc1 pe podea)
(este-bloc ?bloc1)
(pe nimic ?bloc1)
?stiva <- (pe ?bloc1 ?bloc2)
=>
(retract ?scop ?stiva)
(assert (pe ?bloc1 podea) (pe nimic ?bloc2) )
(printout t blocul ?bloc1 este mutat pe podea crlf) )
Prile de condiie i de aciune ale acestei reguli sunt uor de urmrit, explicaiile fiind
similare cu acelea de la regula anterioar, cu observaia c regula Mutare-pe-podea are mai
puine tipare i aciuni, deoarece n ceea ce privete podeaua nu mai sunt necesare verificri
(conform uneia din specificaii, podeaua poate primi oricte blocuri).
Pentru regula Eliberare-surs, plecnd de la forma n pseudocod se ajunge la urmtoarea
form n CLIPS:
(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)
=>
(assert (scop muta ?bloc2 pe podea) ) )
Sunt uor de urmrit prile de condiie i de aciune ale acestei reguli. Este de observat
c destinaia mutrii blocului ?bloc1 nu este necesar n aceast regul i de aceea s-a folosit n
tiparul respectiv variabila simpl nespecificat.
Ca o remarc privind cele patru reguli care rezolv problema, ele pot fi grupate n dou
categorii. Regulile Mutare-direct i Mutare-pe-podea sunt cele care dau planul de lucru pentru
robot, n timp ce regulile Eliberare-surs i Eliberare-distinaie nu transmit comenzi spre robot, ci
doar adaug fapte (scopuri) n BF, crend condiiile celorlalte reguli pentru determinarea soluiei.
Exerciiu
1. S se scrie n CLIPS regula Eliberare-distinaie (se va lucra ntr-un fiier).
2. S se scrie, n acelai fiier, i celelalte trei reguli necesare programului, ca i grupul
de fapte corespunztor strii iniiale (cea din Fig. 1) i s se experimenteze funcionarea
programului.
3. Verificai starea BF dup rularea programului, observai faptul incorect care apare i
modificai programul n aa fel nct s nu mai apar eroarea respectiv.
O a doua variant a programului de planificare a aciunilor robotului se va putea obine
considernd turnurile n care se afl blocurile ca nite structuri de date de tip stiv. n acest sens
este de interes scrierea programului CLIPS care s manevreze asemenea structuri de date.
38
n regula de mai sus faptul (pop) va apare n BF atunci cnd utilizatorul dorete
efectuarea unei extrageri din stiv; evident, am presupus c n BF exist o singur stiv.
Exerciiu
1. Scriei regula pentru cazul n care se cere extragerea dintr-o stiv vid (observai
caracterul disjunct al acestei reguli cu cea scris mai sus, n sensul neactivrii
simultane a celor dou reguli).
2. Rescriei regulile de extragere din stiv n aa fel nct utilizatorul s fie anunat atunci
cnd se extrage ultimul element din stiv.
3. Rescriei regulile de lucru cu o stiv pentru cazul n care n BF se pot afla mai multe
stive.
4. Scriei regulile pentru lucrul cu o structur de date de tip coad.
39
Pe baza elementelor prezentate privind lucrul cu stive putem gsi o nou soluie la
problema de planificare a aciunilor robotului. Astfel fiecare turn de blocuri poate fi modelat
printr-o structur de date de tip stiv, caz n care operaiile de mutare se vor reduce la operaii
asupra structurilor de date respective. n acest fel se simplific i forma faptelor, ajungnd pentru
cazul din Fig. 1 la urmtorul grup de fapte reprezentnd starea iniial:
(deffacts stare-initiala
(stiva A B C)
(stiva D E F)
(scop muta C pe E)
Simplificarea provine din aceea c nu a mai fost necesar s reprezentm explicit elementul care
este n vrful unui turn, el fiind implicit primul din stiva respectiv, i nici elementul aflat pe
podea, acesta fiind ultimul din stiv; de asemenea podeaua nu a mai fost reprezentat explicit. n
plus, am presupus c n stive nu apar dect elemente care sunt blocuri, astfel c nu am mai
introdus fapte speciale care s ateste calitatea unui obiect de a fi bloc.
Regula Mutare-direct devine:
(defrule mutare-directa
?scop <- (scop muta ?bloc1 pe ?bloc2)
?stiva1 <- (stiva ?bloc1 $?rest1)
?stiva2 <- (stiva ?bloc2 $?rest2)
=>
(retract ?scop ?stiva1 ?stiva2)
(assert (stiva $?rest1) (stiva ?bloc1 ?bloc2 $?rest2) )
(printout t blocul ?bloc1 este mutat pe blocul ?bloc2 crlf) )
Exerciiu
Scriei celelalte trei reguli de planificare a aciunilor unui robot n noua variant, aceea a
lucrului cu stive.
4. Elemente de interdependen ntre baza de fapte i baza de reguli
Interpretorul CLIPS posed cteva bistabile care permit utilizatorului s aleag ntre mai
multe variante n funcionare, n funcie de specificul problemei pe care o rezolv (unul din
aceste bistabile a fost deja discutat, cel referitor la variabilele globale). Aceste opiuni se gsesc
n meniul Execution, opiunea Options. Exist dou opiuni cu privire la BF i BR: comportarea
BF n ceea ce privete faptele duplicat i respectiv felul n care regulile sunt sensibile la
momentul introducerii faptelor n BF.
Comportarea BF n ceea ce privete faptele duplicat
Exist un bistabil care determin comportarea BF n ceea ce privete faptele duplicat.
Acesta poate fi modificat prin comanda:
(set-fact-duplication {TRUE, FALSE})
sau din meniul Execution, conform meniunii anterioare (rezultatul acestei comenzi, ca i la toate
comenzile de tip set, este vechea valoare a bistabilului respectiv). Valoarea implicit a
bistabilului este FALSE, situaie n care un fapt, cu un anume coninut, este admis o singur dat
n BF. n acest caz, dac de la nivel superficial sau din partea de aciune a unei reguli se execut
o comand de introducere n BF a unui fapt care deja exist n BF, atunci faptul respectiv nu mai
este nscris n BF, fr ca interpretorul s semnaleze situaia respectiv. n situaia n care
40
bistabilul este pus pe TRUE, un fapt poate fi introdus n BF de ori cte ori, cu consecinele care
pot apare n ceea ce privete procesul de potrivire. Starea bistabilului la un moment dat se poate
vedea din meniul Execution, opiunea Options sau cu comanda:
(get-fact-duplication)
Sensibilitatea regulilor la momentul introducerii faptelor n BF
Exist un bistabil care controleaz aceast sensibilitate. El poate fi modificat prin
comanda:
(set-incremental-reset {TRUE, FALSE})
Valoarea implicit a bistabilului este TRUE, situaie n care regulile vd faptele (n sensul c
sunt activate de ele) indiferent de momentul n care au fost introduse faptele n BF. Dac
bistabilul este pus pe FALSE, atunci regulile nu mai vd, n sensul c nu sunt activate dect de
faptele care au fost introduse n BF dup definiia lor. Starea bistabilului poate fi determinat din
meniul Execution sau prin comanda:
(get-incremental-reset)
Mai menionm c starea acestui bistabil va putea fi modificat numai dac n BR nu exist nicio
regul.
Pentru a verifica influena acestor dou bistabile se va experimenta folosind urmtorul
exemplu, introdus de la nivel superficial (n timpul experimentelor se va urmri i agenda):
(get-fact-duplication)
(get-incremental-reset)
(set-incremental-reset FALSE)
(assert (a))
(assert (a))
(defrule r (a) => (assert (b)) )
(retract 1)
(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)
Se vor explica rezultatele obinute.
Exerciiu
Scriei programul CLIPS care s determine toate permutrile unei mulimi cu trei elemente.
41
LUCRAREA NR. 5
Realizarea testelor n CLIPS
n programele prezentate pn aici, testele care se puteau face n CLIPS, n partea de
condiie a regulilor, erau de urmtoarele dou tipuri:
testarea valorii unui cmp dintr-un tipar, n sensul ca acesta s fie identic cu o valoare
constant; de exemplu, n regula (defrule R1 (a 12) => ) se cere ca faptul care satisface
tiparul regulii s aib primul cmp egal cu constanta a, iar al doilea cmp egal cu constanta 12;
testarea ca valoarea a dou sau mai multe cmpuri din acelai tipar, sau din tipare diferite
din partea de condiie a unei aceleiai reguli s fie egale, prin folosirea repetat a unei aceleiai
variabile specificate; de exemplu, n regula (defrule R2 (a ?x ?x) (b ?x ?x) => ) se cere
ca faptele care satisfac cele dou tipare s aib cmpurile doi i trei egale ntre ele i egale n cele
dou fapte, valoarea respectiv urmnd a se lega la variabila ?x.
n afara
continuare.
<nume>
<facultatea>
<an-de-studii>
<grupa>
<domiciliul-stabil>)
(1)
42
b) n cazul n care trebuie s realizm teste compuse, n care s fie combinate mai multe
operaii logice, poate apare necesitatea folosirii operaiei I. De exemplu, regula de determinare
a studenilor care s nu aib domiciliul nici n Iai i nici n Pacani este:
(defrule R9 (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 observ c n cazul de mai sus operaia & a fost folosit att pentru legarea variabilei ?x la
rezultatul unui test, ct i pentru obinerea conjunciei ntre cele dou negaii.
Operaiile logice asupra cmpurilor tiparelor se pot combina, crend posibilitatea testrii
unor condiii complexe.
Exemplu
S se determine din BF cu informaii asupra studenilor, dac exist dou persoane ce
satisfac urmtoarele condiii:
prima persoan este student la AC n grupa 1401 sau 1402 i nu locuiete n Iai;
a doua persoan este student la AC, n aceeai grup cu prima persoan i locuiete
sau n Bucureti sau n aceeai localitate ca i prima persoan.
Regula ce rezolv problema este:
(defrule R10
(student ?nume1 AC ? ?gr&1401|1402 ?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 c n al doilea tipar s-a verificat i condiia ca a doua persoan s aib un
nume diferit fa de prima persoan, n acest fel mpiedicnd activarea regulii cu cele dou tipare
potrivite pe acelai fapt. De reinut aceast modalitate de a nu permite ca un acelai fapt s
verifice dou tipare dintr-o regul verificarea unui cmp de identificare unic pentru fiecare
fapt, atunci cnd ne intereseaz aa ceva; acest aspect a aprut i ntr-o serie de probleme din
referatele anterioare.
Exerciii
1. Experimentai regula R10 crend o BF cu fapte care s respecte tiparul (1) i n aa fel
nct regula s fie plasat n agend de cteva ori.
2. Dac n BF cu informaiile despre studeni apare un fapt de forma:
(caut-student <grupa> <domiciliul>)
n care n cmpurile doi i trei sunt precizate grupa, respectiv domiciliul dorit, s se scrie
programul care s gseasc n BF studenii care satisfac condiia de domiciliu cerut i nu
satisfac condiia privind grupa, studenii care satisfac condiia de grup cerut i nu satisfac
condiia privind domiciliul, i respectiv studenii care satisfac ambele condiii.
3. S se scrie programul care s determine existena informaiilor despre doi studeni care
s satisfac urmtoarele condiii:
a) primul este din anul III sau IV, nu este de la facultatea de AC i are domiciliul n Iai;
44
b) al doilea este din anul II i este de la aceeai facultate ca i primul student, sau este din
aceeai grup cu primul student, dac acesta (primul student) satisface condiiile de la a)
i n plus este de la facultatea de textile.
2. Predicate n CLIPS
n CLIPS noiunea de predicat are aceeai semnificaie ca n logic: un predicat este o
funcie care are drept rezultat o valoare de adevr: adevrat sau fals. n CLIPS, valoarea fals este
reprezentat de simbolul FALSE, iar valoarea adevrat este reprezentat de orice alt constant,
diferit de FALSE. Atunci cnd interpretorul CLIPS afieaz o valoare de adevr folosete
TRUE pentru adevrat i FALSE pentru fals.
Predicatele pentru operaiile logice I, SAU, NEGAIE sunt n CLIPS:
(and <<<predicat>>>)
(or <<<predicat>>>)
(not <predicat>)
innd seama de felul n care interpreteaz CLIPS valorile de adevr (orice este diferit de
FALSE, este adevrat), rezult c orice funcie CLIPS care ntoarce un rezultat, sau orice
constant CLIPS, poate fi privit i ca predicat. n acest sens, evaluai de la nivel superficial
urmtoarele expresii i explicai rezultatele obinute:
(or 12 logica)
(and -90 FALSE)
(and (facts) (printout t Terminare afisare! crlf))
(not -56)
De obicei, operaiile logice vor fi utilizate mpreun cu o serie de predicate specializate.
Astfel, n efectuarea testelor vor fi utile urmtoarele predicate de testare a tipului: numberp pentru tipul numr, symbolp - pentru tipul simbol, stringp - pentru tipul ir de caractere, integerp
- pentru tipul numr ntreg, floatp pentru tipul numr real, evenp - pentru tipul numr par,
oddp - pentru tipul numr impar. Toate aceste predicate au aceeai sintax, ilustrat pe cazul lui
numberp:
(numberp <argument>)
care va determina rezultatul TRUE dac argumentul are ca valoare un numr i rezultatul
FALSE n caz contrar.
Pentru efectuarea de comparaii sunt utile urmtoarele predicate: eq - testarea egalitii,
neq - testarea ne-egalitii, = - testarea egalitii, <> - testarea inegalitii, >= - mai mare sau
egal, > - mai mare, <= - mai mic egal, < - mai mic. Toate aceste predicate au aceeai sintax,
ilustrat pe exemplul urmtor:
(eq <argument1> <argument2>)
care va determina rezultatul TRUE dac valorile celor dou argumente sunt egale. Predicatele eq
i neq pot fi folosite pentru testarea a dou valori oarecare, n timp ce toate celelalte pot fi
folosite numai pentru cazul n care valorile argumentelor care se testeaz sunt numere. Dac
suntem n situaia de testare a egalitii a dou valori al cror tip nu l cunoatem, va trebui s
folosim predicatul eq; n schimb, atunci cnd suntem siguri c valorile testate sunt numere vom
folosi predicatul =, care determin o execuie mai rapid dect eq.
45
<predicat>)
Se creeaz n acest fel un tipar n partea stng a unei reguli care se va considera satisfcut dac
rezultatul pe care l furnizeaz argumentul predicat este TRUE.
Exemple
1. Fie urmtoarea definiie de regul:
(defrule R11
(a 1)
(b ?x)
(test (> ?x 0))
=>
(printout t ?x crlf))
Regula R11 va fi activat dac n BF exist faptul (a 1) i un alt fapt care s aib drept
prim cmp simbolul b; al doilea cmp din faptul respectiv se leag la variabila ?x. n
conformitate cu tiparul de test, regula este activat numai dac, n plus fa de cele spuse,
valoarea legat la variabila ?x este un numr (predicatul > d eroare dac argumentele sale nu
sunt numere) strict mai mare ca 0.
2. Regula urmtoare este una activat de fapte cu trei cmpuri, n care: primul cmp este
simbolul fapt, al doilea trebuie s fie un ir de caractere, iar al treilea cmp trebuie s fie un
numr impar, mai mare sau egal cu 5 i strict mai mic ca 89:
(defrule R12
(fapt ?x ?y)
(test (and (stringp ?x)
(oddp ?y)
(>= ?y 5)
(< ?y 89)
)
)
=>
(printout t ?x si ?y satisfac restrictiile cerute crlf)
)
Ca observaii importante, este de remarcat felul n care mediul CLIPS nu permite existena
n BF a faptelor care au n primul cmp simbolul test, acesta fiind un simbol rezervat, avnd
unicul scop de a introduce un tipar de test. n plus, ntr-o regul pot exista oricte tipare de test.
Este de remarcat i faptul c n CLIPS primul cmp al unui tipar dintr-o regul trebuie s
fie o constant de tip simbol. Aceasta nseamn c nu putem ncepe un tipar al unei reguli cu o
variabil, asupra creia s putem efectua un test. De exemplu, urmtoarea regul nu este
acceptat de sintaxa CLIPS:
(defrule R13
(?x ?y data)
(test (numberp ?x))
=>
(printout t ?x ?y crlf) )
46
Concluzia este aceea c regulile i faptele trebuie astfel concepute i corelate nct pe
prima poziie n fapte s fie valori fixate n aa fel nct s nu trebuiasc a fi supuse unor teste n
reguli, ci furnizate ca atare; aa cum s-a artat i anterior, o variant des utilizat va fi aceea n
care faptele vor avea pe prima poziie numele relaiei la care acestea se refer, nume care va fi un
simbol folosit ca atare n tiparele din partea stng a regulilor.
Exerciii
1. Scriei regula care s determine faptele din BF care sunt de forma (data <valoare1>
<valoare2>), n care sau cmpurile doi i trei sunt numere ce satisfac condiia c valoare1 este un
multiplu al lui valoare2, sau cmpurile doi i trei sunt dou simboluri egale. Pentru rezolvare va
putea fi utilizat funcia:
(mod <argument1> <argument2>)
care determin restul mpririi ntregi a primului argument la cel de-al doilea argument (evident,
cele dou argumente ale funciei trebuie s fie numere).
2. Scriei regula care s determine perechile de fapte din BF ce sunt ambele de cte trei
cmpuri i satisfac condiiile:
al doilea cmp din primul fapt trebuie s fie un numr i s nu fie egal cu al treilea
cmp din al doilea fapt;
al treilea cmp din primul fapt trebuie s nu fie numr i s fie egal cu al doilea cmp
din al doilea fapt.
3. Operatorul de restricie asupra cmpurilor tiparelor
Acest operator este simbolizat prin : i permite efectuarea de teste direct asupra
cmpurilor tiparelor. Operatorul : trebuie s fie urmat de un predicat CLIPS i efectul su este
ilustrat prin exemplul urmtor. Fie urmtoarea regul:
(defrule R14
(numar ?nr)
(test (> ?nr 100) )
=>
(printout t ?nr satisface restrictia impusa crlf) )
Conform celor precizate n seciunea anterioar, aceast regul va fi activat dac n BF exist un
fapt care are pe prima poziie simbolul numar, iar pe a doua poziie un numr strict mai mare ca
100. Cu ajutorul operatorului de restricie asupra cmpurilor tiparelor, regula poate fi rescris
ntr-o form cu un singur tipar:
(defrule R15
(numar ?nr&:(> ?nr 100) )
=>
(printout t ?nr satisface restrictia impusa crlf)
)
n regula scris n acest fel operatorul & are rolul de a asigura legarea variabilei ?nr la valoarea
celui de-al doilea cmp din faptul ce satisface tiparul regulii (conform seciunii 1 a referatului),
iar prin folosirea operatorului : se cere i verificarea unei condiii asupra valorii variabilei
respective, condiie determinat aici de predicatul >. Deci regula R15 este activat numai dac
47
predicatul care urmeaz dup : determin valoarea adevrat, ceea ce nseamn c regula R15 este
echivalent cu regula R14. Despre succesiunea &: se spune c are nelesul lui astfel nct.
Observaii
1. Operatorul : trebuie s fie ntotdeauna urmat de un predicat, adic de o funcie avnd
drept rezultat o valoare de adevr.
2. Din punct de vedere al eficienei (timp de execuie i memorie ocupat), regula R15 este
mai eficient dect R14; ea are un singur tipar, n comparaie cu prima variant, care are dou
tipare - cel obinuit i cel de test. Deci, pentru eficien, vor fi de preferat testele efectuate direct
asupra cmpurilor tiparelor, fa de cele efectuate ntr-un tipar suplimentar de test.
3. Una din utilizrile obinuite pentru operatorul : este aceea a verificrii corectitudinii
datelor de intrare. n CLIPS datele de intrare sunt sub form de fapte i verificarea va nsemna
efectuarea unor teste asupra cmpurilor din fapte. Un exemplu ilustrativ este urmtorul.
Exemplu
S se scrie o regul care s fie activat de fapte cu trei cmpuri. Primul cmp trebuie s fie
simbolul data, al doilea cmp trebuie s fie un numr ntreg, iar al treilea cmp trebuie s fie un
ir de caractere sau un simbol. Vom da mai multe variante ale acestei reguli.
(defrule R16
(data ?n&:(integerp ?n) ?x&:(stringp ?x) |: (symbolp ?x))
=>
(printout t data ?n este ?x crlf) )
n aceast variant am realizat operaia SAU ntre cele dou condiii privind tipul admisibil
pentru ultimul cmp cu ajutorul operatorului | . Deoarece n cazul regulii de mai sus acest
operator nu este urmat de o constant (ca n utilizrile din seciunea 1, de exemplu regula R4), el
a fost succedat de operatorul : care poate fi urmat de un predicat.
(defrule R17
(data ?n&:(integerp ?n) ?x&:(or (stringp ?x) (symbolp ?x)) )
=>
(printout t data ?n este ?x crlf) )
Aici operaia SAU a fost realizat cu predicatul or.
(defrule R18
(data ?n&:(integerp ?n) ?x&:(not (numberp ?x) ) )
=>
(printout t data ?n este ?x crlf) )
Aici am inut seama de faptul c exist numai trei tipuri de constante (date primitive n CLIPS):
simboluri, iruri de caractere i numere. n consecin, se poate rescrie condiia ca un cmp s fie
de tip ir de caractere sau simbol sub forma condiiei ca acel cmp s nu fie numr.
(defrule R19
(data ?n&:(integerp ?n) ?x&~: (numberp ?x) )
=>
(printout t data ?n este ?x crlf) )
48
?n ?x )
(and (integerp ?n)
(or (stringp ?x) (symbolp ?x) )
)
)
=>
(printout t data ?n este ?x crlf)
Aceast ultim variant se bazeaz pe folosirea unui tipar de test, n care se verific toate
condiiile pe care trebuie s le ndeplineasc valorile variabilelor ?n i ?x. Ar mai putea fi scris
o variant, de acelai fel cu ultima, n care n tiparul de test, n loc de predicatul or s apar
(not (numberp ?x)).
Din punct de vedere al eficienei variantele R16 R19 sunt echivalente i mai bune dect
R20, care are un tipar n plus, cel de test.
Exerciiu
Rezolvai cele dou exerciii de la sfritul seciunii 2, rescriind regulile respective n aa
fel nct acestea s nu mai foloseasc tipare de test.
4. Relaia = n CLIPS
Exist trei utilizri distincte ale lui = n CLIPS, dup cum urmeaz.
a) Se poate utiliza = n partea de aciune a unei reguli, n interiorul unei comenzi assert,
avnd rolul unui operator de atribuire. Se va folosi = n faa unei expresii, determinnd atribuirea
cmpului respectiv din faptul care se introduce prin assert, cu valoarea la care se evalueaz
expresia n faa creia se afl =. n fapt, ncepnd cu CLIPS versiunea 6 operatorul = se poate
omite n partea de aciune a unei reguli, astfel c att regula R21 ct i R22 date mai jos sunt
corecte i produc acelai rezultat.
Exemplu
(defrule R21
(fapt1 ?n1&:(numberp ?n1))
(fapt2 ?n2&:(numberp ?n2))
=>
(assert (fapt-suma = (+ ?n1 ?n2)) )
(defrule R22
(fapt1 ?n1&:(numberp ?n1))
(fapt2 ?n2&:(numberp ?n2))
=>
(assert (fapt-suma (+ ?n1 ?n2)) )
Conform prii de aciune, regulile R21 i R22 determin introducerea n BF a unui fapt avnd pe
prima poziie simbolul fapt-suma, iar pe a doua poziie numrul rezultat din sumarea
valorilor la care s-au legat variabilele ?n1 i ?n2 n procesul de potrivire.
49
b) Se poate utiliza = n partea de condiie a unei reguli, n interiorul unui tipar n faa unei
expresii, expresie prin a crei evaluare trebuie s se obin o constant. n acest fel, cerina de
potrivire este ca n faptul care va satisface tiparul, pe poziia respectiv s fie constanta rezultat
prin evaluarea expresiei n fa creia se afl =.
Exemplu
(defrule R23
(a ?x
=(+ ?x 10) )
(b =(* ?x 5))
=>
(printout t ?x Satisface restriciile cerute crlf))
Aceast regul va fi activat dac n BF se gsete o pereche de fapte care s satisfac
urmtoarele condiii: primul fapt trebuie s aib 3 cmpuri - primul trebuie s fie a, al doilea
cmp poate fi orice numr, iar al treilea cmp trebuie s fie un numr cu 10 mai mare dect cel
aflat pe poziia a doua; al doilea fapt trebuie s aib pe prima poziie b, iar pe poziia a doua
trebuie s fie un numr de 5 ori mai mare dect cmpul doi din primul fapt (de 5 ori valoarea
variabilei ?x). De exemplu, perechea de fapte (a 2 12) (b 10) va determina activarea regulii
R23.
Exerciiu
Experimentai funcionarea regulii R23, introducnd n BF faptele:
(a 2 12) (b 10) (a abc 3).
Explicaia comportrii obinute este urmtoarea. Atunci cnd n BF
faptul (a abc 3) interpretorul CLIPS va ncerca potrivirea faptului pe primul
R23 i va semnala eroare, deoarece funcia + apelat n determinarea restriciei
trei nu va putea aduna simbolul abc. De aceea, este de recomandat ca n locul
folosim regula R24:
se introduce
tipar al regulii
pentru cmpul
regulii R23 s
(defrule R24
(a ?x&:(numberp ?x) =(+ ?x 10) )
(b =(* ?x 5))
=>
(printout t ?x Satisface restriciile cerute crlf))
Observaii
1. Operatorul = se poate folosi mpreun cu operatorii logici n crearea condiiilor de
potrivire n partea stng a regulilor. Un exemplu este urmtorul:
(defrule R25
(a ?x ~=(/ ?x 10))
(b ?y&=(+ 5 ?x)|=(- 12 ?x))
=>
(b ?x)
=>
)
n care variabila ?x folosit n expresia de sumare din primul tipar nu este legat (interpretorul va
semnala eroare). Dac se inverseaz ordinea tiparelor regula devine corect:
(defrule R27
(b ?x)
(a =(+ ?x 3))
=> )
Exerciiu
Precizai o pereche de fapte care activeaz regula de mai sus.
c) Cea de-a treia utilizare a lui = este aceea deja precizat n seciunea 2, de predicat de
testare a egalitii a dou valori numerice; aceast utilizare este ilustrat n exemplul urmtor.
(defrule R28
(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)
n care deosebirea fa de varianta anterioar este aceea c operaia SAU a fost realizat cu
predicatul or n locul operatorului |.
(defrule R31
(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 aceast variant = s-a folosit n sensul de la punctul b), n faa unei expresii, mpreun cu
operatorul &, care asigur legarea variabilei ?y i cu operatorul | pentru realizarea operaiei SAU.
Observaii n legtur cu realizarea testelor n interiorul tiparelor
Pe baza celor prezentate pn aici se pot formula urmtoarele observaii.
1. Dei tiparele de test sunt mai uor de scris, din punct de vedere al eficienei va fi bine s
efectum testele n interiorul tiparelor, fr a aduga tiparul suplimentar de test (de exemplu,
regula R29 este mai eficient dect R28).
2. Dup operatorul de negare ~ poate s urmeze o constant (simbol, ir de caractere sau
numr). n acest caz semnificaia este aceea c se cere o potrivire care s fie diferit de cmpul
care urmeaz dup operatorul de negare, ca de exemplu n regula R3. Dup ~ poate s urmeze i
o variabil, care trebuie s fie deja legat la momentul respectiv, semnificaia fiind aceea c se
cere o potrivire diferit de valoarea variabilei. Un exemplu n acest sens, este regula R8, n care
se cere ca acel cmp care se va lega la ?y s fie diferit de valoarea variabilei ?x, ce este deja
legat, din potrivirea pentru primul tipar al regulii R8. De asemenea, dup ~ poate s urmeze :,
ca n regula R19, sau =, ca n regula R25. De subliniat c operatorul de negare ~ realizeaz
numai negarea unui singur operand (urmtorul operand), adic ~ nu poate nega o expresie logic
de tip compus. Un exemplu n acest sens este urmtorul.
(defrule R32
(data ?x&~:(stringp ?x) |: (eq ?x abc) )
=> (printout t Data ?x satisface restrictiile crlf)
Regula R32 este activat de un fapt care are pe prima poziie simbolul data, iar pe a doua poziie
trebuie s nu fie un ir de caractere, sau s fie irul de caractere abc. Dac dorim scrierea unei
reguli care s fie activat de un fapt ce are ca prim cmp simbolul data, iar al doilea cmp s nu
fie de tip ir de caractere i nici s nu fie egal cu simbolul abc, atunci regula este:
(defrule R33
(data ?x&:(not (or (stringp ?x) (eq ?x abc) )) )
=>
(printout t Data ?x satisface restrictiile. crlf)
Exerciiu
Dac n regula de mai sus, condiia or devine and se ajunge la regula:
(defrule R34
(data ?x&:(not (and (stringp ?x) (eq ?x abc) )) )
=> (printout t Data ?x satisface restrictiile crlf)
)
52
Explicai cnd este activat aceast regul i respectiv cnd este activat regula:
(defrule R35
(data ?x&:(not (and (stringp ?x) (eq ?x abc) )) )
=> (printout t Data ?x satisface restrictiile crlf)
Care sunt formele echivalente, mai simple, pentru regulile R34 i R35 ?
3. Dup operatorii | i & trebuie s urmeze o constant, o variabil, :, = , sau ~ (vezi
regulile scrise n seciunile anterioare).
4. Variabilele care se folosesc n condiii compuse n tiparele regulilor trebuie manevrate
cu atenie, respectnd urmtoarele condiii:
dac variabila este pe prima poziie a condiiei, atunci va fi conectat de restul condiiei
prin operatorul de legare a variabilelor & (ca variabila ?x n regula R33), sau prin operatorul |,
caz n care variabila trebuie s fie deja legat (un exemplu n acest sens este tiparul al doilea din
regula R10; acesta este: (student ?nume2&~?nume1 AC ? ?gr ?dom | Bucuresti) i aici
variabila ?dom este conectat cu operatorul |, ea fiind deja legat din potrivirea pentru primul
tipar al regulii R10).
dac variabila nu apare pe prima poziie a condiiei, atunci ea trebuie s fie deja legat
(aa cum este, de exemplu, variabila ?nume1 n acelai tipar de mai sus al regulii R10).
Exerciiu
ntr-o BF se gsesc informaii cu privire la dimensiunile unor dreptunghiuri, n fapte de
forma: (dreptunghi <lungime> <latime>). Scriei programul CLIPS care s determine suma
ariilor dreptunghiurilor care au lungimea i laimea mai mari dect 5, pentru care avem
informaii n BF, valoarea respectiv urmnd a fi pstrat ntr-un fapt de forma: (suma-ariilor
<valoare>).
5. Operaiile logice ntre tiparele unei reguli
Pe lng operaiile logice ntre cmpurile tiparelor, prezentate pn aici, CLIPS admite i
efectuarea de operaii logice ntre tiparele unei reguli. Aa cum se tie, n mod implicit ntre
tiparele unei reguli se execut operaia I, regula fiind activat numai atunci cnd toate tiparele
ei sunt verificate de fapte din BF. n plus, CLIPS permite i folosirea unor operaii logice
explicite ntre tiparele unei reguli.
Operaia SAU ntre tiparele unei reguli
Plecm de la urmtorul exemplu; presupunem c n BR exist regulile:
(defrule R36
(alarma apa)
=> (printout t Deconecteaza electricitatea crlf) )
(defrule R37
(alarma incendiu)
=> (printout t Deconecteaza electricitatea crlf)
(defrule R38
(alarma explozie)
=> (printout t Deconecteaza electricitatea crlf)
53
Se observ cum cele trei reguli au aceeai parte de aciune. n locul scrierii acestor reguli,
se poate folosi una singur avnd operaia SAU ntre tipare:
(defrule R39
(or (alarma apa) (alarma incendiu) (alarma explozie) )
=> (printout t Deconecteaza electricitatea crlf) )
Observaii
1. Din acest exemplu, rezult sintaxa operaiei SAU ntre tiparele unei reguli:
(or
<<<tipar>>>)
unde tipar poate fi un tipar simplu, sau unul compus prin folosirea operaiilor logice ntre tipare;
de asemenea, sub operaia OR se poate i prelua adresa unui fapt ce satisface un tipar, ca ntr-un
exemplu care va urma (vezi regula R42).
2. Regula R39 trebuie neleas n sensul existenei a trei reguli distincte n BR. Astfel,
dac n BF exist concomitent trei fapte care s satisfac tiparele de sub condiia OR, regula R39
va fi activat de trei ori, cte o dat pentru fiecare fapt.
Exerciiu
Experimentai aspectul menionat n observaia de mai sus, introducnd regula R39 n BR
i punnd n BF cele trei fapte care s satisfac tiparele de sub condiia SAU.
3. ntr-o regul, n afara operaiei SAU, pot fi incluse i alte tipare, legtura fiind asigurat
implicit de operaia I, ca n urmtorul exemplu.
(defrule R40
(tensiune on)
(or (alarma apa) (alarma incendiu) (alarma explozie) )
=> (printout t Deconecteaza electricitatea crlf)
)
Din nou trebuie neles c aceast regul este echivalent cu trei reguli distincte.
Exerciiu
Precizai care sunt cele trei reguli echivalente cu R40.
4. Activarea i apoi execuia succesiv a unei reguli ce conine o operaie OR ntre tipare,
de mai multe ori (datorit satisfacerii mai multor tipare de sub OR) poate fi suprtoare
(nedorit). Acest inconvenient poate fi eliminat, ca n exemplul urmtor.
(defrule R41
?x <- (tensiune on)
(or (alarma apa) (alarma incendiu) (alarma
=>
(retract ?x)
(assert (tensiune off))
(printout t Deconecteaza electricitatea crlf) )
explozie) )
n acest caz regula va fi executat doar o dat, chiar dac n BF exist faptele care s
satisfac toate cele trei tipare de sub OR, deoarece tergerea faptului (tensiune on) n partea de
aciune a regulii R41 determin ca dup prima execuie regula s nu mai fie satisfcut.
54
Dac se pune problema s rescriem regula R41 n aa fel nct, n partea de aciune ea s
determine i tergerea din BF a faptului care a determinat satisfacerea condiiei OR, varianta
corect este:
(defrule R42
?x <- (tensiune on)
(or
?motiv <- (alarma apa)
?motiv <- (alarma incendiu)
?motiv <- (alarma explozie) )
=>
(retract ?x ?motiv)
(assert (tensiune off))
(printout t Deconecteaza electricitatea crlf) )
Se remarc felul n care pentru adresele faptelor care satisfac tiparele de sub condiia OR sa folosit o variabil unic: ?motiv. La prima vedere aceasta poate prea incorect, dar trebuie s
inem seama c regula de mai sus este echivalenta a trei reguli distincte. Dac s-ar fi folosit trei
variabile diferite nu s-ar fi putut scrie n mod corect aciunea retract, adic varianta urmtoare
este greit:
(defrule R43
?x <- (tensiune on)
(or
?motiv1 <- (alarma apa)
?motiv2 <- (alarma incendiu)
?motiv3 <- (alarma explozie) )
=>
(retract ?x ?motiv1 ?motiv2 ?motiv3)
(assert (tensiune off))
(printout t Deconecteaza electricitatea crlf) )
Eroarea este aceea c dac, de exemplu, regula este activat de faptele (tensiune on) i
(alarma apa), n partea de aciune a regulii dou din cele trei variabile motiv nu vor fi legate
(variabilele ?motiv2 i ?motiv3 nu sunt legate).
Operaia I ntre tiparele unei reguli
Datorit existenei implicite a operaiei I ntre tipare, aceast condiie nu apare ca
necesar dect pentru materializarea unor expresii logice complexe ntre tipare, ca n exemplul
urmtor.
(defrule R44
?x <- (tensiune on)
(or
(alarma apa)
(and
(alarma foc)
(incendiu tip_C)
(alarma explozie) )
=>
(retract ?x)
(assert (tensiune off))
55
=> )
?y)
?z)
?x ?x
(defrule R51
(not (triplet
(pereche ?x
(pereche ?y
=>)
?x ?x
?y)
?z)
?z))
?z))
(pereche 3 4)
(pereche 4 5)
(triplet 4 4 6)
Vom constata c regula R50 este activat, iar R51 nu. Explicaia este urmtoarea. Pentru regula
R50 faptul de la identificatorul f - 0 satisface primul tipar, cu legarea variabilei ?x la valoarea 3
i a variabilei ?y la valoarea 4. Atunci, faptul de la identificatorul f - 1 satisface al doilea tipar, cu
legarea variabilei ?z la valaorea 5. Cu aceast legare a variabilelor, cum n BF nu exist faptul
(triplet 3 3 5) i al treilea tipar al lui R50 (cel de tip not) este satisfcut i regula este
activat. n schimb, regula R51 nu este activat deoarece faptul de la identificatorul f - 2
determin nesatisfacerea primului tipar al acestei reguli (acesta cere ca n BF s nu existe un fapt
de forma triplet n care cmpurile doi i trei s fie egale). O concluzie care se desprinde din
acest exemplu este i aceea c tiparele unei reguli, n procesul de potrivire, sunt considerate n
ordinea n care apar n partea stng a regulii.
2. Atunci cnd o condiie not este satisfcut, nu se produce o legare a variabilelor de
sub condiia not. De exemplu, fie urmtoarea regul:
(defrule R52
(not (data ?x))
=>
(printout t ?x crlf)
)
57
Interpretorul CLIPS va semnala eroare la introducerea acestei reguli deoarece variabila ?x, fiind
sub tiparul cruia i se aplic operaia de negaie, rmne nelegat.
Exerciiu
Precizai care dintre urmtoarele reguli este corect i care nu. Explicai de ce.
(defrule
(defrule
(defrule
(defrule
R53
R54
R55
R56
(not
(not
(not
(not
(fapt
(fapt
(fapt
(fapt
3. Condiia not poate fi folosit i pentru negarea unui tipar compus. De exemplu, regula
urmtoare este corect:
(defrule R57
(not (or (a) (b) ) )
=> )
Exerciii
1. Explicai cnd se activeaz regula R57
2. Explicai cnd se activeaz regula R58:
(defrule R58
(not (and (a
=>
(assert (c) )
)
?x) (b
?x) ) )
Trebuie neles c atunci cnd o condiie NOT este folosit (o operaie de negaie asupra
unui tipar), motorul de inferene va cerceta ntreg coninutul BF; din acest punct de vedere putem
asemna o condiie NOT cu o bucl while sau for din programarea procedural. Pentru a
nelege funcionarea condiiei NOT sunt ilustrative i urmtoarele dou reguli:
(defrule R59
(data S1 100)
(not (tip ?v&:(< ?v 0)) )
=>
(printout t Faptul data este prezent si niciun fapt tip cu o valoare negativa nu
este prezent crlf)
)
(defrule R60
(data S1 100)
(tip ?v&:(not (< ?v 0) ))
=>
(printout t Faptul data este prezent si cel putin un fapt tip cu o valoare pozitiva
este prezent crlf)
)
Considerm urmtoarele situaii distincte privind coninutul BF:
58
BF1:
f-1 (data S1 100)
f-2 (tip 12)
f-3 (tip 13)
BF2:
f-1 (data S1 100)
BF3:
f-1
f-2
f-3
f-4
(data
(tip
(tip
(tip
S1 100)
12)
13)
-10)
BF4:
f-1 (data S1 100)
f-2 (tip -12)
Felul n care se activeaz regulile R59 i R60 n cele patru cazuri este urmtorul. Pentru
BF1 ambele reguli sunt activate regula R59 o dat, iar R60 de dou ori, cte o dat pentru
faptele de la adresele f-2 i f-3 potrivite pe al doilea tipar al regulii. Dac suntem n cazul BF2,
atunci numai regula R59 este activat; R60 nu este activat neexistnd niciun fapt care s
satisfac al doilea tipar al regulii. n cazul situaiei date de BF3 numai R60 este activat, de dou
ori, corespunztor existenei faptelor de la adresele f-2 i f-3; n acest caz regula R59 nu este
activat datorit existenei faptului de la adresa f-4, fapt care determin nesatisfacerea condiiei
NOT. n cazul lui BF4 niciuna din cele dou reguli nu este activat. Se poate concluziona asupra
condiiilor logice pe care le verific aceste dou reguli privind faptele care ncep cu simbolul tip:
regula R59 este activat numai atunci cnd niciun fapt de dou cmpuri, cu primul cmp fiind
simbolul tip i al doilea cmp fiind un numr negativ nu este prezent n BF, n timp ce regula
R60 este activat atunci cnd cel puin un fapt cu primul cmp simbolul tip i al doilea cmp o
valoare pozitiv exist n BF.
Operaiile exists i forall asupra tiparelor
Aceti operatori determin pentru limbajul CLIPS posibiliti de testare apropiate de cele
pe care n logic le putem obine cu ajutorul cuantificatorilor (exist, oricare).
Condiia de existen a unui tipar sau a unor tipare satisfcute cel puin o dat de faptele
din BF se obine prin utilizarea operaiei exists asupra unui tipar sau unor tipare. Altfel spus, se
testeaz dac exist cel puin un set de fapte n BF care satisfac condiia cerut de tiparele puse
n interiorul condiiei exists. Sintaxa operaiei este:
(exists
<<<tipar >>>)
59
(defrule R62
(data ?x)
(data1 ?x)
=> (printout t ?x crlf) )
Dac BF este:
f-1
f-2
f-3
f-4
f-5
f-6
f-7
(data
(data1
(data
(data1
(data
(data1
(data
100)
100)
200)
200)
300)
300)
400)
atunci regula R61 va fi plasat n agend o singur dat, n timp ce regula R62 va fi plasat de
trei ori. Operaia exists este n fapt materializat n CLIPS pe baza operaiei de negare asupra
unui tipar (condiia NOT) i se supune restriciilor acesteia. Aceasta nseamn c o variabil
folosit n interiorul unei condiii exists nu va fi legat (atribuit), ci doar poate fi folosit
pentru a crea anumite restricii ce trebuie satisfcute; n consecin o asemenea variabil nu va
putea s apar n partea de aciune a regulii (a se observa diferena dintre prile de aciune ale
regulilor R61 i R62).
Operatorul forall asigur un mecanism pentru a verifica dac un grup de tipare este
satisfcut pentru fiecare (orice) apariie a unui alt tipar specificat. Sintaxa pentru acest operator
este:
(forall <tipar_1>
<<<tipar_i>>>)
Condiia este satisfcut dac pentru fiecare fapt ce verific tipar_1, toate condiiile
determinate de grupul de tipare tipar_i sunt, de asemenea, satisfcute. Ca un exemplu,
considerm c n BF exist fapte care respect urmtoarele dou abloane:
(Student <nume>)
(Nota <proba> <nume>
<nota>)
n aceste condiii regula de mai jos este activat doar atunci cnd n BF pentru toate faptele
de forma Student faptele corespunztoare cu note conin valoarea notei strict mai mare dect 4.
(defrule R63
(forall (Student ?nume)
(Nota Laborator ?nume ?x1&:(> ?x1 4))
(Nota Examen ?nume ?x2&:(> ?x2 4))
(Nota Test ?nume ?x3&:(> ?x3 4)) )
=>
(printout t Student promovat crlf) )
Dac BF conine faptele: (Student Ion), (Nota Laborator Ion 5), (Nota Examen Ion
7), (Nota Test Ion 10), atunci regula este activat. Dac pe lng aceste fapte, n BF apar i
faptele (Student Vasile) (Nota Laborator Vasile 5), atunci regula nu mai este activat,
deoarece pentru faptul corespunztor studentului Vasile nu exist n BF faptele care s precizeze
nota la Examen i nota la Test. Un alt caz de ne-activare a regulii este acela cnd n BF ar fi
60
faptele: (Student Ion1), (Nota Laborator Ion1 6), (Nota Examen Ion1 3), (Nota Test
Ion1 10), de data aceasta nefiind satisfcut condiia cerut pentru nota la examen. Este de
menionat c dac n BF nu exist niciun fapt Student (niciun fapt care s satisfac acea condiie
din primul tipar ce apare n forall, atunci regula este activat.
Operaia forall, la fel ca exists, este materializat pe baza operaiei de negare asupra
tiparelor i se supune restriciilor acesteia. Operaiile forall i exists pot fi utilizate i
mpreun cu condiii obinuite, ca n exemplul de mai jos:
(defrule R64
(Fapt ?y)
(exists (data ?y&:(< ?y 0))
(data1 ?y ?) )
=>
(printout t ?y crlf) )
Regula de mai sus este plasat de dou ori n agend dac n BF sunt faptele: (Fapt -12),
(Fapt aa), (data -12), (data1 -12 as), (data1 -12 ae), (data -3), (data1 -3 v), (Fapt -3).
Exerciiu
Creai cte un exemplu n care s verificai funcionarea condiiilor exists i forall.
Exerciii recapitulative
1. Rspundei la urmtoarele ntrebri.
Care sunt operaiile logice care se pot efectua asupra cmpurilor tiparelor i respectiv
ntre tipare ?
Precizai cnd sunt activate urmtoarele reguli:
(defrule R65 (data a1 | ~a2&~a3) => )
(defrule R66 (data ?x ~?x ?y ?x | ~?y) => )
Precizai dac urmtoarele reguli sunt corecte:
(defrule R67 (data ?x ~?y) => )
(defrule R68 (data ?x ?y ?x&?y) => )
(defrule R69 (data ?x ~a ?y&~a) => )
Ce se nelege prin predicat CLIPS?
Ce se nelege prin tipar de test n CLIPS?
Cnd va fi activat regula:
(defrule R70 (data ?x ?y)
(test
(or (and (numberp ?x) (numberp ?y)
(oddp ?x) (evenp ?y) (= (/ ?x ?y) 0.5) )
(not (and (eq ?x a)(eq ?y b) ) ) ) ) => )
62
Lucrarea nr. 6
Tehnici de intrare i de ieire n CLIPS; elemente procedurale i comenzi
utilitare
1. Lucrul cu fiiere n CLIPS
n CLIPS se pot utiliza fiiere care trebuie n prealabil deschise, folosind funcia:
(open
<nume-fiier>
<nume-logic>
[<acces>])
nume-fiier trebuie s fie de tip simbol sau ir de caractere i va reprezenta numele sub
care este cunoscut fiierul respectiv de ctre sistemul de operare;
nume-logic trebuie s fie o constant CLIPS (simbol, ir de caractere sau numr) i va
reprezenta numele sub care interpretorul CLIPS recunoate fiierul n cauz; acesta este
identificatorul pe care l vom folosi n programele CLIPS atunci cnd ne referim la un fiier (este
numele care va fi utilizat, de exemplu, n reguli, n partea de aciune, sau n comenzi date la nivel
superficial, cu privire la un fiier). Un nume-logic asignat nu poate fi folosit de mai multe ori
pentru diferite fiiere. Un avantaj al folosirii celor dou argumente nume-fiier, pentru sistemul
de operare i nume-logic, pentru interpretorul CLIPS, este acela c putem uor nlocui un fiier
cu altul ntr-un program, fr a trebui s facem schimbri majore n acesta.
acces este un argument opional i fixeaz modul de acces la fiier; trebuie s fie de tip
ir de caractere, fiind posibile urmtoarele patru cazuri: r fiier deschis numai pentru citire;
w - fiier deschis numai pentru scriere; r+ - fiier deschis pentru citire i scriere; a - fiier
deschis numai pentru concatenare (scriere la sfritul fiierului). Dac argumentul acces lipsete
se va da de ctre sistem valoarea implicit r.
Observaii
1. Consecina operaiei open depinde de sistemul de operare n care se lucreaz. De
exemplu, n DOS sau n Windows, sisteme de operare care nu lucreaz cu versiuni multiple ale
fiierelor, redeschiderea pentru scriere a unui fiier existent va determina nlocuirea acestuia cu
unul nou.
2. Funcia open lucreaz ca un predicat, n sensul c determin ca rezultat TRUE dac
deschiderea fiierului s-a fcut cu succes i FALSE n caz contrar. De exemplu, dac se folosete
ntr-o comand open numele unui fiier inexistent, cu argumentul acces egal cu r (deschidere
pentru citire), atunci rezultatul obinut va fi FALSE: nu poate fi deschis pentru citire un fiier
care nu exist. n acest fel, funcia open poate fi inclus n teste, care s transmit mesajele
corespunztoare n cazul apariiei unor erori.
Atunci cnd accesul la un fiier nu mai este necesar se va folosi funcia close, pentru
nchiderea acestuia. Dac fiierul nu se nchide nu avem garania c datele din el sunt salvate n
mod corect. De aceea, ntr-un program CLIPS, de ndat ce nu mai avem nevoie de un fiier, l
vom nchide cu funcia close. Sintaxa pentru aceasta este:
(close
[<nume-logic>])
unde argumentul nume-logic este opional i specific numele logic (acelai cu cel declarat n
open) al fiierului care va fi nchis. Dac argumentul lipsete CLIPS va nchide toate fiierele
deschise. Funcia close determin rezultatul TRUE dac fiierul specificat a putut fi nchis, sau
atunci cnd argumentul nume-logic lipsete, rezultatul furnizat de close este TRUE dac mcar
un fiier a putut fi nchis; ntr-un caz contrar rezultatul lui close este FALSE.
Conform celor menionate mai sus este bine s existe o regul acionnd, dac nu mai
devreme, n finalul rulrii programului CLIPS i care s nchid toate fiierele deschise n timpul
63
execuiei acelui program. n legtur cu acest aspect, chiar interpretorul CLIPS va nchide, la
execuia comenzii exit de prsire a interpretorului, toate fiierele rmase deschise.
nscrierea i citirea datelor din fiiere se poate face cu ajutorul funciilor printout i
read. n programele anterioare printout a fost folosit numai pentru transmiterea de
informaii pe terminal; n acest sens, reamintim forma general a comenzii printout:
(printout <nume-logic> <<element-de-ieire>>)
Dac argumentul nume-logic este t, atunci elementele-de-ieire sunt transmise pe terminal
(elementul standard de ieire, monitor), iar dac este numele-logic al unui fiier (ceea ce
nseamn c fiierul a fost deschis cu o comand open n care a aprut numele-logic respectiv),
atunci elementele-de-ieire sunt nscrise n fiierul n cauz. De exemplu, n comanda:
(printout fdata 1 2 3 crlf)
numerele 1, 2 i 3 sunt nscrise n fiierul avnd numele-logic fdata, pe o linie a fiierului
respectiv, dup care se trece la o linie nou. Aceasta presupune ca anterior execuiei acestei
comenzi, s se fi executat, de exemplu, comanda:
(open f1.dat fdata a)
sau
(open f1.dat fdata r+)
sau
(open f1.dat fdata w)
Mai trebuie remarcat faptul c valorile respective sunt nscrise in fiier fr niciun spaiu
ntre ele, astfel c la o citire care ar urma valoarea preluat din fiier va fi 123. Pentru a obine
delimitarea prin spaiu ntre valorile nscrise n fiier pe aceeai linie vom putea folosi un ir de
caractere care s conin spaiul necesar, adic vom avea o comand de forma:
(printout fdata 1 2
crlf)
[<nume-logic>])
Dac argumentul opional nume-logic este prezent atunci citirea se face din fiierul identificat
prin numele-logic respectiv, iar dac argumentul lipsete sau este simbolul t atunci informaia
este preluat de la tastatur (elementul standard de intrare). Este de menionat c read permite
introducerea unui singur cmp. De exemplu, fie urmtoarea succesiune de comenzi, date la nivel
superficial:
(read)
abc 12
abc
n aceast succesiune, cea de-a treia linie, format din simbolul abc, este rspunsul
interpretorului, care dup comanda read preia de la tastatur numai primul cmp, astfel c
64
numrul 12, care este al doilea cmp introdus pe aceeai linie, se pierde. n mod similar, dac se
execut comanda:
(read
fintrari)
iar n fiierul avnd numele-logic fintrari pe linia curent exist mai multe cmpuri, numai
primul dintre ele este luat n considerare prin comanda de mai sus. Comanda read permite i
preluarea unor cmpuri care nu sunt simboluri, iruri de caractere sau numere, cum ar fi
parantezele; acestea vor fi tratate ca iruri de caractere i deci introduse ntre ghilimele.
Felul n care se poate lucra cu fiiere n CLIPS este ilustrat prin urmtorul exemplu.
Exemplu
S se scrie programul CLIPS care s foloseasc dou fiiere n felul urmtor. Din primul
fiier vor fi citite numere. Dac numrul preluat este mai mare sau egal cu 60 atunci numrul
respectiv este transmis att pe monitor ct i n fiierul de ieire, nsoit de cuvntul corect, iar
dac numrul este strict mai mic ca 60, atunci este transmis pe monitor i n fiierul de ieire
nsoit de cuvntul incorect.
Fr s mai notm forma faptelor pe care le vom folosi, expresiile acestora fiind simple,
vom scrie direct regulile necesare. Programul care rezolv problema trebuie s aib o desfurare
secvenial, fiind organizat n urmtoarele faze: iniializare, citire date din fiierul de intrare,
prelucrare date, transmitere date n fiierul de ieire, terminare program. Dac prima i ultima
faz trebuie s se execute o singur dat, la nceputul i respectiv sfritul lucrului, celelalte trei
faze (citire, prelucrare, transmitere rezultate) trebuie s se execute n mod repetat, ntr-un ciclu
care s se ncheie atunci cnd nu mai sunt date de citit din fiierul de intrare.
Faza de iniializare are de rezolvat deschiderea fiierelor pe care le vom folosi n program,
ceea ce presupune folosirea urmtoarei reguli:
(defrule
R1
=>
(open intrare.dat fdate)
(open iesire.txt fiesire "w")
(assert (faza citire) ) )
Deoarece aceast regul trebuie s se execute prima, imediat dup reset, partea ei de condiie
este vid. n partea de aciune, pe lng deschiderea celor dou fiiere de lucru, se introduce n
BF faptul (faza citire) avnd rolul de a face trecerea la faza urmtoare a ciclului de lucru. Regula
care rezolv citirea unei date din fiierul intrare.dat este:
(defrule
R2
?a <- (faza citire)
=>
(retract ?a)
(assert (valoare-citita (read fdate))) )
Prin aceast regul se introduce n BF un fapt cu primul cmp simbolul valoare-citita, iar al
doilea cmp valoarea preluat din fiierul avnd nume-logic fdate. Funcia read returneaz
simbolul EOF atunci cnd printr-o operaie de citire se ajunge la sfritul unui fiier. Astfel, la un
moment dat n BF vom avea faptul (valoare-citita EOF) care va marca terminarea fazei de citire
din fiier. n consecin putem scrie regula care va indica printr-un fapt n BF posibilitatea
nceperii fazei de oprire (de finalizare a programului) i respectiv regula prin care se rezolv
terminarea programului, operaia de efectuat fiind cea de nchidere a fiierelor.
65
(defrule R3
"regula ce actioneaza atunci cand valoarea citita din fisier este EOF"
?a <-(valoare-citita EOF)
=>
(retract ?a)
(assert (faza oprire)))
(defrule R4
?a <- (faza oprire)
=>
(retract ?a) (close fdate)
(close
fiesire) )
n locul celor dou comenzi close din regula R4 am fi putut folosi una singur, fr nici un
argument - adic (close) - situaie n care interpretorul CLIPS ar fi nchis toate fiierele deschise
n acel moment. Cele dou reguli (R3 i R4), pot fi grupate ntr-o singur regul, atunci cnd
faza de terminare citire reprezint de fapt faza de terminare a programului.
Pentru rezolvarea fazei de prelucrare a datelor citite din fiier vom folosi trei reguli,
corespunztoare celor trei situaii posibile pentru valoarea citit: R5 pentru cazul cnd valoarea
preluat din fiier este numr i este mai mare sau egal dect 60, R6 pentru o valoare preluat
care este numr i este mai mic dect 60, respectiv R7 pentru cazul cnd valoarea preluat din
fiier nu este numr i nu este nici simbolul EOF.
(defrule
(defrule
(defrule
R5
?a <- (valoare-citita ?v&:(and (numberp ?v) (>= ?v
=>
(retract ?a)
(printout t S-a gasit o valoare corecta: ?v crlf)
(printout fiesire ?v corect crlf)
(assert (faza citire) ) )
60) ))
R6
?a <- (valoare-citita ?v&:(and (numberp ?v) (< ?v 60)))
=>
(retract ?a)
(printout t S-a gasit o valoare incorecta: ?v crlf)
(printout fiesire ?v incorect crlf)
(assert (faza citire) ) )
R7 regula ce indeparteaza valorile nenumerice
?a <- (valoare-citita ?v&:(not (or (numberp ?v) (eq
=>
(retract ?a)
(assert (faza citire) ) )
?v
EOF))))
Este de observat c n programul astfel scris faptele (faza citire) i (faza oprire) au
rolul de a asigura secvenierea necesar; ele sunt introduse n BF atunci cnd se dorete trecerea
la o anumit faz (dup execuia uneia din regulile R5, R6, R7 se va reveni la activarea regulii de
citire, R2). Regula R7 trateaz valorile inutile n cazul problemei respective (pentru problema
considerat sunt utile doar valorile numerice sau simbolul EOF). Dac regula R7 lipsete i n
fiier s-ar gsi o valoare nenumeric i diferit de EOF, atunci nu se va mai asigura secvenierea
pentru o nou citire din fiier.
66
Exerciiu
Experimentai funcionarea programului de mai sus, crend n prealabil, cu ajutorul unui
editor de texte, fiierul intrare.dat. Verificai diferena ntre un program cu i fr regula R7.
n CLIPS mai exist cteva funcii destinate lucrului cu fiiere. Pentru scrierea ntr-un
fiier, permind formatarea datelor de ieire, exist funcia (similar lui printf din limbajul C):
(format
<nume-logic>
<ir-de-control>
<<element-de-ieire>>)
Exemplu %n)
67
[<nume-logic>])
Aceast funcie determin citirea unei ntregi linii de intrare, coninutul respectiv fiind preluat
sub forma unui singur cmp, de tip ir de caractere (adic inclus ntre ghilimele). Dac
argumentul nume-logic este absent sau este t, citirea se face de la tastatur, iar dac este prezent,
citirea se face din fiierul indicat prin numele-logic respectiv. La fel ca i n cazul funciei
read, atunci cnd citirea se face dintr-un fiier i s-a atins sfritul acestuia rezultatul returnat
este simbolul EOF. Modul de utilizare a acestei comenzi este ilustrat pe exemplul urmtor:
(defrule
Exerciiu
Experimentai regula de mai sus, introducnd de la tastatur mai multe cmpuri pe aceeai
linie. Observai care este deficiena utilizrii comenzii readline, deficien care va putea fi
eliminat conform celor prezentate n seciunea urmtoare.
n ceea ce privete folosirea fiierelor pentru pstrarea programelor CLIPS, comenzile
load i save, descrise anterior, sunt cele care permit ncrcarea i respectiv salvarea
definiiilor de construcii. Mai exist dou funcii care permit ncrcarea i respectiv salvarea BF
ntr-un fiier. Astfel, pentru completarea BF exist comanda:
(load-facts
<nume-fiier>)
care determin ncrcarea n BF a faptelor din fiierul specificat (argumentul nume-fiier poate fi
de tip ir de caractere sau simbol). Fiierul respectiv poate fi scris cu un editor de texte, dar
trebuie s conin faptele organizate n formatul corespunztor. De exemplu, dac n fiierul
f1.fap se gsete coninutul:
(temperatura punct A 152)
(presiunea punct A 7.3)
(curent-motor 6.7)
68
<nume-fiier>)
Comanda de mai sus determin salvarea tuturor faptelor din BF n fiierul precizat prin
argument. Salvarea se face n formatul corespunztor faptelor n CLIPS, astfel c o folosire a
comenzii save-facts va permite o ncrcare ulterioar a faptelor astfel salvate, prin folosirea lui
load-facts.
Exerciiu
Scriei programul CLIPS care s salveze ntr-un fiier un anume grup de fapte din BF de la
momentul curent. n acest sens mai nti se va prelua de la utilizator numele fiierului n care s
se fac salvarea i primul cmp al faptelor care trebuie salvate (de exemplu, dac utilizatorul
introduce de la tastatur: data, nume i timp, atunci n fiierul indicat vor fi salvate toate faptele
din BF care ncep cu unul din simbolurile data, nume, timp).
2. Funcii CLIPS pentru iruri de caractere i pentru valori multicmp
Exist mai multe funcii CLIPS ce permit prelucrarea irurilor de caractere, simbolurilor i
a valorilor cu mai multe cmpuri, n continuare fiind prezentate cele mai importante.
(str-assert
<ir-de-caractere>)
(marimi-masurate
presiune
temperatura
\volum-exterior\ ))
Evident funcia str-assert poate fi folosit nu numai la nivel superficial ci i n reguli, n partea
de aciune, cnd argumentul va putea fi obinut i prin folosirea unor variabile sau funcii. Un
efect echivalent funciei str-assert l are funcia:
(assert-string
<ir-de-caractere>)
<<element>>)
<<element>>)
Rezultatul obinut prin funcia sym-cat este un singur simbol, determinat din
concatenarea argumentelor funciei.
69
Exemplu
Se poate construi o nou variant a regulii de citire a numelui (R8), n care fa de soluia
dat anterior s se introduc n BF un fapt avnd un numr de cmpuri corespunztor numrului
de cmpuri introduse de la tastatur; aceasta se va face folosind funciile descrise anterior:
(defrule R9 regula de citire a numelui si prenumelui in care acestea devin campuri
distincte
=>
(printout t Care este numele si prenumele ? crlf)
(str-assert (str-cat (nume (readline) ) ) ) )
Exerciiu
Experimentai regula de mai sus, introducnd de la tastatur mai multe cmpuri pe aceeai
linie. Observai forma faptului introdus n BF.
Exist i alte comenzi CLIPS dedicate constantelor de tip ir de caractere, permind:
extragerea unui subir dintr-un ir de caractere (sub-string), aflarea poziiei unui subir ntr-un
ir de caractere (str-index), compararea a dou constante de tip ir de caractere (strcompare), determinarea lungimii unui ir de caractere (str-length); sintaxa i modul de
utilizare pentru aceste comenzi se pot nelege uor din manualele limbajului CLIPS.
Exist mai multe funcii CLIPS pentru valori multicmp, dintre care funcia mv-append
a fost prezentat i anterior; o reamintim aici:
(mv-append <<element>>)
Se creeaz o valoare multicmp din elementele care sunt argumente. Un caz particular este acela
al apelului acestei funcii cu zero argumente, caz n care se obine valoarea multicmp cu zero
cmpuri. Exist o funcie echivalent pentru mv-append i anume:
(create$ <<element>>)
avnd aceeai funcionare ca i mv-append. Alte funcii pentru valori multicmp sunt date n
continuare.
(mv-delete
<indice-cmp>
<valoare-multicmp>)
Efectul este de tergere (eliminare) a cmpului indicat prin indice-cmp din valoarea multicmp
dat ca al doilea argument; acest ultim argument trebuie s fie o valoare multicmp. De exemplu:
(mv-delete 1 (mv-append a b 1 2) ) va determina ca rezultat: (b 1 2); n acest
exemplu funcia mv-append este folosit pentru a crea o valoare multicmp; ntr-un program
CLIPS, valorile multicmp vor putea fi obinute i din legri ale variabilelor multiple.
(delete$
<valoare-multicmp> <indice-cmp1>
<indice-cmp2> )
Efectul este de tergere din valoarea multicmp dat de primul argument a valorilor ale cror
poziii n valoarea multicmp sunt date de cele dou argumente indici. De exemplu: (delete$
(create$ a b 1 2 3) 3 4) va determina ca rezultat: (a b 3). Dac n comanda delete$
argumentele indici sunt egale, atunci din valoarea multicmp se terge doar poziia indicat prin
indicii dai (se obine un efect similar cu al comenzii mv-delete).
70
(length$
<valoare-multicmp>)
Determin ca rezultat numrul de cmpuri din valoarea multicmp ce este dat ca argument.
Comanda poate fi dat i sub forma (length <valoare-multicmp>).
(nth$
<indice-cmp>
<valoare-multicmp)
ntoarce drept rezultat cmpul din cel de-al doilea argument ce are poziia dat prin primul
argument. Dac poziia respectiv nu exist rezultatul ce se obine este nil. Comanda poate fi
dat i sub forma (nth <indice-cmp> <valoare-multicmp>).
(member$
<expresie>
<valoare-multicmp>)
Dac rezultatul evalurii expresiei este o valoare cu un singur cmp i acest cmp se regsete n
valoarea multicmp ce este al doilea argument, atunci se obine poziia cmpului dat de primul
argument n valoarea multicmp dat de cel de-al doilea argument. Dac expresia se evalueaz la
o valoare multicmp i aceast valoare multicmp apare n valoarea multicmp ce este al doilea
argument, atunci rezultatul este o valoare multicmp cu dou constante, reprezentnd indicii de
start i de sfrit pentru includerea respectiv. Dac nu se produce unul din cele dou cazuri
menionate, atunci rezultatul ce se obine este FALSE. De exemplu: (member$ (create$ a b)
(create$ 1 2 a s a b 3) ) va produce rezultatul (5 6).
(subsetp
<valoare-multicmp1>
<valoare-multicmp2>)
ntoarce rezultatul TRUE dac cmpurile care apar n primul argument se regsesc toate printre
cmpurile din cel de-al doilea argument i FALSE n caz contrar (ambele argumente trebuie s
fie valori multicmp). Este de observat c valoarea multicmp cu zero cmpuri se regsete n
orice alt valoare multicmp. De exemplu: (subsetp (mv-append) (mv-append 1 2 3)
) va determina rezultatul TRUE.
(subseq$
Determin extragerea din valoarea multicmp ce este primul argument a poziiilor delimitate de
indicii specificai, adic se obine o parte din valoarea multicmp ce este primul argument. De
exemplu: (subseq$ (create$ 1 2 a s a b 3) 3 6) determina ca rezultat: (a s a b).
(replace$ <valoare-multicmp> <indice1> <indice2> <<expresie>>)
Determin nlocuirea n valoarea multicmp reprezentnd primul argument a valorilor dintre
poziiile specificate cu rezultatul evalurii expresiei sau expresiilor ce apar dup argumentele
indici. De exemplu: (replace$ (create$ 1 2 a s a b 3) 3 6 x x (create$ 12 13))
determin ca rezultat: (1 2 x x 12 13 3).
(insert$ <valoare-multicmp> <indice> <<expresie>>)
Determin inserarea valorii sau valorilor obinute din evaluarea ultimelor argumente n valoarea
multicmp ce este primul argument de la poziia indicat prin argumentul indice. Acest argument
trebuie s fie un numr natural, mai mare sau egal cu 1; dac indicele este 1, atunci inserarea se
face de la nceputul valorii multicmp; dac indicele are o valoare mai mare dect lungimea
valorii multicmp atunci inserarea se face la sfrit. De exemplu: (insert$ (create$ 1 2 a s a b 3)
3 asa (create$ 12 13) ) determin ca rezultat: (1 2 asa 12 13 a s a b 3).
71
(first$ <valoare-multicmp>)
Determin primul cmp al valorii multicmp ce este argument.
(rest$ <valoare-multicmp>)
Determin ceea ce rmne din valoarea multicmp dac se elimin primul cmp. De exemplu:
(rest$ (create$ a s 1 3)) determin rezultatul: (s 1 3).
(str-explode
<ir-de-caractere>)
Convertete un ir de caractere ntr-o valoare multicmp (delimitatorii sunt spaiile din interiorul
irului de caractere). Funcia invers este:
(str-implode
<valoare-multicmp>)
care convertete o valoare multicmp ntr-un singur cmp, de tip ir de caractere. Comenzi
echivalente pentru str-explode i str-implode sunt: (explode$
<ir-de-caractere>),
respectiv (implode$ <valoare-multicmp>).
3. Elemente procedurale de control al execuiei programului
CLIPS posed cteva funcii de tipul celor care n limbajele clasice permit controlul
execuiei programelor. Dei acestea pot fi folosite i la nivel superficial, ele i gsesc utilitatea
n scrierea unor reguli care pot deveni mai eficiente prin folosirea n partea de aciune a funciilor
procedurale de control al execuiei; de altfel, funciile care sunt prezentate n continuare pot fi
folosite n reguli numai n partea de aciune (nu i n partea de condiie). Exist n CLIPS trei
asemenea funcii, descrise n cele ce urmeaz.
(if
<predicat>
then
<<<aciune>>>
[else
<<<aciune>>>])
Cnd se ntlnete aceast funcie (n partea dreapt a unei reguli sau la nivel superficial),
mai nti se evalueaz predicatul. Dac rezultatul evalurii este TRUE se execut
aciunea/aciunile de dup then, iar dac rezultatul evalurii predicatului este FALSE i dac
exist clauza else, atunci se execut aciunea/aciunile de dup else. Dac predicatul
determin rezultatul FALSE i nu exist clauza else atunci nu se execut nici o aciune i se
trece la urmtoarea comand.
Funcia if poate fi util pentru efectuarea unor teste n partea de aciune a unei reguli,
evitnd n acest fel scrierea unor reguli suplimentare. Ca exemplu, regula de mai jos are rolul de
a ghida continuarea unui program, n funcie de coninutul unui fapt din BF.
(defrule
R10
?a <- (continuare ?x)
=>
(retract ?a)
(if (or (eq ?x da) (eq ?x Da) (eq ?x DA) )
then (assert (faza lucru) )
else (assert (faza stop) ) ) )
Exerciiu
nlocuii regula de mai sus cu cteva reguli care s determine aceleai consecine i care s
nu mai foloseasc funcia if.
72
(while
<predicat>
[do]
<<<aciune>>>)
Cuvntul do este opional, iar aciunea/aciunile care urmeaz constituie corpul ciclului.
Mai nti se evalueaz predicatul; dac rezultatul determinat este TRUE, atunci se execut
corpul, iar dac predicatul se evalueaz la FALSE, atunci se trece mai departe, la urmtoarea
comand CLIPS. Dup executarea corpului ciclului se testeaz din nou predicatul, .a.m.d.
Exemplu
Regula urmtoare preia de la operator informaia cu privire la continuarea unui program,
introducnd n BF un fapt corespunztor. n plus, dac utilizatorul nu rspunde cu unul din
cuvintele DA sau NU, programul intr ntr-o bucl, creat prin folosirea funciei while.
(defrule
R11
?a <- (faza verificare-continuare)
=>
(retract ?a)
(printout t Continuati ? crlf)
(bind ?x (read))
(while (and (neq ?x DA)(neq ?x NU) )
do
(printout t Continuati ? (raspundeti cu DA sau NU)
crlf)
(if
(bind ?x (read) ) )
(eq ?x DA)
then (assert (faza lucru) )
else (assert (faza stop) ) )
Observaie
Funciile if i while nu sunt obinuite ntr-un program bazat pe reguli. Scrierea unui
ntreg program, ntr-o variant procedural, n partea de aciune a unei reguli, prin folosirea lui
if i while determin pierderea funcionalitii specifice pentru un program bazat pe reguli,
respectiv a unui SE. ntr-un SE funciile if i while vor fi folosite numai pentru efectuarea
unor teste i bucle simple.
O alt funcie de control al execuiei programului este:
(halt)
Aceasta determin oprirea execuiei unui program CLIPS (se oprete execuia regulilor) i se
revine la nivel superficial. Agenda va continua s pstreze regulile ce eventual existau n ea,
astfel c o comand run care va urma le va putea pune n execuie. n acest fel, comanda halt
poate fi util n depanare; dup o oprire datorat acestei comenzi utilizatorul poate urmri starea
agendei, a BF, pentru ca apoi s reia rularea programului (n acelai sens pot fi ataate i punctele
de oprire break-point, dup cum s-a artat anterior). Ca exemplu, s-a rescris regula anterioar
n aa fel nct s determine oprirea programului dac utilizatorul introduce un cmp diferit de
simbolul DA i diferit de simbolul NU.
(defrule
R12
?a <- (faza verificare-continuare)
=>
(retract ?a)
(printout t Continuati ? crlf)
73
(bind ?x (read) )
(if (and (neq ?x DA) (neq ?x NU) )
then (halt) )
(if (eq ?x DA)
then (assert (faza lucru) )
else (assert (faza stop) ) ) )
4. Comenzi utilitare n CLIPS
Exist o serie de comenzi care pot ajuta utilizatorul n interfaarea cu programele CLIPS.
Astfel se poate cere executarea unei comenzi a sistemului de operare prin funcia:
(system
<<<valoare>>>)
Argumentele trebuie s fie constante CLIPS sau expresii care s furnizeze ca rezultat un singur
cmp. Efectul este acela de a trece controlul sistemului de operare i de a executa comanda care
se obine prin concatenarea argumentelor care apar n comanda system; n acest sens, pentru a
crea comanda de executat de ctre sistemul de operare se concateneaz ntr-un singur ir de
caractere toate valorile date prin argumente. Aceast comand este util, de exemplu, atunci cnd
se lucreaz cu versiunea mediului CLIPS destinat sistemului de operare DOS. De asemenea,
folosind comanda system pot fi lansate din CLIPS aplicaii realizate n alte limbaje de
programare.
Se poate cere execuia unui fiier de tip .bat prin comanda:
(batch
<nume-fiier>)
n care argumentul nume-fiier trebuie s fie de tip simbol sau ir de caractere. Efectul va fi acela
de execuie a comenzilor din fiierul indicat prin argument, fiier care trebuie s fie de tip .bat.
Aceast comand va fi folosit de obicei pentru a nlocui o secven de comenzi care se execut
n mod repetat, de exemplu la nceputul lucrului n CLIPS, cu o singur comand batch, care
va substitui ntreaga secven respectiv. ntr-un fiier de tip .bat poate fi nscris orice comand,
funcie, definiie de construcie, din CLIPS, ca i rspunsurile la comenzile read sau
readline. Totui este bine ca definiiile de construcii s nu fie plasate n fiiere de tip .bat ci n
fiiere de tip .clp, pe care s le ncrcm cu comanda load, pentru c o greeal fcut ntr-un
fiier .bat este mai greu de depistat i depanat, dect atunci cnd lucrm cu fiiere clp. Comanda
batch returneaz valoarea TRUE dac fiierul .bat respectiv a putut fi executat cu succes i
FALSE n caz contrar.
Pentru exemplificare, presupunem urmtorul dialog efectuat de sub interpretorul CLIPS:
(load reguli1.clp)
(load reguli2.clp)
(reset)
(run)
Cate iteraii ? 10
Valoarea de start ? 2
n care 10 i 2 sunt valori introduse de la tastatur, ele fiind cerute de comenzi read executate
din regulile rulate. Comenzile de mai sus, ca i informaiile furnizate, pot fi plasate ntr-un fiier
de tip .bat; fie acesta fiierul f1.bat, care va avea urmtorul coninut:
74
(load reguli1.clp)
(load reguli2.clp)
(reset)
(run)
10
2
n acest caz toat conversaia anterioar este nlocuit de comanda (batch f1.bat).
O facilitate suplimentar privind fiierele de tip .bat este aceea c interpretorul CLIPS
poate executa n mod automat un fiier .bat la lansare. O asemenea facilitate poate fi util, de
exemplu, pentru versiunea mediului CLIPS destinat sistemului de operare DOS. Pentru aceasta
linia de comand de chemare a interpretorului CLIPS va fi:
clips
-f
<nume-fiier>
unde exist un spaiu ntre simbolul clips i f i un spaiu ntre f i nume-fiier, iar nume-fiier
poate fi de tip simbol sau ir de caractere, reprezentnd numele unui fiier de tip .bat. Efectul va
fi acela c se va lansa interpretorul CLIPS i se vor executa comenzile din fiierul precizat, cu
restricia c n acest caz fiierul de tip .bat poate conine numai comenzi, nu i informaii cerute
de execuia funciilor read sau readline.
nregistrarea ntr-un fiier a unei sesiuni de lucru cu interpretorul CLIPS se poate obine
prin comanda:
(dribble-on
<nume-fiier>)
Dup execuia acestei comenzi, n timp ce suntem sub interpretorul CLIPS, tot ceea ce se
introduce de la tastatur i tot ceea ce se transmite pe monitor va fi nregistrat i n fiierul
specificat n comanda dribble-on. Pentru a anula acest efect vom folosi comanda:
(dribble-off)
Exerciii
1. Rspundei la urmtoarele ntrebri:
Care e deosebirea ntre argumentele nume-fiier i nume-logic ntr-o comand open ?
Care este deosebirea ntre un fiier deschis printr-o comand open cu argumentul
acces w i un fiier deschis cu argumentul acces a ?
Care este deosebirea ntre comenzile (read) i (read t) ? Dar ntre (format t %f
12) i (format nil %f 12) ?
Care este deosebirea ntre comenzile load i load-facts i respectiv ntre save i
save-facts ?
Care este rezultatul urmtoarei comenzi:
(member$ (length$ (mv-append 1 2 3) ) (mv-append a 1 c 3 d) ); dar al
comenzii:
(nth$ 5 (explode$ a b c d e f 6)).
2. nlocuii regulile R11 i R12 din seciunea 3 cu variante de programe CLIPS care s nu
foloseasc funciile if, while.
Probleme recapitulative
1. Rescriei programul CLIPS care s materializeze urmtoarea funcie binar:
75
F ( x , y ,z )= x y zUx y z
2. Cu referire la un exerciiu anterior, n care aprea urmtoarea regul:
(defrule R
(tatal-lui ?copil este ?tata)
(tatal-lui ?tata este ?bunic)
=>
(printout t Bunicul lui ?copil
rescriei regula de mai sus n aa fel nct s nu poat fi satisfcute ambele tipare de un singur
fapt din BF; de exemplu, n forma de mai sus, faptul (tatal-lui Ion este Ion) ar activa
regula, potrivindu-se pe ambele tipare, ceea ce nu trebuie s se ntmple.
3. Fie una din regulile folosite anterior, reluat mai jos:
(defrule Rr
(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) )
Aceasta determin o pereche de fapte din BF ce satisfac anumite condiii; deficiena care apare
este c o pereche de fapte poate activa regula de dou ori. De exemplu, faptele: (student Ion
AC 5 1501 Bucuresti) i (student Gelu AC 5 1501 Bucuresti) activeaz regula
Rr de dou ori i la rulare determin afiarea mesajului de dou ori. Eliminai aceast deficien.
4. Scriei un program CLIPS care s determine valoarea unei proprieti specificate pentru
un nod dat al unei reele semantice (n cazul n care pentru nodul respectiv nu se poate determina
proprietatea precizat se va transmite un mesaj adecvat). n prealabil se va stabili felul n care se
memoreaz n CLIPS o reea semantic; programul trebuie s fie conceput pentru a rezolva cazul
general, iar pentru verificarea funcionrii se va alege un caz particular, de exemplu pentru un
univers de discurs format din corpuri cu forme geometrice simple.
76
Lucrarea nr. 7
Fapte CLIPS de tip structurat
1. O clasificare a faptelor n CLIPS
n CLIPS exist dou tipuri de fapte: nestructurate (toate cele folosite pn acum) i
structurate. ntr-un fapt nestructurat ordinea cmpurilor poate fi oarecare, aceasta fiind aleas de
programator, dar odat ordinea fixat, ea trebuie respectat n ntreg programul CLIPS. Altfel
spus, ntr-un fapt nestructurat conteaz att coninutul fiecrui cmp, ct i ordinea cmpurilor.
De exemplu, n urma comenzii (assert (a b c) (a c b)) n BF vor fi introduse dou fapte
distincte. n acest sens, faptele nestructurate se numesc i fapte de tip ordonat, n ideea c au
cmpurile aezate ntr-o ordine bine stabilit i, n principiu, pentru a avea acces la o anumit
informaie programatorul trebuie s tie al ctelea cmp din fapt conine informaia respectiv
(atunci cnd ordinea cmpurilor nu este cunoscut a priori folosirea variabilelor multiple poate
rezolva gsirea unui anumit cmp). Spre deosebire de acest caz, n faptele structurate ordinea n
care sunt plasate informaiile nu mai are importan; de aceea, acestea se numesc i fapte de tip
neordonat.
Faptele structurate din CLIPS sunt asemntoare cu tipurile structurate din programarea
convenional (de exemplu, tipul articol din Pascal sau C), urmrind i caracteristicile modelului
de cadru din inteligena artificial.
2. Definirea faptelor structurate
Pentru a putea fi folosit un fapt de tip structurat trebuie mai nti definit, prin comanda:
(deftemplate <nume-deftemplate> [<comentariu>]
<<faet-cu-un-cmp>>
)
<<faet-multicmp>>
(1)
nu este folosit). ntr-o specificare de tip pot fi prevzute i mai multe argumente tip. De
exemplu, dac n faptul structurat microprocesor vrem ca numele s poat fi numai de tip simbol
sau ir de caractere, atunci putem reface definiia anterioar:
(deftemplate microprocesor acesta este un fapt structurat
(field nume (type STRING SYMBOL) )
(field magistrala (default 8)) )
Aceast definiie este echivalent cu urmtoarea:
(deftemplate microprocesor acesta este un fapt structurat
(field nume (type LEXEME) )
(field magistrala (type ?VARIABLE) (default 8)) )
Atunci cnd valoarea memorat ntr-o faet vrem s fie sau un ntreg sau un real vom
putea folosi (type NUMBER); dac folosim (type FLOAT) atunci o valoare ntreag va
nsemna eroare, ca n exemplul urmtor:
(deftemplate oscilator
(field frecventa (type FLOAT) ) )
La comanda (assert (oscilator (frecventa 10))) se va semnala eroare de tip, pentru c
valoarea folosit pentru faeta frecventa este un ntreg i nu un numr real.
Specificarea de restricionare de valori permise are sintaxa de una din urmtoarele forme:
(allowed-symbols {<niruire-de-simboluri>, ?VARIABLE})
(allowed-strings {<niruire-de-iruri-de caractere>, ?VARIABLE})
(allowed-lexemes {<niruire-de-simboluri-sau-iruri-de-caractere>, ?VARIABLE})
(allowed-integers {<niruire-de-numere-ntregi>, ?VARIABLE})
(allowed-floats {<niruire-de-numere-reale>, ?VARIABLE})
(allowed-numbers {<niruire-de-numere-ntregi-sau-reale>, ?VARIABLE})
(allowed-values {< niruire-de-valori>, ?VARIABLE})
Restricionarea care se face n acest caz este la valorile din niruirea ce este argument,
trebuind evident s existe o concordan ntre elementele din niruire i varianta allowed care
se folosete; de exemplu, se poate utiliza (allowed-symbols microprocesor microcontroler),
dar nu se poate folosi (allowed-symbols 12 -34). Specificarea allowed-values face o
restricionare strict, la valorile din niruirea care urmeaz; n celelalte cazuri restricia apare
numai pentru tipul specificat, aa cum se arat n continuare.
Exemplu:
(deftemplate microprocesor1
(field nume (allowed-symbols
(deftemplate microprocesor2
(field nume (allowed-values
I8086 I80286) ) )
I8086 I80286) ) )
Vom constata c ambele fapte sunt introduse n BF. Explicaia este aceea c primul fapt
satisface restricia de simboluri impus, iar al doilea are valoarea faetei nume un numr, iar
restricia specificat se refer numai la simboluri. n acest sens, dac se d comanda:
(assert (microprocesor1 (nume I86)) )
se va semnala eroare, deoarece valoarea faetei nume este un simbol i acesta nu este printre cele
din niruirea allowed-symbols. Tot eroare se obine i n cazul comenzii:
(assert (microprocesor2 (nume 8086)) )
pentru c la faptul structurat microprocesor2 s-a fcut o restricionare strict, cu specificarea
allowed-values, ceea ce nseamn c numai cele dou valori care apar n niruirea respectiv
pot fi folosite ca valori ale faetei nume.
Dac ntr-o specificare allowed n locul unei niruiri apare ?VARIABLE, atunci nu
se face nicio restricionare asupra tipului respectiv. De exemplu, o definiie de forma:
(deftemplate identificator (field nume (allowed-values ?VARIABLE) ) )
nu introduce nicio restricie asupra valorii care va fi introdus n faeta nume. Conform cu
sintaxa pentru faete, specificrile de restricionare de tip i de valori permise pot fi i combinate
ca n exemplul urmtor:
(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) ) )
Exerciiu Comentai restriciile care apar n definiia de mai sus. Introducei o definiie
logic echivalent cu aceea a faptului identificator i care s aib mai puine specificri de
restricionare. Introducei n BF fapte structurate de tip identificator.
Specificarea de restricionare de domeniu are sintaxa:
(range <minim> <maxim>)
Aceasta determin intervalul n care trebuie s se ncadreze valorile faetei respective,
atunci cnd tipul acesteia este INTEGER, FLOAT sau NUMBER. Dac tipul nu este unul din
acestea trei i se folosete specificarea range, atunci aceasta nu determin nicio restricie.
Argumentele minim i maxim pot fi numere ntregi sau reale, sau pot fi ?VARIABLE. Dac se
folosete ?VARIABLE drept argument minim atunci limita inferioar a domeniului astfel stabilit
este -, iar dac ?VARIABLE se folosete drept argument maxim, atunci limita superioar a
domeniului de restricionare este +.
Exemplu:
(deftemplate numar (field valoare (range ?VARIABLE 50.5) ) )
(deftemplate parametru (field valoare (type INTEGER) (range 0 1000) ) )
Se poate observa c am folosit acelai nume de faet - valoare - n dou fapte structurate,
ceea ce nu determin nicio legtur ntre acestea. n faptul numar, faeta valoare poate fi orice
80
numr n intervalul (-, 50,5] (aici neimpunndu-se o restricie de tip, se poate i ca faeta
valoare s nu fie numr, situaie n care restricia de domeniu este inoperant). n faptul
parametru faeta valoare poate fi orice numr ntreg din intervalul [0, 1000]. De remarcat c
domeniile se stabilesc ca intervale nchise.
Exerciiu Experimentai comportarea celor dou definiii de fapte structurate anterioare,
introducnd, prin comenzi assert sau deffacts, cteva fapte adecvate n BF.
Este de notat c specificarea range nu poate fi utilizat n acelai timp cu una din
specificrile: allowed-values, allowed-numbers, allowed-integers, sau allowed-floats.
Specificarea de restricionare de cardinalitate restricioneaz numrul de cmpuri care pot fi
introduse ntr-o faet de tip multicmp. Este evident c o asemenea specificare va putea fi
folosit numai pentru o faet de tip multicmp. Sintaxa este:
(cardinality
<min>
<max>)
Parametrii min i max pot fi numere ntregi sau pot fi ?VARIABLE. Ei precizeaz numrul
minim, respectiv numrul maxim de cmpuri care pot fi pstrate n faeta multicmp respectiv.
Dac pentru min n locul unui ntreg se folosete ?VARIABLE, atunci nseamn c numrul
minim posibil de cmpuri este fixat la zero. Dac ?VARIABLE se folosete pentru max, atunci
numrul maxim de cmpuri din faet este +. Dac specificarea de cardinalitate nu este
prezent ntre specificrile unei faete de tip multicmp, atunci, n mod implicit, se stabilete c
numrul de cmpuri poate fi ntre 0 i +.
3. Calculul valorii celei mai ateptate a unui fapt structurat
O problem care poate apare este aceea a determinrii pentru o faet a valorii celei mai
ateptate (default), atunci cnd specificarea default nu exist pentru acea faet. ntr-un
asemenea caz, valoarea cea mai ateptat se va deduce de ctre interpretorul CLIPS dup
urmtoarele reguli, care se aplic n ordinea n care sunt enumerate:
1. Tipul pentru valoarea cea mai ateptat este ales din lista de tipuri permise pentru faet,
n urmtoarea ordine de preferine: SYMBOL, STRING, INTEGER, FLOAT.
2. Dac tipul rezultat dup regula 1 are o specificare allowed (de exemplu, faeta are
specificrile (type INTEGER) i (allowed-integers -4 0 34) ) atunci prima valoare din lista
allowed este aleas ca valoare default (n cazul considerat, valoarea default ar fi 4).
3. Dac tipul fixat pentru faet este INTEGER, FLOAT sau NUMBER i exist specificarea
range atunci valoarea minim a domeniului devine valoare default, dac nu este -; dac
valoarea minim a domeniului este - i valoarea maxim a domeniului nu este +, atunci
valoarea maxim a domeniului se consider ca valoare default.
4. Dac faeta nu are tipul precizat, dar are o specificare allowed-symbols, atunci prima
valoare din lista respectiv se ia ca valoare default.
5. Dac valoarea default nu este determinat prin una din regulile de mai sus, atunci ea se
fixeaz n funcie de tipul faetei, dup cum urmeaz: pentru tipul STRING este (irul de
caractere vid), pentru INTEGER este 0, pentru FLOAT este 0.0, iar pentru tipul SYMBOL sau
atunci cnd tipul nu este precizat este simbolul nil.
6. Dac faeta este de tip multicmp atunci valoarea multicmp cu 0 cmpuri este folosit,
dac nu suntem n cazul n care pentru faeta respectiv s-a fixat printr-o specificare de
cardinalitate un numr minim de cmpuri mai mare ca 0. ntr-un asemenea caz valoarea default
va avea un numr de cmpuri egal cu minimum permis prin specificarea cardinality i valoarea
din fiecare cmp va fi aceea calculat dup regulile 1 5, ca i n cazul n care faeta respectiv
ar fi de tipul cu un cmp.
81
<<faet-de-modificat>>)
Efectul este acela de introducere a unui nou fapt structurat n BF, cu acelai coninut ca i
cel al faptului deja existent i care are indexul precizat prin primul argument, mai puin faetele
care apar explicit n comanda respectiv i pentru care se folosesc valorile date n comand.
82
Exemplu :
Avnd n BF faptul structurat Microprocesor cu faeta nume Intel I80286 (acesta fiind
plasat la identificatorul f-1), dac ne intereseaz s introducem n BF un nou fapt structurat, cu
acelai coninut, mai puin faetele nume i putere, care trebuie s devin I80386, respectiv 3,
vom putea folosi comanda:
(duplicate 1 (nume I80386) (putere 3) )
Observaii Dac se folosete o comand duplicate n care nu apare nicio faet de
modificat, atunci rezultatul depinde de starea bistabilului privind faptele duplicat. Nefiind
definiii de construcii, comenzile duplicate pot fi date la nivel superficial, sau n partea de
aciune a regulilor.
O alt posibilitate de introducere n BF a faptelor structurate este cea dat de comanda:
(modify
<index-fapt-structurat>
<<faet-de-modificat>>)
Efectul este acela de tergere din BF a faptului structurat avnd indexul precizat prin primul
argument al comenzii i de introducere a unui nou fapt, cu un coninut identic cu cel al faptului
ters, mai puin faetele de modificat, care iau valorile indicate n comand. Astfel, dac n BF, la
identificatorul f-2, se gsete faptul Microprocesor, cu faeta nume I8080 i faeta stare
depasit, comanda: (modify 2 (stare actual) ) va determina nlocuirea n BF a faptului
respectiv cu un altul, n care se produce schimbarea valorii faetei stare. Folosirea comenzii
modify fr nicio faet de modificat este posibil i va determina tergerea faptului identificat
prin argumentul index-fapt-structurat i reintroducerea aceluiai fapt n BF, cu acelai coninut,
dar ntr-o nou poziie (la urmtorul index liber). Mai menionm c, n conformitate cu sintaxa
dat, n comenzile modify sau duplicate poate fi implicat un singur fapt structurat.
5. Corelarea faptelor structurate cu regulile
Faptele structurate se coreleaz cu regulile la fel ca faptele nestructurate: prezena lor n BF
determin activarea regulilor, prin procesul de potrivire. Deosebirea care apare este dat de aceea
c ordinea faetelor nu are importan (n contrast cu cmpurile din faptele nestructurate, a cror
ordine conteaz n procesul de potrivire).
Exemplu:
S se scrie o regul care s afieze toate microprocesoarele de 8 bii, a cror putere este
strict mai mare dect 2 i pentru care faeta stare are valoarea depasit. Considerm c BF conine
fapte structurate de tip Microprocesor, conform definiiei anterioare.
(defrule R1
(Microprocesor
(nume $?n)
(bus 8)
(putere ?x&:(> ?x 2) )
(stare depasit) )
=>
(printout t ?n este un microprocesor depasit crlf) )
De observat cum tiparul din partea de condiie a regulii de mai sus conine att perechea de
paranteze corespunztoare faptului structurat, precum i perechile de paranteze corespunztoare
faetelor care sunt folosite n crearea condiiei respective. Nu este necesar ca ntr-un tipar dintr-o
regul s apar toate faetele unui fapt structurat, ci numai acele pentru care vrem s impunem
condiii de potrivire. Ordinea faetelor neavnd importan, regula de mai sus este echivalent cu
urmtoarea:
83
(defrule R2
(Microprocesor
(putere ?x&:(> ?x 2) )
(bus 8)
(stare depasit)
(nume $?n) )
=>
(printout t ?n este un microprocesor depasit crlf) )
n schimb, din punct de vedere a eficienei cele dou reguli de mai sus pot fi diferite (se va
ine seama de principiile de construire eficient a regulilor n CLIPS).
Nu exist nicio restricie privind tiparele referitoare la faptele structurate care pot fi folosite
la fel ca i tiparele pentru faptele nestructurate (pot fi folosite i mpreun cu acestea) i pot fi
folosite n condiii privind tergerea faptelor din BF, ca n exemplul urmtor.
(defrule R3
(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) )
Exerciiu Experimentai funcionarea regulii de mai sus, crend condiiile pentru activarea
ei. Explicai comportarea.
Noi posibiliti sunt create pentru faptele structurate prin folosirea comenzilor duplicate i
modify.
Exemplu:
S se scrie regula care s gseasc o pereche de microprocesoare respectnd condiia ca
primul s aib puterea mai mic sau egal cu 4, al doilea s aib puterea mai mare dect 4,
ambele s fie n tehnologia CMOS i s aib starea depasit. Pentru primul, dac faeta viteza este
dat ca numr, aceasta se va modifica, trebuind s devin cu 1 mai mic, iar pentru al doilea se
va mai introduce n BF un fapt similar, dar cu faeta tehnologie la valoarea NMOS i cu puterea
avnd vechea valoare plus 2.
(defrule R4
?a <- (Microprocesor
(tehnologie CMOS)
(stare depasit)
(viteza ?v)
(putere ?p1&:(<= ?p1 4) ) )
?b <- (Microprocesor
(tehnologie CMOS)
(stare depasit)
(putere ?p2&:(> ?p2 4) ) )
84
=>
(if (numberp ?v) then (modify ?a (viteza =(- ?v 1) ) ) )
(duplicate ?b (tehnologie NMOS) (putere =(+ ?p2 2) ) )
Exerciiu Experimentai funcionarea regulii de mai sus, crend condiiile pentru activarea
ei. Efectuai experimentul pentru ambele setri ale bistabilului privind faptele duplicat; explicai
ceea ce se ntmpl. Modificai regula n aa fel nct s nu mai apar vreun efect negativ.
6. Verificarea automat a restriciilor din faptele structurate
Unul din avantajele folosirii faptelor structurate, n comparaie cu cele nestructurate, este
acela c sistemul efectueaz n mod automat un control al corectitudinii definiiei i respectiv un
control al valorilor nscrise n faete, innd seama de restriciile impuse la definirea faptului
structurat. Exist dou variante de efectuare a acestei verificri: static i dinamic. Utilizatorul
poate seta tipul de verificare convenabil, fie folosind meniul Execution, opiunea Options i
fixnd valoarea pentru bistabilele Constraint Checking, fie folosind comanda:
(set-dynamic-constraint-checking {TRUE,FALSE})
sau
(set-static-constraint-checking {TRUE,FALSE})
Fr a intra n toate detaliile, dac verificarea este de tip static atunci ea se face numai la
ncrcarea programelor, n timp ce pentru cazul verificrii dinamice, aceasta se execut i n
timpul rulrii programelor. Pentru a explica modul de verificare sunt considerate urmtoarele
exemple ilustrative (se recomand i urmrirea lor experimental).
Exemplul 1 Fie urmtoarea definiie de fapt structurat:
(deftemplate Greseala (field abc (type FLOAT) (allowed-values 1 2 a) ) )
definiie care este greit prin aceea c determin dou restricii neconcordante n privina tipului
admis i a valorilor admise pentru faeta abc. Eroarea este semnalat chiar de la introducerea
definiiei, aceasta nefiind acceptat.
Exemplu 2 Fie urmtoarea definiie:
(deftemplate G1 (field mm (type INTEGER) (allowed-symbols A B) ) )
La introducerea ei se va semnala eroare privind neconcordana celor dou restricii folosite
i definiia nu este admis.
Exemplul 3 Fie urmtoarea definiie de fapt structurat:
(deftemplate fapt (field nume (type SYMBOL) ) (field val (allowed-values 1 2
3) ) )
La comanda (assert (fapt (nume 2))) se va semnala eroare datorit nerespectrii condiiei
de tip privind faeta nume. Faptul nu este introdus n BF dac este setat verificarea de tip static.
Aceasta se ntmpl i atunci cnd faptul respectiv este ncrcat dintr-un fiier. La comanda
(assert (fapt (val 5))) se semnaleaz eroare, cu aceeai explicaie ca n cazul anterior.
85
O comportare diferit, funcie de tipul setrii, apare la comanda (assert (fapt) ). Dac se
lucreaz cu verificarea static, atunci nu se semnaleaz nicio eroare; aceasta dei valoarea care se
atribuie pentru faeta val este nil, n conformitate cu regulile precizate anterior pentru fixarea
valorii unei faete care nu are specificarea default. Valoarea astfel obinut nu se ncadreaz n
valorile din lista allowed-values i aceast eroare este semnalat dac se lucreaz cu
verificarea dinamic. Este de menionat c i pentru verificarea dinamic faptul este introdus n
BF, eroarea respectiv fiind numai semnalat, rmnnd ca utilizatorul s ia msurile necesare.
Exemplul 4 Dac dintr-un fiier, sau de la nivel superficial se introduc urmtoarele dou
definiii:
(deftemplate A (field a (type INTEGER) (range 0 10) ) )
(defrule R5 (A (a 11) ) => )
atunci, indiferent de tipul setrii (trebuie doar s fie setat unul din cele dou tipuri de verificri
static/dinamic), se semnaleaz eroare pentru regula R5, datorit tiparului regulii care nu
respect cerina privind domeniul fixat pentru faeta a; n consecin, regula R5 nu este luat n
considerare (nu este introdus n BR).
Exemplul 5 Dac sunt introduse urmtoarele dou definiii:
(deftemplate Simbol (field val (type LEXEME) ) )
(defrule R6 (Simbol (val ?x&:(> ?x 0) ) ) => )
La fel ca n exemplul anterior, dac este setat un tip de verificare, se semnaleaz eroarea de
neconcordan a tipului valorii faetei val i a condiiei de verificat n regula R6, astfel c regula
nu este introdus n BR.
Exerciiu tergei toate informaiile din sistem (cu comanda clear), apoi reluai cele dou
comenzi (deftemplate i defrule) din exemplul anterior, n ordine inversat. Explicai
comportarea.
Exemplul 6 Fie urmtoarele dou definiii:
(deftemplate Fapt (field a1 (type STRING) ) (field a2 (type NUMBER) ) )
(defrule R7
(Fapt (a1 ?x) )
(Fapt (a2 ?x) )
=> )
Regula este greit prin aceea c tiparele ei nu vor putea fi niciodat satisfcute datorit
restriciilor impuse pentru cele dou faete ale faptului structurat. Aceast eroare este semnalat
i regula R7 nici nu este acceptat n BR, datorit erorii respective.
Exemplul 7 Dac se introduc urmtoarele dou definiii:
(deftemplate Fapt1 (field a1 (type INTEGER) ) )
(defrule R8 => (assert (Fapt1 (a1 =(read) ) ) ) )
i se activeaz regula R8, iar de la tastatur se introduce valoarea abc (adic un simbol), atunci
comportarea este diferit, n funcie de setarea n care se lucreaz. n cazul verificrii statice nu
se semnaleaz nicio eroare; n cazul celei dinamice se semnaleaz eroarea privind neconcordana
tipului valorii furnizate pentru faeta a1, fa de tipul impus pentru faet prin definiie; totui
86
faptul este introdus n BF, dar rularea se oprete, pentru a avertiza utilizatorul. Este exemplul
care ilustreaz deosebirea dintre comportarea static i cea dinamic.
7. Alte comenzi pentru faptele structurate; aspecte deosebite ale folosirii faptelor
structurate
Pentru manevrarea faptelor structurate exist o serie de comenzi ajuttoare. Astfel,
deftemplate fiind o definiie de construcie, vor putea fi folosite comenzile list-deftemplates,
ppdeftemplate (semnificaia i sintaxa este aceeai ca la list-deffacts i ppdeffacts) pentru
a lista toate definiiile deftemplate existente, respectiv pentru a lista coninutul unei anumite
definiii deftemplate, sau se va putea folosi, pentru aceleai scopuri, meniul Browse.
O definiie de fapt structurat se va putea terge cu comanda: (undeftemplate <numedeftemplate>), dup cum repetarea unei definiii deftemplate cu acelai argument numedeftemplate conduce la nlocuirea vechii definiii cu cea nou, ca la orice alt definiie de
construcie. n plus, tergerea i redefinirea unui fapt structurat se pot face numai dac faptul
respectiv nu este n funciune. Aceasta presupune s nu existe niciun fapt structurat cu numele
respectiv prezent n BF i nicio regul din BR s nu aib n partea de condiie sau n cea de
aciune vreo referire la faptul structurat respectiv.
Exemplu S presupunem c s-a introdus urmtoarea definiie de fapt structurat:
(deftemplate F (field a) )
Dac se d apoi comanda (assert (F) ), atunci tergerea definiiei faptului structurat F
sau redefinirea acestuia se pot face numai dup eliminarea din BF a faptului introdus prin
comanda assert.
De asemenea, dac dup definiia de mai sus se definesc urmtoarele dou reguli:
(defrule R9 (F) =>)
(defrule R10 => (assert (F) ) )
atunci redefinirea sau tergerea definiiei lui F nu mai este posibil. Mai nti trebuie terse cele
dou reguli i abia apoi se va putea redefini F sau terge definiiei sa.
O situaie deosebit este aceea cnd un acelai simbol CLIPS este folosit i ca prim
cmp ntr-un fapt nestructurat i ca argument nume-deftemplate ntr-un fapt structurat. O
asemenea situaie ar putea fi generat prin urmtoarele comenzi:
(assert (F) )
; se introduce in BF un fapt nestructurat.
(deftemplate F (field f1) (field f2) ) ; se definete i un fapt structurat cu numele F.
Aceast situaie determin o eroare i definiia faptului structurat cu numele F nu este
admis, atta timp ct n BF exist un fapt nestructurat care are primul cmp F. Explicaia este
aceea c de fapt n CLIPS faptele nestructurate sunt privite ca fapte structurate, avnd numele dat
de primul cmp i o singur faet de tip multicmp, implicit, care nu se definete explicit, i
care conine toate celelalte cmpuri ale faptului nestructurat. Rezult atunci c n exemplul
prezentat mai sus este ca i acum apar dou definiii contradictorii ale unui acelai fapt structurat,
cu numele F.
Exerciii
1. Rspundei la urmtoarele ntrebri:
Care sunt deosebirile dintre faptele structurate i cele nestructurate?
87
(deftemplate A (field a) )
(assert (A) (A) (A (a 1) ) )
88
LUCRAREA NR. 8
Realizarea unui program de planificare a aciunilor n CLIPS n varianta
nesimplificat
1. Enunul problemei
Universul de discurs la care se refer problema este prezentat in Fig. 1. Acesta a mai fost
folosit i ntr-un referat anterior, dar rezolvarea a fost una pentru un caz simplificat, n care
scopurile admise aveau o form simpl. Relund succint enunul, sigurele elemente de interes
sunt corpurile (blocurile) sub form de cuburi i robotul care le poate mica. Blocurile pot fi
plasate unul peste altul, pe podea, obinndu-se diferite configuraii; pe podea pot fi plasate
oricte blocuri. Programul CLIPS trebuie s gseasc planul de micri pentru robot astfel nct
o configuraia specificat prin starea final s fie obinut, cunoscndu-se starea iniial.
Programul trebuie s lucreze n cazul cel mai general, adic s gseasc planul pentru robot
indiferent de configuraiile luate n considerare n cele dou stri (numrul de stive i numrul de
blocuri).
C
K
D
Podea
Stare final
Stare iniial
89
Astfel, construcia deffacts necesar pentru cazul problemei din Fig. 1 este:
(deffacts Stare-initiala
(scop_stiva D G F E) (scop_stiva C
(stiva D C B A) (stiva F E) (stiva
K
G
M
K
L
L
A B)
M))
Pentru a pstra ca parte a rezolvrii cele patru reguli din rezolvarea anterioar (mutaredirecta, mutare-pe-podea, eliberare-sursa i eliberare-destinatie), trebuie concepute
cteva reguli care s converteasc faptele existente n noua form a programului n baza de fapte
(faptele scop_stiva) n fapte de tipul scopurilor simple, cele care puteau fi tratate de regulile
din forma anterioar. Prima dintre aceste reguli este:
(defrule Initiala1 (declare (salience 10))
(scop_stiva $? ?bl1 ?bl2 $?)
=> (assert (scop muta ?bl1 pe ?bl2)))
Aceast regul creeaz scopurile elementare pentru perechile de blocuri care trebuie s
apar suprapuse n starea final (evident, regula va fi activat i executat de mai multe ori,
pentru toate perechile de blocuri suprapuse). Aceast regul are ataat o prioritate mai mare
deoarece este necesar ca rularea programului s nceap cu regulile de iniializare, cele care s
pregteasc faptele necesare activrii celorlalte reguli. Mai este necesar o asemenea regul care
s fie dedicat blocurilor aflate n stive n starea final pe podea.
Exerciiu
Scriei regula de iniializare care creeaz scopul elementar pentru blocurile ce trebuie s
fie ntr-o stiv n starea final pe podea.
Dup rularea celor dou reguli de iniializare discutate mai sus se poate ntmpla ca n
baza de fapte s existe unele scopuri elementare redundante, produse de aceste reguli. Un
asemenea exemplu este dat de cazul blocurilor F i E din Fig. 1; pentru aceste dou blocuri nu
sunt necesare scopuri n baza de fapte deoarece acestea se gsesc deja n poziia final corect,
chiar din starea iniial. Pentru a ndeprta aceste fapte care reprezint scopuri elementare
redundante, deja ndeplinite, sunt necesare dou reguli specifice.
Exerciiu
Scriei cele dou reguli necesare eliminrii scopurilor redundante care exist n baza de
fapte dup aciunea regulilor de iniializare. Ca indicaie, trebuie manevrat cu atenie o situaie
precum aceea din Fig. 2 (acest caz este similar cu cel cunoscut n inteligena artificial sub
numele de anomalia lui Sussman dup numele celui care a studiat mecanismele de planificare).
Un principiu pe care trebuie s-l urmreasc programatorul n programarea bazat pe
reguli este i acela de a elimina din baza de fapte orice fapt care nu mai este necesar. De
exemplu, n problema studiat, faptele de tip scop_stiva nu mai sunt necesare dup ce au
furnizat informaiile necesare regulilor de iniializare. De aceea, o regul care va completa
programul pentru a elimina aceste fapte ce nu mai sunt necesare este:
(defrule Initiala3 "Regula de curatare a bazei de fapte"
(declare (salience 5))
?sc <- (scop_stiva
$?)
=> (retract ?sc) )
90
Stare iniial
podea
Stare final
92
Lucrarea nr. 9
Sistemul de meninere a consistenei bazei de fapte n CLIPS
Sistemul de meninere a consistenei (corectitudinii) bazei de cunotine este o tehnic de
inteligen artificial care faciliteaz efectuarea raionamentului nemonoton, adic a
raionamentului necesar n cazul n care nu avem cunotine complete asupra universului de
discurs, de-a lungul ntregii evoluii a acestuia. Raionamentul monoton se refer la cazul n care,
avnd cunotine complete asupra unei probleme, concluziile deduse sunt sigure i nu vor fi
invalidate n timp. Atunci cnd se efectueaz un raionament de tip nemonoton o concluzie
dedus poate fi invalidat ulterior i va trebui eliminat din baza de cunotine, mpreun cu
celelalte elemente deduse cu ajutorul concluziei ce s-a dovedit incorect, pentru a pstra
consistena bazei de cunotine; rezult c n acest caz baza de cunotine i poate i reduce
dimensiunea n anumite momente, de unde denumirea de raionament nemonoton.
n CLIPS consistena BF se poate pstra prin folosirea unor tipare speciale n partea de
condiie a regulilor, numite tipare logical. Sintaxa unui tipar logical este:
(logical <tipar>)
n partea de condiie a unei reguli pot fi folosite oricte tipare de tip logical, cu singura
restricie ca acestea s fie plasate pe primele poziii, putnd fi urmate de tipare obinuite. Efectul
folosirii tiparelor logical este acela c faptele care sunt introduse n BF prin partea de aciune a
regulii respective devin susinute logic de faptele care verific tiparul sau tiparele de tip
logical. Aceasta nseamn c atunci cnd faptul sau faptele de susinere sunt terse din BF i
faptele susinute sunt eliminate din BF, n mod automat.
Modul de funcionare a susinerii logice se va ilustra pe mai multe exemple.
Exemplul 1. Fie regula:
(defrule R1
(logical (a) )
(b)
=>
(assert (c) )
)
n partea de condiie a regulii R exist un tipar de tip logical i un tipar obinuit.
Efectul este urmtorul. Dac n BF exist faptele (a) i (b) atunci regula R1 este activat i, la
execuie, ea determin introducerea n BF a faptului (c). Dac ulterior din BF este ters faptul
(b), aceasta nu are nicio consecin asupra faptului (c); n schimb, la tergerea din BF a faptului
(a), sistemul va elimina n mod automat i faptul (c) din BF, deoarece acesta era susinut (prin
tiparul logical al regulii R1) de ctre faptul (a).
Verificarea se poate face dac, dup introducerea regulii R1, se dau comenzile:
(assert (a) (b) )
(run)
(retract 1)
cu condiia ca faptul (a) s fi intrat n BF la identificatorul f-1. Se va constata eliminarea
automat a faptului (c) din BF.
93
(defrule R3
(logical (a1) )
(logical (a2) )
=>
(assert (A1) ) )
BF numai atunci cnd i pierde susinerea din toate grupurile, aa cum se ilustreaz prin
urmtoarele dou reguli:
(defrule R7
(logical (a) )
(b)
=>
(assert (c) (d) ) )
(defrule R8
(logical (e)
(f) )
=>
(assert (c) ) )
(defrule R11
(y2)
=>
(assert (Y) ) )
Observai ceea ce se ntmpl dup comenzile urmtoare (n prealabil trebuie readus bistabilul
Fact Duplication pe FALSE, el fiind pe TRUE din exerciiul anterior):
(assert (y1) (y2) )
(run)
(retract 1)
unde am presupus c faptul (y1) a fost introdus n BF la identificatorul f-1.
95
Exemplul 9. Dac o regul care a generat susinerea logic pentru un fapt este tears din
BR, atunci susinerea logic respectiv este anulat. Aceasta nseamn c faptul nu va mai fi
ters din BF la pierderea susinerii logice, aa cum se ilustreaz n cazul urmtor.
(defrule R12
(logical (t1) )
=>
(assert (t2) ) )
La comenzile:
(assert (t1) )
(run)
(undefrule R12)
(retract 1)
dac f-1 este identificatorul la care se afl faptul (t1), vom constata c faptul (t2) nu este eliminat
din BF, susinerea sa logic anulndu-se odat cu tergerea regulii R12 din BR.
Exemplul 10. O regul n care exist un tipar logical creeaz o dependen numai n
legtur cu comenzile assert existente n partea ei de aciune, nu i cu comenzile de tergere a
faptelor din BF - retract. De exemplu, considernd regula:
(defrule R13
(logical (h1) )
?a <- (h2)
=>
(retract ?a) (assert (h3) ) )
la activarea i execuia ei faptul (h2) este scos din BF, iar (h3) este adugat. La o scoatere
ulterioar din BF a lui (h1), faptul (h3) i pierde susinerea logic i este ters din BF, dar nu
trebuie s ne ateptm c se produce o readucere automat a faptului (h2) n BF.
Exemplul 11. Susinerea logic se produce i n legtur cu faptele structurate, ca n cazul
urmtor:
(deftemplate F (field f) )
(defrule R14
(logical (F (f 1) )
(fa) )
=>
(assert (Aa) ) )
Exerciiu Verificai modul de manifestare a susinerii logice n cazul regulii de mai sus.
Exist o serie de comenzi ajuttoare pentru urmrirea susinerii logice. Acestea sunt
urmtoarele.
(dependencies <index-fapt>)
Drept argument se poate folosi indexul unui fapt din BF sau o variabil legat la indexul
unui fapt (un caz de folosire a unei variabile n acest scop este cel din exerciiul 4, de la
96
exerciiile recapitulative). Efectul este acela de listare a identificatorilor faptelor care asigur
susinerea logic pentru faptul precizat prin argument.
Exemplu Fie urmtoarele dou reguli:
(defrule R15
(logical (Z1) )
=>
(assert (Z4) ) )
(defrule R16
(logical (Z2) (Z3) )
=>
(assert (Z4) ) )
Este regula respectiv corect? Dac da, cnd este regula activat, ce se ntmpl dup
execuia ei i dup eliminarea din BF a unuia din cele dou fapte care au determinat activarea
(gsii rspunsurile pentru ambele situaii ale bistabilului Fact Duplication).
4. Fie urmtoarele definiii de construcii (de observat c numele unui fapt structurat este
acelai cu numele unei reguli, fr s existe vreo restricie 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 manifest susinerea logic n acest caz? Aceeai ntrebare pentru cazul n care n
partea de aciune a regulii M, aciunea duplicate este nlocuit cu una modify, adic partea
dreapt a regulii devine: (modify ?a (m 2) ) ).
5. Care este rezultatul care se obine dup efectuarea comenzilor (observai 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*)
6. Refacei programul de planificare a aciunilor unui robot care trebuie s mute blocuri
dintr-o configuraie iniial n una final, folosind tipare de tip logical. n acest sens se va pleca
de la ultima forma a acestui program, n care au fost folosite dou reguli muta-direct (date n
continuare), necesare pentru ca programul s furnizeze un rspuns corect indiferent de strategia
de rezolvare a conflictului care se folosete:
(defrule muta-direct1
(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 " e mutat pe blocul " ?bl2 crlf) )
(defrule muta-direct2
(declare (salience 1) )
?sc <- (scop muta ?bl1 pe ?bl2)
98
99
Bibliografie
Giarratano, J., and Riley, G. (1989). Expert Systems: Principles and Programming, PWSKENT, Boston.
100