Sunteți pe pagina 1din 102

Doru Adrian Pnescu

Carlos Mihai Pascal

Programare
bazat pe reguli
ndrumar de laborator

EDITURA

CONSPRESS

2013

Copyright 2013, Editura Conspress


EDITURA CONSPRESS
este recunoscut de
Consiliul Naional al Cercetrii tiinifice din nvmntul Superior

Lucrare elaborat n cadrul proiectului: "Reea naional de centre pentru


dezvoltarea programelor de studii cu rute flexibile i a unor instrumente
didactice la specializarea de licen i masterat, din domeniul Ingineria
Sistemelor"

Descrierea CIP a Bibliotecii Naionale a Romniei


PNESCU, DORU ADRIAN ; PASCAL, CARLOS MIHAI
Programare bazat pe reguli : ndrumar de laborator / Doru
Adrian Pnescu, Carlos Mihai Pascal Bucureti : Conspress, 2013
Bibliogr.
ISBN 978-973-100-258-3
004
Colecia Carte universitar

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. 2. Definirea regulilor n CLIPS .................14

Lucrarea nr. 3. Procesul de potrivire n CLIPS; variabilele n CLIPS ..........24

Lucrarea nr. 4. Realizarea unui program de planificare a aciunilor n CLIPS;


elemente de interdependen ntre baza de fapte i baza de reguli ................35

Lucrarea nr. 5. Realizarea testelor n CLIPS .................42

Lucrarea nr. 6. Tehnici de intrare i de ieire n CLIPS; elemente procedurale


i comenzi utilitare .....................................63

Lucrarea nr. 7. Fapte CLIPS de tip structurat ....................77

Lucrarea nr. 8. Realizarea unui program de planificare a aciunilor n CLIPS


n varianta nesimplificat ...............................89

Lucrarea nr. 9. Sistemul de meninere a consistenei bazei de fapte n CLIPS


........................................................................................................................93
Bibliografie .......................................................100
4

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

Fig. 1. Structura unui sistem expert


O regul este o afirmaie de forma:
Dac

<parte de condiie> atunci <parte de aciune>

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)

De observat caracterul de generalitate al cunotinelor coninute n regula (R); este vorba


despre o situaie valabil n general n cazul unui proces tehnologic din industria cimentului.
Dac n baza de fapte se gsesc la un moment dat faptele care afirm: granulaie-material este
mare, curent-motor-grila1 este 10A, mecanism-grila1 este n funciune, atunci regula (R)
va fi activat, adic va fi selectat pentru declanare (execuie). Motorul de inferene este cel care
are rolul de a determina legturile logice dintre reguli i fapte; astfel, el identific toate regulile

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

cunotine, fr a interveni asupra motorului de inferene. n programarea clasic modificrile


pot fi fcute de obicei numai de cel care cunote att ntreg algoritmul de rezolvare, ct i
mecanismele de control ale limbajului folosit.
att ca rezultat al separrii cunotinelor, ct i prin folosirea unor tehnici adecvate de
reprezentare a cunoaterii (capitol distinct al inteligenei artificiale - IA), este posibil
construirea bazei de cunotine ntr-o form declarativ (afirmaii asupra a ceea ce este
adevrat la un moment dat). Din aceast form declarativ, trecerea n forma procedural, cea
necesar calculatorului, se face n mod automat, prin intermediul interpretorului sau
compilatorului mediului de programare destinat construirii SE. Aceasta este o facilitate att
pentru programator, ct i pentru utilizator, deoarece baza de cunotine apare ntr-o form
apropiat de limbajul natural. De exemplu, faptul care atest c mecanismul grilei 1 este n
funciune poate fi scris n limbajul CLIPS, (unul din limbajele folosite pentru construirea SE),
n forma:
(mecanism-grila1 in-functiune)
Singurul element al sintaxei CLIPS sunt parantezele care delimiteaz faptul, coninutul
acestuia putnd fi ales ntr-un mod suficient de liber de programator, astfel nct s se apropie ct
mai mult de limbajul natural.
Pentru a realiza un SE exist mai multe abordri n funcie de instrumentele software de
care dispune programatorul. n principiu, trebuie realizate cele dou componente care apar n fig.
1, adic baza de cunotine (cu cele dou subsisteme ale sale: baza de fapte i baza de reguli) i
motorul de inferene. Aceasta va fi situaia n cazul n care programatorul folosete un limbaj de
programare general. Chiar i n acest caz, n crearea SE sunt mai utilizate aa zisele limbaje de
programare de IA, care introduc mai puine restricii de sintax i sunt mai uor de folosit n
realizarea bazei de fapte i a celei de reguli (nu este totui imposibil dezvoltarea unui SE n C,
de exemplu); un asemenea limbaj de IA este LISP (LISt Processing). Dezavantajul acestei
variante este acela c programatorul trebuie s construiasc ambele componente ale SE. O
variant mai bun din acest punct de vedere este aceea n care se folosete un mediu de
programare destinat SE, mediu care are deja motorul de inferene realizat, astfel c
programatorului i rmne s realizeze numai baza de fapte i cea de reguli. Asemenea medii
sunt CLIPS, PROLOG. Dezavantajul n aceast a doua abordare este acela c utilizatorul nu
poate interveni asupra motorului de inferene dect n msura n care mediul respectiv i permite.
Totui, mai ales pentru folosirea SE n aplicaii industriale, aceasta este varianta preferat,
deoarece motoarele de inferene realizate n diferite medii de programare au caracteristici (vitez
de lucru, memorie ocupat, siguran n funcionare) pe care greu le poate obine un programator
care i construiete un motor de inferene propriu.
2. Prezentare general a mediului de programare CLIPS
Mediul CLIPS este un instrument de programare destinat construirii SE. Denumirea este
un acronim de la C Language Integrated Production System (numele de sistem de producie
este cel folosit iniial pentru programarea bazat pe reguli, metod din care s-au dezvoltat SE).
Cteva caracteristici ale CLIPS sunt:
folosete un interpretor;
conine un motor de inferene bazat pe strategia nainte;
folosete programarea bazat pe reguli, avnd i un modul destinat programrii
orientate pe obiecte;
poate fi rulat att sub sistemul de operare DOS, ct i sub WINDOWS, UNIX, etc.
conine un depanator de programe.
7

3. Interaciunea cu mediul CLIPS


O posibilitate de a interaciona cu mediul CLIPS este de a transmite o comand de la
nivel superficial (top level). Se ajunge la nivel superficial dup lansarea interpretorul CLIPS,
prin comanda adecvat. De ndat ce a aprut prompterul CLIPS>, o comand CLIPS poate fi
transmis spre evaluare.
Comenzile CLIPS sunt de urmtoarele tipuri.
1. Apelul unei funcii
Funciile se scriu n CLIPS n forma prefixat, fiecare apel al unei funcii trebuind s fie
plasat ntr-o pereche de paranteze. Interpretorul evalueaz funcia respectiv, cu argumentele ei
i afieaz rezultatul evalurii.
De exemplu, calculul sumei 7 + 5 se va scrie n CLIPS:
(+ 7 5)
Observaie
Dac se dau mai multe comenzi una dup alta, far a da Enter, numai prima dintre ele
este luat n considerare.
2. Definiia unei construcii
Are drept efect crearea unei noi construcii, care ine seama de definiia respectiv. Se
obine astfel posibilitatea de construire a faptelor i regulilor dintr-un SE.
3. Numele unei variabile globale
n CLIPS se pot folosi variabile globale; dac utilizatorul transmite drept comand
numele unei variabile globale, interpretorul determin valoarea acelei variabile la momentul
respectiv i o afieaz.
4. O constant
Dac utilizatorul transmite drept comand o constant, atunci interpretorul afieaz
constanta respectiv.
Pentru a iei de sub interpretorul CLIPS se folosete comanda: (exit), sau din meniul
File comanda Exit.
4. Tipuri de constante (date primitive) n CLIPS
a) Numr
a1) ntreg - reprezentat intern ca un ntreg C lung.
Exemple: 72; +53; -2.
a2) Real (float) - se reprezint n dubl precizie; numrul de cifre semnificative
depinde de calculatorul pe care se afl interpretorul. Se admite scrierea cu punct zecimal
i cea cu mantis i exponent.
Exemple: -15.09; 273E3; -32.4e-4.
b) Simbol
Un simbol este o secven de caractere ce ncepe cu un caracter ASCII tipribil i este
urmat de zero sau mai multe caractere ASCII tipribile, cu urmtoarele excepii:
un simbol nu va ncepe cu unul din caracterele: ~, <, |, &, $, ?, +, -, (, ), , ;.
Explicaia este legat de faptul c toate aceste caractere introduc situaii speciale n CLIPS,
care vor fi explicate ulterior i de aceea un simbol nu poate ncepe cu ele.
8

un simbol nu va putea conine niciunul din caracterele: <, |, &, (, ), , ~, ;. Toate


aceste 8 caractere, mpreun cu spaiul, tab-ul i sfritul de linie, constituie delimitatori
(separatori) n CLIPS.
CLIPS face distincie ntre literele mari i cele mici.
Exemple de simboluri CLIPS: abc, A1, @2!?A.
c) ir de caractere
Acesta este o succesiune de zero sau mai multe caractere, incluse ntre ghilimele. Dac
vrem s includem ntr-un ir de caractere i ghilimelele trebuie s folosim caracterul de control \
("backslash") naintea ghilimelelor. Dac un ir de caractere trebuie s conin \ atunci acesta
trebuie dublat. ntr-un ir de caractere poate apare i spaiul, fritul irului fiind marcat de
ghilimele.
Exemple de iruri de caractere: ab1, a:\\user\\a.clp.
O dat primitiv CLIPS (numr, simbol sau ir de caractere) se numete i cmp CLIPS
sau constant CLIPS. Cmpurile CLIPS sunt separate prin delimitatori, care sunt cei amintii mai
sus. Atunci cnd utilizatorul introduce de la nivel superficial mai multe cmpuri succesiv, n
aceeai linie (fr a da "Enter"), interpretorul ia n considerare numai primul cmp.
5. Convenii de notaie
Pentru a nelege sintaxa CLIPS facem cteva convenii de notaie; acestea nu sunt
elemente ale sintaxei CLIPS, ci doar convenii care vor facilita nelegerea limbajului.
Vom nota comanda Enter cu .
Orice nu este inclus intre < >, [ ], { }, este un cuvnt cheie i trebuie introdus ca
atare.
Perechea [ ] indic un element opional.
Exemplu: (exemplul [1]). Aceast succesiune va putea fi scris n program (exemplul
1) sau (exemplul).
Perechea < > indic necesitatea substituirii cu un element (unul singur) de tipul indicat.
Exemplu: (exemplul <ntreg>). O variant corect n program poate fi: (exemplul
21).
Succesiunea << >> indic necesitatea unei substituiri cu zero sau mai multe apariii ale
unui element de tipul specificat. Dac este vorba de mai multe apariii, acestea vor fi separate
prin spaiu.
Exemplu: (exemplul <<ntreg>>). Variante corecte n program pot fi: (exemplul -2);
(exemplul 23 145 -3); (exemplul).
Succesiunea <<< >>> indic necesitatea unei substituiri cu una sau mai multe apariii
de tipul specificat (nu zero apariii).
Exemplu: (exemplul <<<ntreg>>>). Variante corecte n program pot fi: (exemplul
20); (exemplul 23 145 -3).
Perechea { } indic faptul c unul singur din elementele dintre acolade va trebui s fie
folosit.
Exemplu: (exemplul {1, 2, abc}). Variante corecte n program pot fi: (exemplul 1);
(exemplul 2); (exemplul abc).
Exerciii
1. Rspundei la ntrebrile:
Ce este un SE i care sunt componentele acestuia ?
Care sunt deosebirile ntre un SE i un program convenional ?
Care sunt cele dou abordri privind construirea unui SE ?
Care sunt tipurile de cmpuri CLIPS ?
9

2. tiind c operaiile aritmetice se simbolizeaz n CLIPS prin +, -, *, / , c acestea


pot avea orici operanzi, i c nu exist o prioritate a operaiilor, rezolvai n CLIPS urmtoarele
calcule:
a) 25 + (17 - 2) : (4 + 1) x 10.
b) 17,3 x [15,5 : (13,2 - 1,5 - 10,3) : 3] x (100 : 2,14).
3. Precizai numrul de cmpuri din urmtoarele exemple:
a) abc
b) -12!vb|ab+c
c) \a bc 12\ .
6. Construirea bazei de fapte n CLIPS
6.1 Forma faptelor
Un fapt CLIPS este o list de unul sau mai multe cmpuri. n CLIPS o list se
delimiteaz prin perechea de paranteze ( ); deci un fapt este unul sau mai multe cmpuri
(constante) incluse ntre paranteze. Conform conveniilor de notaie avem:
Fapt := (<<<cmp>>>).
Exemple de fapte:
(componente-calculator "cpu" memorie tastatura)
(Ion este tatal-lui Vasile)
(temperatura punct_A 123.5)

(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

Mai exist i unele aspecte de optimalitate, referitoare la interdependena ntre forma


faptelor din baza de fapte i regulile din baza de reguli, ct i la ocuparea memoriei. Legat de
acest ultim aspect, se poate ca ntr-un fapt numele relaiei s nu fie nscris ntr-o form extins, ci
n una concis, aceasta determinnd o reducere a numrului de cmpuri, ca n exemplul urmtor;
de la faptul:
(este temperatura-aer-secundar 1000)
se ajunge la:
(temperatura-aer-secundar 1000).
Observaie
Faptele introduse n acest paragraf se numesc fapte CLIPS nestructurate; exist i fapte
de tip structurat care au o sintax specific. Ca o restricie a sintaxei CLIPS, primul cmp dintrun fapt nestructurat trebuie s fie o constant de tip simbol.
6.2 Adugarea i tergerea faptelor din baza de fapte
Toate faptele cunoscute la un moment dat de interpretorul CLIPS sunt meninute ntr-o
colecie - baza de fapte (BF), care n CLIPS se mai numete i list de fapte (fact list) sau
memorie de lucru. Exist mai multe posibiliti de a introduce fapte n BF.
a) Introducerea faptelor de la nivel superficial sau dintr-o regul prin comanda assert
Se pot introduce unul sau mai multe fapte n BF de la nivel superficial prin comanda:
(assert <<<fapt>>>)
Exemple de folosire a acestei comenzi sunt:
(assert (nume Ion) )
(assert (presiune punct_A 215) (temperatura punct_A 100.5) (stare alarma))

(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

director, va fi necesar eventual s precizm i calea, innd seama de regulile de scriere a


irurilor de caractere. De exemplu, dac deffacts-ul de mai sus se geste nscris n fiierul
fisier1.clp, atunci, de sub interpretorul CLIPS, putem ncrca acest fiier prin comanda (am
presupus c a fost necesar precizarea cii):
(load d:\\work\\fisier1.clp)
Mai simplu, putem folosi direct comanda Load, din meniul File. Mai menionm c ntr-un fiier
pot fi nscrise oricte comenzi de definire de construcii, dup cum putem pstra construcii n
mai multe fiiere, pe care s le ncrcm atunci cnd este necesar. Un efect invers fa de load
are comanda:
(save <nume-fisier>)
unde argumentul trebuie s fie de tip ir de caractere sau simbol. Efectul este de salvare n
fiierul respectiv a tuturor definiiilor de construcii care au fost introduse n sistem pn la acel
moment.
Faptele din BF pot fi terse, atunci cnd ele nu mai sunt adevrate sau necesare n BF, cu
ajutorul comenzii:
(retract <<<contor>>>)
unde contor trebuie s fie un ntreg pozitiv, reprezentnd contorul din identificatorul faptului
care trebuie ters. Exemple de utilizare a acestei comenzi sunt:
(retract 1) (retract 5 23 25)
Observaii
1. Dac se cere tergerea unui fapt care nu exist (locul respectiv este deja gol), se
afieaz eroare.
2. Exist i urmtoarea form a comenzii retract: (retract *), care determin tergerea
tuturor faptelor din BF.
Exerciii
1. Rspundei la urmtoarele ntrebri:
Care sunt deosebirile dintre comenzile "deffacts" i "assert" ?
Cte fapte se pot afla ntr-o BF, dup rularea unui program, ntre identificatorii f-10 i f-15 ?
Cum poate utilizatorul vedea primele 25 fapte aflate ntre identificatorii f-15 i f-80 ?
2. Explicai rezultatul urmtoarei comenzi, dat la nivel superficial:
(assert (aaa1) (bbb2) ) (assert (ccc3) )
3. Concepei tiparele de fapte pentru urmtoarele cazuri i introducei n BF cteva exemple de
fapte care s respecte tiparele stabilite (introducerea faptelor s se fac pentru unele de la nivel
superficial, pentru altele dintr-un fiier creat cu un editor de texte).
a) reprezentarea sub form de fapte a mulimilor;
b) reprezentarea sub form de fapte a relaiilor de rudenie;
c) reprezentarea prin fapte a diferitelor figuri geometrice plane;
d) reprezentarea sub form de fapte a universului de discurs pentru o celul flexibil de
fabricaie (se numete univers de discurs o poriune din mediul nconjurtor pentru
care avem sau vrem s realizm un model de reprezentare a cunoaterii; un model de
reprezentare a cunoaterii este un model al realitii, care poate fi introdus n memoria
unui calculator, n scopul efecturii de raionamente).
13

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

[(declare (salience <ntreg>) )]

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


comentariu-opional - trebuie s fie un ir de caractere i va fi folosit pentru a documenta
programul; aici se vor nscrie eventualele explicaii necesare n legtur cu regula;
partea stng a regulii poate conine o declaraie privind prioritatea ataat regulii
(declaraie de tip salience); argumentul care apare trebuie s fie un numr ntreg cuprins
ntre -10000 i 10000 i stabilete prioritatea ataat regulii; declaraia respectiv poate lipsi din
definiia regulii, caz n care regula va primi implicit prioritatea zero, adic o prioritate medie.
tipar - este un element al prii de condiie a regulii i are forma unei liste cu una sau mai
multe poziii (deci conform definiiei pentru o list n CLIPS, un tipar este delimitat de
paranteze);
aciune - este o comand CLIPS, care va fi de tip funcie i va fi executat atunci cnd
regula este executat; totalitatea aciunilor unei reguli constituie partea dreapt a regulii; aa cum
apare n sintaxa dat mai sus, partea de condiie este separat de cea de aciune prin succesiunea:
=>
Pentru fiecare regul trebuie folosit o comand defrule; dac o comand defrule se
folosete succesiv cu acelai nume de regul, atunci ultima definiie o nlocuiete pe cea
anterioar. Regulile se introduc n BR prin folosirea comenzilor defrule la nivel superficial,
sau prin nscrierea acestor comenzi n fiiere i ncrcarea prin load.
O regul din BR se poate gsi n una din strile: inactivat, activat i n execuie.
O regul este activat dac toate tiparele ei pot fi potrivite pe faptele din BF din
momentul respectiv; n caz contrar regula este inactivat. Aceasta nseamn c partea de condiie
a regulilor este n CLIPS sub form de condiie AND. De exemplu, fiind dat regula R introdus
prin definiia:
(defrule R

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

CLIPS i posibilitatea de a aloca regulilor o prioritate de tip dinamic (Meniul Execution,


Options, Salience Evaluation), caz n care pasul de rezolvare a conflictului este mai complicat;
acest aspect nu este prezentat n acest referat. Cel de-al doilea criteriu de rezolvare a
conflictului se refer la o anumit strategie pe care o folosete motorul de inferene pentru a
ordona regulile n agend; fr a intra n detalii, exist apte asemenea strategii, care pot fi fixate
din meniul Execution, opiunea Options, Strategy. Pasul 3 se numete de execuie.
3. Prin repetarea ciclului de mai sus se produce o evoluie a BF: dup fiecare execuie a
unei reguli BF se poate modifica, deoarece n majoritatea cazurilor aciunile regulilor sunt i de
tipul celor care afecteaz BF (de exemplu, assert, retract). Dup efectuarea pasului 3, BF
putnd fi modificat, pasul 1 are consisten, n sensul c noi reguli pot fi satisfcute, n timp ce
altele nu mai sunt satisfcute.
3. Urmrirea agendei; proprietatea de refracie
n timpul evoluiei unui SE apare frecvent ca necesar urmrirea agendei i n acest sens
exist n CLIPS comanda:
(agenda)
Rezultatul va fi afiarea coninutului agendei, adic a regulilor aflate n agend, n forma:
nr

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

n care nr indic prioritatea ce a fost atribuit regulii respective, iar f - ij sunt identificatorii
faptelor care au 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

(printout t (facts) crlf)


2. Scriei o regul care s afieze un mesaj de pornire a funcionrii unui SE atunci cnd
n BF se gsete un anumit fapt de ncepere a lucrului.
7. Documentarea programelor n CLIPS; comenzi pentru depanare n CLIPS
O prim posibilitate de documentare n ceea ce privete regulile i faptele (numai pentru
cele introduse prin deffacts) este aceea de a folosi parametrul opional (cel sub form de ir de
caractere) ce apare n comenzile de definire de construcii respective. O a doua posibilitate este
aceea de a folosi caracterul rezervat ;. Astfel un comentariu ncepe cu ; i se ncheie cu . Tot ce
apare dup ; nu este luat n considerare de interpretor. Exist o deosebire ntre comentariul scris
ntre ghilimele ntr-o definiie de construcie i cel care ncepe cu ; . Aceasta se refer la
comportarea n raport cu comenzile de tip pretty print (ppdefrule, ppdefacts): la afiarea
coninutului unei construcii cu o asemenea comand, comentariul scris ntre ghilimele apare, n
timp ce acela prevzut dup ; nu.
Exerciiu
Verificai explicaia de mai sus pe un exemplu, obinut prin urmtoarele comenzi (vei
respecta ntocmai scrierea din referat, pe rnduri):
(defrule R1 Acesta e exemplul meu => ; el merge grozav (assert (a))
(assert (b)) )
(ppdefrule R1)
(reset)
(run)
Concluzia dup acest exemplu este aceea c n programele CLIPS vom folosi pentru
documentare mai ales comentariul inclus ntre ghilimele, deoarece acela introdus prin ; se pierde.
Exerciiu
Cnd poate fi util un comentariu care este introdus prin ; ?
n ceea ce privete depanarea, o posibilitate este de a urmri BF i agenda prin comenzile
facts, agenda sau prin deschiderea ferestrelor respective.
O comand util n depanarea programelor este:
(watch {facts, rules, activations, compilations, statistics, all})
Mai sunt i ali civa parametri care pot interveni n comanda watch, dar care nu se
refer la BF i BR (urmrirea variabilelor globale, a obiectelor, a funciilor). Comanda watch
are drept efect urmrirea anumitor elemente ale programului CLIPS n timpul lucrului cu
interpretorul. Dac parametrul folosit n comand este all atunci vor fi urmrite toate
elementele. Efectul de dezactivare se poate obine prin comanda:
(unwatch {facts, rules, activations, compilations, statistics, all})
n care dac parametrul folosit este all dezactivarea se face pentru toate elementele, iar dac se
folosete un alt parametru (de exemplu, (unwatch facts) ), atunci dezactivarea se face pentru
elementul respectiv. De observat c, att la activarea urmririi ct i la dezactivarea acesteia,
dac ne intereseaz efectul asupra a dou elemente, atunci comanda va trebui transmis de dou
ori, cu folosirea parametrilor corespunztori. De altfel, comanda watch cu parametrii ei poate
fi selectat mai uor din meniul Execution.
20

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:

1. ncrcai dintr-un fiier, sau de la nivel superficial urmtoarele trei reguli:


(defrule unu => (assert (doi) ) )
(defrule doi (doi) => (assert (trei) ) )
(defrule trei (trei) => )
2. Transmitei comenzile:
(set-break unu)
(set-break doi)
(set-break trei)
(run)
(run)
(run)
3. Explicai rezultatele obinute.
Dup cum s-a mai spus, un efect de oprire dup rularea unui anumit numr de reguli se
poate obine i prin comanda run, dat cu un argument corespunztor; n plus, n meniul
Execution exist i opiunea Step care are un efect de rulare pas cu pas (este echivalent lui (run
1), cu observaia c pasul poate fi i schimbat la o valoare mai mare ca 1, n opiunea
Preferences, din acelai meniu Execution).
Exerciii
1. Rspundei la urmtoarele ntrebri:
Cum pot fi introduse regulile n BR?
Care este deosebirea ntre BR i agend?
Care este ciclul de lucru al motorului de inferene n CLIPS?
Dup comanda (run 10) cte execuii de reguli s-ar putea produce?
Care sunt situaiile n care se oprete rularea n CLIPS?
Ce nseamn refracia n domeniul programrii bazate pe reguli?
Cnd este activat o regul care are zero tipare?
Cte reguli se execut simultan n CLIPS?
Ce posibiliti sunt pentru documentarea programelor n CLIPS? Explicai diferena
ntre ele.
Ce posibiliti pentru depanare ofer CLIPS?
2. Verificai funcionarea programului CLIPS format din urmtoarea regul:
(defrule r (a) => (printout t Ura! crlf) (refresh r) )
Experimentul se va face crend condiiile ca regula s fie activat i efecund rularea cu
comanda (run 25).
3. Scriei programul CLIPS (aceasta nseamn BF i BR) care s materializeze
urmtoarea funcie binar:
F ( x , y ,z )= x y zUx y z

22

4. Scriei programul CLIPS care s simuleze funcionarea automatului secvenial


specificat prin urmtorul tabel de tranziie:
x
0
1

S0
S1
S2

S1
S1
S0

S2
S3
S2

S3
S3
S0

unde am notat cu x variabila de intrare i cu Si strile automatului.


5. Agenii software pot fi clasificai n urmtoarele categorii, n funcie de proprietile
pe care le ndeplinesc:

Ageni reactivi sunt cei care reacioneaz la schimbrile din mediu.


Ageni planificatori sunt cei care sunt capabili s determine un plan de rezolvare a unui
scop primit.
Ageni de tip hibrid sunt cei care reacioneaz att la schimbrile din mediu, ct i la
scopurile primite, fiind capabili s rezolve ambele tipuri de situaii.

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

(defrule R2 (fapt ?x) => (assert (a ?x) ) )


(defrule R3 (fapt ?x 12) => (assert (b ?x) ) )
Dei n cele dou reguli s-a folosit aceeai variabil ?x, ntre regulile respective nu va exista
nicio legtur, pentru c o variabil rmne legat numai pe durata de aciune a regulii.
3. O variabil poate fi folosit de mai multe ori n partea de aciune a unei reguli
(respectnd condiia de a fi deja legat) i poate fi folosit i n operaii diferite, ca n exemplul
urmtor:
(defrule R4 (este-in-stare-de-functiune calculatorul ?nume-calculator) =>
(assert (poate fi utilizat ?nume-calculator) )
(printout t Gata de lucru ?nume-calculator crlf ) )
4. O aceeai variabil poate fi utilizat n mod repetat n partea de condiie a unei reguli,
pentru a verifica anumite condiii prin procesul de potrivire, ca n exemplul urmtor:
(defrule R5 determinare-autor-curs - se determina daca un cadru didactic
are curs tiparit
(cadrul-didactic ?nume tine disciplina ?obiect)
(manualul ?obiect aparut in anul ?an are ca autor pe ?nume)
=>
(printout t cadrul didactic ?nume a realizat un manual la disciplina
?obiect in anul ?an crlf) )
Aceast regul va fi activat dac n BF exist dou fapte care s satisfac condiiile:
primul fapt trebuie s aib 5 cmpuri;
al doilea fapt trebuie s aib 11 cmpuri;
primul fapt trebuie sa aib ca prim cmp simbolul cadrul-didactic, iar pe poziia cmpurilor
trei i patru simbolurile tine i respectiv disciplina;
al doilea fapt trebuie s aib pe poziia nti simbolul manualul, pe poziiile 3 - 5 simbolurile
aparut, in, anul, iar pe poziiile 7 - 10 simbolurile are, ca, autor, pe;
cmpul 2 din primul fapt trebuie s coincid cu cmpul 11 din al doilea fapt;
cmpul 5 din primul fapt trebuie s coincid cu cmpul 2 din al doilea fapt.
Rezult astfel cum prin folosirea repetat a variabilelor n partea de condiie a regulilor se
pot crea efecte de potrivire complexe.
5. Toate variabilele care au fost folosite n aceast seciune au fost variabile simple,
locale i specificate; celelalte tipuri de variabile vor fi prezentate n seciunile urmtoare.
Exerciii
1. Introducei regula de mai sus (R5) ntr-un fiier, mpreun cu un grup de fapte care s
satisfac partea de condiie a regulii, n aa fel nct s obinei mcar dou activri ale acesteia.
Verificai rezultatele prin rulare.
2. Dac n BR exist regula:
(defrule R6
(este-bunic-al ?nume ?nume)
=>
(assert (are-nepot ?nume pe ?nume) ) )
iar n BF exist faptele:

25

(este-bunic-al Ion Vasile), (este-bunic-al Ioan Ion), (este-bunic I I),


(este-bunic-al 12 12), (este-bunic-al Ion Ion)
cte plasri n agend ale regulii R6 se obin? (explicai de ce).
3. Dac n BR exist regula:
(defrule R7
(tatal-lui ?copil este ?tata)
(tatal-lui ?tata este ?bunic)
=>
(printout t Bunicul lui ?copil
)

este ?bunic crlf)

iar n BF ncrcai coninutul urmtorului grup de fapte:


(deffacts relatii-rudenie
(tatal-lui Ion este Mihai)
(tatal-lui Vasile este Mihai)
(tatal-lui Mihai este Andrei)
(tatal-lui Gh este 10)
(tatal-lui Maria este 10)
(tatal-lui 10 este 20)
(tatal-lui Ion este Ion) )
cte activri ale regulii R7 vei obine dup resetare? (explicai de ce).
4. Cu referire la una din observaiile din referatul anterior, concepei regula R8 i scriei
grupul de fapte care s determine urmtoarea situaie a agendei:
0
0
0
0

R8
R8
R8
R8

f - 1, f - 2
f - 1, f - 1
f - 2, f - 1
f - 2, f - 2

2. tergerea faptelor prin folosirea variabilelor


Adesea este necesar ca un fapt s fie ters din BF n timpul lucrului unui program, prin
aciunea unei reguli. Un exemplu n acest sens ar fi regula:
(defrule R9 => (retract 0) )
n urma execuiei regulii obinndu-se tergerea faptului de la identificatorul f - 0. O asemenea
aciune va fi foarte rar folosit ntr-un SE, pentru c ea presupune cunoaterea exact a
contorului din identificatorul faptului care se dorete a fi ters, ceea ce este dificil, innd seama
de caracterul dinamic al BF. n schimb exist posibilitatea de a folosi variabile n partea de
condiie a regulilor i de a obine tergerea unui fapt al crui coninut se cunoate, fr a trebui s
fie precizat identificatorul la care se afl acel fapt. Exist n acest sens operatorul special <care permite legarea valorii contorului din identificatorul unui fapt la o variabil, n partea de
condiie a unei reguli; astfel legat, variabila va putea fi apoi folosit n partea de aciune, ntr-o
operaie de tergere a faptului respectiv. O asemenea situaie este ilustrat n exemplul urmtor:

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)

ncrcai fiierul i rulai programul; explicai funcionarea.


Exist i variabile multiple specificate; acestea vor fi de forma: $?<nume-variabil>,
unde nume-variabil trebuie s fie un simbol care s respecte aceleai condiii ca la variabilele
simple, specificate. Variabilele multiple se vor lega la fel ca variabilele simple, dar se vor putea
lega la 0, 1, 2, ..., n cmpuri. Atunci cnd se afieaz valoarea unei variabile multiple, valoarea
respectiv apare ntre paranteze.
Exemplu
Regula anterioar poate fi modificat, astfel ca s afieze elementele din fiecare list
gsit. Se obine forma:
(defrule R18
(lista ?nume $?elemente)
=>
(printout t S-a gasit lista cu numele ?nume continand elementele $?elemente
crlf) )
Mai facem observaia c variabilele simple i multiple, specificate sau nu, pot fi folosite
mpreun, ceea ce va permite verificarea unor condiii de potrivire complexe. n ceea ce privete
decizia de folosire a unei variabile multiple specificate sau a uneia nespecificate, aceasta se ia
dup acelai criteriu ca la variabilele simple.

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

(defglobal ?*g* = 9.8 ?*pi* = 3.14 ?*nume* = Ion)


n acest exemplu s-au definit trei variabile globale care s-au i iniializat (legat), conform sintaxei
cerute n comanda defglobal.
Observaii
1. ntr-o definiie defglobal, n operaia de legare trebuie lsat un spaiu nainte i dup
semnul =.
2. O variabil global se poate lega n definiia ei i la o valoare multicmp, ca n
exemplul urmtor:
(defglobal ?*nume* = (mv-append Ion Ionescu) )
3. Variabilele globale nu pot fi folosite n partea stng a regulilor pentru a se potrivi pe
cmpurile din fapte. De exemplu, urmtoarea regul este eronat:
(defrule R22 (fapt ?*y*) => )
n schimb variabilele globale pot fi folosite n partea stng a regulilor n componena testelor
asupra cmpurilor (aspect discutat n referatul urmtor) i pot fi folosite n partea de aciune a
regulilor, ca n exemplul urmtor:
(defglobal ?*g* = 9.8)
(defrule R23 (timp ?t) => (printout t Viteza este (* ?*g* ?t) crlf) )
4. O variabil global se poate lega la o nou valoare fa de cea din definiia defglobal
prin folosirea funciei bind (cea descris n seciunea anterioar) folosit la nivel superficial
sau n interiorul unei reguli, n partea de aciune. Dac valoarea nu este specificat n funcia
bind, atunci variabila global este adus pe valoarea implicit, cea din definiia ei.
Exemplu
Transmitei urmtoarele comenzi:
(defglobal ?*A* = 12.3)
?*A*
(bind ?*A* Ura!)
?*A*
(bind ?*A*)
?*A*
Exerciiu
Construii o regul n care n partea de aciune s schimbai valoarea unei variabile
globale i verificai funcionarea.
5. Exist o serie de comenzi care ne permit s urmrim variabilele globale. Astfel,
comanda:
(list-defglobals)
32

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

Care sunt faptele pe care le poate terge n partea de aciune o regul?


Este corect regula:
(defrule R26 ?a <- (a) => (retract ?a) (bind ?a 10) (printout t ?a
crlf) )
Dac nu este corect, care sunt erorile?
Sunt corecte regulile urmtoare?
(defrule R27
?a <- (fapt)
?b <- (fapt-adr ?a) => (retract ?b))
(defrule R28
(fapt ?a)
?a <- (fapt-nou

?b) => (retract ?a))

Dac da, realizai condiiile pentru activarea lor.


Cnd va fi activat regula urmtoare ? Ce rezultat va afia la execuie?
(defrule R29 (a ?x) (bind ?x 1) => (printout t ?x crlf) )
Cte variabile nespecificate pot fi folosite ntr-o regul?
Trebuie scris o regul care s gseasc toate listele cu 3 elemente. Care din
urmtoarele variante este mai bun? De ce?
(defrule R30 (lista ?nume ? ? ?) => (printout t S-a gasit o lista cu 3 elemente
crlf) )
(defrule R31 (lista ?nume $?) => (printout t S-a gasit o lista cu 3 elemente crlf) )
Ce efect are comanda reset asupra variabilelor globale?
2. Cu referire la exemplul de la nceputul seciunii 3, scriei o regul care s determine
toi studenii din anul V, de la facultatea de mecanic; regula va afia numele studenilor gsii i
domiciliul lor.
3. Cu referire la exemplul i exerciiul din seciunea 4, scriei regulile care s determine:
dou liste ce au acelai element pe poziia a doua;
dou liste ce au aceleai elemente;
dou liste ce au un element comun, indiferent de poziia acestuia.
4. Introducei o definiie de variabil global i scriei programul CLIPS cu urmtoarea
comportare: dac n BF exist faptul (schimbare) atunci valoarea variabilei globale va trebui s
devin simbolul DA, iar dac n BF exist faptul (pastrare) atunci variabila global respectiv
trebuie adus la valoarea din definiia ei (facem presupunerea c faptele (schimbare) i (pastrare)
nu pot exista simultan n BF).
5. Construii un program CLIPS (BF i BR) care s conin informaii cu privire la unele
relaii de rudenie dintr-o familie i pe baza acestora s se poat determina prin reguli relaiile
unchi/mtu.
6. O instalaie este supravegheat de 10 senzori. Fiecare senzor poate fi n starea 0 sau n
starea 1. Scriei un program CLIPS (BF i BR) care s determine un mesaj de avertizare dac 3
sau mai muli senzori sunt pe 0. Programul trebuie s se comporte astfel nct i atunci cnd sunt
pe 0 mai mult de 3 senzori mesajul de avertizare s nu fie afiat dect o singur dat.

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

Fig. 1. O problem n lumea blocurilor

Mediul de lucru (universul de discurs)


este cel din Fig. 1. Singurele elemente de interes
sunt blocurile (corpuri avnd form de tip
paralelipiped) i robotul care le mic. Blocurile
sunt aezate unele peste altele, pe podea, n
diverse configuraii. Pentru o prim soluie a
problemei vom face o serie de ipoteze
simplificatoare.
Acestea sunt:

un singur bloc va fi stivuit deasupra altuia;


robotul poate mica un singur bloc o dat; ne intereseaz numai nivelul superior al sistemului
de comand a robotului, fr detaliile privind materializarea fiecrei micri pe care acesta o
efectueaz;
pe podea pot fi puse oricte blocuri;
scopul dat robotului va fi acela de obinere a anumitor configuraii (anumitor stive);
va fi admis numai un scop simplu, exprimabil printr-o singur condiie; pentru situaia din
Fig. 1, un asemenea scop ar fi: blocul C s fie deasupra blocului E.
nu va fi admis un scop care este deja ndeplinit (de exemplu, pentru cazul din Fig. 1 nu se va
admite ca scop: blocul D s fie deasupra blocului E); aceast condiie restrictiv va putea fi
eliminat prin folosirea testelor n CLIPS.

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.

n exprimarea de mai sus am folosit notarea variabilelor din CLIPS.


2) Deoarece podeaua are o situaie deosebit fa de blocuri (poate primi deasupra ei
oricte blocuri), vom prevedea o regul distinct pentru mutarea unui bloc pe podea, numit
Mutare-pe-podea.
Dac scopul este de a muta blocul ?sursa pe podea i blocul ?sursa este liber
atunci mut blocul ?sursa pe podea.
n acest fel regula Mutare-direct va fi de folosit n cazul n care sursa i destinaia sunt blocuri,
iar regula Mutare-pe-podea va fi de folosit atunci cnd destinaia nu este un bloc, ci podeaua.
3) O regul care s permit eliberarea unui bloc care nu este liber i care printr-un scop
existent urmeaz a fi mutat este urmtoarea (o numim regula Eliberare-surs):
Dac scopul este de a muta blocul ?x i blocul ?x nu este liber
i blocul ?y este pe blocul ?x atunci creeaz scopul de a muta blocul ?y pe podea.
n legtur cu regula de mai sus este de observat c destinaia blocului ?x nu intereseaz n
aceast regul i de aceea ea nu apare, iar faptul c blocul ?x nu este liber nseamn c el nu este
n vrful stivei sale. Regula scris, conform felului n care lucreaz un program bazat pe reguli,
se va aplica n mod repetat atunci cnd mai multe blocuri sunt deasupra unui bloc, crend toate
scopurile necesare (regula va fi activat n mod recursiv).
4) O regul similar cu aceea de mai sus este cea de eliberare a destinaiei unui scop
(regula Eliberare-destinaie):
Dac scopul este de a muta ceva pe blocul ?x i blocul ?x nu este liber
i blocul ?y este pe blocul ?x atunci creeaz scopul de a muta blocul ?y pe podea.
n aceast regul nu a interesat care este blocul care urmeaz a fi mutat pe blocul ?x.
Dup ce a fost stabilit forma principial a regulilor putem trece la pasul al doilea, acela
de fixare a formei faptelor prin care s se descrie starea iniial din problema respectiv. innd
seama de Fig. 1, de felul n care am conceput cele patru reguli preliminare, rezult ca necesare
urmtoarele tipuri de fapte.
a) Poziia relativ a blocurilor o vom preciza prin fapte respectnd urmtorul ablon:
(pe <element> <element>)
Exemple de folosire a acestui tip de fapte pentru problema noastr sunt: (pe A B) (pe F
podea) (pe nimic D).

36

b) Cuvintele nimic, podea, trebuie s aib un neles deosebit fa de cuvintele care


reprezint blocurile, pentru a nu putea fi interpretate ca blocuri. De aceea, ca msur de
precauie, vom preciza blocurile prin fapte de forma:
(este-bloc <nume-bloc>)
n problema n lucru vom avea: (este-bloc A), (este-bloc B), .a.m.d.
c) n regulile stabilite anterior este necesar precizarea scopurilor; n acest sens vom
folosi fapte de forma:
(scop muta <bloc> pe <element>)
De exemplu, scopul din problema propus va fi de forma: (scop muta C pe E). n toate
aceste tipare am folosit o serie de cuvinte cu rol ajuttor, astfel ca BF s fie mai uor de urmrit
i neles.
Trecem acum la pasul al treilea al metodei, acela n care innd seama de cele stabilite n
cele dou etape anterioare, ct i de sintaxa limbajului, scriem forma final a regulilor.
Regula Mutare-direct, scris n CLIPS, este:
(defrule mutare-directa aceasta regula intra in executie cand sursa si destinatia sunt
libere si destinatia este un bloc
?scop <- (scop muta ?bloc1 pe ?bloc2)
(este-bloc ?bloc1)
(este-bloc ?bloc2)
(pe nimic ?bloc1)
?stiva1 <- (pe nimic ?bloc2)
?stiva2 <- (pe ?bloc1 ?bloc3)
=>
(retract ?scop ?stiva1 ?stiva2)
(assert (pe ?bloc1 ?bloc2) (pe nimic ?bloc3) )
(printout t blocul ?bloc1 este mutat pe blocul
?bloc2 crlf) )
Se pot face urmtoarele observaii n legtur cu aceast regul. Ea are mai multe roluri.
S determine momentul cnd o micare de mutare a unui bloc poate fi fcut de ctre robot, n
conformitate cu scopurile existente n BF i cu condiiile necesare pentru efectuarea micrii.
Astfel primul tipar al regulii verific existena scopului care va declana micarea. Tiparele
doi i trei se refer la condiia ca valorile pstrate n variabilele ?bloc1 i ?bloc2 s se refere
n adevr la blocuri, iar urmtoarele dou conin condiiile ca blocurile care sunt implicate n
micare (blocul surs i cel destinaie) s fie n vrful stivelor din care fac parte. Ultimul tipar
al regulii are importan pentru procesul de actualizare a BF.
S efectueze o actualizare a BF. De altfel, acesta este un principiu general; ori de cte ori un
SE/program bazat pe reguli determin o modificare n universul de discurs, va trebui fcut i
actualizarea corespunztoare n BF, n ceea ce privete modelul mediului (modelul de
reprezentare a cunoaterii) aflat n BF. n acest fel, BF va pstra n permanen situaia
curent, corect, din universul de discurs. Concret, n exemplul considerat, actualizarea BF se
refer la tergerea faptelor care nu mai sunt actuale: scopul care a declanat regula i care
fiind ndeplinit trebuie eliminat din BF i faptele care se refer la starea anterioar a celor
dou stive care sunt afectate de micarea efectuat (stiva din care se ia blocul avnd numele n
variabila ?bloc1 i stiva n care se pune acest bloc, peste blocul ?bloc2). Pe lng tergerea
faptelor care nu mai trebuie s existe n BF, actualizarea se refer i la introducerea a dou noi
37

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

3. Implementarea unei stive n CLIPS


Datorit simplitii problemei nu vom mai parcurge n mod explicit cele trei etape ale
metodei date n seciunea 1. O stiv va fi reprezentat n BF folosind urmtorul tipar:
(stiva <<element-stiva>>)
Odat stabilit forma acestui fapt vor fi uor de scris regulile care s realizeze operaiile
de prelucrare a stivei - introducere i scoaterea de elemente din aceasta. Deoarece numrul de
elemente din stiv nu se cunoate a priori, n scrierea regulilor vom folosi variabilele multiple.
Pentru regula de introducere n stiv considerm c va exista un fapt de declanare a acestei
operaii, de forma:
(push <valoare>)
unde cmpul al doilea va conine valoarea ce se dorete a se aduga n stiv. Astfel, regula
(scris direct n CLIPS) rezult de forma:
(defrule push-valoare regula de introducere in stiva
?adresa <- (push ?valoare)
?stiva <- (stiva $?rest)
=>
(retract ?adresa ?stiva)
(assert (stiva ?valoare $?rest))
(printout t S-a introdus in stiva valoarea: ?valoare crlf) )
Pentru operaia de extragere din stiv trebuie s concepem dou reguli care s intre n
aciune n cele dou cazuri posibile: se cere o extragere din stiva ce conine mcar un element i
respectiv cazul n care se cere extragerea dintr-o stiv vid. Pentru prima situaie regula este:
(defrule pop-stiva-plina

regula de extragere dintr-o stiva ce contine macar un


element
?adresa <- (pop)
?stiva <- (stiva ?valoare $?rest)
=>
(retract ?adresa ?stiva)
(assert (stiva $?rest))
(printout t Valoarea extrasa din stiva este: ?valoare crlf) )

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.

acestor tipuri de teste, CLIPS mai ofer i alte posibiliti prezentate n

1. Operaii logice asupra cmpurilor dintr-un tipar


n partea de condiie a unei reguli, asupra cmpurilor unui tipar se vor putea efectua
operaiile logice I, SAU, NEGARE. Le vom ilustra folosind un exemplu utilizat i anterior: o
BF conine informaii cu privire la studenii unei universiti, prin fapte respectnd urmtorul
tipar:
(student

<nume>

<facultatea>

<an-de-studii>

<grupa>

<domiciliul-stabil>)

(1)

a) Operaia de negare se simbolizeaz prin: ~ (tilda).


Regula care determin toi studenii de la facultatea de AC, care nu au domiciliul n Iai
este:
(defrule R3 (student ?nume AC ? ? ~Iasi)
=> (printout t ?nume este student la AC si nu are domiciliul in Iasi crlf) )
n regula respectiv nu ne-au interesat valorile cmpurilor n care este precizat anul de studii i
grupa, astfel c am folosit pentru poziiile respective variabila simpl nespecificat.
b) Operaia SAU se simbolizeaz prin: | (bara vertical).
Regula care determin toi studenii care au domiciliul n Iai sau Pacani este:
(defrule R4 (student ?nume AC ? ? Iasi | Pascani)
=> (printout t ?nume este student la AC si are domiciliul in Iasi sau Pascani crlf) )
cu observaia c nainte i dup simbolul | poate fi sau nu lsat un spaiu, deoarece | este el nsui
un delimitator.
c) Operaia I se simbolizeaz prin: & (ampersand).
O operaie de conjuncie ntre dou constante, efectuat pentru un cmp al unui tipar,
determin o eroare de sintax, ntruct conduce la obinerea unei reguli care nu va fi niciodat
activat, adic o regul inutil. De exemplu, regula urmtoare:

42

(defrule R5 (student ?nume AC ? ? Iasi & Pascani) => )


ar fi activat dac n BF ar putea exista un fapt de forma (1) care s aib pe ultimul cmp i
valoarea Iasi i valoarea Pascani, ceea ce evident este imposibil.
Totui operaia I este de utilizat n testele asupra cmpurilor tiparelor n urmtoarele dou
tipuri de situaii.
a) n cazul n care ne intereseaz s realizm un test asupra unui cmp al unui tipar, iar
valoarea cmpului trebuie s fie i pstrat ntr-o variabil, pentru a mai putea fi folosit n
partea de condiie i/sau de aciune, vom conecta variabila cu testul efectuat prin operatorul &.
Asemenea situaii sunt ilustrate prin urmtoarele dou reguli:
(defrule R6 (student ?nume AC ? ? ?x & ~Iasi)
=>
(printout t ?nume este student la AC si nu are domiciliul in Iasi, ci in localitatea ?x
crlf))
(defrule R7 (student ?nume AC ? ? ?x & Iasi | Pascani)
=> (printout t ?nume este student la AC si are domiciliul in ?x crlf) )
Regula R6 determin toi studenii de la AC care nu au domiciliul n Iai i, spre deosebire de
regula R3, n partea de aciune afieaz localitatea de domiciliu, deoarece aceasta a fost pstrat
n variabila ?x. Regula R7 determin toi studenii de la AC care au domiciliul n Iai sau
Pacani, la fel ca regula R4, dar n plus afieaz localitatea de domiciliu, a crei valoare este
pstrat n variabila ?x.
Un alt exemplu de folosire este urmtorul, n care regula R8 determin doi studeni de la
facultatea de AC, care nu locuiesc n Iai, sunt din grupe diferite, din anul V, afind numele
studenilor respectivi i grupele din care fac parte:
(defrule R8
(student ?nume1 AC V ?x ~Iasi)
(student ?nume2 AC V ?y&~?x ~Iasi)
=> (printout t ?nume1 de la grupa ?x si ?nume2 de la grupa ?y
satisfac cerintele impuse crlf) )
De observat c n aceast regul operatorul de negare a fost folosit i n faa unei variabile
(apare ~?x n tiparul al doilea); o asemenea utilizare presupune ca variabila respectiv s fie deja
legat i semnificaia este aceea de a se admite o potrivire la o valoare diferit de valoarea
variabilei. De exemplu, faptele urmtoare:
(student Ionescu AC V 1401 Vaslui)
(student Popescu AC V 1402 Brasov)
activeaz regula R8, cu variabilele ?x i ?y legate la valorile 1401 i respectiv 1402, n timp ce
faptele:
(student Ionescu AC V 1401 Vaslui)
(student Popescu AC V 1401 Brasov)
nu activeaz regula, deoarece nu se respect condiia ca valoarea lui ?y s fie diferit de valoarea
lui ?x.
n concluzie, n cazul tratat la punctul a) operatorul & asigur legarea unei variabile ntr-un
tipar al unei reguli, legare care s urmreasc i satisfacerea unei anumite condiii.
43

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

n CLIPS predicatele vor fi folosite n reguli, n partea de condiie a acestora. Pentru


aceasta va fi utilizat un tipar de test, realizat conform sintaxei:
(test

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

primul cmp din ambele fapte este simbolul data;

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

Schimbarea fa de varianta anterioar este aceea c am folosit operatorul de negare asupra


cmpurilor tiparelor, adic ~. Deoarece ~ nu poate fi urmat de un predicat a fost necesar s
folosim operatorul : n faa predicatului.
(defrule R20
(data
(test

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

=>

Aceast regul va fi activat, de exemplu, de perechea de fapte: (a 40 5)(b -28). (Explicai


de ce).
2. Atunci cnd n expresia n faa creia se afl = apare o variabil, aceasta trebuie s fie o
variabil deja legat. O regul greit din acest punct de vedere este urmtoarea:
(defrule R26
(a =(+ ?x 3))
50

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

Dac n BF sunt informaii cu privire la dimensiunile unor dreptunghiuri, n sensul c


pentru fiecare dreptunghi exist dou fapte, unul preciznd mrimea lungimii i altul a limii,
atunci regula de mai sus determin toate dreptunghiurile pentru care mrimea limii este cu 8
mai mare ca lungimea, sau egal cu 20 - lungimea. De exemplu, faptele (dreptunghi 1 lungime
15) i (dreptunghi 1 latime 5) vor activa regula. n aceast regul = a fost folosit ca predicat
de testare a egalitii a dou valori numerice.
Alte trei variante echivalente de scriere a regulii de mai sus sunt prezentate n continuare.
(defrule R29
(dreptunghi ?identificator lungime ?x)
(dreptunghi ?identificator latime ?y&: (= ?y (+ 8 ?x)) |: ( = ?y (- 20 ?x)) )
=>
(printout t S-a gasit un dreptunghi cu identificatorul ?identificator crlf
care satisface conditiile cerute: lungime = ?x latime = ?y crlf)
)
Aici = s-a folosit tot ca predicat, dar nu ntr-un tipar de test ca n varianta anterioar, ci ntr-un
tipar obinuit, determinnd o restricie asupra variabilei ?y, mpreun cu operatorul : . O variant
apropiat de aceasta este:
(defrule R30
(dreptunghi ?identificator lungime ?x)
(dreptunghi ?identificator latime ?y&: (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)
)
51

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

(printout t Deconecteaza electricitatea crlf) )


Observaii
1. Datorit folosirii condiiei OR, aceast regul este echivalent cu trei reguli.
Exerciii
a. Scriei cele trei reguli echivalente cu R44.
b. Cum se poate obine ca n exemplul cu regula R44 s se realizeze pe lng tergerea din
BF a faptului (tensiune on) i tergerea celorlalte fapte care au determinat execuia regulii?
2. Fr a avea nici un avantaj, n loc de
(defrule R45
(a)
(b) =>
)
putem scrie:
(defrule R46
(and (a)
(b) )

=> )

Operaia de negaie asupra unui tipar


Aceast operaie permite scrierea regulilor care s fie activate atunci cnd un anume fapt
lipsete din BF. De exemplu, fie regulile:
(defrule R47
(faza informare-operator)
(alarma ?tip)
=>
(printout t Exista in sistem alarma ?tip crlf) )
(defrule R48
(faza informare-operator)
(not (alarma ?) )
=>
(printout t Nu exista in sistem nici o alarma crlf) )
Dac BF conine, de exemplu, faptul (faza informare-operator) i faptul (alarma foc),
atunci regula R47 este activat, iar R48 nu este activat. Aceasta din urm va fi activat atunci
cnd n BF exist faptul (faza informare-operator), i n plus, datorit tiparului (not (alarma ?)
), va fi activat numai dac n BF nu exist nici un fapt cu dou cmpuri, avnd primul cmp
simbolul alarma. n acest fel, regulile R47 i R48 sunt mutul exclusive (nu pot fi prezente
simultan n agend). n concluzie, sintaxa operaiei de negare asupra unui tipar este:
(not

<tipar-simplu sau tipar-compus>)

unde tipar-compus este unul dezvoltat cu ajutorul operaiilor OR, AND.


Exemplu
Regula care determin cel mai mare numr dintr-o colecie de fapte de forma:
56

(numar <valoare-numeric>) este:


(defrule R49
(numar ?x)
(not (numar ?y&:(> ?y ?x)))
=>
(printout t Maximum = ?x crlf)
)
Observaii
1. Este important locul plasrii unei operaii not n irul de tipare din partea stng a unei
reguli. De exemplu, fie urmtoarele dou reguli:
(defrule R50
(pereche ?x
(pereche ?y
(not (triplet
=>)

?y)
?z)
?x ?x

(defrule R51
(not (triplet
(pereche ?x
(pereche ?y
=>)

?x ?x
?y)
?z)

?z))

?z))

i fie n BF urmtoarele fapte:


f-0
f-1
f-2

(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

?x)) (test (> ?x 4)) => )


?x&:(> ?x 4))) => )
?x)) (fapt ?y&:(> ?y ?x)) => )
?x)) (fapt ?x&:(> ?x 4)) => )

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

De exemplu fie urmtoarele dou reguli:


(defrule R61
(exists (data ?x)
(data1 ?x) )
=> (printout t Succes crlf) )

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

Cnd trebuie folosit operatorul de restricie asupra cmpurilor tiparelor : ?

Rescriei regula R70 n aa fel nct s nu mai apar tiparul de test.

Care sunt cele trei utilizri ale lui = n CLIPS ?


Cnd este activat regula urmtoare:
(defrule R71
(data ?x&:(integerp ?x) ?y&:(numberp ?y) )
(data ?z&=(+ ?x 1) =(+ ?z 1)|=(- ?y 1) ) => )
Este corect regula:
(defrule R72 (data ?x =(+ ?x ?y) ?y) => )
Cnd este necesar folosirea operaiei SAU ntre tiparele unei reguli ?
61

Cnd este necesar folosirea operaiei I ntre tiparele unei reguli ?


Cnd este necesar folosirea operaiei de negaie asupra unui tipar al unei reguli ?
2. Scriei regulile echivalente regulilor R61 i R63 folosind operaia de negare asupra
tiparelor.
3. ntr-o BF se gsesc informaii cu privire la dimensiunile unor figuri geometrice plane
(triunghiuri, ptrate, dreptunghiuri, etc.). Scriei programul CLIPS care s determine suma
perimetrelor figurilor geometrice asupra crora exist informaii n BF.
4. Scriei programul CLIPS (se vor concepe faptele i regulile necesare) care s determine:
a) intersecia a dou mulimi;
b) reuniunea a dou mulimi;
c) diferena a dou mulimi.

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)

Pentru citirea unor informaii dintr-un fiier se va folosi comanda:


(read

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

Argumentul nume-logic are aceeai semnificaie ca n printout. Rezultatul pe care l determin


funcia format este un ir de caractere format din elementele-de-ieire. Dac dorim ca
elementele-de-ieire s fie transmise numai pe terminal vom folosi ca nume-logic nil; n cazul n
care numele-logic folosit este t, atunci pe terminal rezultatul apare de dou ori: o dat ca efect al
transmiterii pe terminal i a doua oar ca rezultat al funciei format. Argumentul ir-de-control
trebuie s fie de tip ir de caractere i va indica felul n care vor fi aezate elementele-de-ieire.
Drept element-de-ieire poate fi orice expresie CLIPS care s determine ca rezultat un singur
cmp (n particular poate fi o constant CLIPS). Argumentul ir-de-control const dintr-un text i
bistabile de control, totul inclus ntre ghilimele, pentru a forma un singur cmp de tip ir de
caractere. Textul va fi transmis nemodificat, iar bistabilele fixeaz felul n care vor fi aezate
elementele-de-ieire. n acest sens fiecare bistabil corespunde unui element-de-ieire (primul
bistabil corespunde primului element-de-ieire, al doilea bistabil se refer la al doilea elementde-ieire, .a.m.d.). Bistabilele vor fi precedate de semnul % i vor avea forma general:
%-M.Nx
cu urmtoarea semnificaie. Semnul minus (-) este opional: dac este prezent alinierea
elementului-de-ieire se face la stnga, iar n caz contrar alinierea se face la dreapta. n locul
literelor M i N vor fi nite numere, acestea avnd un caracter opional. M specific numrul de
poziii alocate elementului-de-ieire, n sensul c vor fi utilizate cel puin M caractere (dac
elementul-de-ieire are mai mult de M caractere formatul se va expanda n mod corespunztor).
Dac M ncepe cu cifra 0 atunci locurile libere din faa elementului-de-ieire (numai cele din
fa, ceea ce presupune o aliniere la dreapta i numai dac elementul-de-ieire este un numr)
sunt completate cu zerouri, iar n caz contrar se folosete spaiul pentru locurile ce rmn libere
n fa sau dup elementul-de-ieire. N specific numrul de poziii alocate prii zecimale a
elementului-de-ieire; dac N nu apare, atunci n mod implicit, se folosesc pentru partea
zecimal a unui numr real un numr de 6 poziii. Parametrul x trebuie s fie ntotdeauna
prezent, putnd fi una din valorile: d elementul-de-ieire trebuie s fie un numr, care va fi
transmis ca ntreg lung (n acest caz N nu are nici o importan); f elementul-de-ieire va fi un
numr real, n virgul mobil; e - elementul-de-ieire va fi un numr real, reprezentat ca putere a
lui 10, cu mantis i exponent; g elementul-de-ieire trebuie s fie un numr, care va fi
transmis n formatul cel mai general i care este i cel mai scurt; o elementul-de-ieire trebuie
s fie un numr, care va fi convertit n octal, fr semn (n acest caz N nu are nici o importan);
x elementul-de-ieire trebuie s fie un numr, care va fi convertit n hexazecimal, fr semn (n
acest caz N nu are nici o importan); s elementul-de-ieire va fi transmis ca ir de caractere;
dac transmiterea se face ntr-un fiier atunci n acesta elementul-de-ieire apare fr ghilimele,
n schimb rezultatul afiat pe terminal va fi ntre ghilimele (n acest caz N nu are nici o
importan); n determin trecerea la o linie nou.
Exerciiu
Verificai funcionarea comenzii format pe urmtoarele exemple:
(format

Exemplu %n)
67

(format nil Exemplu %n)


(format nil Numarul este %10d 1200)
(format nil Numarul este %-10d 1200)
(format nil Numarul este %010d 1200)
(format nil %10.3f 120.34)
(format nil %10.3e 120.34)
(format nil %10.4e 120.34)
(format nil %10.6g %5o %3x 120.34 90 255)
(format nil %10s abcdef)
(open w1.txt w1 w)
(format w1 Ura! %10s %n %2s %10.3f %n Traiasca A1 14.345)
(close)
Pentru citirea unei date, funcia read prezentat anterior are dezavantajul c nu permite
dect preluarea unui singur cmp. Atunci cnd vrem s prelum o linie ntreag (mai multe
valori), fie de la tastatur sau dintr-un fiier, vom folosi funcia urmtoare:
(readline

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

R8 regula de citire a numelui si prenumelui


=>
(printout t Care este numele si prenumele ? crlf)
(assert (nume =(readline) ) ) )

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

la comanda (load-facts f1.fap) cele trei fapte vor fi adugate n BF.


Pentru salvarea faptelor existente la un moment dat n BF exist comanda:
(save-facts

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

Determin introducerea unui fapt n BF pe baza irului de caractere primit ca argument.


irul de caractere trebuie s nceap cu ( i s se termine cu ). Spaiile din interiorul irului
de caractere sunt delimitatorii care determin cmpurile din faptul ce se creeaz. Dac dorim ca
un cmp al faptului ce se formeaz s fie de tip ir de caractere atunci trebuie s folosim naintea
ghilimelelor caracterul de control \ (back-slash). Un exemplu de utilizare este urmtorul
(verificai experimental):
(str-assert

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

O funcie pentru prelucrarea valorilor de tip ir de caractere este:


(str-cat

<<element>>)

Aceasta construiete un singur ir de caractere din elementele care sunt parametri n


comanda respectiv; elementele furnizate ca parametri pot fi constante CLIPS, variabile simple
legate, sau funcii ce determin ca rezultat un singur cmp. O funcie similar exist pentru
concatenarea constantelor de tip simbol:
(sym-cat

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

<valoare-multicmp> <indice1> <indice2>)

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

este ?bunic crlf) )

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)

Observm respectarea tipicului pentru definirile de construcii din CLIPS i asemnarea


cu definirea faptelor nestructurate prin deffacts.
Faptul structurat care se definete va putea fi identificat prin argumentul numedeftemplate; acesta trebuie s fie un simbol. Comentariu are aceeai form ca i n toate celelalte
definiii de construcii din CLIPS, adic este un ir de caractere.
Expresia (1) trebuie neleas n sensul c un fapt structurat poate fi definit cu oricte
faete cu un singur cmp i oricte faete multicmp, aezate n orice ordine. n definiia de mai
sus faeta cu un cmp trebuie s respecte urmtoarea sintax:
(field <nume-faet> <<specificare-faet>>)
sau
(slot <nume-faet> <<specificare-faet>>)
iar faeta multicmp:
(multifield <nume-faet> <<specificare-faet>>)
sau
(multislot <nume-faet> <<specificare-faet>>)
77

Argumentul nume-faet trebuie s fie un simbol. Prin argumentele specificare-faet se


vor preciza caracteristicile informaiei care poate fi pstrat ntr-o faet a unui fapt structurat.
Exist mai multe tipuri de specificri de faet, ele putnd fi mprite n dou categorii:
specificri pentru valoarea cea mai ateptat i specificri de restricionare.
A.
Specificarea de valoare cea mai ateptat este cea care permite n CLIPS
efectuarea raionamentului implicit. Astfel, dac se tie valoarea cea mai plauzibil pentru o
faet, aceast valoare va fi dat ntr-o specificare default. Totodat, specificarea default are
rolul de a furniza valoarea unei faete atunci cnd utilizatorul nu d o valoare explicit pentru
faeta respectiv. Sintaxa acestei specificri este:
(default <valoare-ateptat>)
cu observaia c argumentul valoare-ateptat va avea un singur cmp, sau 0 n cmpuri, dup
cum specificarea respectiv face parte dintr-o faet cu un cmp, respectiv una multicmp.
Drept valoare ateptat se poate folosi i ?NONE. Cnd o faet are specificarea (default
?NONE), utilizatorul este obligat ca de fiecare dat cnd introduce un fapt structurat n BF s
precizeze valoarea faetei respective.
Exemplu:
(deftemplate microprocesor acesta este un fapt structurat
(field nume)
(field magistrala (default 8)) )
(assert (microprocesor (nume 8080) ) (microprocesor (nume 80286) (magistrala 16) ) )
n acest exemplu s-a definit faptul structurat cu numele microprocesor, avnd dou faete:
nume i magistrala. Pentru faeta magistrala s-a introdus i o specificare default. Aceasta
determin ca, atunci cnd utilizatorul nu precizeaz valoarea explicit a acestei faete, sistemul s
introduc de la sine valoarea dat n default, adic valoarea 8 n cazul nostru. Dac pentru
faeta magistrala este dat o valoare explicit, atunci valoarea din default este ignorat. Toate
acestea se pot verifica prin comanda assert propus n exemplul de mai sus. Este de observat
c faptele structurate se introduc n BF tot prin comanda assert; ntr-o asemenea comand
trebuie manevrate cu grij parantezele: fiecare fapt structurat trebuie inclus ntre paranteze i
fiecare faet dintr-un fapt structurat (precizat prin numele ei) trebuie i ea inclus ntr-o
pereche de paranteze.
B. Specificrile de restricionare sunt de patru feluri: de tip, de valori permise, de
domeniu i de cardinalitate.
Specificarea de restricionare de tip are sintaxa:
(type <<<tip>>> )
unde argumentul tip poate fi unul din urmtoarele: INTEGER, FLOAT, NUMBER, SYMBOL,
STRING, LEXEME (tipurile trebuie scrise n mod obligatoriu cu litere mari) sau poate fi
?VARIABLE. Atunci cnd ntr-o faet apare o asemenea specificare, informaia care va putea fi
pstrat n faet este restricionat la tipul indicat. Semnificaiile sunt: INTEGER nseamn
restricionare la numere ntregi, FLOAT la numere reale, NUMBER la orice fel de numere,
SYMBOL restricionare la simboluri CLIPS, STRING la iruri de caractere, LEXEME la
simboluri sau iruri de caractere, iar dac se folosete ?VARIABLE atunci nu se produce nicio
restricionare de tip (orice tip este admis, situaia fiind aceeai cu aceea n care specificarea de tip
78

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

Pe baza acestor dou definiii putem da comanda:


(assert (microprocesor1 (nume I80286)) (microprocesor1 (nume 80286)) )
79

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

Exerciiu Fie urmtoarea definiie de fapt structurat:


(deftemplate Microprocesor
(multifield nume (type LEXEME) )
(field bus (allowed-values 1 4 8 16 32) )
(field viteza (type STRING NUMBER) )
(field tehnologie (allowed-symbols CMOS NMOS PMOS) )
(field putere (type NUMBER) (range ?VARIABLE 10) )
(field stare (allowed-values actual depasit) (default actual) ) )
Explicai coninutul faptului care se introduce n BF la comanda: (assert (Microprocesor) ).
4. Introducerea faptelor structurate n baza de fapte
Introducerea faptelor structurate n BF se face prin aceleai procedee ca i pentru faptele
nestructurate: prin comenzi assert (date la nivel superficial sau din partea de aciune a
regulilor), respectiv prin comenzi deffacts (date la nivel superficial sau ncrcate din fiiere).
Deosebirea fa de faptele nestructurate este accea c pentru a putea folosi un fapt structurat ntro operaie de introducere n BF este necesar ca n prealabil acesta s fi fost definit printr-o
definiie deftemplate. Aceasta, fiind definiie de construcie, poate fi dat la nivel superficial
sau nscris n fiiere. Aa cum se vede i din exemplele anterioare, ntr-o comand assert (i la
fel stau lucrurile i pentru comanda deffacts) se va prevedea, ntr-o pereche de paranteze,
numele faptului structurat i 0 n din faetele acestuia, unde n este numrul de faete care apare
la definiia faptului structurat respectiv. Faetele care sunt prevzute sunt acelea pentru care vrem
s fixm o valoare diferit de valoarea default, n timp ce faetele care nu sunt prezente vor lua
n mod implicit valoarea default. Fiecare faet trebuie inclus ntr-o pereche de paranteze.
Exemplu:
Avnd definiia faptului structurat din exerciiul anterior, exemple de introduceri n BF ale
unor fapte structurate cu numele Microprocesor sunt:
(assert (Microprocesor (putere 5) (nume Intel I80286) (bus 16) ) )
(deffacts ini (Microprocesor (nume I8080) (stare depasit) (bus 8) ) )
Experimentai aceste comenzi.
Observaii Conform celor tiute pentru comanda deffacts, aceasta determin introducerea
faptelor din interiorul ei n BF numai dup un reset. Este de notat c n cazul faptelor
structurate ordinea faetelor nu are nicio importan, aa cum se vede i din cele dou situaii de
mai sus.
Pentru faptele structurate exist cteva noi posibiliti de introducere n BF. Astfel, atunci
cnd n BF exist deja un fapt structurat i vrem s introducem unul asemntor, putem folosi
comanda:
(duplicate <index-fapt-structurat>

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

Cnd va trebui preferat folosirea faptelor structurate?


Care este valoarea default pentru urmtorul fapt structurat:

(deftemplate Aa (field b1) (field b2 (allowed-symbols as bas) )


(field b3 (allowed-values 1 3 2) ) (field b4 (type INTEGER) )
(field b5 (type STRING) (allowed-strings lk 1 2 3) ) )

Care sunt posibilitile de introducere a faptelor structurate n BF?


Cte fapte structurate vor fi n BF dup comenzile:

(deftemplate A (field a) )
(assert (A) (A) (A (a 1) ) )

Cnd va fi activat urmtoarea regul ?

(defrule R11 (student (domiciliul Iasi) (nume $?n) )


(not (student (nume $?n) (domiciliul Vaslui) ) ) => )
2. Scriei un program CLIPS care folosind fapte structurate coninnd informaii asupra
studenilor unei grupe s determine localitatea unde i au domiciliul cei mai muli studeni,
studentul care are media cea mai mare pentru semestrul curent (vor fi prezente informaii cu
privire la notele din semestrul respectiv, media calculndu-se numai pentru acei studeni care au
cel mult o restan), numrul studenilor integraliti, numrul studenilor care nu au luat un
examen, al celor care nu au luat dou examene, respectiv al celor care nu au luat mai mult de
dou examene i obiectul la care sunt cei mai muli restanieri. Faptele structurate vor fi realizate
n aa fel nct s se prentmpine introducerea de informaii incorecte n BF (de exemplu, o not
poate fi un numr ntreg ntre 1 i 10, numele disciplinelor de studiu sunt a priori cunoscute).
Indicaie: Se va putea folosi pentru pstrarea informaiilor cu privire la notele unui
student o faet multicmp, n care s fie trecute, n perechi de cmpuri alturate, numele
disciplinei i nota obinut, sau simbolul absent.

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

Fig. 1. O problem de planificare n lumea blocurilor

2. Soluia cea mai general a problemei de planificare


Pentru a rezolva problema n cazul general, cel n care utilizatorul specific doar
configuraia iniial i cea final a blocurilor, iar programul CLIPS gsete secvena de micri
ale robotului, este necesar o reprezentare adecvat a strii iniiale i a celei finale. Se va urmri
ca n noua variant de rezolvare s se pstreze soluia dintr-un referat anterior (Lucrarea nr. 4) i
aceasta s fie doar adaptat i completat pentru a funciona i n cazul general. Astfel, se va
pstra reprezentarea pentru starea iniial, folosindu-se n acest sens fapte conform urmtorului
ablon pentru turnurile de blocuri care exist n starea iniial:
(stiva <<<bloc>>>)
iar pentru codificarea strii finale se propune urmtorul ablon al faptelor care reprezint
turnurile de blocuri ce trebuie s existe n starea final:
(scop_stiva <<<bloc>>>)

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

Fig. 2. O problem de tip anomalia lui Sussman


Pentru a aduce programul la forma final mai trebuie fcute unele completri celor patru
reguli din vechea form a soluiei. Astfel, regulile eliberare-sursa i eliberare-destinatie pot
determina n mod repetat un acelai scop, pentru c se poate ntmpla ca un acelai bloc s fie n
situaia de a bloca att un bloc surs (un bloc care trebuie mutat undeva), ct i mutarea ctre un
bloc destinaie. Adaptarea se refer la adugarea unui tipar de tip not, ajungndu-se la
urmtoarea form:
(defrule eliberare-sursa
(scop muta ?bloc1 pe ?)
(stiva ?top $? ?blocl $?)
(not (scop muta ?top pe podea))
=> (assert (scop muta ?top pe
podea))
)
Exerciiu
Scriei forma adaptat a regulii eliberare-destinaie.
Mai multe ajustri necesit regula mutare-direct. Astfel, se poate observa felul n care
n timpul rulrii programului dou scopuri elementare distincte vor putea fi create pentru un
acelai bloc: un scop privind mutarea blocului n cauz peste alt bloc, conform siturii finale
cerute i respectiv un al doilea scop pentru mutarea sa pe podea, conform aciunii uneia din
regulile eliberare-sursa sau eliberare-destinatie. Aceasta nseamn c se poate ntmpla ca
pentru un anume bloc s fie activate la un moment dat att regula mutare-directa ct i regula
mutare-pe-podea. Evident, pentru un plan optim va fi de preferat regula mutare-directa
(mutarea unui bloc nti pe podea i apoi pe poziia sa final nseamn o micare n plus, adic
ineficien). Acesta este motivul pentru care regulii mutare-directa i se va acorda o prioritate
mai mare.
n plus, rezult c exist dou cazuri distincte n care regula mutare-directa se poate
activa i executa: unul este cel n care pentru blocul pentru care se aplic regula mutare-directa
exist n baza de fapte i un scop privind mutarea sa pe podea, i respectiv cazul cnd acest scop
nu exist. Pentru aceste dou situaii diferite sunt necesare actualizri diferite ale bazei de fapte,
astfel c trebuie concepute dou reguli distincte, derivate din forma anterioar a regulii mutaredirecta. Acestea sunt:
(defrule mutare-directa1 regula pentru cazul cnd nu exista si scopul de mutare
pe podea
(declare (salience 1))
?sc <- (scop muta ?bl1 pe ?bl2)
(not (scop muta ?bl2 pe ?))
91

?st1 <-(stiva ?bl1 $?rest1)


?st2 <-(stiva ?bl2 $?rest2)
(not (scop muta ?bl1 pe podea))
=> (retract ?sc ?st1 ?st2) (assert (stiva ?bl1 ?bl2 ?rest2))
(if (neq ?rest1 (mv-append)) then (assert (stiva ?rest1)))
(printout t Blocul ?bl1 este mutat pe ?bl2 crlf))
(defrule mutare-directa 2 regula pentru cazul cnd exista si scopul de mutare
pe podea
(declare (salience 1))
?sc <- (scop muta ?bl1 pe ?bl2)
(not (scop muta ?bl2 pe ?))
?st1 <- (stiva ?bl1 $?rest1)
?st2 <- (stiva ?bl2 $?rest2)
?a <- (scop muta ?bl1 pe podea)
=> (retract ?a ?sc ?st1 ?st2) (assert (stiva ?bl1 ?bl2 ?rest2))
(if (neq ?rest1 (mv-append)) then (assert (stiva ?rest1)))
(printout t Blocul ?bl1 este mutat pe ?bl2 crlf))
Apariia n partea de condiie a celor dou reguli de mai sus a tiparului (not (scop
muta ?bl2 pe ?)) are o explicaie similar cu cea dat la regulile auxiliare care elimin
scopurile redundante, adic o explicaie derivat din cazul anomaliei lui Sussman. Mai este de
remarcat felul n care aceste dou reguli utilizeaz un element procedural n partea lor de aciune,
adic o comand if. O asemenea rezolvare utilizarea unui if pentru un test simplu, poate
simplifica partea de condiie a unei reguli. Oricum, o problem care se preteaz a fi abordat i
este rezolvat prin programarea bazat pe reguli nu trebuie s conduc la o soluie n care s
apar un exces de utilizri ale funciilor if i while n prile de aciune ale regulilor (acestea
pot fi folosite numai n partea dreapt a unei reguli). Dac se ntmpl s avem o rezolvare n
CLIPS cu un exces de funcii if i while, atunci probabil rezolvarea bazat pe reguli nu este
soluia cea mai eficient.
n regulile anterioare funcia if este utilizat pentru un test asupra variabilei ?rest1.
Dac valoarea acesteia nu este vid (adic valoarea multicmp cu zero cmpuri, ceea ce se poate
obine prin apelul funciei mv-append cu zero argumente), atunci nseamn c blocul care este
mutat are un alt bloc sub el i numai n acest caz este necesar o actualizare a bazei de fapte.
Exerciiu
ncrcai ntr-un fiier soluia complet a problemei de planificare n cazul general, cu
toate regulile i cu o baz de fapte care s corespund situaiei din Fig. 1. Verificai funcionarea
programului pe diferite strategii de rezolvare a conflictului.

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

Exemplul 2. Urmtoarele dou reguli sunt echivalente:


(defrule R2
(logical (a1) (a2) )
=>
(assert (A1) ) )

(defrule R3
(logical (a1) )
(logical (a2) )
=>
(assert (A1) ) )

Exerciiu Verificai funcionarea susinerii logice n cazul regulilor de mai sus.


Exemplul 3. Urmtoarea regul este greit sintactic:
(defrule R4
(a)
(logical (b) ) => )
deoarece are un tipar obinuit plasat naintea unui tipar logical.
Exemplul 4. Sub o condiie logical poate fi plasat o operaie SAU ntre mai multe
tipare, ca n cazul regulii R5
(defrule R5
(logical (or (b1) (b2) ) )
(b3)
=>
(assert (B1) ) )
funcionarea fiind cea obinuit pentru condiia or ntre tipare.
Exerciiu Verificai funcionarea regulii R5, observnd felul n care se produce susinerea
logic n acest caz. Scriei cele dou reguli care s nu mai foloseasc condiia or ntre tipare i
care mpreun s fie echivalente cu regula R5.
Exemplul 5. Un tipar de tip not poate fi plasat sub logical, caz n care se va produce
un efect de susinere corespunztor. Fie n acest sens regula:
(defrule R6
(logical (a)
(not (b) ) )
=>
(assert (c) ) )
Dac dup introducerea acestei definiii urmeaz comenzile:
(assert (a) )
(run)
(assert (b) )
vom constata c faptul (c), introdus n BF dup execuia regulii R6, este eliminat din BF, pentru
c prin introducerea lui (b) n BF partea de condiie a regulii R6 nu mai este satisfcut.
Exemplul 6. Un fapt poate fi n situaia de a fi susinut logic de diferite grupuri de fapte,
provenite din mai multe reguli. ntr-un asemenea caz faptul respectiv va fi eliminat automat din
94

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

Exerciiu Introducei regulile R7 i R8 n BR, activai-le i executai-le, iar apoi verificai


momentul cnd faptul (c), respectiv faptul (d), i pierd susinerea logic. Explicai comportarea
obinut.
Exemplul 7. n cazul n care se lucreaz cu admiterea faptelor duplicat n BF (prin
trecerea pe TRUE a bistabilului Fact Duplication), se va ine seama exact de faptele care au
determinat susinerea logic; faptele identice din punct de vedere al coninutului sunt deosebite
dup indexul lor. Verificai acest lucru, trecnd pe TRUE bistabilul Fact Duplication i
folosind regula:
(defrule R9
(logical (P1) (P2) )
=>
(assert (P) ) )
Exerciiu Introducei comenzile:
(assert (P1) (P2) (P1) (P1) (P2) )
(run)
dup care eliminai din BF, pe rnd, diferitele fapte (P1) i (P2), observnd care sunt faptele care
i pierd susinerea logic.
Exemplul 8. Dac un fapt este introdus n BF printr-o modalitate independent de
susinerea logic (aceasta poate fi o comand deffacts urmat de reset, sau assert dat la
nivel superficial, sau din partea de aciune a unei reguli), atunci susinerea logic nu mai este
luat n considerare. Aceast situaie este ilustrat prin urmtoarele dou reguli:
(defrule R10
(logical (y1) )
=>
(assert (Y) ) )

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

Dac n BF se introduc, ncepnd de la identificatorul f-1, faptele (Z1), (Z2), (Z3) i se d


comanda (run), prin execuia regulilor R15 i R16 faptul (Z4) este introdus n BF, la
identificatorul f-4. Pentru a determina faptele care asigur susinerea logic a lui (Z4) se va putea
folosi comanda:
(dependencies 4)
A doua comand care poate fi folosit n legtur cu urmrirea susinerii logice este:
(dependents <index-fapt>)
Argumentul poate fi indexul uni fapt din BF sau o variabil legat la indexul unui fapt.
Rezultatul care se obine este acela de listare a identificatorilor faptelor care primesc suportul
logic de la faptul indicat prin argument.
Exerciiu Construii un exemplu n care s verificai modul de funcionare pentru
comanda dependents.
Exerciii recapitulative
1. Rspundei la urmtoarele ntrebri.
Ce nseamn n inteligena artificial raionament monoton i respectiv nemonoton i
care sunt cazurile n care trebuie s intervin sistemul de meninere a consistenei
(truth maintenance system) ?
Ce se ntmpl atunci cnd un fapt este susinut logic din mai multe reguli?
Ce se ntmpl atunci cnd un tipar de tip not apare sub logical?
Care este efectul comenzilor dependencies i dependents?
2. Care este rezultatul ce se obine dup activarea i execuia regulii:
(defrule R17
(logical ?a <- (b) )
=>
(retract ?a)
(assert (c) ) )
3. Fie urmtoarea regul:
(defrule R18
(logical ?a <- (A ?)
?b <- (A ?) )
(test (neq ?a ?b) )
=>
(assert (c)))
97

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

(not (scop muta ?bl2 pe ?) )


?st1 <- (stiva ?bl1 $?rest1)
?st2 <- (stiva ?bl2 $?rest2)
?a <- (scop muta ?bl1 pe podea)
=>
(retract ?a ?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) )
Se poate obine o nou soluie, n care s se renune la regula muta-direct1, prin folosirea
tiparelor de tip logical. Obinei soluia respectiv i verificai funcionarea pe diferitele
strategii de rezolvare a conflictului, observnd influena acestora. Ca indicaie, tiparele logical
vor fi folosite n regulile eliberare-sursa i eliberare-destinatie.

99

Bibliografie

Brachman, R., Levesque, H. (2004). Knowledge representation and reasoning, Elsevier,


Amsterdam.

Giarratano, J., and Riley, G. (1989). Expert Systems: Principles and Programming, PWSKENT, Boston.

Jackson, P. (1999). Introduction to Expert Systems, Addison-Wesley, Harlow.

Kowalski, T., Levy, L. (1996). Rule-based programming, Kluwer, Boston.

Pnescu, D, A. (2000). Sisteme bazate pe cunotine; reprezentarea cunoaterii, Matrix


Rom, Bucureti.

Riley, G. (2008). CLIPS Advanced Programming Guide, http://clipsrules.sourceforge.net/


OnlineDocs.html

Riley, G. (2008). CLIPS Basic Programming Guide, http://clipsrules.sourceforge.net/


OnlineDocs.html

100

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