Upload
others
View
11
Download
0
Embed Size (px)
Citation preview
Predmet: Sistemi veštačke inteligencije
VEŽBE: LOGIČKO PROGRAMIRANJE - PROLOG
Ove vežbe su bazirane na online radu u SWI Prologu. Kliknite na dugme Program:
Dobije se:
Pre nego što počenemo sa unosom programa, mali podsetnik o sintaksi i prolog rečenicama:
1. vrsta rečenica su činjenice (predikat(argument1, argument2, ..., arguimentN).) i one
predstavaljaju bazu
2. vrsta rečenica su pravila (glava:-telo.) i to je ustvari implikacija zapisana suprotno od desne ka
levoj strani implikacije
3. vrsta rečenica su upiti (?-upit.)
i nema više nikakvih drugih vrsta rečenica!!!!
Ako ukucamo program:
student(petar, petrovic, 22, 3, fizika).
student(petar, petrovic, 22, 2, matematika).
student(mirko, mirkovic, 23, 4, geografija).
student(djordje, djukic, 23, 2, it).
student(ana, anovic, 25, 5, fizika).
student(ana, anovic, 25, 3, geografija).
izdvoj1(X,Y):- student(Y, X, Z, _, it),Z>22.
izdvoj2(X,Y):- student(X, Y, _, _, Z),Z=matematika,student(X, Y,
_, _, W),W=fizika.
Primećujemo da su prvih 6 redova rečenice tipa činjenica sa 5 argumenata. Nakon njih su zapisana dva
pravila i to:
izdvoj1(X,Y):- student(Y, X, Z, _, it),Z>22.
gde je glava pravila izdvoj1(X,Y)
separator (razdvaja glavu od tela pravila): :-
telo pravila: student(Y, X, Z, _, it),Z>22.
Zaraz označava konjukciju, tako da zapis student(Y, X, Z, _, it),Z>22. znači studenti kod
kojih se posmatra prvi, drugi, treći i peti argument i kod kojih je treći argument veći od 22.
Dobijamo:
Zatim upisujemo željeni upit i pokrećemo izvršavanje (Run – dole desno), gde se sva pravila transformišu
u disjunkcije i primenjuje se rezolucijska metoda pobijanja. Više o unifikaciji i algoritmu pobijanja možete
pročitati u materijalu sa predavanja.
Ako je upit na primer činjenica:
student(djordje, djukic, 23, 2, it).
koju imamo u bazi programa, a pošto će Prolog na svaki upit automatski dodati negaciju, doći će odmah
do pobijanja metodom rezolucije i to će izgledati ovako:
Kliknemo na Run:
Znači svaki put kad dođe do pobijanja metodom rezolucije, odgovor je true ili yes (zavisno od vrste
Prologa).
Ako bi u upitu napisali činjenicu koju nemamo u bazi, na primer:
student(djordje, djukic, 27, 2, it).
tada ne bi doško do pobijanja, jer iako se doda automatski negacija mne upit, i postoji suprotan predikat
u bazi (među činjenicama), nisu svi argumenti jednaki!!! Znači do pobijanja dolazi samo kada uspeju svi
argumenti da se ujednače (odnosno unifikuju).
Ako bi u upitu napisali:
student(djordje, djukic, X, 2, it).
gde je sa velikim slovom X označena promenljiva, onda bi se pri proveri argumenata pokrenuo algoritam
unifikacije koji pokušava da ujednači argumente i onda bi rezultat unifikacije bio da je moguće
ujednačavanje argumenata u slučaju kada X uzme vrednost 23. U tom slučaju dolazi do pobijanja
metodom rezolucije, i pošto dolazi do pobijanja, Prolog štampa odgovor unifikacije:
Može se napraviti komponovani upit (ako se zaboravi zagrada ili tačka na kraju upit se neće izvršiti):
Evo upita pomoću pravila:
?-izdvoj1(X,Y).
Evo rezultata:
A može se kombinovati i konstanta u upitu sa glavom pravila:
?- izdvoj2(X,petrovic).
pa se dobija rezultat:
Možete pokrenuti i ugrađene primere sa glavnog menija Examples/..
Na ispitu je 4. zadatak iz oblasti Knowledge bases, a 5 zadatak iz oblasti Lists i dolazi u obzir samo neki od
ovih zadataka sa malim modifikacijama:
1. poslednji element liste
poslednji([X],X).
poslednji([H|T],R):-poslednji(T,R).
2. n-ti element liste
nti([H|T],1,H).
nti([H|T],N,R):-N1 is N-1, nti(T,N1,R).
3. duzina liste
duzina([],0).
duzina([H|T],N1):-duzina(T,N),N1 is N+1.
4. povezivanje listi
povezi([], L, L).
povezi([H1|T1], L2, [H1|T3]) :-povezi(T1, L2, T3).
5. obrtanje liste
obrni([],[]).
obrni([H|T],R):-obrni(T,OT), povezi(OT,[H],R).
povezi([], L, L).
povezi([H1|T1], L2, [H1|T3]) :-povezi(T1, L2, T3).
6. eliminacija uzastopnih duplikata
dup([],[]).
dup([H],[H]).
dup([H1,H1|X],X1):-dup([H1|X],X1).
dup([H1,H2|X],[H1|X1]):-dup([H2|X],X1).
7. traženje podliste
povezi([], L, L).
povezi([H1|T1], L2, [H1|T3]) :-povezi(T1, L2, T3).
podlista(L1, L) :-povezi(_, X, L),povezi(L1, _, X).
8. obrisati traženi element liste
obrisi(X, [X|Ostali], Ostali).
obrisi(X, [Y|Ostali], [Y|OstaliBezX]) :- obrisi(X, Ostali, OstaliBezX).