0% found this document useful (0 votes)
309 views7 pages

Prolog Primeri

The document contains Prolog code definitions for various list processing and mathematical functions including: - Functions for finding the maximum, minimum, length, sum and other properties of lists. - Functions for manipulating lists such as adding/removing elements, reversing lists, and filtering lists. - Mathematical functions such as factorial, Fibonacci, greatest common divisor, prime number checks, and converting between number bases. - Various recursive definitions for working with integers, lists, and mathematical concepts.

Uploaded by

csabas
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
309 views7 pages

Prolog Primeri

The document contains Prolog code definitions for various list processing and mathematical functions including: - Functions for finding the maximum, minimum, length, sum and other properties of lists. - Functions for manipulating lists such as adding/removing elements, reversing lists, and filtering lists. - Mathematical functions such as factorial, Fibonacci, greatest common divisor, prime number checks, and converting between number bases. - Various recursive definitions for working with integers, lists, and mathematical concepts.

Uploaded by

csabas
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 7

/* veci od dva broja.

*/
max2(X,Y,X):-X>=Y,!.
max2(X,Y,Y).

/* N! */
fakt(0,1).
fakt(N,F):-N1 is N-1,fakt(N1,F1),F is N*F1.

/* N!! */
faktd(0,1).
faktd(1,1).
faktd(N,F):-N1 is N-2,faktd(N1,F1),F is N*F1.

/* Zbir parnih cifara broja. Verzija 1. */


zc(N,N):-N<10,N mod 2=:=0.
zc(N,0):-N<10,N mod 2=\=0.
zc(N,X):-N>=10,N1 is N//10,N2 is N mod 10,zc(N1,X1),zc(N2,X2),X is X1+X2.

/* Zbir parnih cifara broja. Verzija 2. */


zpc(N,N):-N<10,N mod 2=:=0.
zpc(N,0):-N<10,N mod 2=\=0.
zpc(N,X):-N>=10,B is N mod 10,B mod 2=\=0,N1 is N//10,zpc(N1,X).
zpc(N,X):-N>=10,B is N mod 10,B mod 2=:=0,N1 is N//10,zpc(N1,X1),X is X1+B.

/* Zbir parnih cifara broja. Verzija 3. */


zpm(N,N):-N<10,N mod 2=:=0.
zpm(N,0):-N<10,N mod 2=:=1.
zpm(N,X):-(N>=10,N mod 2=:=0,N1 is N//10,zpm(N1,X1),X is X1+(N mod 10));
(N>=10,N mod 2=:=1,N1 is N//10,zpm(N1,X1),X is X1).

/* Zbir brojeva deljivih sa 3. */


z3(N,0):-N=:=0;N=:=1;N=:=2.
z3(N,X):-N mod 3=\=0, N1 is N mod 3, N2 is N-N1, z3(N2,X).
z3(N,X):-N mod 3=:=0, N2 is N-3, z3(N2,X1), X is N+X1.

/* Prevesti dekadni u binarni broj. */


dec2bin(0):-!.
dec2bin(X):-Y is X mod 2,X1 is X // 2,dec2bin(X1),write(Y).

/* Prevesti dekadni broj u heksadekadni. */


hek(X):-X<10,write(X),!.
hek(X):-X>=10,X<16,(X=:=10,write('A'));(X=:=11,write('B'));
(X=:=12,write('C'));(X=:=13,write('D'));
(X=:=14,write('E'));(X=:=15,write('F')),!.
heksa(X):-X<16,hek(X),!.
heksa(X):-X>=16,X1 is X//16,B is X mod 16,heksa(X1),hek(B).

/* Apsolutna vrednost. */
abs(X,X):-X>=0,!.
abs(X,Y):-X<0,Y is -X.

/* Broj cifara celog broja. */


brcif(X,1):-X<10,!.
brcif(X,Y):-X1 is X//10,brcif(X1,Y1),Y is Y1+1.

/* Zbir cifara celog broja. */


zcif(X,X):-X<10,!.
zcif(X,Y):-X1 is X//10,C is X mod 10,zcif(X1,Y1),Y is Y1+C.
/* Broj parnih i neparnih cifara celog broja. */
pncif(0,0,0):-!.
pncif(X,P,N):-X1 is X//10,C is X mod 10,C mod 2=:=0,pncif(X1,P1,N),P is P1+1.
pncif(X,P,N):-X1 is X//10,C is X mod 10,C mod 2=\=0,pncif(X1,P,N1),N is N1+1.

/* N-ti stepen broja X. */


stepen(X,0,1):-!.
stepen(X,N,Y):-N>0,N1 is N-1,stepen(X,N1,Y1),Y is X*Y1.

/* Najveci zajednicki delilac. Euklidov algoritam. */


nzd(X,0,X):-!.
nzd(X,Y,N):-Y>0,Z is X mod Y,nzd(Y,Z,N).

/* Najmanji zajednicki sadrzalac. */


nzs(X,Y,N):-nzd(X,Y,Z),N is X*Y//Z.

/*
Utvrditi da li je zadati broj prost.
Broj je prost ako nije deljiv ni sa jednim brojem od broja 2 do
polovine zadatog broja.
*/
prost(N):-prost(N,2).
prost(N,X):-X>N//2,!.
prost(N,X):-X=<N//2,N mod X=\=0,X1 is X+1,prost(N,X1).

/*
Prikazati sve proste brojeve manje ili jednake zadatom broju. Verzija 1.
*/
prosti(X):-X>=2,prost(X),write(X),tab(2),X1 is X-1,prosti(X1).
prosti(X):-X>=2,not prost(X),X1 is X-1,prosti(X1).

/*
Prikazati sve proste brojeve manje ili jednake zadatom broju. Verzija 2.
*/
prosti(X,X):-X>=2,prost(X).
prosti(X,P):-X>=2,X1 is X-1,prosti(X1,P).

/* Prikazati koliko ima prostih brojeva manjih ili jednakih zadatom broju. */
prostin(X,0):-X<2.
prostin(X,N):-X>=2,prost(X),X1 is X-1,prostin(X1,N1),N is N1+1.
prostin(X,N):-X>=2,not prost(X),X1 is X-1,prostin(X1,N).

/* Fibonacijev niz. */
fib(1,1):-!.
fib(2,1):-!.
fib(N,K):-N>2,N1 is N-1,fib(N1,K1),N2 is N1-1,fib(N2,K2),K is K1+K2.

/* Suma prvih N clanova Fibonacijevog niza. */


fibs(1,1):-!.
fibs(N,S):-fib(N,K),N1 is N-1,fibs(N1,S1),S is S1+K.

/* Clan liste. */
clan([X|_],X).
clan([_|Y],X):-clan(Y,X).

/* Duzina liste. */
duzlis([],0).
duzlis([_|R],N):-duzlis(R,M), N is M+1.
/* Zbir elemenata liste. */
zbirellis([],0).
zbirellis([G|R],Z):-zbirellis(R,Z1),Z is Z1+G.

/* Zbir neparnih elemenata liste. */


znep([],0).
znep([G|R],Z):-G mod 2=\=0,znep(R,Z1),Z is G+Z1.
znep([G|R],Z):-G mod 2=:=0,znep(R,Z).

/* Maksimalni element liste. */


maxl([G],G):-!.
maxl([X,X],X):-!.
maxl([X,Y],X):-X>Y,!.
maxl([X,Y],Y):-Y>X,!.
maxl([G|R],M):-maxl(R,X),(G>X, M is G; M is X),!.

/* Broj pozitivnih i negativnih elemenata liste. */


brojpn([],0,0).
brojpn([G|R],P,N):-G>0,brojpn(R,P1,N),P is P1+1.
brojpn([G|R],P,N):-G<0,brojpn(R,P,N1),N is N1+1.
brojpn([G|R],P,N):-G=:=0,brojpn(R,P,N).

/* Suma pozitivnih i suma negativnih elemenata liste celih brojeva. */


sumapn([],0,0).
sumapn([G|R],P,N):-G>=0,sumapn(R,P1,N),P is P1+G.
sumapn([G|R],P,N):-G<0,sumapn(R,P,N1),N is N1+G.

/* Spajanje dve liste. */


spoj([],X,X).
spoj([G|R],L,[G|R1]):-spoj(R,L,R1).

/* Obrtanje liste. */
obrni([],[]).
obrni([G|R],X):-obrni(R,Y),spoj(Y,[G],X).

/* Dodavanje elementa na pocetak liste. */


dodelpoc(X,[],[X]):-!.
dodelpoc(X,[G|R],[X|R1]):-dodelpoc(G,R,R1).

/* Dodavanje elementa na kraj liste. Varijanta 1. */


dodelkraj1(X,[],[X]).
dodelkraj1(X,P,L):-obrni(P,L1),dodelpoc(X,L1,L2),obrni(L2,L).

/* Dodavanje elementa na kraj liste. Varijanta 2. */


dodelkraj(X,[],[X]).
dodelkraj(X,[G|R],[G|R1]):-spoj(R,[X],R1).

/* Lista prvih N faktorijela. */


fakt(0,1).
fakt(X,N):-X>0,X1 is X-1,fakt(X1,N1),N is X*N1.
lisfakt(0,[]).
lisfakt(N,L):-N>0,N1 is N-1,lisfakt(N1,L1),fakt(N,F),dodelkraj(F,L1,L).

/* Na osnovu liste brojeva formirati listu parnih. */


par([],[]).
par([G1|R1],L2):-G1 mod 2=:=0,par(R1,L3),spoj([G1],L3,L2).
par([G1|R1],L2):-G1 mod 2=\=0,par(R1,L2).

/* Na osnovu liste slova formirati listu koja se sastoji od samoglasnika. */


sam([],[]).
sam([G|R],L):-(G==a;G==e;G==i;G==o;G==u),sam(R,X),spoj([G],X,L).
sam([G|R],L):-not (G==a;G==e;G==i;G==o;G==u),sam(R,L).

/* Na osnovu liste slova formirati listu koja se sastoji od suglasnika. */


sug([],[]).
sug([G|R],L):-not (G==a;G==e;G==i;G==o;G==u),sug(R,X),spoj([G],X,L).
sug([G|R],L):-(G==a;G==e;G==i;G==o;G==u),sug(R,L).

/* Poslednji element liste. Varijanta 1. */


poslel1([],_):-write('Lista koju ste uneli je prazna!'),nl,fail.
poslel1([X],X):-!.
poslel1([G|R],P):-poslel1(R,P).

/* Poslednji element liste. Varijanta 2. */


poslel([],_):-fail.
poslel([X],X):-!.
poslel([G|R],P):-poslel(R,P).

/* Proveriti da li su dva data elementa uzastopni clanovi liste. */


uzastopna2([X,Y],X,Y):-!.
uzastopna2([G1,G2|R],X,Y):-G1=X,G2=Y,!.
uzastopna2([G|R],X,Y):-G\=X,uzastopna2(R,X,Y).

/* Proveriti da li su tri data elementa uzastopni clanovi liste. */


uzastopna3([X,Y,Z],X,Y,Z):-!.
uzastopna3([G1,G2,G3|R],X,Y,Z):-G1=X,G2=Y,G3=Z,!.
uzastopna3([G|R],X,Y,Z):-G\=X,uzastopna3(R,X,Y,Z).

/* Zamena mesta prvom i poslednjem elementu liste. */


zamppel([],[]):-!.
zamppel([X],[X]):-!.
zamppel([X,Y],[Y,X]):-!.
zamppel([G|R],L):-obrni(R,[P|R1]),obrni(R1,R2),spoj([P],R2,X),spoj(X,[G],L).

/* Zamena mesta drugom i pretposlednjem elementu liste. */


zam2p(L,L):-duzlis(L,N),N<4,!.
zam2p([G|[D|R]],L):-obrni(R,[P|[PP|R1]]),obrni(R1,R2),
spoj([G,PP],R2,L1),spoj(L1,[D,P],L).

/* Odrediti poslednja tri elementa liste. */


poslednja3([X,Y,Z],X,Y,Z):-!.
poslednja3([_|R],X,Y,Z):-poslednja3(R,X,Y,Z).

/*
Ispitati da li svi elementi liste imaju odredjenu osobinu.
Na primer: da li su svi elementi liste pozitivni.
*/
osobina_liste([]).
osobina_liste([G|R]):-osobina(G),osobina_liste(R).
osobina(X):-X>0.

/* Obrisati prvu pojavu zadatog elementa u listi. */


brisi_jednom([],_,[]).
brisi_jednom([G|R],G,R):-!.
brisi_jednom([G|R],X,[G|R1]):-brisi_jednom(R,X,R1).

/* Obrisati sve pojave zadatog elementa u listi. */


brisi_sve([],_,[]).
brisi_sve([X|R],X,L):-!,brisi_sve(R,X,L).
brisi_sve([G|R],X,[G|R1]):-brisi_sve(R,X,R1).

/* Napraviti listu razlicitih elemenata na osnovu zadate liste. */


razliciti([],[]).
razliciti([G|R],L):-clan(R,G),razliciti(R,L),!.
razliciti([G|R],[G|R1]):-razliciti(R,R1),!.

/*
Iz date liste izbaciti prvih N elemenata a od preostalih formirati listu.
U suprotnom, prikazati odgovarajucu poruku.
*/
izbaci_n(L,0,L):-!.
izbaci_n(L,N,_):-duzlis(L,M),M<N,write('Lista je kraca nego sto treba!'),!,fail.
izbaci_n([G|R],N,L):-N>0,M is N-1,izbaci_n(R,M,L).

/*
Iz date liste izbaciti poslednjih N elemenata a od preostalih formirati listu.
U suprotnom, prikazati odgovarajucu poruku.
*/
izbaci_np(L,N,L1):-obrni(L,LL),izbaci_n(LL,N,L2),obrni(L2,L1).

/* Odrediti poslednjih N elemenata liste. */


poslednjih_n(L,N,L1):-duzlis(L,M),K is M-N,izbaci_n(L,K,L1).

/* Odrediti prvih N elemenata liste. */


prvih_n(L,N,L1):-duzlis(L,M),N=<M,K is M-N,izbaci_np(L,K,L1),!.
prvih_n(L,N,L):-duzlis(L,M),N>M.

/* Napraviti listu koja se sastoji od cifara zadatog celog broja. */


liscif(X,[X]):-X<10,!.
liscif(X,L):-X>10,C is X mod 10,Y is X // 10,liscif(Y,L1),spoj(L1,[C],L).

/*
Brise sve pojave zadatog elementa iz liste ali tako da brise samo jednu
pojavu elementa.
*/
brisi([G|R],G,R).
brisi([G|R],X,[G|R1]):-brisi(R,X,R1).

/* Generisati sve permutacije elemenata date liste. */


perm1([],[]).
perm1([G|R],P):-perm1(R,P1),brisi(P,G,P1).

perm2([],[]).
perm2(L,[G|R]):-brisi(L,G,L1),perm2(L1,R).

/* Generisati sve kombinacije elemenata date liste bez ponavljanja. */


komb(X,0,[]).
komb([G|R],N,[G|R1]):-N>0,N1 is N-1,komb(R,N1,R1).
komb([G|R],N,L):-N>0,komb(R,N,L).

/* Generisati varijacije bez ponavljanja elemenata date liste. */


var(X,0,[]).
var(L,N,[G|R]):-N>0,brisi(L,G,V),N1 is N-1,var(V,N1,R).

/* Clan liste. */
clan([X|_],X).
clan([_|Y],X):-clan(Y,X).
/* Generisati varijacije sa ponavljanjem elemenata date liste. */
varp(X,0,[]).
varp(L,N,[G|R]):-N>0,clan(L,G),N1 is N-1,varp(L,N1,R).

/* Umetanje broja u sortiranu listu. */


umetni(X,[G|R],[G|P]):-G<X,!,umetni(X,R,P).
umetni(X,L,[X|L]).

/* Sortiranje sa umetanjem. */
stu([],[]).
stu([G|R],S):-stu(R,L),umetni(G,L,S).

/* Bubble sort. */
bubble(L1,L2):-spoj(X,[A,B|R],L1),B<A,!,spoj(X,[B,A|R],L3),bubble(L3,L2).
bubble(L,L).

/* Spajanje dve sortirane liste sa sortiranjem. */


spojs([],X,X):-!.
spojs(X,[],X):-!.
spojs([G1|R1],[G2|R2],[G1|R]):-G1<G2,spojs(R1,[G2|R2],R),!.
spojs([G1|R1],[G2|R2],[G2|R]):-spojs([G1|R1],R2,R),!.

/* Clan stabla. */
clan(X,s(L,X,D)):-!.
clan(X,s(L,Y,D)):-clan(X,L),!.
clan(X,s(L,Y,D)):-clan(X,D).

/* Broj cvorova stabla. */


brcvor(nil,0).
brcvor(s(L,K,D),N):-brcvor(L,N1),brcvor(D,N2), N is N1+N2+1.

/* Dubina binarnog stabla. */


dubbs(nil,0).
dubbs(s(L,K,D),N):-dubbs(L,N1),dubbs(D,N2),max2(N1,N2,N3), N is N3+1.

/* Ubacivanje u listu svih cvorova binarnog stabla po inorder redosledu. */


inorder(nil,[]).
inorder(s(L,K,D),Lis):-inorder(L,Lis1),inorder(D,Lis2),spoj(Lis1,[K|Lis2],Lis).

/* Dodavanje u uredjeno binarno stablo. */


ubacis(nil,X,s(nil,X,nil)).
ubacis(s(L,X,D),X,s(L,X,D)).
ubacis(s(L,K,D),X,s(L1,K,D)):-X<K,ubacis(L,X,L1).
ubacis(s(L,K,D),X,s(L,K,D1)):-X>K,ubacis(D,X,D1).

/* Ubacivanje elemenata liste u uredjeno binarno stablo. */


ublisbs([],S,S).
ublisbs([G|R],S,NNS):-ubacis(S,G,NS),ublisbs(R,NS,NNS).

/* Sortiranje liste brojeva. */


sortlis(L,L1):-ublisbs(L,nil,S),inorder(S,L1).

/* Brisanje elementa iz uredjenog binarnog stabla. */


brisi(s(nil,X,D),X,D):-!.
brisi(s(L,X,nil),X,L):-!.
brisi(s(L,K,D),X,s(L1,K,D)):-X<K,brisi(L,X,L1),!.
brisi(s(L,K,D),X,s(L,K,D1)):-X>K,brisi(D,X,D1),!.
brisi(s(L,X,D),X,s(L,Y,D1)):-brisimin(D,Y,D1).
brisimin(s(nil,X,D),X,D):-!.
brisimin(s(L,K,D),X,s(L1,K,D)):-brisimin(L,X,L1).

/* Provera brisanja. */
bris(L,X,L1):-ublisbs(L,nil,BS),brisi(BS,X,BS1),inorder(BS1,L1).

/*
Generisati listu listova binarnog stabla.
*/
listovi(L,L1):-ublisbs(L,nil,S),nadjilistove(S,L1).
nadjilistove(nil,[]):-!.
nadjilistove(s(nil,K,nil),[K]):-!.
nadjilistove(s(L,K,D),Lis):-nadjilistove(L,Lis1),nadjilistove(D,Lis2),
spoj(Lis1,Lis2,Lis).
/*
Sadrzaj K-tog cvora binarnog stabla pri obilasku levo-koren-desno.
*/
sadrzaj(S,K,X):-inorder(S,L),ktiellis(L,K,X).
ktiellis(L,K,X):-K<1,write('Nemoj da se salis!'),!,fail.
ktiellis(L,K,X):-duzlis(L,N),K>N,write(K),write('>'),write(N),fail,!.
ktiellis(L,K,X):-duzlis(L,N),K=<N,K1 is K-1,izbaciprvihn(L,K1,[X|_]).
provsadrk(L,K,X):-ublisbs(L,nil,BS),sadrzaj(BS,K,X),!.

You might also like