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.
1.3. Primeri na Prolog-u i LISP-u 81<br />
p(b,c). p(d,g). p(c,f). p(g,h).<br />
p(c,b). p(g,d). p(f,c). p(h,g).<br />
Program treba da nađe rešenje problema u obliku liste prostorija na putu od prostorije A do<br />
prostorije B. Inicijalno se može pokušati sa sledećim predikatom:<br />
/* prvo rešenje */<br />
/* put_1(A,B,P) : put od A do B je lista prostorija P */<br />
put_1(A,B,[A,B]) :- p(A,B).<br />
put_1(A,B,[A|P]) :- p(A,C), put_1(C,B,P).<br />
Prema ovom rešenju, <strong>iz</strong>među prostorija A i B postoji put P ako:<br />
(1) <strong>iz</strong>među prostorija A i B postoji neposredan prolaz kada se lista P sastoji samo od prostorija<br />
A i B, ili, ako ovo nije slučaj,<br />
(2) bira se prostorija C povezana prolazom sa prostorijom A pa se traži (rekurzivno) put P’ od<br />
prostorije C do prostorije B. Ako se nađe put P’, traženi put P se dobija dodavanjem prostorije<br />
A na početak liste P’. Ukoliko put P’ ne postoji, u mehan<strong>iz</strong>mom vraćanja (backtracking) bira<br />
se druga od prostorija susednih prostoriji A i traži put od te prostorije do prostorije B. Izbor<br />
prostorije zavisi od redosleda navođenja iskaza u opisu grafa pretrage. Radi se o pretrazi u<br />
dubinu.<br />
Izvršavanjem ovog programa dobijaju se sledeći rezultati:<br />
?- put_1(a,h,P).<br />
P = [a,c,g,h]? ;<br />
P = [a,c,g,c,g,h]? ;<br />
P = [a,c,g,c,g,c,g,h]? ;<br />
U prikazanom dijalogu korisnika sa PROLOG interpreterom masnim slovima označen je tekst<br />
koji <strong>iz</strong>daje interpreter a običnim tekst koji kuca korisnik. Korisnik zadaje upit a interpreter<br />
<strong>iz</strong>daje prvo rešenje. Ukoliko korisnik odgovori sa ; traži se sledeće rešenje i tako dalje. Iz<br />
navedenog primera može se zaključiti da u navedenom rešenju <strong>iz</strong> pretrage nisu eliminisani<br />
zatvoreni putevi.<br />
Korektno rešenje, koje vodi računa o već posećenim prostorijama radi eliminacije zatvorenih<br />
puteva u grafu pretrage, je sledeće:<br />
/* ispravno rešenje */<br />
/* element(E,L) : E je element liste L */<br />
element(E,[E|_]).<br />
element(E,[_|R]) :- element(E,R).<br />
/* put_2(A,B,Q,P): put od prostorije A do prostorije B koji ne<br />
prolazi ni kroz jednu od prostorija <strong>iz</strong> liste Q je lista P */<br />
put_2(A,B,Q,[A,B]) :- p (A,B), not(element(B,Q)).<br />
put_2(A,B,Q,[A|P]) :- p(A,C), not(element(C,Q)),<br />
put_2(C,B,[C|Q],P).<br />
/* put(A,B,P): put od prostorije A do prostorije B je lista P */<br />
put(A,B,P) :- put_2(A,B,[A],P).