Professional Documents
Culture Documents
Clips
Clips
(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
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
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)
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).
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
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
-> Depth
odabrano
- agenda
je
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
1 kako_obojiti_krov: f-1
(boja crvena)
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
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))
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.
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)
=>
201
3
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)
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)
)
201
Lukovi
4. Promenjive
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:
201
3
=>
(assert (oglasava-se "Be!")))
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
Primer 1.7.
201
3
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"
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.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.
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))
201
3
5. CLIPS templejti
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)
201
3
[CSTRNCHK1] A literal slot value found in the assert command does not match the allowed values
for slot answer.
201
3
(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.
201
3
201
3
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
201
3
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
?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
2013
(?a ?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>
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>)
<arg> simbol
ili
Osim navedenih funkcija, korisna funkcija CLIPS jezika je random, koja generie pseudo sluajan
broj.
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))))