60
1 1. CLIPS - Introducere CLIPS - C Language Integrated Production System. Este un mediu de dezvoltare al sistemelor expert realizat de către Departamentul Software ("Software Technology Branch, NASA/Lyndon B. Johnson Space Center") al NASA în anul 1986. CLIPS permite dezvoltarea de software de modelare a cunoştinŃelor şi expertizei umane. CLIPS este numit mediu de dezvoltare a sistemelor expert deoarece are facilităŃi de creare şi editare a bazelor de cunoştinŃe folosind un editor de text standard, de salvare a bazei de cunoştinŃe într-unul sau mai multe fişiere text şi de încărcare şi rulare a acesteia. Datorită portabilităŃii (Ms-Dos, Windows, Unix/Linux, Macintosh), popularităŃii (codul sursă este distribuit gratuit) şi performanŃelor, mediul CLIPS a fost acceptat pe scară largă la implementarea tehnologiei sistemelor expert atât în sectoarele publice, cât şi în cele private pentru o gamă largă de aplicaŃii pe medii hardware diverse. Un avantaj al acestui mediu de dezvoltare este că asigură integrarea cu limbaje de programare, cum ar fi C şi Ada. Mediul CLIPS pune la dispoziŃia utilizatorului elementele de baza pentru dezvoltarea unui sistem expert: liste de fapte şi liste de instanŃe, care formează datele; baza de cunoştinŃe procedurale, constând în baza de reguli; motorul de inferenŃă, care controlează execuŃia regulilor. Un program în CLIPS poate să conŃină reguli, fapte şi obiecte. Motorul de inferenŃă decide care reguli vor fi executate şi momentul când vor fi executate. Un sistem expert bazat pe reguli este un program în care faptele şi eventual, obiectele, sunt datele care asigură execuŃia prin motorul de inferenŃă. InterfaŃa mediului CLIPS este simplă, interactivă, permite introducerea de comenzi la prompt sau executarea comenzilor din meniurile puse la dispoziŃie. Prompt-ul mediului CLIPS este "CLIPS>". Acest prompt apare la lansarea în execuŃie a mediului CLIPS într-o fereastră de dialog.

Curs Clips

Embed Size (px)

DESCRIPTION

Curs Clips

Citation preview

  • 1

    1. CLIPS - Introducere CLIPS - C Language Integrated Production System.

    Este un mediu de dezvoltare al sistemelor expert realizat de ctre Departamentul Software ("Software Technology Branch, NASA/Lyndon B. Johnson Space Center") al NASA n anul 1986.

    CLIPS permite dezvoltarea de software de modelare a cunotinelor i expertizei umane. CLIPS este numit mediu de dezvoltare a sistemelor expert deoarece are faciliti de creare i editare a bazelor de cunotine folosind un editor de text standard, de salvare a bazei de cunotine ntr-unul sau mai multe fiiere text i de ncrcare i rulare a acesteia.

    Datorit portabilitii (Ms-Dos, Windows, Unix/Linux, Macintosh), popularitii (codul surs este distribuit gratuit) i performanelor, mediul CLIPS a fost acceptat pe scar larg la implementarea tehnologiei sistemelor expert att n sectoarele publice, ct i n cele private pentru o gam larg de aplicaii pe medii hardware diverse.

    Un avantaj al acestui mediu de dezvoltare este c asigur integrarea cu limbaje de programare, cum ar fi C i Ada.

    Mediul CLIPS pune la dispoziia utilizatorului elementele de baza pentru dezvoltarea unui sistem expert:

    liste de fapte i liste de instane, care formeaz datele; baza de cunotine procedurale, constnd n baza de reguli; motorul de inferen, care controleaz execuia regulilor. Un program n CLIPS poate s conin reguli, fapte i obiecte. Motorul de inferen

    decide care reguli vor fi executate i momentul cnd vor fi executate. Un sistem expert bazat pe reguli este un program n care faptele i eventual, obiectele, sunt datele care asigur execuia prin motorul de inferen.

    Interfaa mediului CLIPS este simpl, interactiv, permite introducerea de comenzi la prompt sau executarea comenzilor din meniurile puse la dispoziie. Prompt-ul mediului CLIPS este "CLIPS>". Acest prompt apare la lansarea n execuie a mediului CLIPS ntr-o fereastr de dialog.

  • 2

    Fig. 1.1 Interfaa mediului CLIPS

    Codul surs al CLIPS este n limbajul C, astfel nct toate comenzile, procedurile i

    structurile sunt tratate ca funcii. Din acest motiv toate apelurile date la prompt trebuie incluse ntre paranteze. Mediul CLIPS este un limbaj funcional.

    1.1 Ghid de programare n mediul CLIPS

    Un sistem expert realizat n CLIPS poate fi executat n trei moduri: - interactiv, introducnd comenzi de la prompt n mod text; - folosind meniuri din fereastra grafic a Clips-ului; - se proiecteaz un sistem expert ncapsulat n care utilizatorul asigur un program

    principal i controleaz execuia sistemului expert;

    Sintaxa reprezint o entitate simpl ce denumete o clas sau un nume dat de utilizator.

    Aceste stringuri se numesc termeni sau simboluri ne-terminale. * cnd urmeaz un termen reprezint zero sau mai multe entiti de tipul

    respectiv. De exemplu: * arat c se pot folosi mai multe entiti sau nici una.

    + cnd urmeaz un termen reprezint una sau mai multe entiti de tipul respectiv. De exemplu: + arat c se poate folosi cel puin o entitate.

    specific mai multe entiti. []

    un termen inclus ntre paranteze ptrate este opional.

    | indic posibilitatea de a alege dintre mai muli termeni blanchspace, tabs, carriage return

    sunt folosite n Clips doar pentru delimitarea termenilor, altfel sunt ignorate (doar dac sunt incluse ntre ghilimele).

  • 3

    ::= este folosit pentru a arta cu ce poate fi nlocuit un simbol neterminal. De exemplu urmtoarea sintax indic faptul c poate fi nlocuit cu sau cu : ::= |

    1.2 Elementele de baz ale mediului CLIPS tipuri primitive de date; funcii pentru manipularea datelor; constructori pentru adugarea la baza de cunotine;

    1.2.1 Tipurile primitive de date Tipuri primitive de date sunt: 1) Integer

    2) Float Un numr poate fi memorat ca float sau ca integer. Orice numr format din semn i cifre este memorat ca integer (reprezentat intern ca long integer din limbajul C). Alte numere memorate ca float (reprezentare intern a Clipsului ca double din C). 3) Simbol este alctuit dintr-o secven de caractere care ncepe cu un caracter ASCII printabil i este urmat de zero sau mai multe caractere ASCII printabile. Simbolul se termin la ntlnirea oricrui caracter printabil (spaiu, tab, return, line feed, ghilimele, paranteze (), &, |,

  • 4

    7) Instana este o instaniere a unui obiect al unei clase. n Clips obiectele pot fi definite ca float, integer, symbol, string, valori multicmp (asemntoare cu un vector ale crui elemente pot avea tipuri diferite), adrese externe, adrese de fapte sau instane ale unor clase definite de utilizator. Un nume al unei instane se formeaz prin includerea unei simbol n paranteze ptrate.

    [stare-1] [nume] [+++] [1473-390]

    Adresa unei instane este de forma unde XXXX este numele unei instane.

    1.2.2 Funcii

    O funcie n Clips este o secven de cod executabil identificat printr-un nume i care ntoarce o valoare sau are ca rezultat un efect vizibil. Tipuri de funcii: ale sistemului, scrise ntr-un alt limbaj (C, Fortran, Ada) i introduse n mediul CLIPS

    (funcii interne ale mediului); definite de utilizator ntr-un alt limbaj (funcii externe) sau n mediul CLIPS cu ajutorul

    constructorului deffunction; generice definite prin constructorul defgeneric sau defmethod, i care permit executarea

    codului dependent de argumentele transmise spre funciile generice. Astfel se pot supradefini funciile;

    funcionale la care argumentele apar ntotdeauna dup numele funciei. Exemplu: (+ 3 4 5) sau (+ 3 ( * 4 8) 9)

    O expresie este o funcie ale crei argumente sunt specificate.

    1.2.3 Constructori

    Constructorii definii n mediul CLIPS sunt: defmodule, defrule, deffacts, deftemplate, defglobal, deffunction, defclass, definstances, defmessagehandler, defgeneric, defmethod.

    La apelare toi constructorii trebuiesc inclui n paranteze. Diferena dintre constructori i funcii este c apelul unei funcii nu modific mediul CLIPS, pe cnd un constructor adaug noi elemente n baza de cunotine a mediului CLIPS i nu returneaz nici o valoare.

    1.3 Abstractizarea datelor Pentru reprezentarea informaiilor n Clips se folosesc trei forme primare: faptele,

    obiectele i variabilele globale. Valorile i instanele acestora la un moment dat formeaz memoria de lucru a mediului CLIPS.

    1.3.1 Fapte Faptele reprezint forma de baz pentru reprezentarea cunotinelor n Clips. Fiecare

    fapt reprezint o pies de informaie i este plasat ntr-o list de fapte. Faptele reprezint unitatea fundamental de date folosit de reguli.

    Operaiile ce se pot efectua asupra faptelor sunt: adugarea de noi fapte la lista de fapte;

  • 5

    tergerea de fapte din lista de fapte; modificarea unui fapt; duplicarea unui fapt;

    Toate aceste operaii pot fi fcute direct, n linia de comand a mediului sau printr-un program. Numrul de fapte din lista de fapte i cantitatea de informaie ce poate fi reinut de un fapt sunt limitate doar de capacitatea de memorie a computerului.

    Dac se ncearc introducerea unui fapt n lista de fapte i dac acest fapt deja exist n list, atunci noul fapt introdus va fi ignorat. Exist o constant de mediu care permite introducerea unui nou fapt cu acelai coninut de informaie, dar cu un nou index.

    Un fapt poate fi specificat prin: adres sau prin index. Cnd un fapt este adugat la lista de fapte sau modificat primete un index unic n lista

    de fapte. Indexul de fapte ncepe de la zero i se incrementeaz cu 1 la fiecare nou fapt adugat sau modificat. Cnd se apeleaz comenzile reset sau clear indexul de fapte este pus la zero.

    Adresa unui fapt se poate obine prin valoarea returnat la apelul unei comenzi assert, modify, duplicate sau printr-o variabil legat cu adresa unui fapt care ndeplinete o condiie din partea stng a unei reguli.

    Faptele pot fi: a) ordonate, constau ntr-un simbol urmat de o secven de zero sau mai multe cmpuri separate de spaii i delimitate de paranteze (). n general primul cmp al unui fapt ordonat specific o relaie ntre celelalte cmpuri ale faptului. Exemple:

    (numele este Mihai) (altitudinea este 10000 metri) (lista-mic-dejun paine lapte oua ) Cmpurile dintr-un fapt ordonat pot avea orice tip primitiv de date, cu excepia

    primului cmp care trebuie s fie un simbol. Faptele ordonate codific informaia dup poziie. Pentru ca un utilizator s aib acces la cunotine trebuie s cunoasc nu numai ce date sunt memorate n acel fapt, dar i cmpul care conine datele. b) neordonate constau dintr-o structur abstract n care fiecare cmp are un nume. Pentru a crea fapte neordonate se folosete constructorul deftemplate. Primul cmp al unui fapt neordonat corespunde numelui faptului apoi este urmat de zero sau mai multe sloturi. Cmpurile dintr-un fapt neordonat se numesc sloturi i pentru ele se poate defini tipul de date pe care-l conin, valoarea, i eventual domeniul de valori, i o valoare implicit. Sloturile dintr-un fapt neordonat pot avea orice ordine de aezare. Exemplu:

    (client (nume "Ion Popescu") (id 234652)) (punct (abscisa 100) (ordonata -200)) (grupa (profesor "Maria Ionescu") (numar-elevi 30) (sala "Y300")) (meniu (numar-produse 3) (produse paine lapte oua))

    c) fapte iniiale cu ajutorul constructorului deffacts se pot introduce n lista de fapte o colecie de fapte folosind comanda reset.

    1.3.2 Obiecte

    Obiecte sunt definite cu ajutorul tipurilor primitive de date simbol, string, numere ntregi i reale, valori multicmp, adrese externe sau instane ale unor clase definite de utilizator. Obiectele sunt descrise prin proprieti i comportament. O clas este un ablon pentru proprieti i comportamentul comun al obiectelor ce sunt instane ale clasei.

  • 6

    n Clips obiectele fac parte din dou categorii:

    tipuri primitive; instane ale unor clase definite de utilizator;

    Aceste dou categorii de obiecte difer prin modul n care sunt referite, create i terse. Obiectele de tipul primitiv sunt referite simplu prin specificarea valorii i sunt create i

    terse implicit de mediul CLIPS atunci cnd este nevoie. Aceste obiecte nu au nume i nici sloturi, iar clasele lor sunt predefinite n CLIPS.

    O instan a unei clase definit de utilizator este referit prin nume sau adres i sunt

    create i terse explicit prin mesaje i funcii speciale. Proprietile unei astfel de instane sunt date printr-un set de sloturi care au nume i pot avea valori singulare sau multicmp. Comportamentul unui obiect este specificat prin cod procedural numit messagehandlers, care este ataat obiectelor clasei. Toate instanele unei clase au aceleai sloturi, dar fiecare instan poate avea valori diferite ale acestor sloturi. Principala diferen dintre sloturile unui obiect i cele ale unui structuri definit cu ajutorul constructorului deftemplate (fapt neordonat) este noiunea de motenire. n CLIPS se permite motenirea multipl.

    1.3.3 Variabile globale

    Variabile globale pot fi definite cu ajutorul constructorului defglobal i au avantajul c pot fi accesate oriunde n mediul CLIPS i valorile lor sunt independente de apelul altor constructori.

    Exist i constructori (cum ar fi defrule, deffunction) care permit definirea unor variabile locale care pot fi referite doar n constructorul respectiv. Variabilele globale din CLIPS sunt asemntoare cu cele din limbajele procedurale C, Ada, dar spre deosebire de acestea pot conine valori care au mai multe tipuri de date.

    1.4 Reprezentarea cunotinelor

    1.4.1 Cunotine euristice Regulile Regulile sunt folosite pentru a reprezenta cunotine euristice, asigurnd realizarea unui

    set de aciuni n condiii date, verificabile. Dezvoltarea unui sistem expert const n definirea unui set de reguli care vor duce la rezolvarea problemei. O regul este alctuit din antecedent (parte condiional, LHS-left hand side parte stng) i consecvent (parte de aciuni, RHS-right hand side parte dreapt).

    Antecedentul conine un set de condiii (elemente condiionale) care trebuie s fie satisfcute pentru ca regula s fie aplicabil. n CLIPS, partea condiional a unei reguli este satisfcut dac exist sau nu anumite fapte n lista de fapte sau o anumit instan a unei clase definite de utilizator sau este ndeplinit o condiie testat explicit. O condiie din antecedentul unei reguli se numete pattern. Procesul prin care se verific faptele i instanele care satisfac o anumit condiie (pattern) se numete pattern-matching (verificare). CLIPS asigur un mecanism, numit motor de inferen, care verific automat condiiile regulilor n conformitate cu starea actual a listei de fapte i a listei de instane determinnd regulile aplicabile la un moment dat, care sunt trecute ntr-o list numit agend.

  • 7

    Consecventul unei reguli este un set de aciuni care sunt executate la aplicarea regulii. Aciunile sunt realizate atunci cnd motorul de inferen execut o regul din cele aplicabile. Dac sunt aplicabile mai multe reguli la un moment dat, motorul de inferen folosete o strategie de rezolvare a conflictelor care alege o singur regul. Acest proces se termin atunci cnd nu mai exist nici o regul n agend sau cnd s-a specificat explicit, printr-o comand, oprirea inferenei (agenda conine toate regulile aplicabile la un moment dat).

    O regul seamn cu secvena procedural IF THEN dintr-un limbaj de programare.

    1.4.2 Cunotine procedurale Sunt asemntoare cu cele din limbajele procedurale, astfel: if...then...else, while, loop-

    for-count, progn, progn$, return, breack, switch. Aceste funcii procedurale pot fi folosite n constructorul deffunction, n funciile generice, la mesajele ataate obiectelor sau n constructorul defmodules care permite partiionarea bazei de cunotine. deffunction permite declararea unor noi funcii. Corpul unei funcii este un set de aciuni

    executate secvenial la apelul funciei. Valoarea returnat de funcie este valoarea ultimei expresii evaluate n corpul funciei.

    funcii generice sunt similare cu primele, dar au avantajul c pot fi suprancrcate. mesajele ataate obiectelor comportamentul obiectelor este dat de o parte de cod

    procedural numit messagehandlers. Obiectele sunt manipulate cu ajutorul mesajelor, care sunt asemntoare funciilor din CLISP i care returneaz o valoare sau au un anumit efect.

    defmodules permit modularizarea bazei de cunotine. Fiecare constructor trebuie s fac parte dintr-un modul. Vizibilitatea unui constructor definit ntr-un modul pentru un alt modul poate fi setat de utilizator. La fel se poate seta i vizibilitatea faptelor i a instanelor. Modulele pot fi folosite i pentru controlul execuiei regulilor.

    7. Funcii n mediul CLIPS

    n mediul CLIPS apelul unei funcii se face n notaia n prefix argumentele funciei (separate de spaii) sunt trecute ntotdeauna dup numele funciei. Argumentele unei funcii pot fi tipuri primitive de date, variabile, sau alte funcii.

    Funciile sunt de mai multe tipuri: funcionale, definite de utilizator, ale sistemului, generice. Cele mai uzuale funcii ale mediului CLIPS sunt prezentate n continuare.

    7.1 Funcii de interaciune cu mediul load

    (load )

    ncarc constructori din fiierul specificat ca argument (mpreun cu calea de directoare). bload

    (bload )

    ncarc un fiier binar, produs anterior cu comanda bsave.

  • 8

    batch

    (batch )

    Execut comenzi din fiierul specificat ca argument. Dac reuete, ntoarce valoarea ultimei expresii din fiier. agenda

    (agenda)

    Afieaz o list de reguli aplicabile la un moment dat. Dac nu se specific nici un argument, sunt afiate activrile din modulul curent. Dac se specific un nume de modul, se afieaz numai activrile din acel modul. Dac se specific *, sunt afiate toate activrile. clear

    (clear)

    terge mediul CLIPS. exit

    (exit)

    Oprete i nchide mediul CLIPS. halt

    (halt)

    Oprete execuia unei reguli. Nu are efect dac nu este apelat n consecventul unei reguli. reset

    (reset)

    terge toate faptele din lista de fapte, toate regulile aplicabile din agend, instanele. Apoi introduce faptul iniial (initial-fact) n lista de fapte, toate faptele definite cu ajutorul constructorului deffacts, introduce instanele definite de constructorul definstance, i (dac proprietatea set-reset-globals este TRUE) iniializeaz la valorile declarate iniial toate variabilele globale. run

    (run [])

    Pornete motorul de inferen. Dac nu este specificat nici un argument, atunci el are implicit valoarea 1, i CLIPS ruleaz pn cnd nu mai rmn activri sau pn cnd ntlnete o comand halt. Dac se specific un argument, acesta va da numrul maxim de reguli de executat nainte de oprire. Urmtoarea comanda run va continua execuia din locul de unde s-a oprit anterior. Comanda (run 1) este echivalent cu rularea pas cu pas. set-reset-globals

    (set-reset-globals (TRUE | FALSE | nil))

    Schimb setarea curent a constantei de mediu cu referire la variabilele globale la apelul comenzii reset. Dac constanta este setat TRUE, comanda reset reiniializeaz valorile variabilelor globale la valorile lor iniiale. Dac proprietatea este setat FALSE sau nil, comanda nu va afecta valorile variabilelor globale.

  • 9

    7.2 Funcii matematice +

    (+ +)

    ntoarce suma primului argument cu urmtoarele argumente. -

    (- +)

    ntoarce primul argument minus argumentele urmtoare. *

    (* +)

    ntoarce produsul argumentelor. /

    (/ +)

    ntoarce primul argument mprit la argumentele urmtoare. **

    (** )

    Ridic primul argument la puterea celui de-al doilea argument.

    (< +)

    ntoarce TRUE dac fiecare argument este mai mic (mai mare) n valoare dect argumentul urmtor. Altfel, ntoarce FALSE.

    (

  • 10

    ntoarce primul argument mprit la argumentele urmtoare folosind mprirea ntreag. Ctul valorilor celor dou expresii numerice este rotunjit la cel mai apropiat ntreg. exp

    (exp )

    Ridic numrul e la puterea indicat de argument. float

    (float )

    Convertete argumentul ntr-un numr real de tip float. integer

    (integer )

    Convertete argumentul ntr-un numr ntreg. Trunchiaz orice parte fracionar a valorii expresiei numerice date i ntoarce partea ntreag. log

    (log )

    ntoarce logaritmul natural al argumentului. log10

    (log10 )

    ntoarce logaritmul zecimal al argumentului. max

    (max +)

    ntoarce valoarea celui mai mare argument numeric. min

    (min +)

    ntoarce valoarea celui mai mic argument numeric. mod

    (mod )

    ntoarce restul mpririi primului argument la cel de-al doilea. pi

    (pi)

    ntoarce constanta pi. random

    (random)

    ntoarce aleator un ntreg cu o valoare n intervalul 0 i 65536. round

    (round )

    Rotunjete argumentul ctre cel mai apropiat ntreg. sqrt

    (sqrt )

    ntoarce rdcina ptrat a argumentului. and

  • 11

    (and +)

    ntoarce TRUE dac toata argumentele sunt evaluate la o valoare non-FALSE. or

    (and +)

    ntoarce TRUE dac oricare dintre argumente este evaluat la o valoare non-FALSE.

    eq (eq +)

    ntoarce TRUE dac primul argument este egal ca tip i valoare cu toate celelalte argumente. eq*

    (eq* +)

    ntoarce TRUE dac primul argument este echivalent cu toate celelalte argumente. neq

    (neq +)

    ntoarce TRUE dac primul argument nu este egal ca tip i valoare cu argumentele urmtoare. lexemep

    (lexemep )

    ntoarce TRUE dac expresia este de tip simbol sau string. Numberp (symbolp, stringp, integerp, floatp)

    (numberp )

    ntoarce TRUE dac expresia este de tip integer sau float (simbol, string, integer, float).

    7.3 Structuri de control if

    (if then * [else *])

    Permite execuia condiional a unui grup de aciuni. Se evalueaz expresia. Dac nu este evaluat ca FALSE, se execut prima list de aciuni (corespunztoare ramurii then). Dac este evaluat FALSE, se execut cea de-a doua list de aciuni (corespunztoare ramurii else dac aceasta este specificat). Se returneaz valoarea ultimei expresii evaluate.

    return (return [])

    Dac este ntlnit ntr-o funcie definit cu ajutorul constructorului deffunction, atunci ntoarce valoarea dat, i ncheie execuia acesteia. Dac este definit n partea dreapt a unei reguli, atunci termin imediat execuia regulei i scoate modulul de curent din stiva de focus. while

    (while [do] *)

    Permite ciclarea condiional. Evalueaz expresia n mod repetat. Atta timp ct aceasta nu este FALSE, se execut aciunea. Returneaz valoarea ultimei expresii evaluate. loop-for-count

    (loop-for-count [do] *) ::= | (

  • 12

    [ ]) ::= ::=

    Permite ciclarea cu contor. Returneaz valoarea ultimei expresii evaluate.

    7.4 Funcii trigonometrice acos arccosinus acosh arccosinus hiperbolic acot arccotangent acoth arccotangent hiperbolic acsc arccosecant acsch arccosecant hiperbolic asec arcsecant asech arcsecant hiperbolic asin arcsine asinh arcsinus hiperbolic atan arctangent atanh arctangent hiperbolic cos cosinus cosh cosinus hiperbolic cot cotangent coth cotangent hiperbolic csc cosecant csch cosecant hiperbolic sec secant sech secant hiperbolic sin sinus sinh sinus hiperbolic tan tangent tanh tangent hiperbolic Exemplu: de utilizare a diverselor funciilor ale mediului CLIPS

    CLIPS>(+ 3 4 ) 7 CLIPS>(* 10 8 ) 80 CLIPS>(* 5 (+ 3 7) (+ (** 2 3) (/ 24 2))) 1000.0 CLIPS>(eq test alt-test) FALSE CLIPS>(neq test alt-test) TRUE CLIPS>(* 5 7.8 2 ) 78.0 CLIPS>(* 7 (+ 5 (* 3 4 6 ) 9 ) (+ 10 3 )) 7826 CLIPS>(acos 0.5) 1.0471975511966 CLIPS>(log10 10) 1.0 CLIPS>(>= 5 7 ) FALSE CLIPS>(max 3 6 10 1 9 ) 10 CLIPS>(sqrt 81) 9.0

    Se observ n acest exemplu c funciile matematice se pot apela cu mai multe argumente. Evaluarea funciilor se face din interior ctre exterior, n cazul n care sunt prezente paranteze.

  • 13

    7.5 Funcii de intrare-ieire Funciile de intrare-ieire folosesc nume de dispozitive de intrare-ieire sau nume logice de fiiere, unde vor fi efectuate operaiile de culegere sau afiare de date. Aceste dispozitive logice pot fi implicite: stdin este implicit pentru toate dispozitivele standard de intrare (tastatura); stdout este implicit pentru toate dispozitivele standard de ieire (de exemplu monitorul, dac se specific t); sau explicite, definite de utilizator, asociate cu nume de fiiere. printout

    (printout * )

    Afieaz expresia la dispozitivul standard de ieire (monitorul) dac se specific t la nume-logic, sau scrie ntr-un fiier asociat cu numele logic printr-o operaie de deschidere de fiier. Simbolul crlf poate fi utilizat ca o expresie i poate fi amplasat oriunde n lista de expresii, el fornd carriage return / new line (face saltul la un nou rnd). Pentru a afia un ir de caractere cu (printout) acesta trebuie trecut ntre ghilimele. Expresiile care nu sunt scrise ntre ghilimele sunt evaluate i rezultatul este afiat. Se pot afia i adrese de fapte, de instane sau adrese externe. Aceast comand este folosit de obicei, n partea de aciune a unei reguli pentru afiarea unui mesaj pe monitor i poate conine orice numr de expresii de afiat. format

    (format < nil|nume-logic> * )

    Formateaz o expresie pentru a o scrie n fiierul sau dispozitivul asociat cu numele logic sau dac nu se dorete scrierea se specific nil. Aceast funcie este asemntoare funciei printf din limbajul de programare C. read

    (read [] )

    Citete o valoare de la dispozitivul logic dac este specificat. readline

    (readline [] )

    Citete un ir de caractere pn la ntlnirea caracterului de trecere la linie nou, sau EOF, de la dispozitivul logic, dac acesta este specificat. open

    (open []) ::= "r" | "w" | "r+" | "a" | "wb"

    Deschide un fiier specificat prin nume (mpreun cu calea de directoare) i l asociaz cu numele logic, care va fi folosit de alte funcii pentru a avea acces la fiier. Modul de utilizare al fiierului este specificat opional i poate fi numai pentru citire (r - implicit), numai pentru scriere (w), pentru citire i pentru scriere (r+), pentru adugare (a), pentru scriere n binar (wb). Aceast funcie este folosit, n general, n consecventul unei reguli. close

  • 14

    (close [] )

    nchide un fiier specificat prin nume logic, deschis anterior cu funcia open. Dac funcia este apelat fr nici un argument, atunci sunt nchise toate fiierele deschise. Exemplu: de utilizare a funciilor de lucru cu fiiere

    CLIPS>(open test1.clp fis1 w) TRUE CLIPS>(printout t Voi scrie in linie comanda crlf) Voi scrie in linie comanda CLIPS>(printout fis1 date fisier) CLIPS>(close fis1) TRUE CLIPS>(open C:\\Ex-clips\\test1.clp fis2) TRUE CLIPS>(read fis2) date CLIPS>(read fis2) fisier CLIPS>(read fis2) EOF CLIPS>(close) TRUE CLIPS>(close) FALSE CLIPS>

    Fiierul cu numele test1.clp a fost deschis pentru scriere i asociat cu numele logic fis1, apoi se scrie un mesaj pe ecran i sunt introduse date n fiier. Dup ce se nchide fiierul, se redeschide pentru citire.

  • 15

    8

    Reprezentarea cunotinelor - Fapte

    Faptele sunt forma principal de abstractizare, n mediul CLIPS, a cunotinelor declarative, structurate ca piese de cunoatere. Pentru a se putea lucra cu piese de cunoatere, acestea trebuiesc formalizate ntr-un anumit formalism, care apoi s permit i raionamentul cu aceste cunotine. Cel mai des ntlnite metode de formalizare a cunotinelor declarative sunt logica propoziiilor i logica predicatelor de ordin unu, care au un fundament matematic bine definit. Definirea unui element de informaie se face folosind tripletul: Obiect la care face referire piesa de cunoatere. Atribut (proprietate) este o funcie (caracteristic) care poate modifica valoarea sau un

    ansamblu de valori ale obiectului. Valoare corespunde unui predicat, adic o mulime de referine legate de atribut.

    Exemplu: de reprezentare a unui element de informaie (animal mamifer elefant) (patrat latura 10) (persoana (nume Popescu) (varsta 30)) structur de date cu mai multe perechi atribut-valoare

    Fiecare fapt este plasat n lista curent de fapte (engl.: fact-list), care face parte din memoria de lucru a sistemului. Memoria de lucru a sistemului mai cuprinde lista de instane, lista de variabile mpreun cu valorile asociate i modulele de cunotine.

    Operaiile care se pot efectua asupra faptelor sunt: introducerea de noi fapte la lista de fapte, tergerea din lista de fapte, modificarea sau multiplicarea unui fapt existent. Numrul de fapte din lista de fapte este nelimitat, singura limitare fiind cea impus de capacitile hard ale calculatorului, adic de dimensiunea memoriei. n mediul CLIPS faptele pot fi de dou tipuri: Ordonate Neordonate Faptele pot avea unul sau mai multe cmpuri, care sunt separate ntre ele de delimitatori (blanchspace, tabs, carriage return pentru faptele ordonate), (paranteze pentru faptele neordonate). Cmpurile unui fapt pot avea urmtoarele tipuri: float integer symbol (caracter sau ir de caractere ncepnd cu un caracter printabil) string (ir de caractere) externaladdress factaddress instancename instanceaddress

  • 16

    Caracteristic mediului CLIPS este posibilitatea de a introduce un fapt iniial, numit

    "initial-fact". Acesta este adugat n lista de fapte n urma comenzii (reset), care, n primul rnd, terge toate faptele din lista de fapte i apoi introduce faptul iniial cu indicele 0. Faptul iniial este folosit pentru activarea unor reguli care nu au o condiie precis de activare.

    8.1 Fapte ordonate

    Faptele ordonate memoreaz obiecte, atribute sau valori ale pieselor de cunoatere sub forma cmpurilor. Ordinea cmpurilor este important, deoarece este singurul criteriu de identificare. Este bine ca ordinea dintre cmpuri s exprime o relaie ntre acestea. De obicei, primul cmp exprim obiectul, iar cmpurile urmtoare memoreaz atributele i/sau valorile obiectului. De exemplu, faptul (animal este zebra) nu este acelai cu faptul (zebra este animal). La faptele ordonate utilizatorul trebuie s cunoasc ce cunotine sunt memorate n fapt i poziia cmpurilor care conin acele cunotine. Tipul fiecrui cmp este dat de tipul valorii memorata n acel cmp. La faptele ordonate tipul valorii unui cmp este determinat implicit.

    8.1.1 Adugarea de fapte

    Comanda cu care se introduce un nou fapt la lista de fapte este (assert). Sintaxa comenzii este urmtoarea:

    (assert +)

    i are ca efect adugarea imediat a tuturor faptelor scrise ntre paranteze, dup numele comenzii, n lista de fapte i ntoarcerea indexului ultimului fapt introdus sau FALSE dac nu s-au introdus cu succes faptele. Comanda (assert) poate fi folosit n mediul CLIPS n linia de comand, sau n partea de aciune a unei reguli. Folosind constructorul (deffacts) se poate defini o list de fapte, care va fi introdus n lista de fapte a mediului CLIPS la execuia comenzii (reset). Sintaxa comenzii este:

    (deffacts [] *)

    Aceast comand poate fi scris n linie de comand a mediului CLIPS, sau poate fi scris ntr-un fiier CLIPS (cu extensia clp) ca o comand de sine stttoare. Faptele introduse prin acest constructor au acelai comportament cu al faptelor introduse prin comanda (assert).

    O alt comand care permite introducerea unui fapt n lista de fapte are urmtoarea sintax:

    (assert-string )

    i are ca efect convertirea expresiei ir ntr-un fapt, urmat de introducerea n list. Scopul funciei este de a analiza irul ca pe un fapt, i dac este corect, afieaz indicele faptului introdus. Observaie: primul cmp al unui fapt trebuie s fie de tip simbol sau string i este folosit de obicei, pentru a exprima o relaie ntre celelalte cmpuri utilizate pentru valori, asigurnd astfel i documentaie pentru utilizator. Exemplu:

    CLIPS>(assert (masura))

  • 17

    CLIPS>(assert (a 45) (test fapt) (laborator-clips tematica fapte reguli variabile)) CLIPS>(assert-string (numar real 5.6))

    n acest exemplu au fost introduse n list urmtoarele fapte: (masura) care are un singur cmp, (a 45), (test fapt) aceste fapte au dou cmpuri, primul poate fi interpretat ca numele faptului, iar al doilea ca atribut, (numar real 5.6) care are trei cmpuri i faptul (laborator-clips tematica fapt reguli variabile) care are cinci cmpuri. La ultimele dou fapte, primul cmp se poate interpreta ca fiind obiectul asupra cruia se face referire, al doilea cmp atributul obiectului, iar cmpurile urmtoare pot fi considerate valorile asociate atributului. De observat c se folosete o singur dat comanda (assert) pentru a introduce mai multe fapte. n mediul CLIPS fiecare fapt primete un identificator (numit i index sau indice) unic, de forma fact-0, fact-1, fact-23, etc. Nu este permis ca un fapt ordonat s includ un alt fapt. Exemplu:

    (dreptunghi lungime 40 latime 20)

    Urmtorul fapt nu va fi acceptat (dreptunghi (lungime 40 latime 20))

    Toate numerele n CLIPS sunt tratate ca numere ntregi sau reale n dubl precizie. Numerele fr zecimale sunt considerate a fi ntregi, iar cele cu virgul reale. Comanda (clear) este folosit pentru a ndeprta toate faptele din memorie i pentru a fora indicele de fapte s nceap cu f-0. Exemplu de folosire a numerelor pentru valorile unor cmpuri ale faptelor:

    CLIPS> (clear) CLIPS> (assert (numar 1) (x 1.5) (y 1.0) (z 65)) CLIPS> (assert (distanta 3.5e5) (coordonate 1 2 3) (coordonate 1 3 2))

    Lista de fapte va arta astfel: f-0 (numar 1) ;al doilea cmp are valoare ntreag f-1 (x 1.5) ;al doilea cmp are valoare real f-2 (y 1.0) ;al doilea cmp are valoare real negativ f-3 (z 65) ;al doilea cmp are valoare ntreag f-4 (distanta 350000.0) ;al doilea cmp are valoare real f-5 (coordonate 1 2 3) ;cmpurile de pe poziiile 2, 3 i 4 au valori ntregi f-6 (coordonate 1 3 2) ;este diferit de faptul anterior datorit valorilor diferite

    ale cmpurilor de pe poziia 3 i 4. For a total of 7 facts.

    Cmpurile dintr-un fapt ordonat pot fi separate de delimitatori, care pot fi de spaii, tabs, Enter. Exemplu: urmtorul fapt va fi introdus o singura dat pentru c este acelai:

    CLIPS> (clear) CLIPS> (assert (Animal este "Zebra".)) CLIPS> (assert (Animal este "Zebra". )) FALSE CLIPS> (assert (Animal este "Zebra".))

  • 18

    FALSE CLIPS> (assert (Animal este "Zebra ".))

    Lista de fapte va conine urmtoarele dou fapte: f-0 (Animal este "Zebra".) f-1 (Animal este "Zebra ")

    Mediul CLIPS nu permite folosirea spaiilor n cadrul unui fapt, dect pentru delimitarea cmpurilor. Pentru a utiliza totui spaiile acestea trebuiesc incluse ntre ". Exemplu: de folosire a spaiilor n interiorul unui cmp de tip string

    CLIPS> (clear) CLIPS> (assert (animal-este "cal") (animal-este "cal ") (animal-este " cal") (animal-este " cal ")))

    Lista de fapte va conine urmtoarele fapte: f-0 (animal-este "cal") f-1 (animal-este "cal ") f-2 (animal-este " cal") f-3 (animal-este " cal ")

    Dac se ncearc inserarea unui fapt care deja exist n lista de fapte atunci noua inserare va fi ignorat. Exemplu:

    CLIPS>(assert (lungime 50) (latime 40) (lungime 30)) CLISP>(assert (lungime 50)) FALSE

    Lista de fapte va conine urmtoarele fapte: f-0 (lungime 50) f-1 (latime 40) f-2 (lungime 30)

    Exist o opiune a mediului CLIPS care permite adugarea unui acelai fapt cu un nou indice, prin urmtoarea setare:

    (set-fact-duplication )

    8.1.2 Afiarea faptelor Pentru a afia lista de fapte se folosete comanda: (facts [ [ []]])

    start-integer este o valoare ntreag care exprim indicele faptului cu care ncepe afiarea, end-integer arat indicele unui fapt la care s se opreasc afiarea, max-integer fixeaz numrul maxim de fapte care pot fi afiate. Exemplu: n care sunt introduse patru fapte ordonate n lista de fapte i apoi sunt urmrite diverse utiliti ale comenzii (facts).

    CLIPS> (clear) CLIPS> (assert (a) (b) (c) (d)) CLIPS> (facts) f-0 (a) f-1 (b) f-2 (c)

  • 19

    f-3 (d) For a total of 4 facts. CLIPS> (facts 2) f-2 (c) f-3 (d) For a total of 2 facts. CLIPS> (facts 1 3) f-1 (b) f-2 (c) f-3 (d) For a total of 3 facts. CLIPS> (facts 0 3 2) f-0 (a) f-1 (b) For a total of 2 facts.

    Afiarea liste de fapte se poate realiza n mediul CLIPS i ntr-o fereastr separat, care poate fi deschis cu opiunea Facts Window din meniul Window.

    8.1.3 tergerea faptelor

    Pentru a terge fapte din lista de fapte se folosete comanda (retract | + | *)

    Ca argument al comenzii se d indicele faptului din list sau adresa unui fapt (care poate fi obinut n partea condiional a unei reguli). Pentru a terge toate faptele din lista de fapte se d comanda (clear). Prin comanda clear mai sunt terse toate regulile, variabilele globale, funciile, metodele i instanele. Pentru a terge toate faptele din lista de fapte i pentru a introduce faptul iniial se folosete comanda (reset).

    Exemplu: n care sunt introduse patru fapte ordonate n lista de fapte i apoi sunt terse folosind comanda (reset).

    CLIPS> (clear) CLIPS> (assert (a) (b) (c) (d))

    Pentru a terge faptul cu indicele 2 se apeleaz comanda retract astfel: CLIPS>(retract 2) CLIPS>(facts) f-0 (a) f-1 (b) f-3 (d) For a total of 3 facts.

    Dac se ncearc tergerea unui fapt care a fost deja ters sau a unui fapt inexistent se primete urmtorul mesaj:

    CLIPS>(retract 2) [PRNTUTIL1] Unable to find fact f-2.

    Se pot terge i mai multe fapte odat: CLIPS> (retract 1 3) CLIPS> (facts) f-0 (a) For a total of 1 fact.

    Pentru a terge toate faptele existente se folosete comanda (retract *): CLIPS> (retract *) CLIPS>

    Dup apelul comenzii (retract *) indexul de fapte nu revine la 0, deoarece incrementarea urmtoarelor fapte se face pornind de la indicele ultimului fapt ters.

  • 20

    8.1.4 Alte funcii pentru lucrul cu faptele load-facts

    (load-facts )

    Introduce n lista de fapte a mediului CLIPS faptele ncrcate dintr-un fiier primit ca argument. Argumentul trebuie s fie numele unui fiier, mpreun cu calea de directoare complet, care conine o list de fapte (nu constructori deffacts i nici alte comenzi sau constructori) separate prin delimitatorii admii de mediul CLIPS. Exemplu: fie fiierul test.txt care are urmtorul coninut:

    (a) (b) (c) (d)

    Pentru a ncrca aceste fapte n mediul CLIPS se d comanda (load-facts C:/Clips-Exemple/ test.txt) save-facts

    (save-facts )

    Salveaz fapte ntr-un fiier specificat prin nume i calea complet de directoare. ncearc s deschid fiierul pentru a scrie, i apoi scrie lista faptelor mediului CLIPS n fiier.

    8.1.5 Urmrirea faptelor

    CLIPS asigur o serie de comenzi care ajut utilizatorul s depaneze programe. Una din aceste comenzi, (watch facts), permite urmrirea faptelor care sunt introduse sau terse din lista de fapte. Este mai utila dect tastarea repetata a comenzii (facts). Exemplu: de folosire a comenzii (watch facts)

    CLIPS> (clear) CLIPS> (watch facts) CLIPS> (assert (Marti M1 curs "Inteligenta artificiala")) ==> f-0 (Marti M1 curs "Inteligenta artificiala")

    Simbolul ==> arat c s-a introdus un fapt n memorie, iar simbolul (reset) f-0 (initial-fact) CLIPS> (assert (Marti M2 laborator "Clips")) ==> f-1 (Marti M2 laborator "Clips") CLIPS> (retract 1) (facts) f-0 (initial-fact) For a total of 1 fact.

    Comanda (watch facts) asigur urmrirea dinamic a strii listei de fapte, spre deosebire de comanda (facts) care d starea static a listei n momentul apelrii comenzii. Pentru a nceta urmrirea faptelor se folosete comanda (unwatch facts). Pe lng posibilitatea de urmrire a faptelor, CLIPS asigur opiuni ale comenzii (watch) pentru urmrirea i a altor obiecte, dup cum urmeaz:

    (watch instances) ;folosite pentru instane ale obiectelor (watch slots) ;folosite pentru obiecte (watch rules) ;folosite pentru reguli

  • 21

    (watch activations) ;urmrete activarea regulilor (watch messages) ;folosite pentru obiecte (watch message-handlers) ;folosite pentru obiecte (watch generic-functions) ;pentru funcii generice (watch methods); ;folosite pentru metodele obiectelor (watch deffunctions) ;urmrirea funciilor definite de utilizator (watch compilations) ;activat implicit (watch statistics) (watch globals) ;pentru variabile globale (watch focus) ;urmrirea modulelor (watch all) ;urmrete toate opiunile enumerate anterior

    Aceste opiuni de urmrire pot fi selectate i din meniul Execution prin Watch Options sau din meniul Windows, prin bifarea ferestrei corespunztoare, care permite urmrirea obiectelor n ferestre separate.

    8.2 Fapte neordonate Faptele neordonate permit introducerea unei structuri abstracte, n care numele faptului specific un obiect. Obiectul poate avea mai multe cmpuri (numite sloturi), fiecare cmp din fapt avnd un nume i una sau mai multe valori asociate (multi-valoare). Ordinea sloturilor faptului nu are importan, acesta fiind motivul pentru care se numesc fapte neordonate. Definirea faptelor neordonate se face cu ajutorul constructorului (deftemplate) care are urmtoarea sintax: (deftemplate []

    *) ::= |

    ::= (slot *) ::=

    (multislot *) ::= i/sau ::=

    (default ?DERIVE | ?NONE | *) | (default-dynamic *)

    Acest constructor este folosit pentru a crea abloane n care cmpurile sunt accesibile prin numele lor (este asemntoare definirii unei structuri n limbaj C). Constructorul (deftemplate) permite definirea unui fapt neordonat cu nici unul sau mai multe cmpuri (numite slot sau multislot). Sloturile care au asociate mai multe valori se numesc multi-slot. Spre deosebire de faptele ordonate, sloturilor li se poate specifica tipul, valoarea i valoarea implicit. Pentru a introduce un fapt neordonat definit cu constructorul (deftemplate) n lista de fapte se folosete comanda (assert). Numele unui fapt neordonat i numele sloturilor, definite cu constructorul (deftemplate) trebuie s fie de tipul string. La faptele ordonate, pentru a avea acces la informaii, utilizatorul trebuie s cunoasc nu numai ce date sunt memorate n faptul respectiv, dar i poziia cmpurilor care conin datele respective. Spre deosebire de acestea, pentru a avea acces la informaii n faptele neordonate este suficient s se cunoasc numele atributului. Un fapt definit prin constructorul (deftemplate) poate avea oricte sloturi simple sau sloturi multiple. Atributele implicite (default sau default-dynamic), specific valori care vor fi

  • 22

    asociate cu un slot atunci cnd, la introducerea faptului n lista de fapte nu se d nici o valoare slotului respectiv. Valoarea implicit a unui slot poate fi static (default) sau dinamic (default-dynamic). Valoarea implicit static este evaluat o singur dat, atunci cnd este definit faptul, iar rezultatul este memorat n slotul corespunztor. ?DERIVE - valoarea implicit e dat de tipul valorii impuse slotului (de obicei este NIL), dac nu este specificat o valoare explicit. ?NONE - valoarea slotului trebuie specificat explicit atunci cnd se introduce faptul n lista de fapte; dac nu se atribuie o valoare explicit, mediul CLIPS va semnala eroare. specific o expresie evaluat o singur dat la introducerea faptului n lista de fapte. Valoarea implicit dinamic specific o expresie care este evaluat de fiecare dat cnd este introdus faptul n lista de fapte, iar rezultatul este atribuit slotului corespunztor. Exemplu:

    CLIPS>(clear) CLIPS> (deftemplate cerc (slot x_centru (default ?NONE)) (slot y_centru (default 0)) (slot raza (default ?DERIVE))) CLIPS>(assert (cerc)) [TMPLTRHS1] Slot x_centru requires a value because of its (default ?NONE) attribute. CLIPS>(assert (cerc (x_centru 20) (y_centru 30)) (cerc (x_centru 50) )) CLIPS>(facts) f-0 (cerc (x_centru 20) (y_centru 30) (raza nil)) f-1 (cerc (x_centru 50) (y_centru 0) (raza nil)) For a total of 2 fact.

    n exemplu (raza nil) semnific faptul c pentru slotul raza nu are asociat nici o valoare. Valoarea "nil" este folosit pentru a indica existena unui cmp, chiar dac acesta nu are nici o valoare. Dac aceast valoare nu ar fi trecuta, atunci slotul respectiv ar avea specificat doar numele, fr nici o valoare, ceea ce ar duce la erori. Atributele explicite ale unui slot, permit specificarea tipului de date care poate fi memorat cu slotul respectiv i pot avea urmtoarea sintax:

    ::= (type ) | (allowed-values ? )

    specifica tipul de date pe care l poate avea voaloarea slotului respectiv: INTEGER, FLOAT, SYMBOL, STRING, EXTERNAL-ADDRESS, FACT-ADDRESS, INSTANCE-NAME, INSTANCE-ADDRESS. permite memorarea oricrui tip de date. Exemplu: de utilizare a unui fapt neordonat, cu specificarea tipului da date al sloturilor (simbol pentru slotul nume, numr ntreg pentru slotul vrsta, numr real pentru slotul id, valorile m i f pentru slotul sex, mai multe valori de tip simbol pentru multislotul adres):

    CLIPS> (deftemplate persoana (slot nume (type SYMBOL) (default ?DERIVE)) (slot varsta (type INTEGER)(default ?NONE)) (slot id (type FLOAT) (default 0.0)) (slot sex (allowed-values f m ) (default m)) (multislot adresa (type SYMBOL) (default ?DERIVE))) CLIPS> (assert (persoana (nume Ionescu) (varsta 30) (id 12.3) (adresa str Domaneasca, nr.10))

  • 23

    (persoana (nume Popescu) (varsta 41)) (persoana (nume Florescu) (adresa str Brailei, nr.54) (sex f) (varsta 32) (id 45.2)) (persoana (varsta 27)))

    Lista de fapte va conine urmtoarele fapte: f-1 (persoana (nume Ionescu) (varsta 30) (id 12.3) (sex m) (adresa str Domaneasca, nr.10)) f-2 (persoana (nume Popescu) (varsta 41) (id 0.0) (sex m) (adresa)) f-3 (persoana (nume Florescu) (varsta 32) (id 45.2) (sex f) (adresa str Brailei, nr.54)) f-4 (persoana (nume nil) (varsta 27) (id 0.0) (sex m) (adresa))

    La introducerea unui fapt persoana n lista de fapte, este obligatoriu s se precizeze o valoare pentru slotul varsta, deoarece are specificat ca valoare implicit ?NONE. Redefinirea unui fapt neordonat duce la ignorarea definiiei anterioare. Un fapt poate fi redefinit cu ajutorul constructorului deftemplate, numai dac nu e folosit n momentul respectiv (dac nu exist nici un astfel de fapt n lista de fapte), n caz contrar mediul CLIPS afieaz eroare. Un fapt neordonat definit cu constructorul (deftemplate) poate avea oricte sloturi sau multisloturi, n orice combinaie. Facem observaia c un slot nu poate avea mai multe valori, n acest caz trebuie s se defineasc un multislot. La introducerea unui fapt neordonat n lista de fapte nu are importan ordinea n care sunt specificate sloturile.

    8.2.1 Adugarea de fapte

    Comanda cu care se introduce un nou fapt la lista de fapte este (assert). Sintaxa comenzii este urmtoarea:

    (assert +)

    Exemple ale folosirii acestei comenzi au fost prezentate anterior. Comanda (assert) poate fi folosit n mediul CLIPS n linia de comand, sau n partea de aciune a unei reguli. Cu ajutorul constructorul (deffacts) se poate defini o list de fapte, care va fi introdus n lista de fapte a mediului CLIPS la execuia comenzii (reset). Sintaxa comenzii este:

    (deffacts [] *)

    Aceast comand poate fi scris n linie de comand a mediului CLIPS, sau poate fi scris ntr-un fiier CLIPS (cu extensia clp) ca o comand de sine stttoare, fiind util pentru introducerea bazei iniiale de cunotine. Faptele introduse prin acest constructor au acelai comportament cu al faptelor introduse prin comanda (assert). Exemplu: de folosire a constructorului (deffacts) pentru introducerea n lista de fapte a mediului CLIPS a unor fapte ordonate si neordonate. Se salveaz un fiier cu extensia .clp, care va fi ncrcat n mediul CLIPS prin comanda (load), sau dac se lucreaz cu WinClips, se poate edita acest fiier cu editorul CLIPS-ului i apoi va fi ncrcat prin comanda LoadBuffer, din meniul Buffer.

    (deftemplate persoana (slot nume (type SYMBOL)(default ?DERIVE)) (slot varsta (type INTEGER) (default ?NONE)) (slot id (type FLOAT)(default 0.0)) (slot sex (allowed-values f m )(default m)) (multislot adresa (type SYMBOL) (default ?DERIVE))) (deffacts lista-fapte-initiale

  • 24

    ;fapt ordonat (pers nume Ionescu varsta 30 id 12.3 adresa str Domneasca nr.10) ;fapt neordonat (persoana (nume Ionescu)(varsta 30)(id 12.3) (adresa str Domaneasca, nr.10)))

    Observaii: constructorul (deftemplate) pentru definirea ablonului unui fapt neordonat, trebuie s fie trecut naintea constructorului (deffacts); primul cmp al faptului ordonat trebuie s fie denumit diferit fa de numele faptului ordonat, pentru a nu declana erori.

    8.2.2 Afiarea faptelor Pentru a afia lista de fapte se folosete comanda: (facts [ [ []]])

    pe care am prezentat-o la faptele ordonate, cap. 3.1.2. Comanda cu care se poate urmri lista faptelor neordonate este:

    (list-deftemplates), cu observaia c afieaz i faptele ordonate. Exemplu: pentru fiierul prezentat mai sus, vor fi afiate urmtoarele:

    CLIPS> (reset) CLIPS> (facts) f-0 (initial-fact) f-1 (pers nume Ionescu varsta 30 id 12.3 adresa str Domneasca nr.10) f-2 (persoana (nume Ionescu) (varsta 30) (id 12.3) (sex m) (adresa str Domaneasca, nr.10)) For a total of 3 facts. CLIPS> (list-deftemplates) initial-fact pers persoana For a total of 3 deftemplates.

    8.2.3 tergerea faptelor Pentru a terge fapte din lista de fapte se folosete comanda

    (retract | + | *)

    Ca argument al comenzii se d indicele faptului din list sau adresa unui fapt (care poate fi obinut n partea condiional a unei reguli). Pentru a terge toate faptele din lista de fapte se d comanda (clear). Pentru a terge toate faptele neordonate din lista de fapte care au fost introduse prin comanda (assert) i pentru a introduce faptul iniial se folosete comanda (reset). Efectul comenzii (reset) este de a reintroduce n lista de fapte, acele fapte definite prin constructorul (deffacts), dac nu a fost apelat anterior comanda (clear).

    8.2.4 Alte funcii pentru lucrul cu faptele

    Valoarea unui slot al unui fapt neordonat introdus cu (deftemplate) poate fi redefinit, cu condiia ca faptul respectiv s nu fie activ n acel moment (s nu existe nici un fapt cu acel nume n lista de fapte).

    (modify ( )+)

    este indicele unui fapt sau adresa unui fapt (obinut n partea condiional a unei reguli). Fiecare modificare trebuie s conin numele slotului ce urmeaz a fi modificat i noua valoare care se asigneaz slotului. n caz de succes al modificrii, faptul modificat va

  • 25

    fi ters din lista de fapte i un nou fapt se introduce n lista de fapte, similar cu faptul iniial, dar avnd sloturile specificate nlocuite cu valori noi. Efectul comenzii este de a ntoarce indexul faptului nou. Cu ajutorul acestei comenzi se pot modifica mai multe sloturi odat, dar nu se poate modifica dect un singur fapt, al crui specificator este dat ca argument n funcia (modify). Exemplu: pentru faptele neordonate definite n exemplu anterior:

    CLIPS>(modify 2 (nume POPESCU)) CLIPS>(facts 3) f-2 (persoana (nume POPESCU) (varsta 30) (id 12.3) (sex m) (adresa str Domaneasca, nr.10)) For a total of 1 fact.

    Comanda de copiere a unui fapt neordonat, ntr-un nou fapt are sintaxa:

    (duplicate ( )+)

    Face o copie a faptului. Apelul comenzii trebuie s conin indexul sau adresa faptul care se dorete a fi copiat, urmat, de o list de sloturi a cror valori se doresc a fi modificate n noul fapt i noua valoare care se asociaz slotului. Efectul comenzii este introducerea unui nou fapt n lista de fapte, similar cu faptul copiat, dar avnd valorile sloturilor specificate nlocuite cu valori noi i afiarea indexului faptului nou. Exemplu: n continuarea operaiilor exemplificate anterior:

    CLIPS>(duplicate 3 (nume Georgescu)) CLIPS>(facts 3 4) f-3 (persoana (nume POPESCU) (varsta 30) (id 12.3) (sex m) (adresa str Domaneasca, nr.10)) f-4 (persoana (nume Georgescu) (varsta 30) (id 12.3) (sex m) (adresa str Domaneasca, nr.10)) For a total of 2 facts.

    Afiarea valorilor unui slot al unui fapt neordonat se face prin comanda:

    (fact-slot-value )

    ntoarce valoarea slotului specificat prin nume. Afiarea numelor sloturilor unui fapt neordonat se face prin comanda:

    (fact-slot-names )

    ntoarce o list cu numele sloturilor faptului specificat prin index sau adres. Exemplu: de utilizare al ultimelor dou comenzi:

    CLIPS>(fact-slot-value 4 nume) Georgescu CLIPS>(fact-slot-names 4) (nume varsta id sex adresa)

    Funciile de urmrire, salvare n fiier, ncrcare de fapte dintr-un fiier, pentru faptele neordonate sunt identice cu cele prezentate la faptele ordonate.

  • 26

    9

    Reprezentarea cunotinelor - Reguli

    Un sistem expert trebuie s conin, pe lng cunotinele declarative, reunite sub forma listei de fapte, obiectelor, variabilelor i cunotine euristice, exprimate prin reguli de producie. Sursa de inspiraie pentru sistemele bazate pe reguli de producie este o simplificare a modelului cognitiv uman. Regulile sunt principala form de reprezentare a cunotinelor n mediul CLIPS, prin specificarea unui set de aciuni care urmeaz a fi realizate ntr-o anumit situaie. Dezvoltarea unui sistem expert const n definirea unui set de reguli care s rezolve problema dat. Regulile sunt folosite pentru a selecta setul de aciuni ce trebuiesc executate, n cazul ndeplinirii unei condiii. O regul este compus din: antecedent- numit i partea condiional (engl. if), sau partea stng a regulii (engl. LHS-left hand side); consecvent- numit i partea de aciune (engl. then), sau partea dreapt a regulii (engl. RHS-right hand side). Antecedentul este format dintr-o condiie (element condiional primitiv) sau dintr-o conjuncie de condiii primitive, care trebuie s fie satisfcute pentru ca regula s fie activat. n mediul CLIPS, partea condiional a unei reguli este verificat n funcie de existena, sau inexistena unor fapte bine precizate, n lista de fapte, sau a unor instane ale claselor definite de utilizator, n lista de instane sau testarea unor valori ale unor cmpuri. Un element condiional specificat n partea condiional a unei reguli, se numete ablon (engl. pattern). Procesul de comparare a faptelor i obiectelor, cu diferitele abloane, este numit pattern-matching. Mediul CLIPS furnizeaz un mecanism, care compar abloanele cu starea curent a listei de fapte i a listei de instane, n mod automat, pentru a determina regulile care au partea condiional satisfcut i deci, sunt aplicabile. Regulile aplicabile sunt trecute ntr-o list de reguli activate, numit agenda. Coninutul agendei poate fi vizualizat ntr-o fereastr separat a mediului CLIPS, care poate fi deschis din meniul Window. n agend pot fi zero sau mai multe reguli activate la un moment dat. Consecventul unei reguli este format dintr-un set de aciuni ce vor fi executate atunci cnd regula va fi aplicat (cnd va fi activat). Procesul inferenial prin care motorul de inferen caut regulile aplicabile i le execut este partea cea mai important a unui sistem expert (comanda de apel a motoului inferenial al mediului CLIPS este (run)). Procesul funcioneaz ciclic astfel:

    1. se determin regulile aplicabile (care au partea condiional satisfcut, adic toate elementele condiionale sunt adevrate);

    2. dac nu exist nici o astfel de regul (aplicabil), atunci procesul de oprete; 3. dac exist mai multe reguli aplicabile, motorul de inferena folosete o strategie de

    rezolvare a conflictelor, pentru a selecta regula a crei aciuni vor fi executate; 4. execut aciunile corespunztoare regulii selectate;

  • 27

    5. reia pasul 1. Acest proces inferenial poate fi cu nlnuire nainte (engl. forward chaining) sau cu nlnuire napoi (engl. backward chaining). Mediul CLIPS pune la dispoziie numai inferen cu nlnuire nainte. Un program scris n CLIPS i termin execuia cnd nu mai exist nici o regula n agend. Dac dup ce o regul a fost executata se d comanda (run) din nou, nainte de a fi dat comanda (reset), cu toate c partea ei condiional este satisfcut ea nu va mai fi activat n agend. CLIPS ine cont de urmtoarele principii: o regul este activat dac partea condiional se potrivete: - cu un nou ablon care nu exista nainte de activarea anterioar a regulii; - cu un ablon care a existat nainte, dar a fost ters i reintrodus i astfel este definit o nou entitate (un nou index).

    9.1 Definirea regulilor Regulile sunt definite folosind constructorul (defrule), care are urmtoare sintax: (defrule [] ; Left-Hand Side (LHS)

    [] * => ; Right-Hand Side (RHS) *) ntregul corp al regulii trebuie s fie inclus ntre paranteze, la fel i fiecare element condiional i fiecare aciune. Prin sintaxa de definire a unei reguli partea condiional (LHS) este desprit de partea de aciune (RHS) prin => (egal, mai mare). Partea condiional este format din zero sau mai multe elemente condiionale, care trebuie s fie adevrate pentru ca regula s fie aplicabil. Fiecare ablon const din unul sau mai multe cmpuri. Partea condiional a unei reguli mai poate conine declaraii cu privire la proprietile regulii, imediat dup numele regulii si comentariu. O aciune poate realiza introducerea sau tergerea unui fapt sau a unei instane sau poate apela o secven procedural sau o funcie care, n general, nu ntoarce nici o valoare, dar realizeaz ceva util pentru program (de exemplu afiarea unui mesaj). Nu exist o limit a numrului de condiii sau de aciuni pe care o regul le poate avea (alta dect limitarea impusa de memoria disponibil). Aciunile sunt executate secvenial dac i numai dac, toate condiiile din antecedent sunt satisfcute.

    Redefinirea unei reguli deja existente, cauzeaz ndeprtarea vechii reguli (tergerea ei),

    chiar dac noua regul este declarat eronat. La un moment dat n CLIPS nu pot exista dou reguli cu acelai nume.

    Dac n antecedentul unei reguli nu se afl nici o condiie, atunci este utilizat automat (initial-fact) sau (initial-object). Daca nu sunt aciuni n consecventul unei reguli, regula poate fi activat i executat, dar execuia ei nu va avea nici un efect.

    Regulile pot fi scrise direct n mediul CLIPS sau pot fi preluate dintr-un fiier cu extensia clp, pentru a putea corecta mai uor eventualele erori. Pentru uurina editrii regulilor, se face mai nti trecerea de la limbajul natural la pseudocod, iar apoi se folosesc comenzi ale mediului CLIPS pentru reguli. Exemplu: de regula

  • 28

    DACA unghi=90grade ATUNCI triunghiul este dreptunghic

    Regula poate fi introdus pe o singura linie, dar poate fi introdus i pe linii separate pentru a fi mai uor de editat i de citit. CLIPS> (clear) CLIPS> (assert (unghi 90-grade)) CLIPS> (defrule r1 (unghi 90-grade) ;ablon => (assert (triunghiul-este dreptunghic))) ;actiune CLIPS>

    Dac regula a fost introdus corect prompt-ul mediului CLIPS va reapare. Altfel va fi afiat un mesaj de eroare. Observaie: numrul de paranteze deschise trebuie s fie egal cu cel al parantezelor nchise (una din cele mai frecvente erori apare datorit parantezelor neperechi).

    Dac se apeleaz comanda (reset) memoria de lucru a mediului CLIPS este tears i se introduce n lista de fapte faptul iniial (initial-fact). In urma acestei comenzi nu sunt terse i regulile, ci doar agenda cu regulile activate.

    9.2 Declararea proprietilor unei reguli Proprietile (caracteristicile) unei reguli se pot declara n antecedent, folosind comanda declare. O regul nu poate avea dect un declare, care trebuie s fie situat naintea de definirea elementelor condiionale. Sintaxa prin care se definesc proprietile unei reguli este: ::= (declare + ) ::= (salience ) | (auto-focus < TRUE | FALSE > )

    Proprietatea salience permite utilizatorului s introduc un grad de ncredere unei reguli. Gradul de ncredere are o valoare ntreag i poate fi cuprins n intervalul -10000 i 10000. Dac gradul de ncredere al unei reguli nu este declarat explicit, atunci mediul CLIPS asigur implicit valoarea "0". Proprietatea auto-focus, dac simbolul boolean este TRUE, permite ca o comand focus s se execute ori de cte ori regula este activat. Exemplu: de definire a unor reguli cu valori specificate ale ncrederii

    (defrule test-1 (declare (salience 99) ) (fapt test-1) => (printout t Regula test-1 este executata. crlf )) (defrule test-2 (declare (salience 10 ) ) (fapt test-1) => (printout t Regula test-2 este executata. crlf ))

    Cele dou reguli sunt activate n acelai moment, dar regula test-1 va fi executat naintea regulii test-2, deoarece are valoarea ncrederii asociate mai mare.

  • 29

    Mediul CLIPS execut ntotdeauna regula cu cea mai mare prioritate din agenda, cea care este trecut prima n list. n momentul n care aciunea unei reguli a fost executat, regula este tears din agend, (altfel s-ar ajunge la bucle infinite) i se execut urmtoarea regul. Acest proces continu pn cnd nu mai exist nici o regul n agend sau pn cnd se ntlnete o comand de stop. Dac sunt dou reguli care au acelai grad de ncredere se folosete o strategie de rezolvare a conflictelor care decide care regul va fi activat prima. Comanda cu care se poate vizualiza coninutul agendei este (agenda). Exemplu:

    CLIPS> (agenda) 0 r1: f-0 For a total of 1 activation. CLIPS>

    Primul numr "0" reprezint gradul de ncredere al regulii, iar f-0 este indicele faptului care a contribuit la activarea regulii. Regulile introduse n memoria mediului CLIPS, la un moment dat, pot fi listate cu comanda (rules). Exemplu:

    CLIPS>(rules) r1 For a total of 1 defrule. CLIPS>

    9.3 Sintaxa prii condiionale ale unei reguli Partea condiional a unei reguli este constituit din zero sau mai multe elemente condiionale (prescurtat CE) conjunctive. Exista opt tipuri de elemente condiionale: - pattern - test - and - or - not - exists - forall - logical Elementul condiional de tip pattern este cel mai ntlnit i cel mai utilizat. Acesta conine condiii (constrngeri) care sunt folosite pentru afla dac exist fapte sau instane ce satisfac pattern-ul (ablonul). Elementul condiional de tip test se folosete pentru a evalua expresiile n procesul de pattern-matching (potrivire de abloane). Elementul condiional and este folosit pentru a specifica dac un ntreg grup de elemente condiionale trebuie s fie ndeplinite simultan. Elementul condiional or se folosete atunci cnd se dorete s se specifice c este suficient s poate fi ndeplinit doar unul dintr-un grup de elemente condiionale. Sintaxa pentru elementele condiionale specificate mai sus este: : : = |

    | | |

  • 30

    | |

    |

    9.3.1 Elementul condiional PATTERN Elementele condiionale de tip pattern constau dintr-o serie de constrngeri de cmp i valori, eventual asociate unor variabile, care sunt folosite pentru a condiiona un set de fapte care se potrivesc ablonului. Constrngerile sunt folosite pentru a testa un cmp al unui fapt ordonat sau un slot al unui fapt neordonat. Ele pot conine doar o constrngere literal, dar totui, pot fi compuse i din mai multe constrngeri conectate ntre ele. Pe lng constrngerile literale, mediul CLIPS furnizeaz alte trei tipuri de constrngeri: conective, predicative, i respectiv, de valoare returnat. Constrngeri literale Acest tip de condiie poate fi folosit n cadrul unui element condiional de tip pattern prin indicarea valorii exacte care corespunde cu valoarea cmpului. Se numete constrngere literal, deoarece este compus n totalitate din constante de tip simbol, ir de caractere, numr ntreg sau real, nume de instane. Aceast constrngere nu trebuie s conin variabile. Sintaxa unui astfel de element condiional este: pentru un fapt ordonat, care conine doar literali: () pentru un fapt neordonat: ( ) Exemplu: de reguli care au elemente condiionale de tip pattern

    (deftemplate persoana (slot nume (type SYMBOL) (default ?DERIVE)) (slot varsta (type INTEGER) (default ?NONE))) (deffacts fapte-de-start (unghi 90 grade) (unghi 45 grade) (persoana (nume Ion) (varsta 30)) (persoana (nume Ion) (varsta 45)) (persoana (nume Vasile) (varsta 62))) (defrule determinare-tip-triunghi (unghi 90 grade) => (printout t Triunghiul este dreptunghic crlf)) (defrule cauta-Ion (persoana (nume Ion) ) =>)

    Se introduc aceste dou reguli i faptele definite prin constructorul (deffacts) ntr-un fiier deschis n editorul mediului CLIPS (meniul File comanda New), salvat (Meniul File comanda Save), care apoi este ncrcat n mediul CLIPS (fie cu funcia (load) din meniul File sau tastat la promter, fie cu comanda LoadBuffer din meniul Buffer, apelat din fiierul n care se face editarea). n continuare se apeleaz urmtoarea secven de comenzi:

    CLIPS> (reset) CLIPS> (facts) f-0 (initial-fact)

  • 31

    f-1 (unghi 90 grade) f-2 (unghi 45 grade) f-3 (persoana (nume Ion) (varsta 30)) f-4 (persoana (nume Ion) (varsta 45)) f-5 (persoana (nume Vasile) (varsta 62)) For a total of 6 facts. CLIPS> (agenda) 0 cauta-Ion: f-4 0 cauta-Ion: f-3 0 determinare-tip-triunghi: f-1 For a total of 3 activations. CLIPS>

    Se observ c este un singur fapt, cel cu indice f-1 care satisface constrngerea literal impus n elementul condiional al regulei determinare-tip-tringhi, i exist dou fapte neordonate persoana, care au slotul nume cu valoarea Ion, al cror indici sunt f-3 i f-4 care satisfac regula cauta-Ion. Activrile acestor reguli se pot observa n agend, prin comanda (agenda), de vizualizare a listei de reguli activate. Constrngeri conective Sunt disponibile trei constrngeri conective, care pot fi combinate oricum i n orice numr. Acestea sunt urmtoarele: - & (and)-dac toate elementele condiionale conectate sunt adevrate; - | (or)-dac cel puin un element condiional dintre cele conectate este satisfcut; - ~ (not)-dac elementul condiional cruia i este aplicat nu este adevrat. Constrngerile conective au urmtoarea sintax: && < expresie-1>|< expresie-2>|< expresie-n> ~< expresie> unde poate fi variabil, constant sau constrngere conectiv. Prioritatea constrngerilor conective este: ~, &, |. Exemplu: de folosire a elementelor condiionale care conin constrngeri conective. Urmtoarea secven de cod va fi salvat ntr-un fiier cu extensia clp, care apoi va fi ncrcat folosind funcia (load). n continuare se apeleaz funcia (reset) pentru a introduce n lista de fapte, faptele definite prin constructorul (deffacts) i funcia (run) pentru ca motorul de inferen s execute regulile definite. Explicaiile fiecrei reguli se gsesc n consecventul acesteia, unde se face afiare.

    (deffacts fapte (fapt_1 aaa) (fapt_1 bbb) (fapt_1 ccc) (fapt_2 uuu) (fapt_2 vvv)

    (fapt_2 www) (fapt_3 3) (fapt_3 4) (fapt_3 5))

    (defrule r1 (fapt_1 ~aaa) => (printout t "regula 1: IF not(aaa)" crlf)) (defrule r1-0 (fapt_1 ~a)

  • 32

    ;daca in loc de valoarea aaa se trece a, nu se considera a ;fi o eroare, deoarece se incearca gasirea unui fapt_1 care sa ;nu aiba valoarea a pe al doilea camp => (printout t "regula 1-0: IF not(a)" crlf)) (defrule r2 (fapt_1 ?x&~aaa&~bbb) =>

    (printout t "regula 2: IF (not(aaa) AND not(bbb)) THEN: "?x crlf))

    (defrule r3 (fapt_1 aaa|ccc) => (printout t "regula 3: IF (aaa OR ccc)" crlf)) (defrule r4 (fapt_1 ?x) (fapt_2 ?y&~uuu&~vvv) =>

    (printout t "regula 4: IF [fapt_1 AND (not(uuu) AND not(vvv))] THEN: fapt_1="?x " fapt_2=" ?y crlf))

    (defrule r5 (fapt_1 ?x&~aaa) (fapt_2 uuu|vvv) =>

    (printout t "regula 5: IF [(not(aaa) AND (uuu OR vvv)] THEN: fapt_1="?x crlf))

    Observaie: variabilele se noteaz cu ? naintea numelui, iar domeniul de vizibilitate este constructorul n care sunt apelate prima dat. Am notat cu ?x variabila cu numele x. Variabilele vor fi prezentate ntr-un alt capitol. Constrngeri predicative Uneori este necesar s se verifice dac valoarea unui cmp ndeplinete o anumit condiie impus de valoarea de adevr boolean a unei expresii date. Constrngerile predicative permit ca o funcie predicativ, care ntoarce valori FALSE sau TRUE, s fie apelat i evaluat n timpul procesului de pattern-matching. De cele mai multe ori, constrngerile predicative sunt folosite n combinaie cu constrngeri conective. Sintaxa pentru constrngerile predicative este:

    ::= | |

    :

    Exemplu: de folosire a constrngerilor predicative combinate cu constrngeri conective, n continuarea exemplului anterior

    (defrule r6 (fapt_3 ?y)

    (fapt_3 ?x&: (> ?x ?y) ) => (printout t ?x > ?y crlf))

    Agenda va conine i urmtoarele activri 0 r6: f-7 , f-9 0 r6: f-8 , f-9 0 r6: f-7 , f-8

  • 33

    Constrngeri ale valorii returnate Este posibil s se compare valoarea returnat de o funcie extern cu valoarea unui cmp. Constrngerea de valoare returnat, permite utilizatorului s apeleze i s evalueze funcii externe, din interiorul unui ablon din partea condiional a unei reguli. Valoarea returnat trebuie s fie una din tipurile primitive de date. Sintaxa pentru constrngerile de valoare returnat este:

    ::=| | :| =

    Exemplu: la fiierul anterior se mai adaug regula

    (defrule r7 (fapt_3 ?y)

    (fapt_3 ?x& =(- (* ?y 2) 3)) => (printout t ?x = ?y *2-3 crlf))

    Agenda va cuprinde i activrile: 0 r7: f-8, f-9 0 r7: f-7, f-7

    9.3.2 Elementul condiional TEST Elementul condiional de tip test este satisfcut dac funcia pe care o apeleaz este evaluat la o valoare TRUE i nesatisfcut dac funcia este evaluat la o valoare FALSE. Funciile apelate pot fi comparaii ntre variabile i/sau constante, comparaii logice sau pot fi apelate i testate funcii ale mediului CLIPS sau funcii externe definite de utilizator. Sintaxa elementului condiional de tip test este:

    ::= (test )

    Exemplu: se definete regula urmtoare care verific dac diferena a dou numere este mai mare sau egal cu valoarea 2, folosindu-se faptele definite n exemplul anterior

    (defrule r8 (fapt_3 ?x) (fapt_3 ?y) (test (>= (abs (- ?y ?x) ) 2) ) =>

    (printout t Regula 8 crlf))

    Agenda va cuprinde activrile 0 r8: f-9,f-7 0 r8: f-7,f-9

    9.3.3 Elementul condiional OR Acest tip de element condiional permite combinarea mai multor elemente condiionale, astfel nct s fie suficient s fie adevrat unul singur pentru a ndeplini o condiie. Dac oricare dintre elementele condiionale dintr-un element condiional compus de tip or este satisfcut, atunci elementul compus este satisfcut. Dac toate celelalte elemente condiionale din antecedentul regulei sunt satisfcute, regula va fi activat. n interiorul unui element condiional or pot fi plasate oricte elemente condiionale. Sintaxa pentru elementul condiional or este:

    ::= (or + )

  • 34

    Exemplu: de utilizare a elementelor condiionale or. Se definete regula poligon-regulat, care este satisfcut dac exista un fapt (figura necunoscuta) i macar unul din faptele din elementul condiional or.

    (defrule poligon-regulat (figura necunoscuta) (or (triunghi echilateral) (patrat) (hexagon regulat) ) =>

    (printout t Proprietati: toate unghiurile si laturile congruente crlf) )

    Regula de mai sus este echivalent cu urmtoarele trei reguli:

    (defrule regulat-3 (figura necunoscut) (triunghi echilateral) =>

    (printout t Proprietati: toate unghiurile si laturile congruente crlf) )

    (defrule regulat-4 (figura necunoscut) (patrat) =>

    (printout t Proprietati: toate unghiurile si laturile congruente crlf) )

    (defrule regulat-6 (figura necunoscut) (hexagon regulat) =>

    (printout t Proprietati: toate unghiurile si laturile congruente crlf) )

    9.3.4 Elementul condiional AND Mediul CLIPS consider ca toate regulile au un elementele condiionale separate de AND implicit. Aceasta nseamn ca toate elementele condiionale din antecedentul regulei trebuie s fie satisfcute pentru ca regula s fie activat. Dar, mediul CLIPS pune la dispoziie si un and explicit, pentru a permite combinri complexe care s conin and i or. Elementul condiional de tip and este satisfcut dac toate elementele condiionale incluse n acesta sunt satisfcute. ntr-un element condiional de tip and pot fi incluse un numr orict de mare de elemente condiionale simple. Sintaxa elemetului condiional de tip and este:

    ::= (and + )

    Exemplu: de regul care combin elemente condiionale de tip or cu elemente condiionale de tip and.

    (defrule gripa (stare boala) (or (and (temperatura mare) (ochi inrositi)) (and (temperatura mica) (dureri gat) (curge nasul)) => (printout t Bolnavul este suspect de gripa crlf ))

  • 35

    9.3.5 Elementul condiional NOT Elementul condiional not este satisfcut doar dac acele condiii care l compun nu sunt ndeplinite (sunt evaluate la o valoare de adevr FALSE). Sintaxa elementului condiional not este:

    ::= (not )

    La un moment dat, doar un singur element condiional poate fi negat. Combinarea lui NOT cu AND i OR trebuie fcut cu mult atentie, deoarece rezultatele nu sunt ntotdeauna clare. Exemplu: de utilizare a elementului not, care verific dac nu exist faptul (stare boala).

    (defrule gripa (not (stare boala))

    (and (temperatura mare) (ochi inrositi)) => (printout t Posibil stare de oboseala crlf ))

    Un element condiional de tip NOT care conine un singur TEST este convertit astfel nct elementul condiional TEST s fie inclus ntr-un AND i s fie precedat de (initial-fact) sau (initial-object). De exemplu, urmtoarea condiie (val-1 i val-2 sunt numele unor variabile):

    (not (test (> ?val-1 ?val-2) ) )

    este convertit n:

    (not (and (initial-fact) (test (> ?val-1 ?val-2) ) ) )

    Totui, ar fi mult mai simplu s convertim condiia dat ca exemplu, n forma urmtoare:

    (test (not (> ?val-1 ?val-2) ) )

    9.3.6 Elementul condiional EXISTS Acest tip de element condiional este folosit pentru a determina dac un grup de elemente condiionale este ndeplinit de mcar un set de date. Sintaxa elementului condiional exist este:

    ::= (exists +)

    Elementul condiional exists este implementat folosind dou elemente condiionale de tip NOT. De exemplu, regula de mai jos:

    (defrule exemplu (exists (a ?x) (b ?x) )

    =>)

    este echivalent cu urmtoarea:

    (defrule exemplu (not (not (and (a ?x) (b ?x) ) ) )

    => )

    Exemplu: de utilizare a elementului condiional exists. Regula exemplu-exists-1 va fi activat i executat de 2 ori deoarece exista cel puin un fapt date al crui slot latura s aib valoarea

  • 36

    romb i faptul (unghi ...), este prezent de 2 ori n lista de fapte (cu valorile 45 i 90). Regula exemplu-exists-2 va fi activat o singur dat, deoarece elementul condiional exists verific dac exist cel puin un fapt al crui slot latura cu valoarea romb.

    (deftemplate date (slot valoare) (slot latura (default romb))) (deffacts fapte-start (date (valoare 15)) (date (valoare 25)) (date (valoare 35)) (unghi 90) (unghi 45)) (defrule exemplu-exists-1 (unghi ?v) (exists (date (latura romb))) => (printout t "Exista un romb cu unghi de "?v crlf)) (defrule exemplu-exists-2 (exists (date (latura romb))) => (printout t "Exista un romb " crlf))

    9.3.7 Elementul condiional FORALL Elementul condiional FORALL are rolul de a determina dac un numr de elemente condiionale dintr-un grup sunt ndeplinite pentru fiecare caz al unui alt element condiional, precizat explicit. Sintaxa elementului condiional forall este:

    ::= (forall + )

    Acest tip de element condiional este echivalent cu dou elemente condiionale: unul NOT i unul AND. De exemplu, regula de mai jos:

    (defrule exemplu (forall (a ?x) (b ?x) (c ?x) ) => )

    este echivalent cu urmtoarea regul:

    (defrule exemplu (not (and (a ?x) (not (and (b ?x) (c ?x) ) ) ) ) => )

    Exemplu: urmtoarea regul determin dac toi studenii au absolvit examenele la Inteligenta-artificiala, Baze-de-date, Retele-calculatoare, folosind elementul condiional forall. Singurul student care a trecut la toate examenele este Pop, iar regula va fi activat o singur dat.

    (deffacts fapte-start (student Pop) (Inteligenta-artificiala Pop) (Baze-de-date Pop) (Retele-calculatoare Pop)) (defrule exemplu-forall (forall (student ?v)

  • 37

    (Inteligenta-artificiala ?v) (Baze-de-date ?v) (Retele-calculatoare ?v)) => (printout t "Studentul este absolvent" crlf))

    9.3.8 Elementul condiional LOGICAL Elementul condiional LOGICAL este folosit pentru a crea un grup de dependene logice ntre abloanele de tip logical din partea stng a unei reguli cu entiti (fapte sau instane) create n partea de dreapt a regulii. Condiia logical grupeaz abloanele mpreun, exact ca i un AND explicit.

    ::= (logical + )

    Poate fi folosit n combinaii cu elemente condiionale de tip AND, OR, sau NOT. Trebuie menionat faptul c doar abloanele logical ale unei reguli trebuie s fie poziionate naintea celorlalte abloane. De exemplu, regula de mai jos este corect:

    (defrule exemplu-logical-corect (logical (a) ) (logical (b) ) (c) => (assert (d) ) )

    n timp ce urmtoarele reguli nu sunt corecte:

    (defrule exemplu-logical-incorect-1 (logical (a) ) (b) (logical (c) ) => (assert (d) ) ) (defrule exemplu-logical-incorect-2 (a) (logical (b) ) (logical (c) ) => (assert (d) ) ) (defrule exemplu-logical-incorect-3 (or (a) (logical (b) ) ) (logical (c) ) => (assert (d) ) )

    Exemplu: de utilizare a dependenelor logice

    CLIPS> (clear) CLIPS> (defrule regula1 ;dependenta logica intre a i x,y (logical (a)) (b) => (assert (x) (y))) CLIPS> (defrule regula2 ;dependenta logica intre c i x,y (logical (c)) (d) =>

  • 38

    (assert (x) (y))) CLIPS>

    Pentru a vedea cum funcioneaz dependenele logice se vor urmri faptele i activrile de reguli i regulile.

    CLIPS> (watch facts) CLIPS> (watch activations) CLIPS> (watch rules) CLIPS> (assert (a) (b) (c) (d) ) ==> f-0 (a) ==> f-1 (b) ==> Activation 0 regula1: f-0,f-1 ==> f-2 (c) ==> f-3 (d) ==> Activation 0 regula2: f-2,f-3 CLIPS> (run) FIRE 1 regula2: f-2,f-3

    ; regula2 introduce dependenta logica ==> f-4 (x) ==> f-5 (y) FIRE 2 regula1: f-0,f-1

    ; regula1 introduce dependenta logica, dar nu mai sunt introduse nc odat faptele (x) i (y) n lista de fapte, deoarece ele exist deja.

    CLIPS> (retract 0) (retract 2)

    ; se terge dependenta logica dintre (c) i (x), (y), astfel (x) i (y) nu mai au suport logic i vor fi terse automat din lista de fapte.

    (ppdefrule r1) (defrule MAIN::r1 (latura1 ?val1) (latura2 ?val2) => (assert (figura dreptunghi)) (printout t "Figura este dreptunghi")) CLIPS>

  • 39

    10

    Variabile n mediul CLIPS

    Variabilele sunt folosite pentru a stoca valori. Spre deosebire de fapte, ale cror cmpuri au valori care sunt statice i pe parcursul unui program nu se schimb, valoarea variabilelor este dinamic. n plus, odat ce un fapt a fost introdus n lista de fapte, cmpurile sale pot fi modificate doar prin tergerea faptului respectiv i introducerea sa ca un nou fapt, cu valorile cmpurilor schimbate, i care are un nou indice. Variabilele sunt de dou tipuri:

    locale sunt vizibile doar n constructorul n care au fost definite; globale sunt vizibile din momentul n care au fost definite pn la sfritul fiierului.

    Valorile variabilelor pot fi unul din tipurile de date primitive (float, integer, symbol, string, external address, fact address, instance name i instance address). Spre deosebire de limbajele de programare unde, pentru a declara o variabil este necesar s i se specifice tipul i eventual, domeniul de valori, mediul CLIPS evalueaz variabila i i asociaz automat unul din tipurile primitive de date. Variabilele pot avea valori:

    simple multivaloare

    Numele unei variabilei trebuie s fie un simbol, cu observaia c trebuie s nceap cu o liter (n caz contrar dei nu se semnaleaz eroare, variabila este inexistent).

    10.1 Variabile locale Forma de definire i de folosire a variabilelor locale este:

    ?

    nainte ca o variabil s fie folosit trebuie s i se dea o valoare. n caz contrar, la apelul variabilei respective va apare un mesaj de eroare. Variabilele locale au domeniul de vizibilitate doar n constructorul n care au fost folosite. Exemplu: de eroare la folosirea unei variabile

    CLIPS> (clear) CLIPS> (defrule test (initial-fact) => (printout t ?x crlf)) [PRCCODE3] Undefined variable x refered in RHS of defrule. ERROR: (defrule MAIN::test (initial-fact) => (printout t ?x crlf)) CLIPS>

    Variabila x din partea dreapt a regulii nu a fost definit i CLIPS afieaz un mesaj de eroare pentru c nu poate asigna nici o valoare variabilei respective.

  • 40

    Variabilele locale sunt folosite, n principal, pentru a memora valorile folosite n elementele condiionale ntr-un anumit ablon din antecedentul regulilor i pentru a le folosi n consecventul regulilor. Exemplu:

    (defrule determinare-tag (tag ?nume) => (assert (cauta-tag-pereche ?nume)))

    Dac se introduce faptul (tag html) i apoi se d comanda (run), dup care se verific lista de fapte, atunci noul fapt introdus n lista de fapte este (cauta-tag-pereche html), deoarece variabila nume are asociat de valoarea "html" obinut prin compararea variabilei cu valoarea celui de-al doilea cmp al ablonului din antecedentul regulii. Exemplu: preluat din capitolul anterior, n care se asociaz valoarea posibil unui cmp cu dou variabile x i y, aceste valori urmnd a fi comparate.

    (defrule r6 (fapt_3 ?y)

    (fapt_3 ?x&: (> ?x ?y) ) => )

    De asemenea variabilele pot fi folosite pentru a tipri valorile asociate cu unele cmpuri. Exemplu: de afiare a valorii celui de-al doilea cmp al ablonului din antecedentul regulii, asociat cu variabila nume. Variabila poate fi folosit de mai mult ori n cadrul constructorului n care a primit valoarea, dar utilizarea ei n cadrul oricrui alt constructor este eronat, deoarece domeniul de valabilitate este numai n constructorul n care a primit prima oar valoarea. n exemplul de mai jos existena variabilei este legat de regula determinare-tag, iar dup execuia regulei variabila este tears, pierzndu-i valoarea.

    (defrule determinare-tag (tag ?nume) => (printout t tag-ul cautat este ?nume crlf) (assert (pereche-tag _nume)))

    Exemplu: preluat din capitolul anterior (defrule r2 (fapt_1 ?x&~aaa&~bbb) => (printout t "regula 2: IF (not(aaa) AND not(bbb)) THEN: "?x ))

    Se asociaz valoarea celui de-al doilea cmp al faptului fapt_1 cu variabila x, se compar aceast valoare cu ~aaa i ~bbb i apoi se afieaz valoarea variabilei x ntr-un mesaj n funcia (printout). n constructori diferii se pot folosi aceleai variabile, fr ca valorile acestora s se influeneze. O variabil mai poate fi folosit pentru a memora adresa un fapt n partea dreapt a unei reguli, faptul putnd fi ters, modificat, duplicat. Pentru aceasta, se leag adresa faptului de o variabil n partea stng a regulii. Deci variabila memoreaz adresa unei fapt, de tip fact-address i nu faptul. Adresa unui fapt este specificata prin operatorul "

  • 41

    CLIPS> (facts) f-0 (latura 4) For a total of 1 fact. CLIPS> (defrule latura

    ?l

    (retract ?l) (printout t "Latura are valoarea ?val memorata in faptul cu

    indice " ?l crlf) ) CLIPS> (run) Latura este CLIPS> (facts) CLIPS>

    Se observa c prin comanda printout este afiat att valoarea asociat laturii memorat n variabila val, ct i indexul faptului memorat n variabila l", iar la apelul comenzii (facts) nu mai este afiat nici un fapt, deoarece faptul latura a fost ters n partea dreapt a regulii latura. Chiar dac faptul latura a fost ters, valoarea celui de-al doilea cmp mai este disponibil pn la sfritul regulii, acesta fiind memorat n variabila val. De notat c, att regula, ct i faptul au acelai nume latura, mediul CLIPS acceptnd pentru construcii ale unor cunotine diferite (reguli, fapte, funcii, variabile) acelai nume. Exemplu: de utilizare a variabilelor pentru memorarea valorii unui cmp i a adresei unui fapt. Se observ c regula grupa va fi executat de trei ori, deoarece este activat de cele trei fapte, iar la fiecare execuie a regulii variabilele primesc alte valori.

    CLIPS> (clear) CLIPS> (defrule grupa ?id_stud (printout t ?nume " este student al acestei grupe." crlf) (retract ?id_stud)) CLIPS> (deffacts studenti (student Adrian) (student Dan) (student Stefan)) CLIPS> (reset) CLIPS> (run) Adrian este student al acestei grupe. Dan este student al acestei grupe. Stefan este student al acestei grupe. CLIPS>

    O variabil poate fi folosit i la citirea unei valori de la tastatur, care s poat fi folosit n diverse operaii. Exemplu: de citire a unei valori de la tastatur folosind funcia (read), asocierea acestei valori cu variabila val utiliznd funcia (bind). Variabila este folosit apoi pentru afiare i introducerea unui nou fapt. Pentru a executa aceast regul este suficient s se dea comanda (reset), urmat de (run).

    (defrule introduce-valoare => (bind ?val (read))

    (printout t "valoarea = " ?val crlf) (assert (valoare ?val)))

  • 42

    10.2 Variabile multivaloare Pe lng variabilele cu o singur valoare, mediul CLIPS pune la dispoziia utilizatorilor variabile multivaloare, care pot memora mai multe tipuri de date n acelai timp. Variabilele multivaloare sunt apelate cu urmtoarea sintax:

    $?

    Funciile care opereaz cu valori multicmp sunt exemplificate mai jos.

    10.2.1 Crearea de valori multicmp Aceast funcie grupeaz orice numr de cmpuri pentru a crea o valoare multicmp. Sintaxa comenzii este:

    (create$ *)

    Valoarea returnat de funcia create$ este o valoare multicmp cu un numr oarecare de date de un anumit tip. Dac se apeleaz funcia fr argumente, atunci este creeat o valoare cu lungime zero. Exemplu: de utilizare al funciei create

    CLIPS (create$ ion vasile popescu iordachescu) (ion vasile popescu iordachescu) CLIPS> (create$ (+ 3 4) (* 2 3) (/ 8 4)) (7 6 2) CLIPS>

    10.2.2 Specificarea unui element al unui multicmp Se realizeaz cu funcia nth$ care returneaz un cmp al unei valori multicmp. Sintaxa este urmtoarea:

    (nth$ )

    primul argument este un numr ntreg care specific poziia cmpului care se dorete a fi returnat. Dac acest ntreg este mai mare dect numrul de campuri a valorii multicmp, atunci se returneaz nil. Exemplu:

    CLIPS> (nth$ 3 (create$ a b c d e f g)) c CLIPS>

    10.2.3 Cutarea unui element al unui multicmp Funcia member$ verific dac o valoare simpl se regsete ntr-o valoare multicmp. Sintaxa este:

    (member$ )

    Funcia returneaz poziia expresiei dac aceasta se regsete printre valorile expresie multicmp, i FALSE n rest. Exemplu:

    CLIPS> (member$ galben (create$ rosu 3 "text" 8.7 galben)) 5

  • 43

    CLIPS> (member$ 4 (create$ rosu 3 "text" 8.7 galben)) FALSE CLIPS>

    10.2.4 tergerea unui element al unui multicmp Funcia pentru tergerea unor elemente ale unei variabile multicmp are sintaxa: (delete$ )

    Valoarea ntoars de aceast funcie este valoarea multicmp modificat prin tergerea cmpurilor cu poziia ncepnd la begin-integer i terminndu-se la end-integer. Exemplu:

    CLIPS> (delete$ (create$ camp1 camp2 camp3 camp4 camp5) 3 4) (camp1 camp2 camp5) CLIPS> (delete$ (create$ computer imprimanta hard-disk) 1 1) (imprimanta hard-disk) CLIPS>

    10.2.5 Extragerea unei secvene de cmpuri Funcia creeaz o nou valoare multicmp care conine cmpurile din valoarea iniial specificate prin poziia de nceput i sfrit, cu urmtoarea sintax: (subseq$ )

    Exemplu:

    CLIPS> (subseq$ (create$ camp1 camp2 camp3 camp4) 3 4) (camp3 camp4) CLIPS> (subseq$ (create$ 1 "abc" def "ghi" 2) 1 1) (1) CLIPS>

    10.2.6 nlocuirea unui cmp Se realizeaz cu funcia replace$, care are sintaxa: (replace$

    +)

    Scopul acestei funcii este de a nlocui cu o valoare simpl sau multicmp specificat explicit prin al patrulea argument al funciei ntr-o expresie multicmp ntre poziiile specificate cu begin-integer i end-integer. Exemplu:

    CLIPS> (replace$ (create$ camp1 camp2 camp3) 3 3 macheta) (camp1 camp2 macheta) CLIPS> (replace$ (create$ a b c d) 2 3 x y (create$ q r s)) (a x y q r s d) CLIPS>

    10.2.7 Introducerea unui cmp Funcia insert$ introduce o valoare simpla sau multicmp pe poziia specificat explicit printr-un numr ntreg, dup urmtoarea sintax:

    (insert$

  • 44

    +)

    Exemplu:

    CLIPS> (insert$ (create$ a b c d) 1 x) (x a b c d) CLIPS> (insert$ (create$ a b c d) 4 y z) (a b c y z d) CLIPS> (insert$ (create$ a b c d) 5 (create$ q r)) (a b c d q r) CLIPS>

    Mai exist i alte funcii pentru lucrul cu valori multicmp (first$, rest$, implode$, explode$) care pot fi cutate n help-ul pus la dispoziie de mediul CLIPS.

    10.3 Variabile globale Pe lng variabilele locale mai exist i variabile globale, care sunt vizibile n toi constructorii fiierul n care au fost definite i n mediul CLIPS. Variabilele globale pot fi folosite ntr-un ablon al prii stngi ale unei reguli, dar schimbarea valorii asociate nu influeneaz procesul de potrivire al abloanelor (pattern-matching). Pentru a putea fi folosite, variabilele globale se definesc cu constructorul:

    (defglobal [] ?** = *)

    Numele variabilei globale trebuie s fie de tip simbol, iar specificarea numelui modulului din care face parte este opional (implicit este modulul MAIN). Expresia poate fi o valoare simpl sau o valoare multicmp. Observaie: ntre numele variabilei, semnul = i expresie, t