
Modeliranje Wumpus svijeta

   1. Predmet ove vjezbe je stara (u terminima racunarskih znanosti) igra
   nazvana po grabezljivom cudovistu Wumpusu. Pazljivo procitaj opis te
   igre te odigraj nekoliko igara kako bi stekao/la osjecaj o problemima
   sa kojima se protagonist te igre susrece.

   2. Wumpus svijet je jednostavno polje dimenzija 4x4, pa ga je
   prikladno modelirati matricom. Kako u svakom polju moze biti po
   nekoliko objekata (zlato, wumpus, jama), elementi matrice moraju biti
   skupovi objekata. Organiziranje podataka u matrice u Prologu je nesto
   slozenije nego u ostalim programskim jezicima. U prethodnoj vjezbi,
   redci matrice se prikazuju pomocu liste ciji elementi su opet liste.
   Prednost tog pristupa je konceptualna jednostavnost, med/utim,
   pokazuje se da je takav pristup dosta neefikasan. Za efikasniju
   izvedbu matrica, potrebno je iskoristiti ugrad/ene metapredikate
   arg/3, functor, i =... Pronad/i i prouci opis tih predikata u
   dokumentaciji SWI prologa.

   3. U vecim programima, jako je bitna pravilna podjela posla na nacin
   da se glavni problem hijerarhijski razdijeli na veci broj manjih
   problema koji su cim vise nezavisni. Jedan od problema koji se pri
   tome javlja je da se u rjesenjima razlicitih manjih problema mogu
   javiti isti identifikatori (tzv. name-clashing problem). Taj problem
   se u Prologu moze rijesiti upotrebom modula. Procitaj dio
   dokumentacije SWI prologa u kojem je objasnjeno koristenje modula.

   4. Biblioteka za rad sa matricama je predlozen u programskom modulu
   array.pl. Dobra je navika uz svaki programski modul priloziti i
   proceduru koja testira funkcionalnost koju modul pruza. Testiranje
   modula za rad sa matricama se tako moze obaviti pozivanjem predikata
   array:goal/0.

   5. Upotrebom modula za rad sa matricama, oblikuj modul za prikaz
   Wumpus svijeta i njegovu inicijalizaciju, u skladu sa slijedecim
   uputama:
    1. svijet prikazi kao matricu ciji elementi su liste objekata koji se
       na doticnom polju nalaze (agent, jama, wumpus, zlato);
    2. neka se agent prilikom inicijalizacije nalazi na lijevom gornjem
       polju matrice (1,1) - tradicionalno, koordinate u ovoj igri
       pocinju od jedan;
    3. neka se wumpus nalazi na slucajno odabranom polju matrice koje ne
       smije biti pocetno, uz uniformnu razdiobu;
    4. neka svako polje moze biti jama, uz vjerojatnost od 0.2;
    5. konacno, neka se zlato (kao i Wumpus) nalazi na slucajno odabranom
       polju matrice koje ne smije biti pocetno, uz uniformnu razdiobu.

   Zaglavlje i testni predikat trazenog modula su zadani datotekom
   world.pl.

   6. Oblikuj modul za percepciju agenta koji opisuje objekt za
   predstavljanje pet podrazaja koje agent moze percipirati u wumpus
   svijetu: propuh (breeze), smrad (stench), sjaj (glitter), udarac
   (bump), urlik (scream). Buduci da se podrazaji 'udarac' i 'urlik' ne
   mogu odrediti samo na temelju trenutnog stanja svijeta, oni se moraju
   specificirati izvani, kao dodatni parametri predikata za kreiranje
   objekta. Tako glavni predikat trazenog modula percept_create(World,
   I,J, Bump,Scream, Percept) treba odrediti podrazaje 'propuh', 'smrad'
   i 'sjaj' na temelju zadanog svijeta World i koordinata agenta (I,J),
   te inkorporirati ih zajedno sa ostala dva podrazaja Bump i Scream u
   strukturirani objekt Percept.
   Zaglavlje i testni predikat trazenog modula su zadani datotekom
   percept.pl. Pored glavnog predikata percept_create/6, sucelje modula
   sadrzi i pet pristupnih predikata kojima se omogucava neovisnost
   ostalih modula u slozenom programu od izvedbenih detalja strukture
   podataka za prikaz slozenog podrazaja. Predikati trebaju uspjeti samo
   ako je odgovarajuci podrazaj prisutan u slozenom podrazaju zadanom
   jedinim argumentom.
   Ovaj zadatak nije uvjet za kolokviranje vjezbi, ali bez njega se ne
   moze dobiti vise od 67% bodova.

   7. Oblikovati modul za prikaz modela svijeta kako ga vidi agent
   (mape). Neka model ponovo bude matrica ciji elementi su liste
   objekata, s tim da treba uvesti nove objekte:
     * moguca jama;
     * moguci Wumpus;
     * sigurno polje (polje na kojem sigurno nije ni jama ni Wumpus);
     * posjeceno polje.

   Dva glavna javna predikata modula neka budu predikat za
   inicijalizaciju model_create/1, i predikat za azuriranje modela
   model_update(Model,Percept,I,J, ModelNew), kojim se slozeni podrazaj
   Percept percipiran na upravo posjecenom polju (I,J) koristi za
   upotpunjavanje sadrzaja mape.
   Ovaj zadatak nije uvjet za kolokviranje vjezbi s maksimalnim brojem
   bodova.
