Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 10.38 KB | None | 0 0
  1. % al K lea element din lista L in X
  2. % ( 1 )
  3. extract_k([_|T],K,X) :- K > 0 , CONT is K - 1 , ! , extract_k(T,CONT,X).
  4. extract_k([H|_],K,X) :- K = 0 , X is H.
  5.    
  6. %usage: extract_k([69,12,3,55,23],5,X).
  7.  
  8. % ?- diagonal([[1,2,3],[4,5,6],[7,8,9]], D).
  9. % D = [1, 5, 9].
  10. % ( 2 )
  11. %diagonal_fun([],[],0).
  12. diagonal([H|T],D,K) :- extract_k(H,K,X) ,
  13.                         atomic(X),
  14.                         %writeln(X),
  15.                     append(D,[X],D1),
  16.                     writeln(D1),
  17.                     CONT is K + 1 ,
  18.                     diagonal(T,D1,CONT).
  19.  
  20. %( 1 )
  21. cmmdc(B,B,B).
  22. cmmdc(A,B,C) :- A>B , A1 is A-B , cmmdc(A1,B,C).
  23. cmmdc(A,B,C) :- B>A , B1 is B-A , cmmdc(A,B1,C).
  24.  
  25. %( 2 )
  26. cmmmc(A,B,C) :- cmmdc(A,B,D) , C is A*B/D.
  27.  
  28. %( 3 ) suma
  29. suma([H|T],R) :- suma(T,ACC) , R is ACC + H.
  30. suma([],0).
  31.  
  32. %– suma([1,2,3,4,5], R).
  33.  
  34. % ( 4 )
  35. %? – separate_parity([1,2,3,4,5,6], E, O).
  36. %E = [2,4,6], O=[1,3,5]
  37.  
  38. separate_parity([H|T],E,[H|O]) :- 1 is H mod 2 , separate_parity(T,E,O).
  39. separate_parity([H|T],[H|E],O) :- 0 is H mod 2 , separate_parity(T,E,O).
  40. separate_parity([],[],[]).
  41.  
  42. % ( 5 ) Înlocui?i toate apari?iile lui X cu Y.
  43. %Ex: ? – replace_all(1, a, [1,2,3,1,2], R).
  44.  
  45. replace_all(X,Y,[X|T],[Y|R]) :- replace_all(X,Y,T,R),!.
  46. replace_all(X,Y,[H|T],[H|R]) :- not(H is X),  replace_all(X,Y,T,R).
  47. replace_all(_,_,[],[]).
  48.  
  49. % ( 6 ) ?terge?i elementele de pe pozi?ii divizibile cu K.
  50. %Ex: ? – sterge_k([6,5,4,3,2,1], 3, R).
  51. %R = [6,5,3,2]
  52.  
  53. sterge( [H|T] , K , CONT , [H|R] ) :- CONT < K ,
  54.                                      CONT1 is CONT + 1,
  55.                                      sterge(T,K,CONT1,R) , !.
  56. sterge( [_|T] , K , CONT , R ) :- 0 is CONT mod K , sterge(T,K,1,R).
  57. sterge( [], _ , _ , [] ).
  58.  
  59. sterge_k(L,K,R) :- sterge(L,K,1,R).
  60.  
  61. % ( 7 ) Inverseaza o lista completa/incompleta.
  62. %? – reverse([1, 2, 3, 4, 5], R).
  63. %R = [5, 4, 3, 2, 1].
  64.  
  65. %reverse lista normala cu REC inainte
  66. reverse1([],[]).
  67. reverse1([H|T],R) :- reverse1(T,ACC) , append(ACC,[H],R).
  68.  
  69. reverse_il( L , R , R ) :- var(L),  !.
  70. reverse_il( [H|T] , R , ACC ) :- reverse_il(T,R,[H|ACC]).
  71. % reverse2([1, 2, 3, 4, 5|_], R ).
  72. reverse2( L , R ) :- reverse_il(L,R,_).                  
  73.  
  74. % ( 8 ) Calcula?i adâncimea maxima a unei liste imbricate.
  75. %Ex: ? – adancime([1, [2, [3]], [4]], R1), adancime([], R2).
  76. %R1 = 3, R2 = 1.
  77. %adancime([1, [2, [3]], [4]], R1), adancime([], R2).
  78.  
  79. max(A,B,A) :- A>B , !.
  80. max(_,B,B).
  81.  
  82. adancime([],1).
  83. adancime([H|T],R) :- atomic(H) ,!, adancime(T,R).
  84. adancime([H|T],R) :- adancime(H,R1), adancime(T,R2),
  85.                     R3 is R1 + 1,
  86.                     max(R2,R3,R).
  87.  
  88. % ( 9 ) Aplatiza?i o lista imbricata cu liste complete/incomplete.
  89. %Ex: ? - flat([1, [2, [3]], [4]], R).
  90. %R = [1,2,3,4].
  91.  
  92. flat( [H|T] ,[H|R] ) :- atomic(H) , ! , flat(T,R).
  93. flat( [H|T] , R ) :- flat(H,R1),flat(T,R2),  append(R1,R2,R).
  94. flat( [],[] ).
  95.  
  96. %flat_il([[1|_], 2, [3, [4, 5|_]|_]|_], R).
  97.  
  98. append_il(L,L2,L2):- var(L),!.
  99. append_il([H|T],L2,[H|R]) :- append_il(T,L2,R).
  100.  
  101. flat_il(L,_) :- var(L), !.
  102. flat_il( [H|T] ,[H|R] ) :- atomic(H) , ! , flat_il(T,R).
  103. flat_il( [H|T] , R ) :- flat_il(H,R1),flat_il(T,R2),  append_il(R1,R2,R).
  104. %flat_il( [],[] ).
  105. %flat_il([[1|_], 2, [3, [4, 5|_]|_]|_], R).
  106.  
  107.  
  108. %( 11 ). Colecta?i toate nodurile unui arbore binar complet/incomplet în inordine folosind liste complete/diferen?a.
  109. %tree1(t(6, t(4, t(2, nil, nil), t(5, nil, nil)), t(9, t(7, nil, nil), nil))).
  110. %? – tree(T), inordine(T, R).
  111. %R = [2,4,5,6,7,9].
  112.  
  113. %tree(t(6, t(4, t(2, nil, nil), t(5, nil, nil)), t(9, t(7, nil, nil), nil))).
  114. inorder( t(K,L,R) , LIST ) :- inorder(L,LL) ,
  115.                              inorder(R,LR) ,
  116.                             append(LL,[K|LR],LIST).
  117. inorder( nil , [] ).
  118.  
  119. preoder( t(K,L,R) , LIST ) :- preoder(L,LL) ,
  120.                              preoder(R,LR) ,
  121.                             append([K|LL],LR,LIST).
  122. preoder( nil , [] ).
  123.  
  124. postorder( t(K,L,R) , LIST ) :- postorder(L,LL) ,
  125.                              postorder(R,LR) ,
  126.                             append(LL,LR,R1) ,
  127.                             append(R1,[K],LIST).
  128. postorder( nil , [] ).
  129.  
  130.  
  131. %( 12 ). Colectați toate frunzele dintr-un arbore binar.
  132. tree(t(6, t(4, t(2, nil, nil), t(5, nil, nil)), t(9, t(7, nil, nil), nil))).
  133. %? – tree(T), collect_k(T, R).
  134. %R = [2,5,7].
  135. height3(nil, 0).
  136. height3(t(_, L,Mid, R), H):-
  137.     height3(L, H1),
  138.     height3(Mid, H2),
  139.     height3(R, H3),
  140.     max(H1, H2, H4),
  141.     max(H4, H3 ,H5),
  142.     H is H5+1.
  143.  
  144. collect( t(K,nil,nil) , [K] ) :- !.
  145. collect( t(_,L,R) , LIST  ) :-
  146.     collect( L , LL ),
  147.     collect( R , RR ),
  148.     append(LL,RR,LIST).
  149. collect( nil , [] ).
  150.  
  151. count_leaves( t(_,_,_) , 1 ).
  152. count_leaves( t(_,L,R) , CONT ) :-
  153.         count_leaves( L , CONT1 ),
  154.         count_leaves( R , CONT2 ),
  155.         CONT is CONT1 + CONT2.
  156.  
  157.  
  158. height( nil , 0 ).
  159. height( t(_,L,R) , H ) :-
  160.         height(L, H1 ),
  161.         height(R, H2 ),
  162.         max(H1,H2,H3),
  163.         H is H3+1.
  164.  
  165. % Toate ele pare dintr-un arbore binar incomplet/complet
  166. tree2(t(6, t(4, t(2, _, _), t(5, _, _)), t(9, t(7, _, _), _))).
  167.  
  168. %extract_even(T, []):- var(T), !.
  169. extract_even(nil,[]).
  170. extract_even(t(K, L, R),Rez):-
  171.     1 is K mod 2, !,
  172.     extract_even(L,Rez1),
  173.     extract_even(R,Rez2),
  174.     append(Rez1,[K],RezP),
  175.     append(RezP,Rez2,Rez).
  176. extract_even(t(_, L, R),Rez):-
  177.     extract_even(L,Rez1),
  178.     extract_even(R,Rez2),
  179.     append(Rez1,Rez2,Rez).
  180.  
  181. % 12. colectati toate frunzele dintr-un arbore binar
  182. colect(t(K, nil, nil), [K]):- !.
  183. colect(t(_, L, R), List) :- colect(L, LL), colect(R, RR) , append(LL, RR, List).
  184. colect(nil, []).
  185.  
  186. % 13. stergeti toate elementele duplicate dintr-o lista
  187. s_duplicate([], []).
  188. s_duplicate([H|T], R):- member(H, T), s_duplicate(T, R).
  189. s_duplicate([H|T], [H|R]):- s_duplicate(T, R).
  190.  
  191. % 14. stergeti toate aparitiile elem min dintr-o lista
  192. min1([H|T], M):- min1(T, M), M<H, !.
  193. min1([H|_], H).
  194.  
  195. delete(X, [X|T], T):- !.
  196. delete(X, [H|T], [H|R]) :- delete(X, T, R).
  197. delete(_, [], []).
  198.  
  199. s_min(L, R) :- min1(L, R1), delete(R1, L, R).
  200.  
  201. max2([H|T],M) :- max2(T,M1),
  202.          H < M1,!,M=M1.
  203. max2([H|_],H).
  204.  
  205. s_max(L, R) :- max2(L, R1), delete(R1, L, R).
  206.  
  207.  
  208. % 15. inversati elementele dintr-o lista dupa pozitia K
  209.  
  210. revk([H|T],N,Count, [H|TR]) :- Count < N ,!, Count1 is Count +1 , revk(T, N, Count1, TR).
  211. revk(L,N, Count, R) :- append(TL, [Last], L) , C1 is Count+1 , revk(TL, N, C1, TR), R = [Last|TR].
  212. revk([], _, _, []).
  213.  
  214. % 17. rotire k pozitii la dreapta
  215. rotire(L,K,R):-append(L1,L2,L),
  216.         length(L,Len),
  217.         K1 is Len -K,
  218.         length(L1,K1),
  219.         append(L2,L1,R).
  220.  
  221. % 18. sortati o lista de caractere in functie de codul ascii
  222. del(X,[X|T],T).
  223. del(X,[H|T],[H|R]) :- del(X,T,R).
  224. del(_, [], []).
  225.  
  226. sort_chars(L, [M|R]):- min3(L, M), del(M, L, L1), sort_chars(L1, R).
  227. sort_chars([], []).
  228.  
  229. min3([H|T], M) :- min3(T, M), char_code(M, R1), char_code(H, R2), R1<R2, !.
  230. min3([H|_], H).
  231.  
  232. % 19. sortati o lista de liste in functie de lungimea listelor de nivel 2
  233. length_lista([],0):-!.
  234. length_lista([_|T],Len):-length_lista(T,Len1),
  235.              Len is Len1 +1.
  236.              
  237. minim_list([],M,M).
  238. minim_list([H|T],MP,M):-length_lista(H,Z1),
  239.              length_lista(MP,Z2),
  240.              Z1<Z2, ! ,
  241.              minim_list(T,H,M).
  242. minim_list([H|T],MP,M):-minim_list(T,MP,M).
  243. minlista([H|T],R):-minim_list([H|T],H,R).
  244.  
  245.  
  246. sort_len(L,[M|R]):-minlista(L,M),
  247.            delete(M,L,L1),!,
  248.            sort_len(L1,R).
  249. sort_len([],[]).
  250.  
  251.  
  252. % 20. suma elem de la niv k intr-o lista imbricata ??
  253.  
  254. sum_k([],_,_,0).
  255. sum_k([H|T],K,C,R):- C<K,
  256.                 atomic(H),!,
  257.                 sum_k(T,K,C,R).
  258. sum_k([H|T],K,C,R):- C<K,!,
  259.                 C1 is C+1,
  260.                 sum_k(H,K,C1,R1),
  261.                 sum_k(T,K,C1,R2),
  262.                 R is R1+R2.
  263. sum_k([H|T],C,K,R):-collect(L,R).
  264.  
  265. collect1([],0).
  266. collect1([H|T],S):- atomic(H),!,
  267.            collect(T,S1), S is H+S1.
  268. collect1([H|T],S):- collect1(H,S1),collect1(T,S2), S is S1 + S2.
  269.  
  270. % 21. inlocuiti toate aparitiile lui x cu y in lista imbricata
  271.  
  272. append1([H|T], L, [H|R]) :- append1(T, L, R).
  273. append1([], L, L).
  274.  
  275.  
  276. repl(X,Y,[X|T],[Y|R]):-repl(X,Y,T,R).
  277. repl(X,Y,[H|T],[H|R]):-atomic(H), ! , repl(X,Y,T,R).
  278. repl(X,Y,[H|T],R):- repl(X,Y,H,RH),repl(X,Y,T,RT),append1(RH,RT,R).
  279. repl(_,_,[],[]).
  280.  
  281. % 22. colecteaza toate nodurile de la adancimea k dintr-un arbore binar
  282. %tree(t(6, t(4, t(2, nil, nil), t(5, nil, nil)), t(9, t(7, nil, nil), nil))).
  283.  
  284. collect_k(t(_,L,nil),K,C,List):- C<K,!,
  285.                  C1 is C+1,
  286.                  collect_k(L,K,C1,List).
  287. collect_k(t(_,nil,R),K,C,List):- C<K,!,
  288.                  C1 is C+1,
  289.                  collect_k(R,K,C1,List).
  290. collect_k(t(_,L,R),K,C,List):- C<K,!,
  291.                    C1 is C+1,
  292.                    collect_k(L,K,C1,L1),
  293.                    collect_k(R,K,C1,R1),
  294.                    append(L1,R1,List).
  295. collect_k(t(K,_,_),_,_,[K]).
  296. collect_k1(t(Ki,L,R),K,List):-collect_k(t(Ki,L,R),K,1,List).
  297.  
  298. % extrage elem pare dintr-un arbore binar incomplet
  299. extract(T, []):- var(T), !.
  300. extract(t(K, L, R),Rez):-0 is K mod 2, !, extract(L,Rez1),extract(R,Rez2),
  301.     append(Rez1,[K],RezP),append(RezP,Rez2,Rez).
  302. extract(t(_, L, R),Rez):-extract(L,Rez1),extract(R,Rez2),append(Rez1,Rez2,Rez).
  303.  
  304. col(t(_, L, nil), K, C, List):- C<K, !, 0 is K mod 2,
  305.     C1 is C+ 1, col(L, K, C1,List).
  306. col(t(_, nil, R), K, C, List):- C<K, !,0 is K mod 2,
  307.     C1 is C+ 1, col(R, K, C1,List).
  308. col(t(_, L, R), K, C, List):- C < K, !, 0 is K mod 2,
  309.     C1 is C+1,
  310.     col(L, K, C1 , L1),
  311.     col(R, K, C1, L2),
  312.     append(L1, L2, List).
  313. col(t(K, _,_), _, _, [K]).
  314.  
  315. col_k(t(Key, L, R), K,List):- col(t(Key, L, R),K, 1, List).
  316.  
  317.  
  318. %tree(t(6, t(4, t(2, nil, nil), t(5, nil, nil)), t(9, t(7, nil, nil), nil))).
  319. % ARBORII _---
  320. insert_key(Key, nil, t(Key, nil, nil)). % inserează cheia în arbore
  321. insert_key(Key, t(Key, L, R), t(Key, L, R)):-!. % cheia există deja
  322. insert_key(Key, t(K,L,R), t(K,NL,R)):- Key<K,!,insert_key(Key,L,NL).
  323. insert_key(Key, t(K,L,R), t(K,L,NR)):- insert_key(Key, R, NR).
  324.  
  325. get_pred(t(Pred, L, nil), Pred, L):-!.
  326. get_pred(t(Key, L, R), Pred, t(Key, L, NR)):-get_pred(R, Pred, NR).
  327.  
  328. delete_key(Key, t(Key, L, nil), L):-!.
  329. delete_key(Key, t(Key, nil, R), R):-!.
  330. delete_key(Key, t(Key, L, R), t(Pred,NL,R)):-!,get_pred(L,Pred,NL).
  331. delete_key(Key, t(K,L,R), t(K,NL,R)):-Key<K,!,delete_key(Key,L,NL).
  332. delete_key(Key, t(K,L,R), t(K,L,NR)):-delete_key(Key,R,NR).
  333.  
  334. search_key(Key, t(Key, _, _)):-!.
  335. search_key(Key, t(K, L, _)):-Key<K, !, search_key(Key, L).
  336. search_key(Key, t(_, _, R)):-search_key(Key, R).
  337.  
  338.  
  339. %encode
  340. max_encode([H1,H1|T],R,C):-!, C1 is C+1, max_encode([H1|T],R,C1).
  341. max_encode([_, H2|T],[C|TR],C):- max_encode([H2|T],TR,1).
  342. max_encode([_],[C],C).
  343. max_encode([],[],_).
  344. max_encode([H1,H2|T],R):- max_encode([H1,H2|T],R1,1), max(R1,R).
  345.  
  346. max_from_list([H|T],R,MAX) :- H>MAX , max_from_list(T,R,H).
  347. max_from_list([_|T],R,MAX) :- max_from_list(T,R,MAX).
  348. max_from_list([],_,_).
  349.  
  350. max_enc(L,R,X) :- max_encode(L,R,1),max_from_list(R,X).
  351.  
  352. %max_enc([a,a,b,b,b,d,a,a,a,a,d],R,X).
  353. %
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement