I.a. Definer et predikat rotL(L,R) der R er listen L rotert en gang til venstre, f.eks. ?- rotL([1,2,3],X). X = [2,3,1] ; no I.b Ved aa bruke rotL, definer et predikat rot(X,L,R) der R er listen L rotert til venstre X ganger. X kan godt vaere stoerre en lengden av L. F.eks. ?- rot(1,[1,2,3],Y). Y = [2,3,1] ; No ?- rot(3,[1,2,3,4],Y). Y = [4,1,2,3] ; No ?- rot(7,[1,2,3,4],Y). Y = [4,1,2,3] ; No II.a Definer et predikat split(L,N,L1,L2) som holder dersom listen L1 inneholder foerste N elementer fra listen L, og listen L2 de resterende elementene fra L (spesielt, N overstiger ikke lengden av L). II.b Definer naa et predikat rotate(X,L,R) som er det samme som rot(X,L,R) fra 1.b, men ved aa bruke split (og append), istedenfor rotL. Forklar kort prinisppet for definisjonen av dette predikatet. III. La oss anta at vi representerer en (rettet) graf som en mengde fakta i programmet. F.eks. p(a,b). p(a,c). p(c,a). p(c,d). p(d,a). er en graf med en (rettet) kant a->b, a->c, c->a, c->d og d->a. III.a Definer et predikat path(A,B,P) som skal holde kun naar P er en sti (liste med noder) som forbinder node A med B. (F.eks., path(a,b, [a,b]), path(a,d,[a,c,d]), men ogsaa path(a,d,[a,c,a,c,d])...) III.b Definer et predikat cycle(A,X) som skal holde kun naar X er en syklisk sti fra node A til A. IV. Definer et predikat perm(L,R) som holder kun naar R er en (vilkaarlig) permutasjon av listen L (f.eks. perm([1,2,3],[1,3,2]), perm([1,2,3],[1,2,3]), perm([1,2,3],[3,2,1]), osv.) V. I denne oppgaven skal du definere et predikat plass(N,P) som holder dersom P er en liste som representerer alle mulige plasseringer av N brikker paa NxN brett der ingen to brikker staar i samme rad eller kolonne. Vi skal representere posisjonene som par R:C av rad:kolonne. F.eks., skal vi ha at plass(3, [1:1,2:2,3:3]) holder, mens plass(3, [1:1,2:2,3:2]) ikke holder. V.a Definer et predikat liste(N,L) der N er et heltall>0 og L er listen av tall [1,2,3,4...N]. V.b Definer et predikat par(L,R,LR) der LR inneholder alle etterfoelgende par fra L, resp. R. (L og R antas aa ha samme lengde). F.eks. par([1,2,3],[3,2,1],[1:3,2:2,3:1]) par([1,2,3],[1,2,3],[1:1,2:2,3:3]) V.c Bruk de to predikatene, samt oppgave IV til aa definere plass(N,P). [NB! Hvis du passer paa at alle dine loesninger (P'er) kommer paa formen: [1:y1,2:y2,3:y3,...,n:yn], dvs. sortert etter rad, kan du bruke foelgende predikat for aa skrive de ut ved aa si: skriv(P,N) der N er stoerrelsen paa brettet. % skriv en x i X-te plass i en rad av lengde N: row(X,N,W) :- Y is X-1, write(W), writef('%r',['| ',Y]), write('|x'), Z is N-X, writef('%r',['| ',Z]),writeln(|). % sol maa komme ordnet etter rad: 1,2,3..., n-te elementetmaa vaere n-te rad writesol([],N). writesol([X|R],N) :- length(R,L), Y is N-L, row(X,N,Y), writesol(R,N). % pi - fjerener foerste elementet fra hvert par i listen: pib(X:Y,Y). pi([],[]). pi([A|X],[B|Y]) :- pib(A,B), pi(X,Y). skriv(L,N) :- pi(L,P), writesol(P,N). ]