Zbirka zadataka iz Ekspertskih sistema
Zbirka zadataka iz Ekspertskih sistema
Zbirka zadataka iz Ekspertskih sistema
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
76 1. Pretraživanje<br />
promeni_stanje(S1, Operator, S2),<br />
moze_li(S2).<br />
Prolog ima ugrađeni mehan<strong>iz</strong>am vraćanja (backtracking) koji obezbeđuje selekciju<br />
alternativne putanje pretrage u situaciji kada se na tekuće stanje ne može primeniti nijedan<br />
operator. Ovakvo rešenje ne obezbeđuje, međutim, eliminaciju zatvorenih putanja u grafu<br />
pretrage pa se, na primer, može desiti da se majmun neprekidno šeta od vrata do prozora. U<br />
kompletnom programu koji je dat u nastavku uvedeni su novi argumenti predikata moze_li:<br />
moze_li(Stanje,Lista_stanja,Lista_operatora)<br />
U listi stanja pamte se sva stanja na parcijalnoj putanji od startnog do tekućeg stanja da bi se<br />
eliminisali oni naslednici tekućeg stanja koji se već nalaze u toj listi. U listi operatora pamte<br />
se primenjeni operatori; po nalaženju ciljnog stanja lista operatora predtavlja rešenje<br />
problema. Uveden je i jedan novi predikat, resenje, čija je uloga inicijal<strong>iz</strong>acija liste stanja<br />
operatora moze_li početnim stanjem.<br />
Rešenje<br />
Na osnovu <strong>iz</strong>loženih elemenata može se sastaviti kompletan program na Turbo Prologu.<br />
domains<br />
s= stanje(symbol,symbol,symbol,symbol)<br />
op= dohvati; popni_se; gurni(symbol,symbol);<br />
setaj(symbol,symbol)<br />
lista_stanja = s*<br />
lista_op = op*<br />
predicates<br />
pozicija(symbol)<br />
resenje(s,lista_op)<br />
moze_li(s,lista_stanja,lista_op)<br />
promeni_stanje(s,op,s)<br />
pripada_listi(s,lista_stanja)<br />
clauses<br />
resenje(Pocetno_stanje,Lista_op):moze_li(Pocetno_stanje,[Pocetno_stanje],Lista_op).<br />
pozicija(sredina).<br />
pozicija(uz_prozor).<br />
pozicija(uz_vrata).<br />
moze_li(stanje(_,_,_,ima),_,[]).<br />
moze_li(Stanje1,Lista_stanja,[Op|Lista_op]) :-<br />
promeni_stanje(Stanje1,Op,Stanje2),<br />
not(pripada_listi(Stanje2,Lista_stanja)),<br />
moze_li(Stanje2,[Stanje2|Lista_stanja],Lista_op).<br />
promeni_stanje(stanje(sredina, na_sanduku, sredina, nema),