You are on page 1of 26

CLIPS

CLIPS (C Language Integrated Production System) je alat za izgradnju ekspertnih


sistema. Napravljen je u cilju da omogui razvoj programa za modelovanje znanja
eksperta iz neke oblasti.
Poseduje podrku za sve osnovne elemeate ekspertnih sistema i to:
Listu injenica (fact list) ili liste instanci (instance list) Bazu znanja - koja
sadri sva pravila (rule base)
Mehanizam za zakljuivanje - koji kontrolie proces izvravanje pravila
CLIPS poseduje tri osnovna naina za predstavu znanja:
Pravila (Rules) koja su namenjena za deklarativnu prestavu iskusventog
znanja
Procedure

(Deffunction, generic
functions)

- koja su namenjena
za

predstavu proceduralnog
znanja
Objektno-orijentisano programiranje - koje je prvenstveno namenjeno za
predstavu proceduralnog znanja, pri emu su podrani svi aspekti objektno
orijentisanog
programiranja:
apstrakcija,
enkapsulacija,
nasleivanje
i
polimorfizam
Ovde ce biti dat samo teorijski osvrt na predstavu znanja korienjem pravila.
Celokupan materijal je nastao preureivanjem postojeeg materijala Clips User
Guide, koji je dostupan na adresi: http://clipsrules.sourceforge.net/
Predmetni asistent
Vanja Lukovi
Email: vanja.lukovic@ftn.kg.ac.rs

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

1. injenice (facts)
injenice mogu imati jedan, dva ili vie polja. Dobra programerska praksa je
da prvo polje objanjava znaenje preostalih polja injenice ili definie meusobnu

relaciju ostalih polja u injenici. Preostala polja


predstavljaju specifine vrednosti injenice. Na primer:

injenice

tom

sluaju

(domace-zivotinje pas macka ovca) - prvo polje ove injenice koja ima ukupno 4
polja, objanjava da su vrednosti preostalih polja injenice domae ivotinje.
(majka Olga Marija) - prvo polje ove injenice od ukupno 3 polja definie meusobnu
relaciju izmeu preostalih polja tj. definie da je Olga majka Marije.
(lista-namirnica mleko jaja sir jogurt hleb ulje secer)
- prvo polje ove injenice od ukupno 8 polja definie da su vrednosti preostalih polja
namirnice.
injenice moe biti tipa: simbol, string (poinje i zavrava se sa znacima navoda),
celi ili realan broj itd. Ukoliko je polje injenice broj ono mora imati prvo polje tipa
simbol. Na primer: (x 1.1), (broj 1256), itd.
2. CLIPS komande za unos, brisanje jedne ili vise injenica iz liste
injenica
Clips pravi razliku izmeu velikih i malih slova tj. ima svojstvo case-sensitivity. Sve
komande se unose u zagradama i svi argumenti komande su u zagradama.
Komentari poinju sa takom zarez.
I nain za ubacivanje injenica u listu linjenica radne memorije je korienjem
sledee komande:
(assert (fact-1) (fact-2) ... (fact n))
II nain za ubacivanje injenica u listu injenica radne memorije je korienjem
komande:
(deffacts naziv_cinjenice opcioni komentar
(fact_1)
(fact_2)

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

(fact_n))
- nakon ega sledi komanda: (reset).
Izbacivanje ovako unete liste cinjenica ostvaruje se komandom: (undeffact
naziv_cinjenice), nakon ega sledi komanda: (reset).

f-i je identifikator injenice, i je indeks injenice.


(facts) - komanda za prikaz statikog stanja liste injenica ili Window->Facts Window
oznaeno;
(watch facts) - Ovom komandom se obezbeuje prikaz dinamikog stanja liste
injenica u radnoj memoriji. Strelica u desno (==>) znai da se injenica ubacuje u
listu injenica radne memorije. Strelica u levo (<==) znai da se injenica izbacuje
iz liste injenica radne memorije ili Executions->Watch->Facts oznaeno;
(unwatch facts) - komanda za iskljuivanje (watch) komande. (clear) - komanda
uklanja sve injenice iz liste injenica.
(reset) - komanda uklanja sve injenice iz liste injenica, to moe takoe ukoniti
odgovarajue aktivirano pravilo iz agende pravila i ubacuje u radnu mermoriju sve
injenice koje su navedene deffacts naredbom.
(retract i j k) - komanda izbacuje injenicu i-tog, j-tog i k-tog indeksa iz liste
injenica radne mmorije.
(help) - komanda obezbeuje pomo korisniku oko CLIPS sintakse.
(save-facts my-fact-file) - komanda obezbeuje pamenje svih pravila u listipravila u fajl na disku.
(load-facts
my-fact-file) - komanda obezbeuje uitavanja svih pravila iz fajla diska u
memoriju.

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

3. Pravila (rools)
Pravila su slina IF THEN naredbi u proceduralnim jezicima kao to su C, Java ili Ada.
IF (ukoliko) su ispunjeni odredeni uslovi THEN (tada) izvri sledee naredbe
Opta sintaksa pravila je:
(defrule naziv_pravila opcioni
komentar
PRAVILA

Comment [V1]:
ZAGLAVLJE

(premisa_1)
(premisa_ Comment [V2]: PREMISA
JE
2)
INJENICA ILI INSTANCA KLASE
(premisa_N) =>
(akcija_1) (akcija_2) Comment [V3]: LHS - leva strana pravila
Comment [V4]: STRELICA Comment [V5]: AKCIJA JE OBINO
FUNKCIJA KOJA NE VREA VREDNOST VE IMA NEKI SPOREDAN EFEKAT KAO NPR: assert ILI retract
KOMANDE KOJE OBAVLJAJU NEKU AKCIJU ILI PAK prinout NAREDBA KOJA

(akcija_M ISPISUJE NEKU VREDNOST


))
Comment [V6]: RHS - desna strana pravila

CLIPS program vri uporeivanje premise pravila sa injenicama u listi injenica.


Ukoliko neka injenica odgovara svim premisama nekog pravila, pravilo se
aktivira i stavlja u agendu. CLIPS tj. Mehanizam za zakljuivanje CLIPS programa sva
aktivirana pravila stavlja u red i inkementalno im poveava prioritet koji se izraava
salience faktorom. Na ovaj nain se postie reavanje konflikta (conflict resolution) u
odluivanju koje pravilo treba da se sledee izvrava.
(run) - komandom se izvrava ono pravilo (rule fires) u agendi pravila koje je
najveeg prioriteta tj. Ono pravilo sa najveom vrednosti salience faktora. Prilikom
izvravanja pravila izvravaju se redom sve akcije u njemu. Kada se pravilo izvri,

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

ono se uklanja iz agende pravila, nakon ega se izvrava sledee pravilo najvieg
prioriteta.
(watch activations)- komandom se postie automatsko posmatranje
Comment [V7]: SAILENCE

aktivacije pravila (ubacivanje pravila u agendu) u formi: ==> Activation n


VREDNOST AKTIVIRANOG PRAVILA

naziv_pravila: f-m; ili Executions->Watch->Activations


oznaeno;

KOJI SE UBACUJE U AGENDU

Comment [V8]: IDENTIFIKATOR CINJENICE SA KOJOM SE PRAVILO

(agenda) - komandom se postie prikaz svih pravila u agendi u formi: n SLAZE


naziv_pravila: f-m ili Window->Agenda Window oznaeno.
(rules)- komandom se postie prikaz svih unetih pravila (clear) - brisanje svih
definisanih pravila
(save) - komandom se postie pamenje pravila u fajl na disku
u formi:
naziv.cl
p
(load) - komandom se postie uitavanje zapamenih pravila iz naziv.clp fajla diska
u memoriju
Window-> Execution->Options-> IncrementalReset oznaeno - spreava da uneta
pravila vide injenice koje su unete pre njihovog unosa.
Window-> Execution->Options-> Strategy

-> Depth
odabrano

- agenda
je

uredjena od najveceg ka najmanjem silence faktoru


pravila.
(matches naziv_pravila) - komandom se postie prikaz da li pojedine premise
pravila odgovaraju unetim injenicama

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

Primer 1.1.
Definisati pravila u CLIPS programu koja definiu kojom bojom treba obojiti pojedine
delove crtea koji se sastoji od krova, kuce, trave i neba. a) Za unetu injenicu krov
posmatrati koje se pravilo aktivira i stavlja u agendu, kao i koje se pravilo izvrava
unosom run komande
b) Za unete cinjenice krov, kuca i nebo posmatrati koja se pravila aktiviraju i
izvrsavaju unosom run komande
*/Napomena: Koristiti prozore Window->Fact i Window->Agenda za prikaz cinjenica
u radnoj memoriji i prikaz aktiviranih pravila, a naredbe watch za dinamicki ptikaz
ubacivanja injenica u radnu memoriju i aktiviranih pravila u agendu.
Reenje:

a)
(Quicksilver Beta 3/26/08) CLIPS> (defrule kako_obojiti_krov
(krov)
=>
(assert (boja crvena))
(printout t "Krov kuce treba obojiti u crveno" crlf)) CLIPS> (defrule kako_obojiti_kucu
(kuca)
=>
(assert (boja zuta))
(printout t "Kucu treba obojiti u zuto" crlf)) CLIPS> (defrule kako_obojiti_travu
(trava)
=>
(assert (boja zelena))
(printout t "Travu treba obojiti u zeleno" crlf)) CLIPS> (defrule kako_obojiti_nebo
(nebo)
=>
(assert (boja plava))
(printout t "Nebo treva obojiti u plavo" crlf)) CLIPS> (watch facts)
CLIPS> (watch activations) CLIPS> (assert (krov))
==> f-1 ==> Activation 0 <Fact-1>
CLIPS> (run) FIRE ==> f-2

(krov) kako_obojiti_krov: f-1

1 kako_obojiti_krov: f-1
(boja crvena)

Krov kuce treba obojiti u crveno

CLIPS - Teorija i primeri - Vanja


Lukovi
b)
CLIPS> (defrule kako_obojiti_krov
(krov)

201
3

=>
(assert (boja crvena))
(printout t "Krov kuce treba obojiti u crveno" crlf)) CLIPS> (defrule kako_obojiti_kucu
(kuca)
=>
(assert (boja zuta))
(printout t "Kucu treba obojiti u zuto" crlf)) CLIPS> (defrule kako_obojiti_travu
(trava)
=>
(assert (boja zelena))
(printout t "Travu treba obojiti u zeleno" crlf)) CLIPS> (defrule kako_obojiti_nebo
(nebo)
=>
(assert (boja plava))
(printout t "Nebo treba obojiti u plavo" crlf)) CLIPS> (watch facts)
CLIPS> (watch activations)
CLIPS> (assert (krov) (kuca) (nebo))
==> f-1 ==> Activation 0 ==> f-2 ==> Activation 0 ==> f-3 ==> Activation 0 <Fact-3>
CLIPS> (run) FIRE ==> f-4
Nebo treba obojiti u plavo FIRE
==> f-5
Kucu treba obojiti u zuto FIRE
==> f-6

(krov) kako_obojiti_krov: f-1 (kuca)

kako_obojiti_kucu: f-2 (nebo)


kako_obojiti_nebo: f-3
1 kako_obojiti_nebo: f-3
(boja plava)
2 kako_obojiti_kucu: f-2
(boja zuta)
3 kako_obojiti_krov: f-1
(boja crvena)

Krov kuce treba obojiti u crveno

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

Primer 1.2.
Definisati pravila u CLIPS programu koja definisu koje je trenutno godisnje doba na osnovu bitnih
pokazatelja vreme (kisno, snezno, suncano), lisce (zuti
, zeleno, zeleni, opalo), temperatura-oko (0,
10, 30). Posmatrati
celokupan rad ekspertnog sistema za razliite primere unetih injenica, unetih deffact naredbom.
*/ Napomena: Koristiti prozore Window->Fact i Window->Agenda za prikaz cinjenica u radnoj
memoriji i prikaz aktiviranih pravila, a naredbe watch za dinamicki ptikaz ubacivanja injenica u
radnu memoriju i aktiviranih pravila u agendu.

Reenje:
(defrule godisnje_doba_jesen
(vreme kisno)
(lisce zuti opada) (temperatura-oko 10) =>
(assert (doba
jesen))
)
(defrule godisnje_doba_zima
(vreme snezno)
(lisce opalo)
(temperatura-oko 0) =>
(assert (doba
zima))
)
(defrule godisnje_doba_prolece
(vreme suncano)
(lisce zeleni)
(temperatura-oko 10) =>
(assert (doba
prolece))
)

(defrule godisnje_doba_leto
(vreme suncano)
(lisce zeleno)
(temperatura-oko 30) =>
(assert (doba leto)))
(deffacts jesen
(vreme kisno)
(lisce zuti opada) (temperatura-oko 10))

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

Primer 1.3.
Napisati CLIPS program u kome se korisniku u zavisnosti od toga koje je svetlo upaljeno na
semaforu na ekranu ispisuje radnja koju je potrebno da preduzme.
*/ Napomena: Koristiti prozore Window->Fact i Window->Agenda za prikaz cinjenica u radnoj
memoriji i prikaz aktiviranih pravila. U meniju Execution > Watch ekirati opcije Facts i
Activations za dinamicki ptikaz ubacivanja injenica u radnu memoriju i aktiviranih pravila u
agendu.

Reenje:
(defrule crveno
(svetlo crveno) (not(svetlo zuto)) (not(svetlo zeleno)) =>
(printout t "Na semaforu je upaljeno crveno svetlo! Cekaj!" crlf))
(defrule zuto
(svetlo zuto)
(not(svetlo crveno)) (not(svetlo zeleno)) =>
(printout t "Na semaforu je upaljeno zuto svetlo! Budi na oprezu!" crlf))
(defrule zeleno
(svetlo zeleno) (not(svetlo zuto)) (not(svetlo crveno)) =>
(printout t "Na semaforu je upaljeno zeleno svetlo! Kreni!" crlf))

Zakljuak:
U listi pravila mora postojati uvek samo jedna injenica koja definie da li je svetlo
crveno, uto ili zeleno da bi dolo do aktiviranja nekog od pravila.
Primer 1.4.

Napisati CLIPS program u kome se korisniku u zavisnosti od proizvoda koji se


dobijaju od pojedinih domaih ivotinja odreuje koja je to ivotinja i na osnovu toga
kako se ona oglaava.
*/ Napomena: Koristiti prozore Window->Fact i Window->Agenda za prikaz cinjenica
u radnoj memoriji i prikaz aktiviranih pravila. U meniju Execution

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

> Watch ekirati opcije Facts i Activations za dinamicki ptikaz ubacivanja injenica u
radnu memoriju i aktiviranih pravila u agendu.
Reenje:
defrule sta-daje-ovca
(proizvod vuna)
(proizvod mleko) (proizvod meso) =>
(assert (zivotinja ovca)))
(defrule sta-daje-patka
(proizvod jaja)
(proizvod meso) =>
(assert (zivotinja patka)))
(defrule sta-daje-krava
(proizvod mleko)
(proizvod meso)
(not (proizvod vuna)); da bi se krava razlikovala od ovce =>
(assert (zivotinja krava)))
(defrule sta-daje-svinja
(proizvod meso)
;da bi se svinja razlikovala od ostalih zivotinja koje daju meso
(not(proizvod vuna))
(not(proizvod jaja)) (not(proizvod mleko)) =>
(assert (zivotinja svinja)))
(defrule kako-se-oglasava-ovca
(zivotinja ovca)

=>
(assert (oglasava-se "Be!"))
(defrule kako-se-oglasava-krava
(zivotinja krava)
=>
(assert (oglasava-se "Mu!")))
(defrule kako-se-oglasava-patka
(zivotinja patka)
=>

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

(assert (oglasava-se "Kva!")))


(defrule kako-se-oglasava-svinja
(zivotinja svinja)
=>
(assert (oglasava-se "Gro!")))

Zakljuak:
U ovom primeru se pravila ulanavaju!
Primer 1.5.
Napisati CLIPS program u kome se korisniku u zavisnosti da li auto vergla, da li se
oseca miris benzina, da li je rezervoar prazan, da li rade farovi i da li rade lampice
na komandnoj tabli odreuje i na ekranu ispisuje uzrok kvara na automobili i korake
koje treba preduzeti za reavanje konkretnog problema.
(defrule neispravniElVodovi
(verglanje da)
(mirisBenzina da) =>
(printf "Neispravan elektricni vodovi: Obavezno pozovite automehanicara ili
autoelektricara
" crlf)
)
(defrule nestaloGoriva

(verglanje da)
(mirisBenzina ne) (prazanRezervoar da) =>
(printf "Nestalo je goriva: Sipajte gorivo i pazite da auto stoji na ravnom pri sledecem
paljenju" crlf)
)
(defrule neispravnaPumpa
(verglanje da)
(mirisBenzina ne) (prazanRezervoar ne) =>
(printf "Neispravna pumpa za gorivo: Idite kod automehanicara da zameni pumpu" crlf)
)
(defrule neispravanAnlaser
(verglanje ne)
(radeFarovi da) (radeLampice da)

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

=>
(printf "Neispravan anlaser: Probajte da upalite auto na gurku i/ili idite kod
automehanicara da zameni anlaser" crlf) )
(defrule neispravnaKontaktBrava
(verglanje ne)
(radeFarovi da) (radeLampice ne)
=>
(printf "Neispravna kontakt brava: Idite kod auto-elektricara da zameni bravu" crlf)
)
(defrule prazanAkumulator
(verglanje ne)
(radeFarovi ne) (radeLampice ne)
=>
(printf "Prazan akumulator: Izvaditi i napuniti akumulator, upaliti auto uz pomoc kablova i
jos jednog auta ili upaliti auto guranjem" crlf)
)

CLIPS - Teorija i primeri - Vanja

201

Lukovi

4. Promenjive

Identifikator promenljive poinje uvek sa znakom pitanja "?". Za razliku od


injenica iji je sadraj stalan, statiki i nepromenljiv, sadraj promenljivih je
dinamiki. Najee se koriste u okviru pravila u svrhu tampanja rezultata. Prilikom
definisanja injnice koja odgovara premisi pravila u kome se nalazi neka
promenljiva, vrednost injenice se dodeljuje odgovarajuoj promenljivoj. Program e
prijaviti greku ukoliko nije u mogunosti da promenjivima u premisi pravila dodeli
odgovarajuu vrednost na osnovu definisanih injenica. Na primer:
CLIPS> (defrule kako-se-oglasava-patka
(oglasava-se ?glas)
=>
(printout t "Patka se oglasava sa: " ?glas crlf)) CLIPS> (assert (oglasava-se "Kva!"))
<Fact-0>
CLIPS> (run)
Patka se oglaava sa: Kva!
?x - promenljiva sa jednim poljem
$?x - promenljiva sa vie polja. Ova oznaka se moe koristiti samo na levoj
strani pravila (LHS), dok se na desnoj strani pravila (RHS) koristi uobiajena oznaka
?x te promenljive, bez znaka "$".

Kada u okviru pravila elimo neku injenicu da obriemo, korienjem


operatora -> mogue je promenljivoj proslediti adresu injenice koja se brie:
(?x <- (naziv_cinjenice))
(retract ?x); uklanja se injnica naziv_cinjenice iz radne memorije.

Znak "?" moe da zameni jedno polje injenice, dok znak "$?" zamenjuje nula,
jedno ili vie polja neke injenice.
Konektivna ogranienja nad injenicama koje imaju samo jednu vrednost polja
Postoje tri vrste konektivnih ogranienja:

Ogranienje negacije (~). Ono se odnosi na jednu vrednost koja mu direktno


sledi i ne dozvoljava tu vrednost.

Ogranienje disjunkcije ( | ). Ovo ogranienje dozvoljava bilo koju vrednost


iz skupa vrednosti na koje se primenjuje.

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

Ogranienje konjukcije (&). Ovo ogranienje se najee koristi za


povezivanje promenljive sa odreenom vrednosti ili skupom vrednosti i
uslovljava da oni skpa deluju u uniji.
Primer 1.5.
Napisati CLIPS program u kome se korisniku u zavisnosti od proizvoda koji se
dobijaju od pojedinih domaih ivotinja odreuje koja je to ivotinja i na osnovu toga
kako se ona oglaava. Definisati zajedniko pravilo za ispis naina oglaavanja koje
e generalno vaiti za sve ivotinje.
Reenje:
(defrule sta-daje-ovca
(proizvod vuna)
(proizvod mleko) (proizvod meso) =>
(assert (zivotinja ovca)))
(defrule sta-daje-patka
(proizvod jaja)
(proizvod meso) =>
(assert (zivotinja patka)))
(defrule sta-daje-krava
(proizvod mleko)
(proizvod meso)
(not (proizvod vuna)); da bi se krava razlikovala od ovce =>
(assert (zivotinja krava)))
(defrule sta-daje-svinja
(proizvod meso)
;da bi se svinja razlikovala od ostalih zivotinja koje daju meso
(not(proizvod vuna))
(not(proizvod jaja)) (not(proizvod mleko)) =>
(assert (zivotinja svinja)))
(defrule kako-se-oglasava-ovca
(zivotinja ovca)

=>
(assert (oglasava-se "Be!")))

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

(defrule kako-se-oglasava-krava
(zivotinja krava)
=>
(assert (oglasava-se "Mu!")))
(defrule kako-se-oglasava-patka
(zivotinja patka)
=>
(assert (oglasava-se "Kva!")))
(defrule kako-se-oglasava-svinja
(zivotinja svinja)
=>
(assert (oglasava-se "Gro!")))
(defrule kako-se-oglasava-ispisi
(oglasava-se ?x)
=>
(printout t "Ova zivotinja se oglasava sa " ?x crlf)))

Primer 1.6.
Napisati CLIPS program u kome se definie pravilo u kome se u definisanim
injenicama koje predstavljaju naslove knjiga izdvajaju i ispisuju naslovi onih knjiga
koji u sebi sadre re CLIPS.
Reenje:
(deffacts knjige "naslovi knjiga"
(naslov CLIPS user guide) (naslov Introduction to CLIPS) (naslov C++ tutorial)
(naslov Assembler) (naslov CLIPS manual))
(defrule pronadji-clips-knjige
(naslov $?pocetak CLIPS $?kraj) =>
(printout t "Knjiga koje sadrze rec Clips u naslovu je " ?pocetak " CLIPS " ?kraj crlf))
*/Napomena da bi pretrazivanje bilo moguce vrednosti naslova knjiga ne smeju biti tipa STRING

vec tipa SYMBOL!!!

Primer 1.7.

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

Napisati CLIPS program u kome se definie pravilo u kome se u definisanim


injenicama koje predstavljaju naslove knjiga izdvajaju i uklanjaju naslovi onih
knjiga koji u sebi sadre re CLIPS.
Reenje:
I nacin - bez ispisa koje se knjige izbacuju
(deffacts knjige "naslovi knjiga"
(naslov CLIPS user guide) (naslov Introduction to CLIPS) (naslov C++ tutorial)
(naslov Assembler) (naslov CLIPS manual))
(defrule obrisi-clips-knjige
?index <- (naslov $? CLIPS $?) =>
(retract ?index))

II nacin - sa ispisom koje se knjige izbacuju


(deffacts knjige "naslovi knjiga"
(naslov CLIPS user guide) (naslov Introduction to CLIPS) (naslov C++ tutorial)
(naslov Assembler) (naslov CLIPS manual))
(defrule obrisi-clips-knjige
?index <- (naslov $?pocetak CLIPS $?kraj) =>
(printout t "Knjiga koje sadrze rec Clips u naslovu je: " ?pocetak " CLIPS " ?kraj crlf)
(retract ?index))

Primer 1.8.
Napisati CLIPS program u kome se definie pravilo u kome se u definisanim
injenicama koje prestavljaju naslove knjiga izdvajaju naslovi onih knjiga koji poinju
sa CLIPS i zamenju naslovom: CLIPS knjiga index-cinjenice.
Reenje:
(deffacts knjige "naslovi knjiga"

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

(naslov CLIPS user guide) (naslov Introduction to CLIPS) (naslov C++ tutorial)
(naslov Assembler) (naslov CLIPS manual))
(defrule pronadji-clips-knjige
?index<-(naslov CLIPS $) =>
(retract ?index)
(assert (naslov CLIPS knjiga ?index))

Primer 1.9. Napisati CLIPS program u kome se definie pravilo u kome se u


definisanim injenicama koje predstavljaju naslove knjiga briu naslovi knjiga koji
sadre re CLIPS ili Assembler.
Reenje:
(deffacts knjige "naslovi knjiga"
(naslov CLIPS user guide) (naslov Introduction to CLIPS) (naslov C++ tutorial)
(naslov Assembler) (naslov CLIPS manual))
(defrule obrisi-odredjene-knjige
?index <- (naslov CLIPS|Assembler) =>
(retract ?index))

Primer 1.10.
Definisati CLIPS pravilo u kome se korisniku ispisuje da ne ide ukoliko svetlo na
semaforu nije zeleno, zatim pravilo koje upozorava korisnika da bude na oprezu
ukoliko je svetlo na semaforu uto ili treptee uto, zatim pravilo koje ispisuje boju
na semaforu kada svetlo nije uto ili treptee-uto i pravilo koje saoptava korisniku
da moe da krene ukoliko svetlo na semaforu nije uto, crveno ili treptee uto i
ispisuje ta boja na semaforu.
*/ Napomena: Koristiti prozore Window->Fact i Window->Agenda za prikaz injenica
u radnoj memoriji i prikaz aktiviranih pravila. U meniju Execution Watch ekirati
opcije Facts i Activations za dinamicki prikaz ubacivanja injenica u radnu memoriju
i aktiviranih pravila u agendu.

CLIPS - Teorija i primeri - Vanja


Lukovi
Reenje:

201
3

(defrule ne-idi
(svetlo ~zeleno) =>
(printout t "Ne idi!" crlf))
(defrule oprez
(svetlo zuto|treptece-zuto) =>
(printout t "Budi na oprezu!" crlf))
(defrule nije-upozorenje
(light ?boja&~zuto&~treptece-zuto) =>
(printout t "Svetlo je " ?boja crlf))
(defrule idi
(light ?boja&~zuto&~~treptece-zuto&~crveno)
=>
(printout t "Mozes da krenes, zato sto je svetlo " ?boja crlf))

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

5. CLIPS templejti

CLIPS templejti su analogni definiciji struktura u programskom jeziku C. Templejt


definie grupu povezanih polja, koji se nazivaju slotovi, na slian nain kao to
strukture u programskom jeziku C predstavljaju grupu povezanih podataka.
Korisnost templejta posebno dolazi do izraaja pri definisanju pravila sa
premisom, koja ima dobro organizovanu strukturu templejta.
Generalna forma templejta je:
(deftemplate template-name
(slot-1)
(slot-2)
(slot-n))
Slotovi mogu biti single-slotovi ili multi-slotovi. Single-slotovi sadre tano
jedno polje, dok multi-slotovi sadre nula ili vie polja. Svaki slot ima svoje ime i
vrednost. Single-slotovi imaju samo jednu vrednost koja se pridruuje polju slota,
dok multi-slotovi mogu imaju vie vrednosti, koje se pridruuju poljima multislota.
U templejtu se takoe mogu sa type specificirati tipovi vrednosti slotova:

SYMBOL, STRING, NUMBER (specificirani broj moe biti ili INTEGER ili FLOAT),
INTEGER, FLOAT.
Takoe se za svaki tip mogu specificirati dozvoljene vrednosti sa:
allowedsimbols, allowed-stings, allowed-numbers, allowedintegers, allowedfloats i allowed-values. Za brojeve je mogue definisati opseg dozvoljenih vrednosti
npr. (range 234 567). Ukoliko se za broj definie opseg dozvoljenih vrednosti, nije
mogue da se istovremeno definiu i dozvoljene vrednosti i obratno.
Osim toga, za svaki slot je mogue specificirati i podrazumevane (default)
vrednosti slotova, koje e biti unete ukoliko se prilikom definisanja odgovarajue
injenice ne specificira vrednost tih slotova. Ukoliko se pri definisanju
podrazumevane vrednosti sa default komandom, koristi kljuna re ?DEFAULT, onda
se u zavisnosti od odgovarajueg tipa slota uzimaju sledee podrazumevane
vrednosti: "" za STRING tip, 0 za INTEGER tip i 0.0 za FLOAT tip itd.
Primer definisanja templejta:
(deftemplate da-ne-odgovor
(slot odgovor
(type SYMBOL)

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

(allowed-symbols da ne) (default da)))

Kada u CLIPS programu definiemo templejt kao u prethodnom primeru, CLIPS


program od nas oekuje da unesemo injenicu prema navedenoj definiciji templejta
(pri emu se ne mora voditi rauna o redosledu kojim su slotovi navedeni u
templejtu) u suprotnom javie upozorenje:
CLIPS> (deftemplate da-ne-odgovor
(slot odgovor
(type SYMBOL)
(allowed-symbols da ne) (default da)))
CLIPS> (assert (da-ne-odgovor (odgovor da))) <Fact-0>
CLIPS> (facts)
f- (da-ne-odgovor (odgovor
0 da))
For a total of 1 fact.
CLIPS> (assert (da-ne-odgovor (odgovor ne-znam)))

[CSTRNCHK1] A literal slot value found in the assert command does not match the allowed values
for slot answer.

Za izmenu vrednosti slotova moe se koristiti modify komanda, kojom se


istovremeno odbacuje indeksirana injenica i specificira nova vrednost jednog ili
vie slotova, koji se modifikuju.
Primer 1.10.
CLIPS program u kome se definie templejt knjiga sa sledeim skupom slotova:
naslov, autor i godIzdavanja. Podrazumevana vrednost za slot naslov i autor je
Nepoznat, a za slot godIzdavanja 2002. Dozvoljeni opseg vrednosti za slot
godIzdavanja je 1600 do 2009. Za definisani skup knjiga (injenica), definisati
pravilo koje uklanja sve knjige odreenog autora, npr. Stephen Prata, pravilo koje u
zasebnim redovima ispisuje sve podatke o knjigama, kao i pravilo koje u zasebnim
redovima ispisuje sve podatke o knjigama bez godine izdavanja .
(deftemplate knjiga
(slot naslov
(type STRING)
(default "Nepoznat")) (slot autor
(type STRING)

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

(default "Nepoznat")) (slot godIzdavanja (type INTEGER) (default 2001)


(range 1600 2009)))
(deffacts knjige "nekoliko knjiga"
(knjiga (naslov "Clips book") (autor "Giarratano") (godIzdavanja 2001))
(knjiga (naslov "Common Lisp") (autor "someone") (godIzdavanja 2005))
(knjiga (naslov "C++") (autor "Stephen Prata") (godIzdavanja 2002))
(knjiga (naslov "ANSI C") (autor "Stephen Prata") (godIzdavanja 2000)))
(defrule ukloni-knjigu "ukloni sve knjige autora Stephen Prata"
?x <- (knjiga (naslov ?n) (autor "Stephen Prata") (godIzdavanja ?g))
=>
(printout t "Uklanja se knjiga " ?n " autora Stephen Prata godine izdavanja " ?g " god." crlf)
(retract ?x))

(defrule prikazi_podatke_knjiga
(knjiga (naslov ?n) (autor ?a) (godIzdavanja ?g)) =>
(printout t "Naslov knjige: " ?n crlf
"Autor: " ?a crlf
"Godina izdavanja: " ?g ". god." crlf))
(defrule prikazi_podatke_knjiga_bez_godIzd (knjiga (naslov ?n) (autor ?a))
=>
(printout t "Naslov knjige: " ?n crlf
"Autor: " ?a crlf)

Primer 1.11.
Napisati CLIPS program u kome se definie templejt knjiga sa sledeim skupom
slotova: naslov, autor i godIzdavanja. Za definisani skup knjiga (injenica), definisati
pravilo koje uklanja sve knjige sa rei Lord u naslovu, kao, pravilo koje menja godinu
izdavanja svih knjiga sa rei Clips u naslovu u 2000, kao i pravilo koje prikazuje
podatke o svim knjigama iz 2000 godine.

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

(deftemplate knjiga (multislot naslov (type SYMBOL)


(default Nepoznat)) (slot autor
(type STRING)
(default "Nepoznat")) (slot godIzdavanja (type INTEGER) (default 2001)
(range 1600 2009)))
(deffacts knjige "nekoliko knjiga"
(knjiga (naslov Clips book) (autor "Giarratano") (godIzdavanja 2001))
(knjiga (naslov Common Lisp) (autor "someone") (godIzdavanja 2005))
(knjiga (naslov C++) (autor "Stephen Prata") (godIzdavanja 2002))
(knjiga (naslov ANSI C) (autor "Stephen Prata") (godIzdavanja 2000))
(knjiga (naslov Lord of the rings the fellowship of the ring) (autor "Tolkien"))
(knjiga (naslov Lord of the rings the two towers) (autor "Tolkien"))
(knjiga (naslov Lord of the rings the return of the king) (autor "Tolkien")))

(defrule ukloni-knjige "ukloni sve knjige sa reci Lord u naslovu"


?x <- (knjiga (naslov $?pocetak Lord $?kraj) (autor ?aut) (godIzdavanja ?g))
=>
(printout t "Uklanja se knjiga " ?pocetak " Lord " ?kraj ", autora " ?aut " i godine izdavanja:
" ?g "god." crlf)
(retract ?x))
(defrule izmeni-knjige "izmeni god. izd. knjiga sa Clips u naslovu u 2000"
?i<-(knjiga (naslov $? Clips $?)(godIzdavanja 2001)) =>
(modify ?i (godIzdavanja 2000))
(defrule prikazi_podatke_knjiga_2000
(knjiga (naslov $?n) (autor ?a) (godIzdavanja 2000)) =>
(printout t "Naslov knjige: " ?n crlf
"Autor: " ?a crlf
"Godina izdavanja: 2000" crlf))

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

*/Napomena da bi pretrazivanje knjiga prema specificnoj reci u naslovu bilo moguce


vrednosti naslova knjiga ne smeju biti tipa STRING vec tipa SYMBOL, pa ih je zato
potrebno definidati kao multislotove!!!
Kada se modifikuje vrednost nekog slota, mora se u okviru premise pravila specificirati
prethodna vrednost toga slota, u protivnom pravilo ce se beskonacno puta izvrsavati!!! U
nastavku je takvo pogreno napisano pravilo!
(defrule izmeni-knjige-greska "izmeni god. izd. knjiga sa Clips u naslovu u 2000"
?i<-(knjiga (naslov $? Clips $?)) =>
(modify ?i (godIzdavanja 2000))

Primer 1.12.
Napisati CLIPS program u kome se definie templejt auto sa sledeim skupom
slotova: marka, boja, godite i cena. Za definisani skup automobila (injenica),
definisati pravilo koje uklanja sve automobile, ija boja poinje reju svetlo i pravilo
koje menja godite svih automobila marke Mercedes iz 2004 u 2000.
(deftemplate auto
(slot marka (type SYMBOL)) (multislot boja (type SYMBOL)) (slot godiste (type INTEGER))
(slot cena (type INTEGER)) )
(deffacts automobili

(auto (marka OPEL)(boja svetlo plava)(godiste 2004)(cena 2000))


(auto (marka CITROEN)(boja svetlo crvena)(godiste 2004)(cena 3000))
(auto (marka MERCEDES)(boja bela)(godiste 2004)(cena 3000)) (auto (marka CITROEN)(boja siva)
(godiste 2004)(cena 3000))

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

(auto (marka MERCEDES)(boja crna)(godiste 2007)(cena 5000)) (auto (marka OPEL)(boja


svetlo plava)(godiste 2004)(cena 3000)) (auto (marka MERCEDES)(boja crvena)(godiste 2005)
(cena 4000))
)
(defrule ukloni-svetlo-boje
?indeks <- (auto (boja svetlo ?)) =>
(retract ?indeks) )
(defrule izmeni-god-mercedesa-2004
?indeks <- (auto (marka MERCEDES)(godiste 2004)) =>
(modify ?indeks (godiste 2000)) )

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

6. CLIPS funkcije
U CLIPS-u se funkcije definiu korienjem kljune rei deffunction. Opta sintaksa definisanja
funkcije je:
(deffunction <naziv-funkcije> [opcioni komentar]
(?arg1 ?arg2 ... ?argM [$?argN]) ;
(<akcija 1>
<akcija 2>
<akcija K-1>
<akcija K>); u poslednjoj akciji se vraca vrednost
Nazivi argumenata nisu u konfliktu sa nazivima promenljivih u pravilima, ukoliko su isti.
deffunction e jedino da vrati vrednost poslednje akcije, koja moe biti funkcija,
promenljiva ili konstanta.
-), matematikih (div, max, min, abs, float integer

funkcija poreenja:
nejednakost bilo kog tipa podatka), =, <>(razliito od),<, >, >=, <=). CLIPS progrsm prua
mogunost pisanja osnovnih predefinisanih aritmetikih (+,
/, *, (za konverziju u realan broj) i
(za konverziju u celi broj)), logikih funkcija, kao to su: not, and, or, kao i (eq
(provereava jednakost bilo kog tipa podatka), neq (proverava
Pri pisanju izraza koristi se prefiks forma, umesto uobiajene infiks forme, u kojoj operator
stoji ispred argumenata, a izraz je obavezno uokviren zagradom. Npr. numeriki izraz 2 + 3 se u
CLIPS-u pie u formi (+ 2 3). Na slian nain se numeriki izraz u kome se sabira tri ili vie brojeva
pie na sledei nain: (+ 2 3 5). Za specificiranje redosleda izvravanja operacija u izrazima
koriste se zagrade. Npr. u izrazu: (*?x (+?y ?z)), se najpre izraunava zbir vrednosti promenljivih ?
y i ?z, pa se rezultat mnoi sa vrednosti promenljive ?x.
Kao primer definiimo CLIPS funkciju koja izraunava razliku kvadrata dva broja i pravilo
koje vrednost dobijenog izraza ispisuje na ekranu:
CLIPS> (deffunction
razlika_kvadrata

(?a ? (- (* ?a ?a)
b)
(* ?b

Comment [U9]: Parametri


funkcije

?b)))
CLIPS> (defrule ispis_rezultata
(brojevi ?a ?b)
=>
(printout t "a^2 - b^2 = " (razlika_kvadrata ?a ?b) crlf)) CLIPS> (assert (brojevi 3 2)
(brojevi 25 16)) <Fact-1>
CLIPS> (run) a^2 - b^2 = 369 a^2 - b^2 = 5
Koristei CLIPS naredebu bind, koja se koristi na desnoj strani pravila za dodeljivanje vrednosti
nekog izraza nekoj promenljivoj, isti primer bi se mogao napisati i u sledeem obliku:

CLIPS> (deffunction
razlika_kvadrata

CLIPS - Teorija i primeri Vanja Lukovi

2013

(?a ?b)

(- (* ?a ?a) Comment [U10]:


Parametri funkcije
(* ?b

?b)))
CLIPS> (defrule ispis_rezultata
(brojevi ?a ?b)
=>
(bind ?rez (razlika_kvadrata ?a ?b)) (printout t "a^2 - b^2 = " ?rez crlf))
CLIPS> (assert (brojevi 3 2)(brojevi 25 16)) <Fact-1>

CLIPS> (run) a^2 - b^2 = 369 a^2 - b^2 = 5


Uzimajui u obzir da se u CLIPS-u operacija stepenovanja oznaava sa "**", funkcija koja
izraunava razliku kvadrata dva broja u prethodonom primeru se moe napisati i u sledeem
obliku:
(deffunction
razlika_kvadrata

(?a ? (- (** ?a) (** ? Comment [U11]: Parametri


funkcije
b)
b)))

Osim navedenih funkcija, CLIPS omoguuje da se u desnom delu pravila koristi funkcija
read za unos konkretne vrednosti polja neke injenice u vidu stringa. Za razliku od ove funkcije,
funkcija readline, omoguuje unos vie vrednosti, sve dok se ne pristisne komanda za prelazak u
novi red.
CLIPS jezik poseduje takodje predikatske funkcije, koje za rezultat vraaju istinitu (TRUE)
il i neistinitu vrednost (FALSE).
Tabela predikatskih funkcija CLIPS jezika:
(evenp <arg>) Proverava da
broj
(floatp <arg>) Proverava da
realan broj
(integerp
Proverava da
<arg>)
broj
(lexemep
Proverava da
<arg>)
string
(numberp
Proverava da
<arg>)
(oddp <arg>)
Proverava da
neparan broj
(pointerp
Proverava da
<arg>)
adresa
(sequencep
Proverava da
<arg>)
vrednost sa
vie polja
(stringp <arg>) Proverava da
(symbolp
Proverava da
<arg>)

li je argument <arg> paran


li je argument <arg>
li je argument <arg> ceo
li je argument

<arg> simbol
ili

li je argument <arg> broj


li je argument <arg>
li je argument <arg>
li je argument <arg>
li je argument <arg> string
li je argument <arg> simbol

Osim navedenih funkcija, korisna funkcija CLIPS jezika je random, koja generie pseudo sluajan
broj.

CLIPS - Teorija i primeri - Vanja


Lukovi

201
3

Primer 1.12.
Definisati fukciju za izraunavanje hipotenuze trougla, na osnovu poznatih duzina osnova trogula.
Definisati pravilo u kome se za zadate duine kateta ispisuje vrednost hipotenuze.
(deffunction hipotenuza (?a ?b) (sqrt(+ (* ?a ?a) (* ?b ?b))))

(defrule izracunaj-hipotenuzu (duzine_kateta ?kateta1 ?kateta2) =>


(bind ?c (hipotenuza ?kateta1 ?kateta2)) (printout t "Hipotenuza=" ?c crlf))
CLIPS> (assert (duzine_kateta 3 4)) <Fact-1>
CLIPS> (run) Hipotenuza=5.0

You might also like