24.12.2012 Views

Zbirka zadataka iz Ekspertskih sistema

Zbirka zadataka iz Ekspertskih sistema

Zbirka zadataka iz Ekspertskih sistema

SHOW MORE
SHOW LESS

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).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!