
Operacije nad listama

   1. Unesi u ljusku Prologa program koji sadrzi definicije predikata
   clan/2, povezi/3, dodaj/3, obrisi/3, umetni/3, podlista/3,
   permutacija/3 (broj iza kose crte nakon imena predikata oznacava broj
   argumenata).
   Osmisli i isprobaj upite kojima se upotrebom spomenutih predikata
   rjesavaju jednostavni zadaci kao npr:
     * obrisi sve clanove zadane liste koji se u listi javljaju nakon
       podliste [z,z,z];
     * za zadanu listu mjeseci u godini, pronad/i mjesece koji se u listi
       javljaju prije, odnosno poslije svibnja;
     * za zadanu listu mjeseci u godini, pronad/i neposredni sljedbenik
       odnosno prethodnik mjeseca srpnja;
     * obrisi prvog i zadnja tri elementa zadane liste L.

   Radi jednostavnosti, mozes definirati pomocni predikat mjeseci/1:
mjeseci(L):- =(L,[sijecanj,veljaca,ozujak,travanj,
                  svibanj,lipanj, srpanj, kolovoz,
                  rujan, listopad, studeni, prosinac]).

   = jest predikat unifikacije. Koja je njegova namjena?

   2. Napisi program za predikat staviNaKraj(X,Lista,NovaLista) koji
   listu NovaLista gradi tako da objekt X, stavlja na kraj liste List.

   3. Definiraj relaciju posljednji(Clan, Lista) koja vrijedi ako je
   objekt Clan posljednji element liste Lista. Program napisi sa i bez
   upotrebe predikata povezi/3.

   4. Napisi proceduru okreni(L, D) koja gradi listu D tako da okrene
   redoslijed elemenata liste L. Vrijedi npr. okreni([a,b,c],[c,b,a]).

   5. Definiraj relaciju rotirajLijevo(L,R) koja vrijedi ako se lista R
   moze dobiti kruznim posmakom elemenata liste L ulijevo. Tako npr.
   vrijedi rotirajLijevo([1,2,3,4,5], [2,3,4,5,1]). Kako bi definirao
   predikat rotirajDesno/2?

   6. Definiraj proceduru podskup(Podskup, Skup) koja vrijedi ako su svi
   elementi liste Podskup ujedno i elementi liste Skup. Pored toga, neka
   procedura moze potraziti sve podskupove danog skupa kao u primjeru:
   ?-podskup(X, [a,b,c]).

   7. Napisi modifikaciju programa za problem majmuna i banane. Definiraj
   relaciju moze_uzeti(Stanje, Akcije) tako da program ne odgovara samo
   sa da ili ne, nego da u listu Akcije upise jos i redoslijed poteza
   koji vodi do uspjeha. Tako se na upit
   ?-moze_uzeti(stanje(kod_vrata,na_podu,kod_prozora,ne_moze), Akcije).
   ocekuje odgovor
   Akcije=[hodaj(kod_vrata, kod_prozora), guraj(kod_prozora,
   sredina_sobe), popni_se, zgrabi].

   8. Definiraj predikat izravnaj(Lista,RavnaLista) koji gradi listu
   RavnaLista iz svih atoma liste Lista koja moze sadrzavati i druge
   liste. Tako npr. vrijedi:
   ?-izravnaj([a,b,[c,d],[],[[[e]]],f],[a,b,c,d,e,f]).
