16
Cuprins 1 Introducere in CLIPS. Fapte si reguli. Depanare. Variabile si Constante 3 1.1 Instalare si rulare ...................................... 3 1.2 Help ............................................. 4 1.3 Fapte ............................................. 4 1.3.1 Adaugare de fapte la memoria de lucru ...................... 5 1.3.2 Listarea faptelor .................................. 5 1.3.3 Stergerea faptelor .................................. 5 1.3.4 Resetarea memoriei de lucru ............................ 5 1.3.5 Definirea faptelor .................................. 5 1.4 Reguli ............................................ 6 1.4.1 Afisarea regulilor .................................. 6 1.4.2 Rulare: pornirea procesului de deductie ...................... 7 1.4.3 Rulare automata: batch .............................. 8 1.5 Reinitializarea CLIPS .................................... 8 1.6 Intrare/Iesire ........................................ 8 1.6.1 Tiparirea pe ecran ................................. 8 1.6.2 Citirea de la tastatura ............................... 8 1.7 Tipuri de date ........................................ 9 1.8 Comentarii .......................................... 9 1.9 Reguli cu wildcarduri si variabile ............................. 9 1.9.1 Wildcarduri ..................................... 9 1.9.2 Patternuri cu variabile ............................... 10 1.9.3 Optionalitate pentru variabile ........................... 11 1.10 Retractarea unui fapt din interiorul unei reguli ...................... 13 1.11 Depanare .......................................... 13 1.11.1 Watch ........................................ 13 1.11.2 Breakpoint ..................................... 13 1

DocumentL1

Embed Size (px)

DESCRIPTION

curs1

Citation preview

  • Cuprins

    1 Introducere in CLIPS. Fapte si reguli. Depanare. Variabile si Constante 3

    1.1 Instalare si rulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    1.2 Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    1.3 Fapte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    1.3.1 Adaugare de fapte la memoria de lucru . . . . . . . . . . . . . . . . . . . . . . 5

    1.3.2 Listarea faptelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    1.3.3 Stergerea faptelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    1.3.4 Resetarea memoriei de lucru . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    1.3.5 Definirea faptelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    1.4 Reguli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    1.4.1 Afisarea regulilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    1.4.2 Rulare: pornirea procesului de deductie . . . . . . . . . . . . . . . . . . . . . . 7

    1.4.3 Rulare automata: batch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    1.5 Reinitializarea CLIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    1.6 Intrare/Iesire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    1.6.1 Tiparirea pe ecran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    1.6.2 Citirea de la tastatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    1.7 Tipuri de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    1.8 Comentarii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    1.9 Reguli cu wildcarduri si variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    1.9.1 Wildcarduri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    1.9.2 Patternuri cu variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    1.9.3 Optionalitate pentru variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    1.10 Retractarea unui fapt din interiorul unei reguli . . . . . . . . . . . . . . . . . . . . . . 13

    1.11 Depanare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    1.11.1 Watch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    1.11.2 Breakpoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    1

  • 2 CUPRINS

    1.11.3 Stoparea executiei dupa n pasi . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    1.11.4 Matching partial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    1.11.5 Loguri ale sesiunii CLIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    1.12 Variabile temporare si constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    1.12.1 Variabile temporare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    1.12.2 Constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

  • Laboratorul 1

    Introducere in CLIPS. Fapte si reguli.Depanare. Variabile si Constante

    CLIPS (C Language Integrated Production System) este:

    un tool pentru dezvoltare de sisteme expert disponibil free (la http://clipsrules.sourceforge.net); vom folosi versiunea 6.24; declarativ (programatorul spune CE trebuie facut, ca si in Prolog) si nu procedural (unde pro-gramatorul spune CUM se face un anumit lucru, ca de exemplu in C). Asadar, nu trebuiesa descriem pas cu pas drumul catre solutia problemei; in CLIPS, trebuie doar sa descriemproblema si calculatorul este cel care gaseste calea spre solutie;

    bazat pe fapte si reguli. Faptele sunt proprietati ale entitatilor; ex. Didier e fotbalist (undeentitatea este Didier, iar proprietatea este fotbalist). Regulile servesc la deducerea de faptenoi pornind de la cele existente; ex. daca cineva este fotbalist, atunci este legitimat la un club.Cunostintele pe care le avem despre lume vor fi codificate sub aceasta forma, apoi CLIPS vadeduce din ele alte cunostinte care ne-ar putea interesa.

    1.1 Instalare si rulare

    Pe sistemele din laborator, rularea se face tastand:

    rlwrap clips

    (rlwrap permite accesul la istoricul de comenzi tastate la promptul CLIPS). Pentru test, la promptulcare apare, tastati

    (+ 1 2)

    si trebuie sa obtineti raspunsul

    3

    Parasirea programului se face cu:

    (exit)

    Pentru o instalare pe un alt sistem, trebuie descarcate arhivele clips_core_source_624.tar.Z simake_and_help_files_624.zip. Apoi, se fac urmatorii pasi:

    3

  • 4LABORATORUL 1. INTRODUCERE IN CLIPS. FAPTE SI REGULI. DEPANARE. VARIABILE SI CONSTANTE

    tar zxvf clips_core_source_624.tar.Z

    unzip make_and_help_files_624.zip

    cp makefile.gcc clipssrc/clipssrc

    cd clipssrc/clipssrc

    make -f makefile.gcc

    In urma compilarii, se obtine fisierul executabil, care se lanseaza prin comanda

    ./clips

    Optional, se poate adauga directorul curent la variabila PATH pentru a putea lansa CLIPS cucomanda

    clips

    1.2 Help

    Pentru help, tastati la promptul CLIPS:

    (help)

    Este necesara prezenta in director a fisierului clips.hlp.

    Parasirea helpului se face apasarea tastei ENTER pana apare promptul CLIPS.

    1.3 Fapte

    Faptele sunt descrieri ale diferitelor aspecte din realitate, cum ar fi proprietati ale unor obiecte sauactiuni si participantii la aceste actiuni. Ele sunt stocate in memoria de lucru (working memory).

    Faptele se introduc sub forma unor liste cu elementele grupate in paranteze. Pe prima pozitie a listeise gaseste, prin conventie, numele proprietatii sau al actiunii descrise; pe urmatoarele pozitii se aratacine are proprietatea respectiva / cine participa la actiune.

    Ex.: Didier e fotbalist (proprietatea: a fi fotbalist; obiectul care are proprietatea: Didier)

    (fotbalist Didier)

    Ex.: Ex.: Juventus invinge Milanul (actiunea: a invinge, participantii la actiune: Juventus siMilan)

    (invinge Juventus Milan)

    Ex.: Casillas si Raul joaca la Real (actiunea: a juca la, participantii la actiune: Real - care arataunde si Casillas, respectiv Raul - care arata cine joaca)

    (joaca_la Real Casillas Raul )

    Atentie, CLIPS este case sensitive, asadar exemplul de mai sus NU este identic cu:

    (joaca_la real casillas raul )

  • 1.3. FAPTE 5

    1.3.1 Adaugare de fapte la memoria de lucru

    Se face cu:

    (assert fapt)

    Ex.:

    (assert (fotbalist Didier))

    Asertarea de mai multe ori a aceluiasi fapt nu are efect.

    1.3.2 Listarea faptelor

    Se face cu ajutorul lui

    (facts)

    1.3.3 Stergerea faptelor

    (retract nr_fapt),

    unde nr_fapt este numarul returnat de catre comanda facts.

    (retract *)

    retracteaza toate faptele din memoria de lucru.

    1.3.4 Resetarea memoriei de lucru

    (reset)

    Se sterg toate faptele din memoria de lucru si se adauga un fapt initial, numit initial-fact.

    1.3.5 Definirea faptelor

    Putem folosi deffacts pentru a crea fapte fara a folosi assert. Aceste fapte vor aparea in memoriade lucru la primul (reset). Ex (vezi fisierul e3.clp):

    (deffacts fapte1

    (club U)

    (studiaza Mihai CS))

    Daca lansam

    (facts)

    observam ca faptele nu sunt prezente in memoria de lucru. Pentru a le aduce in memoria de lucru,trebuie lansata comanda

    (reset)

    Aceasta are urmatoarele efecte:

    1. stergerea faptelor din memoria de lucru;

  • 6LABORATORUL 1. INTRODUCERE IN CLIPS. FAPTE SI REGULI. DEPANARE. VARIABILE SI CONSTANTE

    2. asertarea lui initial-fact;

    3. asertarea tuturor faptelor definite in deffacts.

    Daca exista mai multe deffacts, la (reset) vor aparea toate in memoria de lucru.

    Putem pastra deffacts in fisiere pe disc, editate cu un editor oarecare. Aceste fisiere au, princonventie, numele terminat in .clp.

    Vom incarca aceste fisiere cu comanda:

    (load "fisier.clp")

    Listarea tuturor constructiilor deffacts se poate face cu

    list-deffacts

    Pentru a lista un anumit set de fapte, folosim:

    ppdeffacts nume_set_fapte

    De exemplu:

    ppdeffacts fapte1

    1.4 Reguli

    Regulile sunt niste sabloane de forma

    IF antecedent

    THEN actiune

    si descriu ce actiuni trebuie facute in cazul in care faptele din antecedent sunt adevarate. Intr-oregula, antecedent este o conjunctie de fapte, iar actiune poate fi o combinatie de assert, tiparirede mesaje pe ecran etc.

    Regulile sunt definite cu defrule si sunt pastrate in memoria de reguli.

    Ex.: Daca Blackie latra si Blackie alearga, atunci Blackie este bucuroasa (vezi fisierul e4.clp).

    (defrule BlakieFeeling

    (latra Blackie)

    (alearga Blackie)

    =>

    (assert (bucuroasa Blackie)))

    Semantica este urmatoarea: daca fiecare din patternurile din antecedent (dinainte de semnul =>)este adevarat, atunci se executa fiecare actiune de dupa =>.

    1.4.1 Afisarea regulilor

    (rules)

    listeaza numele tuturor regulior din sistem.

    (ppdefrule nume_regula)

  • 1.4. REGULI 7

    tipareste (Pretty Print) definitia regulii.

    1.4.2 Rulare: pornirea procesului de deductie

    Se face cu ajutorul comenzii:

    (run)

    care are ca efect inceperea procesului de deductie. Dintre regulile ale caror antecedente sunt adevaratein momentul curent, se selecteaza una singura si se executa toate actiunile din componenta ei (aflatein dreapta semnului de implicatie =>); procesul se repeta apoi pana cand nu se mai poate deducenici o un fapt nou.

    Ex.: sa presupunem ca avem urmatoarele definitii de reguli si fapte in fisierul e50.clp:

    (defrule test_pasare "definitia notiunii de pasare"

    (penat Woody) ;are pene

    (biped Woody) ; are 2 picioare

    =>

    (assert (pasare Woody)))

    (deffacts fapte1

    (penat Woody)

    (biped Woody))

    Daca, la promptul CLIPS, tastam:

    (load "e50.clp")

    (reset)

    (facts)

    observam ca in memoria de lucru avem faptele:

    (initial-fact)

    (biped Woody)

    (penat Woody)

    Continuand cu:

    (run)

    (facts)

    vom observa ca acum in memoria de lucru

    s-a adaugat faptul

    (pasare Woody)

    dedus automat de catre CLIPS pe baza regulii de mai sus si a faptelor deja cunoscute.

  • 8LABORATORUL 1. INTRODUCERE IN CLIPS. FAPTE SI REGULI. DEPANARE. VARIABILE SI CONSTANTE

    1.4.3 Rulare automata: batch

    Sa presupunem ca pasii din sectiunea anterioara trebuie repetati de mai multe ori. Avem posibilitateade a automatiza aceasta procedura: daca introducem intr-un fisier numit, de exemplu, go, comenzilecare trebuie rulate:

    (load "e50.clp")

    (reset)

    (facts)

    (run)

    (facts)

    si, de la promptul CLIPS, lansam:

    (batch "go")

    obtinem acelasi rezultat ca si in cazul lansarii manuale, succesiv, a acestor comenzi.

    1.5 Reinitializarea CLIPS

    Daca dorim indepartarea din memorie a faptelor, regulilor si definitiilor lor, tastam

    (clear)

    ceea ce este echivlent cu o oprire si o repornire a CLIPS.

    1.6 Intrare/Iesire

    1.6.1 Tiparirea pe ecran

    Pentru a tipari un mesaj pe ecran, folosim:

    (printout t "text" crlf)

    unde t inseamna iesirea standard (ecran), text este textul de tiparit, iar crlf semnifica trecereala o linie noua. Ex (fisierul e5.clp):

    (defrule zboara_vorbeste

    (pasare Woody)

    =>

    (assert (zboara Woody))

    (printout t "Deci Woody zboara" crlf))

    1.6.2 Citirea de la tastatura

    Se realizeaza folosind read. Iata un exemplu (vezi e19.clp):

    (defrule ex_citire

  • 1.7. TIPURI DE DATE 9

    =>

    (printout t "Introduceti varsta pacientului ")

    (assert (pacient (read))))

    La executarea acestei reguli, sistemul va tipari textul

    Introduceti varsta pacientului

    si apoi va astepta introducrerea unei valori de la tastatura. Aceasta valoare va fi apoi asertata inmemoria de lucru ca fiind varsta acelui pacient.

    1.7 Tipuri de date

    Sunt numerice (intregi/flotante), string etc. Ex (vezi e2.clp).

    (deffacts tipuri

    (intreg+ 1)

    (intreg- -2)

    (flotant_format_1 -3.14)

    (flotant_format_2 2.05e3)

    (string1 "Ana are mere")

    (string_cu_ghilimele "Blackie face \"HAM\"")

    )

    1.8 Comentarii

    Sunt precedate de caracterul ;.

    Este posibila introducrea de comentarii explicative intre ghilimele (" si ") in interiorul structurilorde definire a faptelor si regulilor. De exemplu:

    (deffacts animale "comentariu despre faptele privind animalele"

    (animal caine)

    (animal pisica))

    1.9 Reguli cu wildcarduri si variabile

    Regulile definite pana acum nu sunt generale, fiecare referindu-se la un obiect individual. In contin-uare, vom vedea cum se pot utiliza wildcarduri si variabile in interiorul patternurilor care definescregulile.

    1.9.1 Wildcarduri

    Semnul intrebarii (?) folosit in interiorul unei reguli are semnificatia unui wildcard. Sa consideramexemplul urmator (e7.clp):

  • 10LABORATORUL 1. INTRODUCERE IN CLIPS. FAPTE SI REGULI. DEPANARE. VARIABILE SI CONSTANTE

    (deffacts animale

    (animal caine)

    (animal kiwi)

    (animal lebada)

    (animal pisica)

    (animal sarpe))

    (defrule r1

    (animal ?)

    =>

    (printout t "Avem un animal " crlf))

    La activarea regulii, se va tipari pe ecran de 5 ori mesajul Avem un animal. Aceasta se intampladeoarece antecedentul regulii ((animal ?)) se va potrivi (va face matching) pe fiecare din cele 5 faptereferitoare la animale introduse de deffacts animale. Mecanismul de wildcard permite activarearegulii pe orice fapt care contine pe prima pozitie predicatul animal indiferent de numele concret alacestuia.

    1.9.2 Patternuri cu variabile

    Daca dorim insa nu numai un matching reusit pe fiecare dintre fapte, ci dorim sa aflam si numeleanimalului din faptul curent (care a realizat matchingul), atunci vom folosi variabile in interiorul reg-ulilor. Numele acestor variabile incepe cu semnul intrebarii (?); de exempul, variabila ?nume_animaldin exemplul de mai jos (e8.clp). La rularea acestui exemplu, se tipareste pe ecran de 5 ori mesajulAm gasit un animal, urmat de fiecare data de numele acestuia.

    (deffacts animale

    (animal caine)

    (animal kiwi)

    (animal lebada)

    (animal pisica)

    (animal sarpe))

    (defrule r1

    (animal ?nume_animal)

    =>

    (printout t "Avem un animal: " ?nume_animal crlf))

    Pe scurt, mecanismul de matching functioneaza in felul urmator: sablonul din partea stanga a reguliieste potrivit pe fiecare din faptele aflate in memoria de lucru la un moment dat. Potrivireainseamna coincidenta numelui de predicat, precum si a valorilor constante din partea stanga a regulii.De exemplu, se poate realiza o potrivire intre (animal ?nume_animal) si (animal caine) (ceea eare ca efect legarea lui ?nume_animal la valoarea caine), dar nu se poate face o potrivire intre(animal ?nume_animal) si (plata ficus).

    In urma potrivirii, variabilele primesc valorile corespunzatoare din faptul peste care s-a realizatpotrivirea. Valoarea pe care o variabila o primeste in urma unui matching este folosita pe maideparte in interiorul regulii respective. Fie exemplul urmator (e9.clp):

  • 1.9. REGULI CU WILDCARDURI SI VARIABILE 11

    (deffacts vertebrate "animale cu coloana vertebrala"

    (vertebrat caine)

    (vertebrat cangur)

    (vertebrat kiwi)

    (vertebrat lebada)

    (vertebrat pisica)

    (vertebrat rechin)

    (vertebrat sarpe))

    (deffacts animale_bipede "animale care au 2 picioare"

    (biped cangur)

    (biped kiwi)

    (biped lebada))

    (deffacts animale_cu_pene "animale care au pene"

    (penat kiwi)

    (penat lebada))

    (defrule test_pasare "definitia generala a notiunii de pasare"

    (vertebrat ?nume_animal) ; este vertebrat

    (biped ?nume_animal) ; are 2 picioare

    (penat ?nume_animal) ; are pene

    =>

    (assert (pasare ?nume_animal)))

    Odata realizat matchingul intre (vertebrat ?nume_animal) si (vertebrat caine), variabila ?nume_animalva avea pe mai departe, in interiorul regulii respective, valoarea caine. De exemplu, (biped ?nume_animal)va avea succes doar daca in prealabil in memoria de lucru s-a asertat faptul (biped caine).

    Legatura creata prin matching intre o variabila si o valoare ia nastere la activarea unei reguli si estevizibila numai in interiorul acesteia. Dupa ce regula activata este executata, legatura varaibila-valoarecreata prin matchingul aferent va disparea.

    1.9.3 Optionalitate pentru variabile

    Simbolul $? semnifica 0 sau mai multe aparitii. Iata un exemplu inspirat din fotbal (e10.clp):

    (deffacts echipe "echipe de fotbal si jucatorii lor"

    (joaca_la Real Casillas Raul Salgado Cannavaro)

    (joaca_la Juventus Del_Pierro Trezeguet)

    (joaca_la Steaua Radoi))

    (defrule listare_echipe

    (joaca_la ?echipa $?)

    =>

    (printout t "Am gasit echipa " ?echipa crlf))

    Variabila ?echipa va primi, la fiecare matching, o valoare egala cu primul arguemnt al predicatuluijoaca_la, adica Real, Juventus, respectiv Steaua. $? va primi ca valori liste de dimensiuni variabile

  • 12LABORATORUL 1. INTRODUCERE IN CLIPS. FAPTE SI REGULI. DEPANARE. VARIABILE SI CONSTANTE

    ((Casillas Raul Ronaldo Cannavaro), (Del_Pierro Trezeguet), respectiv (Radoi)).

    Daca adaugam la acest exemplu si regula urmatoare (e11.clp):

    (defrule listare_jucatori

    (joaca_la ?echipa $? ?jucator $?)

    =>

    (printout t "Jucatorul " ?jucator " joaca la echipa " ?echipa crlf))

    vom avea, la potriviri succesive, urmatoarele valori pentru variabile:

    la prima potrivire:

    ?echipa : Real

    $? : nil

    ?jucator : Casillas

    $? : Raul Salgado Cannavaro

    apoi:

    ?echipa : Real

    $? : Casillas

    ?jucator : Raul

    $? : Salgado Cannavaro

    in continuare:

    ?echipa : Real

    $? : Casillas Raul

    ?jucator : Salgado

    $? : Cannavaro

    si in sfarsit:

    ?echipa : Real

    $? : Casillas Raul Salgado

    ?jucator : Cannavaro

    $? : nil

    Rezultate similare se produc si pentru celelalte doua cluburi mentionate.

    In cazul in care mai adaugam o regula (vezi e12.clp):

    (defrule listare_loturi

    (joaca_la ?echipa $?lot)

    =>

    (printout t "Echipa " ?echipa " are in lot pe " $?lot crlf))

    la prima activare, variabila $?lot va avea ca valoare lista: (Casillas Raul Salgado Cannavaro).La urmatoarele activari, valorile vor fi (Del_Pierro Trezeguet), respectiv (Radoi).

  • 1.10. RETRACTAREA UNUI FAPT DIN INTERIORUL UNEI REGULI 13

    1.10 Retractarea unui fapt din interiorul unei reguli

    Actiunea din partea dreapta a unei reguli poate consta in retractarea unui anumit fapt din memoriade lucru. Pentru a faca insa un retract, avem nevoie de numarul atasat faptului respectiv (id-ulfaptului din memoria de lucru). Putem obtine acest id cu ajutorul operatorului

  • 14LABORATORUL 1. INTRODUCERE IN CLIPS. FAPTE SI REGULI. DEPANARE. VARIABILE SI CONSTANTE

    1.11.3 Stoparea executiei dupa n pasi

    Se poate face cu:

    (run n)

    unde n reprezinta numarul de pasi de inferenta (de reguli pe care le dorim activate si executate). Deexemplu daca facem (run 3) pentru e30.clp, cel mai probabil vom ajunge la concluzia ca Blackieeste bucuroasa, bolnava si trista, dar regula r4 nu se va mai executa.

    1.11.4 Matching partial

    Daca o anumita regula nu va face matching pe fapte, ea nu se va activa, asadar executia nu va ajungela ea niciodata. Daca stim ca ea ar trebui sa se activeze totusi, se poate sa ne intereseze pe ce fapteface ea matching partial, pentru a putea localiza cauza esecului. Comanda

    (matches nume_regula)

    ne va arata toate matchingurile partiale reusite pe acea regula. De exemplu, daca in programulreferitor la comportamentul lui Blackie, am gresit, in regula r2, numele, putem folosi aceasta comandapentru a vedea daca matchingul are loc pe primul fapt din antecedent, pe al doilea sau nicaieri(Exemplu: e31.clp).

    (deffacts Blackie_facts

    (alearga Blackie)

    (latra Blackie))

    (defrule r1

    (alearga Blackie)

    (latra Blackie)

    =>

    (assert (bucuroasa Blackie))

    (printout t " r1: Blackie e bucuroasa " crlf))

    (defrule r2

    (alearga Blackie)

    (latra Blakie) ; GRESEALA LA SCRIEREA NUMELUI!

    =>

    (assert (bolnava Blackie))

    (printout t " r2: Blackie e bolnava " crlf))

    (defrule r3

    (bolnava Blackie)

    =>

    (assert (trista Blackie))

    (printout t " r3: Blackie e trista " crlf))

    Daca tastam:

    (clear)

  • 1.12. VARIABILE TEMPORARE SI CONSTANTE 15

    (load "e31.clp")

    (reset)

    (matches r2)

    (run)

    vom obtine:

    Matches for Pattern 1

    f-1

    Matches for Pattern 2

    None

    Partial matches for CEs 1 - 2

    None

    Activations

    None

    ceea ce arata ca avem 1 potrivire pe primul pattern al regulii r2, dar nici una pe patternul 2.

    1.11.5 Loguri ale sesiunii CLIPS

    Comanda

    (dribble-on fisier)

    face ca toate comenzile date la promptul CLIPS, ca si toate raspunsurile acestuia sa fie salvate infisierul dat ca parametru. Oprirea procesului se face cu

    (dribble-off)

    1.12 Variabile temporare si constante

    1.12.1 Variabile temporare

    Exista numai in interiorul unei reguli si isi pierd valoarea dupa ce aceasta este executata. Numelelor incepe cu caracterul ?. Li se atribuie valori cu ajutorul constructiei bind. De exemplu, variabila?suma din programul urmator, folosit la generarea sumelor unor perechi de numere (e13.clp):

    (deffacts numere

    (numar 0)

    (numar 1))

    (defrule adunare "tabla adunarii a 2 numere"

    (numar ?x)

    (numar ?y)

    =>

    (bind ?suma (+ ?x ?y))

    (printout t ?x " + " ?y " = " ?suma crlf))

    Sa remarcam modul prefixat in care se folosesc operatorii aritmetici in CLIPS: ?x + ?y este calculatprin constructia (+ ?x ?y).

  • 16LABORATORUL 1. INTRODUCERE IN CLIPS. FAPTE SI REGULI. DEPANARE. VARIABILE SI CONSTANTE

    1.12.2 Constante

    Exista pe parcursul intregii executii a programului si au mereu aceeasi valoare. Numele lor incepe cu?* si se termina cu *. Sunt definite si li se atribuie valori cu ajutorul constructiei defglobal. Avemca exemplu constanta ?*pi* din programul urmator. Acest program calculeaza aria unui cerc datprin coordonatele centrului si raza sa (sub forma faptului (cerc x y r) - vezi e15.clp):

    (deffacts cercuri

    (cerc 0 0 10)

    (cerc 1 1 10)

    (cerc 1 1 5))

    (defglobal

    ?*pi* = 3.14)

    (defrule calcul_arii_cercuri

    (cerc ?x ?y ?r)

    =>

    (bind ?aria (* ?*pi* ?r ?r))

    (printout t " Cerc: x = " ?x " y = " ?y " r = " ?r " arie = " ?aria crlf))