Advertisement
stevanevolja

Prolog zadaci

Mar 2nd, 2023 (edited)
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 6.15 KB | Source Code | 0 0
  1. /*1.    Definisi predikat kojim se odredjuje broj elemenata u listi L.*/
  2. brElemenata([],0).
  3. brElemenata([_|OstatakListe],R):-brElemenata(OstatakListe,R1), R is R1+1.
  4.  
  5. /*2.    Definisi predikat kojim se odredjuje suma elemenata u listi brojeva L.*/
  6. suma([],0).
  7. suma([PrviElement|OstatakListe],S):-suma(OstatakListe,S1), S is S1+PrviElement.
  8.  
  9. /*3.    Definisi predikat kojim se odredjuje aritmeticka sredina elemenata u listi brojeva.*/
  10. aritmetickaSredina(Lista, Prosek):-suma(Lista, S), brElemenata(Lista, R), Prosek is S/R.
  11.  
  12. /*4.    Definiši predikat kojim se za dato N kreira lista koja sadrži
  13. a)  redom brojeve od 1 do N
  14. b)  redom brojeve od N do 1
  15. c)  brojeve deljive sa 5 koji su manji od N
  16. */
  17. clan(X,[X|_]).
  18. clan(X,[_|L]):-clan(X,L).
  19.  
  20. spoji([],L,L).
  21. spoji([X|L1],L2,[X|L]):-spoji(L1,L2,L).
  22.  
  23. doN(1,[1]).
  24. doN(N,L):-N>1, N1 is N-1, doN(N1,L1), spoji(L1,[N],L).
  25.  
  26. odN(1,[1]).
  27. odN(N,L):-N>1, N1 is N-1, odN(N1,L1), spoji([N],L1,L).
  28.  
  29. deljivi_sa_5(N, L) :-deljivi_sa_5_pomocna(1, N, [], L).
  30. deljivi_sa_5_pomocna(A, N, L1, R) :-
  31.     A =< N,
  32.     (
  33.         A mod 5 =:= 0 ->
  34.             spoji(L1, [A], L2)
  35.         ;
  36.             L2 = L1
  37.     ),
  38.     A1 is A + 1,
  39.     deljivi_sa_5_pomocna(A1, N, L2, R).
  40.  
  41. deljivi_sa_5_pomocna(_, _, L1, L1).
  42.  
  43. /*5.    Definiši predikat kojim se iz date liste izdvajaju pozitivni elemeneti.*/
  44. pozitivni([],[]).
  45. pozitivni([X|L],[X|R]):-X>0,pozitivni(L,R).
  46. pozitivni([X|L],R):-X=<0,pozitivni(L,R).
  47.  
  48. /*6.    Definiši predikat kojim se iz date liste brojeva  izdvajaju elementi koji su veći od aritmetičke sredine elemenata liste.*/
  49. veciOdProseka(L,R):-aritmetickaSredina(L,Prosek), veciOdProseka(L,Prosek,R).
  50. veciOdProseka([],_,[]).
  51. veciOdProseka([X|L],Prosek,[X|R]):-X>Prosek, veciOdProseka(L,Prosek,R).
  52. veciOdProseka([X|L],Prosek,R):-X=<Prosek, veciOdProseka(L,Prosek,R).
  53.  
  54. /*7.    Definisi predikat kojim se odredjuje maksimalini element u listi brojeva.*/
  55. maksimum([],_):-fail.
  56. maksimum([X],X).
  57. maksimum([X|L],M):-maksimum(L,M2), M is max(X,M2).
  58.  
  59. /*8.    Definisi predikat kojim se odredjuje suma pozitivnih elemenata u listi celih brojeva.*/
  60. sumaPozitivnih([],0).
  61. sumaPozitivnih([X|L],R):-X>0,sumaPozitivnih(L,R1), R is R1+X.
  62. sumaPozitivnih([X|L],R):-X=<0,sumaPozitivnih(L,R1), R is R1.
  63.  
  64. /*9.    Definisati predikat kojim se odredjuje broj pojavljivanja elementa X u datoj listi L.*/
  65. brojPojavljivanja(_,[],0).
  66. brojPojavljivanja(N,[N|L],R):-brojPojavljivanja(N,L,R1), R is R1+1.
  67. brojPojavljivanja(N,[_|L],R):-brojPojavljivanja(N,L,R).
  68.  
  69. /*10.   Definisi predikat kojim se odredjuje N-ti clan liste. */
  70. clan_liste(1, [X|_], X).
  71. clan_liste(N, [_|T], X) :- N > 1, N1 is N-1, clan_liste(N1, T, X).
  72.  
  73. /*11.   Formiraj listu koja sadrži elemente iz  date liste L  od pozicije P do pozijcije K, za dato P i K (1<=P<K<=duzini liste).*/
  74. odPdoK(L,P,K,R):-odPdoK(1,P,K,L,R).
  75. odPdoK(X,_,X,[Y|_],[Y]).
  76. odPdoK(X,P,K,[_|L],R):- X < P, X1 is X + 1, odPdoK(X1,P,K,L,R).
  77. odPdoK(X,P,K,[E|L],[E|R]):- X >= P, X < K, X1 is X + 1, odPdoK(X1,P,K,L,R).
  78.  
  79. /*12.   Podeli listu na dva dela, ako je data dužina prvog dela.
  80. ?- podeli([a,b,c,d,e,f,g,h,i,k],3,L1,L2).
  81. L1 = [a,b,c]
  82. L2 = [d,e,f,g,h,i,k]
  83. */
  84. podeli(L,0,[],L).
  85. podeli([X|L],N,[X|L1],L2):-N>0,N1 is N-1, podeli(L,N1,L1,L2).
  86.  
  87. /*13.   Napisati predikat koji se za datu listu celih brojeva L  formira lista  koja sadrži  elemente liste L  čiji se suprotan broj ne javlja u listi L.
  88. Npr. u listi [1, -2, -1, 3, 2, -4] to su brojevi 3 i -4.
  89. */
  90. brisi(X,[X|L],L).
  91. brisi(X,[Y|L],[Y|L1]):-brisi(X,L,L1).
  92.  
  93. suprotni([],[]).
  94. suprotni([X|L],R):-X1 is -X, brisi(X1,L,Ost), suprotni(Ost,R).
  95. suprotni([X|L],[X|R]):-X1 is -X, not(brisi(X1,L,_)), suprotni(L,R).  %ako stablo nema ni 1 cvoir uspeha ovo ce proci i obrnuto za gore
  96.  
  97. /*14.   Napisati PROLOG predikat sumeK(L,K,NL) koji za datu listu L i prirodan broj K formira listu NL sastavljenu
  98. od zbirova K uzastopnih elemenata liste L. Primer: sumeK([3,1,4,7,2,0], 3, [8,12,13,9]).*/
  99. sumePrvihK([X|_],1,X).
  100. sumePrvihK([X|L],K,R):-K>1,K1 is K-1,sumaPrvihK(L,K1,R1),R is R1+1.
  101. sumeK([X|L],K,[S|R]):-sumaPrvihK([X|L],K,S),sumeK(L,K,R).
  102. sumeK(L,K,[]):-not(sumaPrvihK(L,K,_)).
  103.  
  104. /*15.   Napisati PROLOG predikat koji za datu listu L i prirodan broj K formira listu NL redom sadrzi sumu prvih K elemenata liste, zatim sumu drugih K ...
  105. Od liste [3,1,4,7,2,0] za K=3  dobijamo [8,9]
  106. a od liste [3,1,4,7,2,5,1] za K=2  dobijamo [4,11,7]*/
  107. sumePoReduK(L,K,R):-sumePoReduK(L,K,R,K,0). %0 je medju rezultat koji upisujemo u rezultat
  108. sumePoReduK([X|L],K,R,N,Ms):-N>0, Ms1 is Ms+X, N1 is N-1, sumePoReduK(L,K,R,N1,Ms1).
  109. sumePoReduK(L,K,[Ms|R],0,Ms):-sumePoReduK(L,K,R,K,0).
  110. sumePoReduK([],_,[],N,_):-N>0.
  111.  
  112. /*16.   Dupliraj svaki element liste dati broj puta.
  113. ?- dupli([a,b,c],3,X).
  114. X = [a,a,a,b,b,b,c,c,c]
  115. */
  116. dupli(L,K,R):-dupli(L,K,R,K).
  117. dupli([],_,[],_).
  118. dupli([_|L],K,R,0):-dupli(L,K,R,K). %kada brojac dodje do 0 onda predjemo na sledeci element
  119. dupli([X|L],K,[X|R],N):-N>0,N1 is N-1, dupli([X|L],K,R,N1).
  120.  
  121. /*17.   Dodaj element X na poziciji K u listi L.
  122. Ako je X=5 K=3 Lista [a,b,c,d,e] dobijamo listu [a,b,5,c,d,e]
  123. */
  124. dodajNaK(X,1,L,[X|L]).
  125. dodajNaK(X,K,[Y|L],[Y|L1]):-K>1, K1 is K-1,dodajNaK(X,K1,L,L1).
  126.  
  127. /*18.   Brisi element na poziciji K iz liste L.
  128. Ako je K=3 Lista [a,b,c,d,e] dobijamo listu [a,b,d,e]
  129. */
  130. brisiK(1,[_|L],L).
  131. brisiK(K,[X|L],[X|L1]):-K>1,K1 is K-1, brisiK(K1,L,L1).
  132.  
  133. /*19.   Napisati predikate koji realizuju relacije sa skupovima: podskup, jednakost i disjunktni. Skup se zadaje kao lista. */
  134. duzina([],0).
  135. duzina([_|L],R):-duzina(L,R1), R is R1+1.
  136.  
  137. clan(X,[X|_]).
  138. clan(X,[_|L]):-clan(X,L).
  139.  
  140. podskup([], _).
  141. podskup([X|L], L1) :- clan(X, L1), podskup(L, L1).
  142.  
  143. jednakost(L1,L2):-podskup(L1,L2), podskup(L2,L1), duzina(L1,D1), duzina(L2,D2), D1=:=D2.
  144.  
  145. disjunktni([],_).
  146. disjunktni([X|L1],L2):-not(clan(X,L2)),disjunktni(L1,L2).
  147.  
  148. % Unija dva skupa
  149. unija([],L,L).
  150. unija([X|L],L1,[X|R]):-not(clan(X,L1)), unija(L,L1,R). %ako element prve liste nije u drugoj, upisujemo ga u rezultat
  151. unija([X|L],L1,R):-clan(X,L1), unija(L,L1,R).
  152.  
  153. % Presek dva skupa:
  154. presek([],_,[]).
  155. presek([X|L],L1,[X|R]):-clan(X,L1), presek(L,L1,R). %ako element prve liste jeste u drugoj, upisujemo ga u rezultat
  156. presek([X|L],L1,R):-not(clan(X,L1)), presek(L,L1,R).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement