tuxmartin

LP1 - cviceni - prolog

Dec 9th, 2011
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 5.85 KB | None | 0 0
  1. % -----------------------------------------------------------
  2. /*
  3.  1) Napiste predikat vydel(Sez1, Sez2), ktery vydeli Sez1 (seznam celych sudych cisel)
  4.    celociselne 2ma. Tj. napr. vydel([6,8,4],X)  - vysledek X=[3,4,2].
  5. */
  6.  
  7. vydel([], []).
  8. vydel([H|T], [A|Vysl]) :- A is H / 2, vydel(T, Vysl).
  9.  
  10. % -----------------------------------------------------------
  11. /*
  12.  2) Napiste program, ktery pocita obvod ctverce, dokud uzivatel nezada 'konec'.
  13. */
  14.  
  15. ctverec:-repeat,
  16.     write('Zadej cislo:'),
  17.     read(X),
  18.     (X='konec',!;
  19.     O is X * 4, write('Obvod je '), write(O)),nl,fail.
  20.  
  21. % -----------------------------------------------------------
  22. /*
  23. 3) Napiste predikat porovnej(Sez1, Sez2), ktery porovna delku obou seznamu
  24.    a vypise, ktery z nich je delsi.
  25.    Napr. porovnej([2, ahoj, cisla, 8],[5,5,ahoj,77,windows,blbost])
  26.    napise: 'Druhy seznam je delsi'.
  27. */
  28.  
  29. delka([], 0).
  30. delka([_|T], V) :- delka(T, D), V is D + 1.
  31.  
  32. porovnej(X, Y) :- delka(X, D1), delka(Y, D2), ktery(D1, D2).
  33.  
  34. ktery(D1, D2) :- D1 < D2, write('prvni seznam je mensi nez druhy'),nl.
  35. ktery(D1, D2) :- D1 > D2, write('prvni seznam je vetsi nez druhy'),nl.
  36. ktery(D1, D2) :- D1 = D2, write('seznamy jsou stejne dlouhe'),nl.
  37.  
  38.  
  39. % -----------------------------------------------------------
  40. /*
  41. 4) Napiste predikat, jimz prictete ke vsem prvkum seznamu dane cislo X.
  42.    Tj. pokud zavolate napriklad ?- pricti(5,[1,3,2],V).
  43.    dostanete odpoved V = [6,8,7]
  44. */
  45.  
  46. pricti(X,[],[]).
  47. pricti(X,[H|T],[A|V]):-A is X+H,pricti(X,T,V).
  48.  
  49. %%% PO VYSLEDKU VRACI NO !!!!!!!!!!!!!!!!
  50. % -----------------------------------------------------------
  51. /*
  52. 5) Napiste program, ktery bude pracovat v cyklu a bude pocitat obvody kruhu
  53.    vzdy zada polomer/prumer kruhu, program program vypise obvod a vyzada si
  54.    dalsi vstup. Pri zadani slova "konec" program zkonci.
  55. */
  56.  
  57. obvod:-repeat,
  58.     write('zadej polomer kruhu v metrech, nebo ukonci slovem konec'),nl,
  59.     read(X),
  60.     (X='konec';  % NEBO  (X='konec',!;   oboje funguje
  61.     O is (3.14*2*X),write('obvod kruhu je '),write(O),write('metru'),nl,fail).
  62.  
  63. % -----------------------------------------------------------
  64. /*
  65. 6) Napiste pravidlo, ktere overi, jestli je seznam usporadan sestupne. Priklad:
  66.    ?- poradi([7,4,9,3,2,1]). ... dostanete odpoved "no"
  67.    ?- poradi([6,4,2,1]). ... dostanete odpoved "yes"
  68. */
  69.  
  70. poradi([_]).
  71. poradi([H,H1|T]):-H>H1,poradi([H1|T]).
  72.  
  73.  
  74. % -----------------------------------------------------------
  75. /*
  76. 7) Ze seznamu odstrante prvni a posledni prvek.
  77. */
  78.  
  79. %%% DOPLNIT !!!!!!!!!!!!!!!!
  80.  
  81.  
  82. % -----------------------------------------------------------
  83. /*
  84. 8) Do databaze vlozte sestupne N cisel.
  85. */
  86.  
  87. vlozv(X).
  88. vlozv(X):-N>0,asserta(cislo(0)),N1 is N-1,vlozv(N1).
  89. %%% NEFUNGUJE !!!!!!!!!!!!!!!!
  90.  
  91. % -----------------------------------------------------------
  92. /*
  93. 9) V databazi mame ulozenačcisla ve tvaru cislo(1) az cislo(...),
  94.    odstrante takove, ktera je mensi nez uzivatelem zadane cislo.
  95. */
  96. % - napoveda - http://iris.uhk.cz/logpro/teorie/teorie10.html
  97.  
  98.  
  99. % -----------------------------------------------------------
  100. /*
  101. 10) Spocita druhou mocninu zadaneho cisla v rozsahu 100 az 200
  102. */
  103.  
  104. cislo100az200(X):-repeat,write('Zadej cislo v rozmezi 100-200'),nl,read(X),X>=100,X=<200,!.
  105.  
  106. nasob:-cislo100az200(X),N is X*X,write('Druha mocnina '),write(X),write(' je '),write(N),nl.
  107.  
  108.  
  109. % -----------------------------------------------------------
  110. /*
  111. 11) Zadej cislo v rozsahu 100 az 200
  112. */
  113.  
  114. vstup(X):-repeat,write('Zadej cislo v rozmezi 100-200'),nl,read(X),X>=100,X=<200,!.
  115.  
  116. % -----------------------------------------------------------
  117. /*
  118. 11) Prunik, sjednoceni a rozdil
  119.     %?- prunik([1,2,3,4,5],[2,8,4,6],V).      V = [2,4]
  120.     %?- sjednoceni([1,2,3,4],[2,3,4,5],V).    V = [1,2,3,4,5]
  121.     %?- rozdil([1,2,3,4],[1,3,5,2],V).
  122. */
  123.  
  124. clen(X,[X|T]).
  125. clen(X,[H|T]):-clen(X,T).
  126.  
  127.  
  128. prunik([],_,[]).
  129. prunik([H|A],B,[H|V]):-clen(H,B),!,prunik(A,B,V).
  130. prunik([H|A],B,V):-prunik(A,B,V).
  131.  
  132. sjednoceni([],B,B).
  133. sjednoceni([H|A],B,[H|V]):-not(clen(H,B)),!,sjednoceni(A,B,V).
  134. sjednoceni([H|A],B,V):-sjednoceni(A,B,V).
  135.  
  136.  
  137. %rozdil A-B
  138. rozdil([],_,[]).
  139. rozdil([H|A],B,[H|V]):-not(clen(H,B)),rozdil(A,B,B).
  140. rozdil([H|A],B,V):-clen(H,B),rozdil(A,B,V).
  141. %%% NEFUNGUJE !!!!!!!!!!!!!!!!
  142.  
  143. % -----------------------------------------------------------
  144. /*
  145. 12) Histogram.   %?-his([3,2,5,1]).
  146. */
  147.  
  148. his([]).
  149. his([H|T]):-vypis(H),nl,his(T).
  150.  
  151. vypis(0):-!. %prikaz rezu (misto podminek)
  152. vypis(H):-write('*'),H1 is H-1,vypis(H1).
  153.  
  154. % -----------------------------------------------------------
  155. /*
  156. 13) Vytikani cisel:
  157.      ?- smazej(2,[1,2,3,4,5],V).
  158.      V = [2,3,4,5] ;
  159.      V = [3,4,5] ;
  160. */
  161.  
  162. smazej(X,[],[]).
  163. smazej(X,[H|T],T).
  164. smazej(X,[H|T],V):-X\=H,smazej(X,T,V).
  165. %?-smazej(2,[1,2,3,4,5],V).
  166.  
  167. % -----------------------------------------------------------
  168. /*
  169. 14) Posledni  a predposledni cislo v seznamu:
  170.      ?- predposledni([1,2,3,4,5],V).
  171.      V = 4 ;
  172.      ?- posledni(V,[1,2,3]).
  173.      V = 3 ;
  174. */
  175.  
  176. predposledni([P,X],P).
  177. predposledni([H|T],P):-predposledni(T,P).
  178.  
  179. posledni(X,[X]).
  180. posledni(X,[H|T]):-posledni(X,T).
  181.  
  182. %%% PO VYSLEDKU VRACI NO !!!!!!!!!!!!!!!!
  183. % -----------------------------------------------------------
  184. /*
  185. 15) Delka seznamu, vypis kladnych cisel, vypis n-teho prvku,
  186.     spojeni 2 seznamu
  187. */
  188.  
  189. clen(X,[X|_]).
  190. clen(X,[H|T]):-clen(X,T).
  191.  
  192. vypis([]).
  193. vypis([H|T]):-write(H),nl,vypis(T).
  194.  
  195. nty(1,[H|T],H).  %n-ty prvek
  196. nty(N,[H|T],V):-N>1,N is N-1,nty(N1,T,V).
  197.  
  198. kladna([]):-write('Seznam obsahuje pouze kladna cisla'),nl.
  199. kladna([H|T]):-H>0,kladna(T).
  200. kladna([H|T]):-H=<0,write('Seznam obsahuje i nekladna cisla'),nl.
  201.   % ?- ?- kladna([1,-2,3]).
  202.  
  203. delka([],0).
  204. delka([H|T],P):-delka(T,P1),P is P1+1.
  205.   % ?- delka([1,2,3,4,5],V).
  206.   % V = 5
  207.  
  208. spoj([],S,S).
  209. spoj([H|T],S,[H|V]):-spoj(T,S,V).
  210.   % ?- spoj([1,2,3],[4,5,6],V).
  211.   % V = [1,2,3,4,5,6]
  212.  
  213. % -----------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment