Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.63 KB | None | 0 0
  1. ff(X,[H|T],[H|R]):-ff(X,T,R),X<H,!.
  2. ff(H,[H|T],T).
  3.  
  4.  
  5.  
  6. cmmdc1(X,Y,Z) :- X>Y, Diff is X-Y, cmmdc1(Diff,Y,Z).
  7. cmmdc1(X,Y,Z) :- X<Y, Diff is Y-X, cmmdc1(X,Diff,Z).
  8. cmmdc1(X,X,X).
  9.  
  10. %rec inainte
  11. fact1(0,1).
  12. fact1(N,F) :-N>0, N1 is N-1, fact1(N1,F1), F is N*F1.
  13.  
  14. %rec inapoi
  15. fact2(0,Acc,F) :- F = Acc.
  16. fact2(N,Acc,F) :- N > 0, N1 is N-1, Acc1 is Acc*N, fact2(N1,Acc1,F).
  17. fact2(N,F) :- fact2(N,1,F). % acumulatorul este ini?ializat cu 1
  18.  
  19.  
  20. length([H|T], L, Rez) :- Laux is L + 1,
  21. length(T,Laux,Rez).
  22. length([], L,L).
  23.  
  24.  
  25.  
  26. %length2([H|T], L) :- Laux is L + 1,
  27. %length(T,Laux).
  28. %length2([], L).
  29.  
  30. length2([H|T], L) :- length2(T,LI),
  31. L is LI + 1.
  32. length2([], 0).
  33.  
  34.  
  35.  
  36. cmmmc(A,B,Res):- A>0, B>0,
  37. cmmdc1(A,B,Inter),
  38. Res is (A*B) / Inter.
  39.  
  40.  
  41.  
  42. putere(A,1,Res):- Res = A.
  43. putere(A,B,Res) :- A>0,B>1, A1 is A*A,B1 is B - 1, putere(A1, B1, Res).
  44.  
  45.  
  46.  
  47. putere2(A,1,A).
  48. putere2(A,B,Res):-A>0,B>1, B1 is B - 1, putere2(A,B1,X), Res is A*X.
  49.  
  50.  
  51. fibo(0,1).
  52. fibo(1,1).
  53. fibo(A,Rez):- A>1,N1 is A-1, N2 is A-2, fibo(N1, Res1), fibo(N2, Res2), Rez is Res1 + Res2.
  54.  
  55.  
  56. eq(A,B,C,R1,R2) :- Delta is (B*B)-(4*A*C), Delta >=0,
  57. R1 is (-B + sqrt(Delta))/(2*A),
  58. R2 is (-B - sqrt(Delta))/(2*A).
  59.  
  60.  
  61.  
  62. member1(X, [X|_]).
  63. member1(X, [_|T]) :- member1(X, T).
  64.  
  65.  
  66.  
  67. append1([], L2, L2).
  68. append1([H|T], L2, [H|CoadaR]) :- append1(T, L2, CoadaR).
  69.  
  70.  
  71. delete1(X, [X|T], T). % sterge prima aparitie si se opreste
  72. delete1(X, [H|T], [H|R]) :- delete1(X, T, R). % altfel itereaza peste elementele listei
  73. delete1(_, [], []). % daca a ajuns la lista vida inseamna ca elementul nu a fost gasit si putem returna lista vida
  74.  
  75.  
  76.  
  77.  
  78. delete_all(X, [X|T], R) :- delete_all(X, T, R). % daca s-a sters prima aparitie se va continua si pe restul elementelor
  79. delete_all(X, [H|T], [H|R]) :- delete_all(X, T, R).
  80. delete_all(_, [], []).
  81.  
  82.  
  83.  
  84.  
  85. append3(L1,L2,L3,R):-append1(L2,L3,RI),
  86. append1(L1,RI,R).
  87.  
  88.  
  89. add_first(X,L,[X|L]).
  90. add_first(X,L,R):-add_first(X,L,K), K is [X|R].
  91.  
  92. %add_first2(X,L,R):- append1([X|_],L,R).
  93. %add_first(X,L,[X|L]).
  94.  
  95.  
  96.  
  97. sum2([H|T],Ac,S):- Ac1 is Ac+H, sum2(T,Ac1,S). %apelez cu 0
  98. sum2([],Ac,S):- S=Ac.
  99.  
  100.  
  101. sum([H|T],S):-sum(T,S1), S is H+S1.
  102. sum([],0).
  103.  
  104.  
  105. separate_parity([H|T],[H|L1],L2):- 0 is H mod 2, separate_parity(T,L1,L2).
  106. separate_parity([H|T],L1,[H|L2]):- 1 is H mod 2, separate_parity(T,L1,L2).
  107. separate_parity([],[],[]).
  108.  
  109.  
  110.  
  111.  
  112. remove_duplicates([H|T],R) :- member(H,T), remove_duplicates(T,R).
  113. remove_duplicates([H|T],[H|R]) :-remove_duplicates(T,R).
  114. remove_duplicates([],[]).
  115.  
  116.  
  117. %inlocuieste toate aparitiile lui x in lista l cu y
  118. replace_all(X,Y,[X|T],[Y|R]) :- replace_all(X,Y,T,R).
  119. replace_all(X,Y,[H|T],[H|R]) :- replace_all(X,Y,T,R).%pune pe h in lista 2
  120. replace_all(_,_,[],[]).
  121.  
  122. replace(X,Y,[H|T],[Y|R]):-X=H,replace(X,Y,T,R).
  123. replace(X,Y,[H|T],[H|R]):-X \=H,replace(X,Y,T,R).
  124. replace(X,Y,[],[]).
  125.  
  126.  
  127. %Scrieti un predicat care sterge tot al k-lea element din lista de intrare.
  128. %drop_k([1, 2, 3, 4, 5, 6, 7, 8], 3,1, R).
  129.  
  130. drop_k([H|T], P, Ac, R):- Ac = P, drop_k(T,P,1,R).
  131. drop_k([H|T], P, Ac, [H|R]):- Ac < P, Ac1 is Ac + 1, drop_k(T,P,Ac1,R).
  132. drop_k([], P, Ac,[]).
  133.  
  134.  
  135.  
  136. member_c(X, [X|_]) :- !.
  137. member_c(X, [_|T]) :- member(X, T).
  138.  
  139.  
  140.  
  141. delete_c(X, [X|T], T) :- !.
  142. delete_c(X, [H|T], [H|R]) :- delete_c(X, T, R).
  143. delete_c(_, [], []).
  144.  
  145.  
  146.  
  147. % Varianta 1 (recursivitate înapoi)
  148. length1([], 0).
  149. length1([H|T], Len) :- length1(T, Lcoada), Len is 1+Lcoada.
  150.  
  151.  
  152. % Varianta 2 (recursivitate înainte)
  153. length2([], Acc, Len) :- Len=Acc.
  154. length2([H|T], Acc, Len) :- Acc1 is Acc + 1, length2(T, Acc1, Len).
  155. length2_pretty(L, R) :- length2(L, 0, R).
  156.  
  157.  
  158. --------------------------------------------taiere backtr---------------------
  159.  
  160. % Varianta 1 (recursivitate înapoi)
  161. reverse1([], []).
  162. reverse1([H|T], R) :- reverse1(T, Rcoada), append1(Rcoada, [H], R).
  163.  
  164.  
  165. % Varianta 2 (recursivitate înainte)
  166. reverse2([], Acc, R) :- Acc=R.
  167. reverse2([H|T], Acc, R) :- Acc1=[H|Acc], reverse2(T, Acc1, R).
  168. reverse2_pretty(L, R) :- reverse2(L, [], R).
  169.  
  170.  
  171.  
  172. % Varianta 1 (recursivitate înapoi)
  173. min1([H|T], M) :- min1(T, M), M<H, !.
  174. min1([H|_], H).
  175.  
  176.  
  177. max1([H|T], M) :- max1(T, M), M>H, !.
  178. max1([H|_], H).
  179.  
  180. % Varianta 2 (recursivitate înainte)
  181. min2([], Mp, M) :- M=Mp.
  182. min2([H|T], Mp, M) :- H<Mp, !, min2(T, H, M).
  183. min2([H|T], Mp, M) :- min2(T, Mp, M).
  184. min2_pretty([H|T], M) :- min2(T, H, M). % la inceput initialiam minimul cu primul element Urmareste
  185.  
  186.  
  187.  
  188. union_c([], L, L).
  189. union_c([H|T], L2, R) :- member(H, L2), !, union_c(T, L2, R).
  190. union_c([H|T], L2, [H|R]) :- union_c(T, L2, R).
  191.  
  192.  
  193.  
  194. inters_c([], _, []).
  195. inters_c([H|T], L2, [H|R]) :- member1(H, L2), !, inters_c(T, L2, R).
  196. inters_c([H|T], L2, R) :- inters_c(T, L2, R).
  197.  
  198.  
  199.  
  200. dif1([], _, []).
  201. dif1([H|T], L2, R) :- member1(H, L2), !, dif1(T, L2, R).
  202. dif1([H|T], L2, [H|R]) :- dif1(T, L2, R).
  203.  
  204.  
  205.  
  206. %sterge toate aparitiile minimului
  207. del_min(L,R) :- min1(L,M),
  208. delete_all(M,L,R).
  209.  
  210.  
  211.  
  212.  
  213. del_max(L,R) :- max1(L,M),
  214. delete_all(M,L,R).
  215.  
  216.  
  217.  
  218. reverse_k([H|T], K, R):- K>0, K1 is K-1, reverse_k(T,K1,R1), R= [H|R1],!.
  219. reverse_k( L, K, R) :-reverse1(L,R).
  220.  
  221. %recursivitate inainte
  222. revk([H|T],K,Q,R) :- K > 0,
  223. K1 is K - 1,
  224. append1(Q,[H],Q1),
  225. revk(T,K1,Q1,R).
  226.  
  227. revk(L,_,Q,Y) :- reverse1(L,R1),
  228. append1(Q,R1,Y).
  229. revk(L,K,R) :- revk(L,K,[],R).
  230.  
  231.  
  232.  
  233.  
  234.  
  235. %pt rle-----------------------------------------------------------------
  236. count([H|T], H, R):- count(T,H,R1), R is R1 + 1, !.
  237. count([H|T], X, R):- count(T,X,R).
  238. count([],_,0).
  239.  
  240. compress([H|T], A, R):- member1(H,A), compress(T,A,R).
  241. compress([H|T], A, R):- A1=[H|A],
  242. count([H|T],H,C),
  243. compress(T,A1,R1),
  244. R=[[H|C]|R1].
  245. compress([],A,[]).
  246.  
  247. rle_encode(L,R):-compress(L,[],R).
  248. %---------------------------------------------------------------------------
  249.  
  250.  
  251.  
  252.  
  253.  
  254. %pt rotire k pozitii------------------------------------------------------------
  255. rotate_k([H|T],K,LL,L1,R):- K<LL, K1 is K+1,
  256. append(L1,[H],L11),
  257. rotate_k(T,K1,LL,L11,R), !.
  258. rotate_k(L,K,LL,L1,R):- append(L,L1,R).
  259.  
  260. rotate_right(L,K,R):- length1(L,LL), K1 is K mod LL,
  261. rotate_k(L,K1,LL,[],R).
  262. %-------------------------------------------------------------------------------
  263.  
  264.  
  265.  
  266.  
  267. %pt random----------------------------------------------------------------------
  268. select_p(0,[H|T],H).
  269. select_p(X,[H|T],R):-X1 is X-1, select_p(X1,T,R).
  270.  
  271. rnd_sel(L,LL,0,[]).
  272. rnd_sel([H|T],LL,K,R):-K1 is K-1,LL1 is LL-1,P is random(LL),
  273. select_p(P,[H|T],R1),
  274. rnd_sel([H|T],LL1,K1,R2), R=[R1|R2], !.
  275.  
  276. rnd_select(L,K,R):-length1(L,LL), rnd_sel(L,LL,K,R).
  277.  
  278. %-------------------------------------------------------------------------------
  279.  
  280. %----------------------------------SORTARI------------------------------------------------
  281. perm_sort(L,R):-perm(L, R), is_ordered(R), !.
  282.  
  283.  
  284.  
  285. perm(L, [H|R]):-append(A, [H|T], L), append(A, T, L1), perm(L1, R).
  286. perm([], []).
  287.  
  288.  
  289. is_ordered([H1, H2|T]):-H1 =< H2, is_ordered([H2|T]).
  290. is_ordered([_]). % daca ii doar un element ii deja ordonata
  291.  
  292. %------------------------------------------------------------------
  293.  
  294.  
  295.  
  296. sel_sort(L, [M|R]):- min1(L, M), delete1(M, L, L1), sel_sort(L1, R).
  297. sel_sort([], []).
  298. %----------------------------------------------------------------------
  299.  
  300.  
  301. ins_sort([H|T], R):- ins_sort(T, R1), insert_ord(H, R1, R).
  302. ins_sort([], []).
  303.  
  304. insert_ord(X, [H|T], [H|R]):-X>H, !, insert_ord(X, T, R).
  305. insert_ord(X, T, [X|T]).
  306.  
  307.  
  308.  
  309. %------------------------------------------------------------------------------------------------
  310. bubble_sort(L,R):-one_pass(L,R1,F), nonvar(F), !, bubble_sort(R1,R).
  311. bubble_sort(L,L).
  312.  
  313.  
  314. one_pass([H1,H2|T], [H2|R], F):-H1>H2, !, F=1, one_pass([H1|T],R,F).
  315. one_pass([H1|T], [H1|R], F):-one_pass(T, R, F).
  316. one_pass([], [] ,_).
  317. %------------------------------------------------------------------------------------------
  318. %------------------------------------------------------------------------------------
  319.  
  320. quick_sort([H|T], R):- % alegem pivot primul element
  321. partition(H, T, Sm, Lg),
  322. quick_sort(Sm, SmS), % sortam sublista cu elementele mai mici decat pivotul
  323. quick_sort(Lg, LgS), % sortam sublista cu elementele mai mari decat pivotul
  324. append(SmS, [H|LgS], R).
  325. quick_sort([], []).
  326.  
  327. partition(H, [X|T], [X|Sm], Lg):-X<H, !, partition(H, T, Sm, Lg).
  328. partition(H, [X|T], Sm, [X|Lg]):-partition(H, T, Sm, Lg).
  329. partition(_, [], [], []).
  330.  
  331. %------------------------------------------------------------------------------------------
  332.  
  333.  
  334. merge_sort(L, R):-split(L, L1, L2), % imparte L in doua subliste de lungimi egale
  335. merge_sort(L1, R1),
  336. merge_sort(L2, R2),
  337. merge(R1, R2, R). % interclaseaza sublistele ordonate
  338. merge_sort([H], [H]). % split returneaza fail daca lista ii vida sau are doar un singur element
  339. merge_sort([], []).
  340.  
  341. split(L, L1, L2):-length(L, Len),
  342. Len>1,
  343. K is Len/2,
  344. splitK(L, K, L1, L2).
  345. splitK([H|T], K, [H|L1], L2):-K>0,!,K1 is K-1,splitK(T, K1, L1, L2).
  346. splitK(T, _, [], T).
  347.  
  348. merge([H1|T1], [H2|T2], [H1|R]):-H1<H2, !, merge(T1, [H2|T2], R).
  349. merge([H1|T1], [H2|T2], [H2|R]):-merge([H1|T1], T2, R).
  350. merge([], L, L).
  351. merge(L, [], L).
  352.  
  353.  
  354. %-----------------------------------------------------------------------------------------------------------
  355.  
  356. sel_sort_desc(L, [M|R]):- max1(L, M),
  357. delete1(M, L, L1),
  358. sel_sort_desc(L1, R).
  359. sel_sort_desc([], []).
  360.  
  361.  
  362. %-------------Sorteaza lista de caractere ascii--------------------------------------------------------------------------------
  363.  
  364.  
  365.  
  366. sort_chars(L, [M|R]):- min_char(L, M),
  367. delete(L, M, L1),
  368.  
  369. sort_chars(L1, R).
  370. sort_chars([], []):- !.
  371.  
  372. min_char([H|T], M) :- min_char(T, M),
  373. char_code(M, R1),
  374. char_code(H, R2), R1<R2, !.
  375. min_char([H|_], H).
  376.  
  377. %----------------------sorteaza lista de subliste in functie de lungimea sublistelor----------------------------
  378. sort_len(L, [M|R]):- min_list(L, M),
  379. delete(L, M, L1),
  380. sort_len(L1, R).
  381. sort_len([], []):- !.
  382.  
  383. min_list([H|T], M) :- min_list(T, M),
  384. length(M, R1),
  385. length(H, R2),
  386. R1<R2, !.
  387. min_list([H|_], H).
  388.  
  389.  
  390.  
  391.  
  392.  
  393. %------------------------------------------LISTE ADANCI-----------------------------------
  394. %L1 = [1,2,3,[4]] member1(1,L1).
  395.  
  396.  
  397.  
  398. max(A, B, B) :- A<B.
  399. max(A, B, A) :- A>B.
  400. max(A, A, A).
  401.  
  402. depth([H|T], D) :- atomic(H), !, depth(T, D).
  403. depth([H|T], D) :- depth(H, D1), depth(T, D2), D3 is D1+1, max(D3, D2, D).
  404. depth([], 1).
  405.  
  406. append([H|T], L2, [H|R]) :- append(T, L2, R).
  407. append([], L2, L2).
  408.  
  409. flat([H|T], [H|R]):- atomic(H), !, flat(T, R).
  410. flat([H|T], R) :- flat(H, R1), flat(T, R2), append(R1, R2, R).
  411. flat([], []).
  412.  
  413.  
  414. %extrage elementele atomice de la capul fiecarei liste
  415. heads([],[],_).
  416. %la recursiv setam flag=0
  417. heads([H|T],[H|R],1):- atomic(H), !, heads(T,R,0).
  418.  
  419. heads([H|T],R,0):- atomic(H), !, heads(T,R,0).
  420.  
  421. heads([H|T],R,_):- heads(H,R1,1), heads(T,R2,0), append(R1,R2,R).
  422. heads_pretty(L,R):- heads(L, R, 1).
  423.  
  424.  
  425. member(H, [H|_]):-!.
  426. member(X, [H|_]) :- member(X, H), !.
  427. member(X, [_|T]) :- member(X, T).
  428.  
  429. count_atomic([H|T], Count):- atomic(H), !, count_atomic(T, Count1), Count is Count1 +1.
  430. count_atomic([H|T], Count):- count_atomic(H, Count1), count_atomic(T, Count2), Count is Count1+Count2.
  431. count_atomic([], 0).
  432.  
  433.  
  434. %numarul de elemente atomice din lista
  435. sum_atomic([H|T], Sum) :- atomic(H), not(is_list(H)), !, sum_atomic(T, Sum1), Sum is Sum1+H.
  436. sum_atomic([H|T], Sum) :- sum_atomic(H, Sum1), sum_atomic(T, Sum2), Sum is Sum1+Sum2.
  437. sum_atomic([], 0).
  438.  
  439.  
  440.  
  441. %Scrie?i predicatul lasts(L,R) care extrage elementele atomice de pe ultima
  442. %pozi?ie din fiecare sublista din L.
  443. lasts([], []).
  444. lasts([H], [H]) :- atomic(H).
  445. lasts([H|T], R):- atomic(H), !, lasts(T, R).
  446. lasts([H|T], R):- lasts(H, L1), lasts(T, L2), append(L1, L2, R).
  447.  
  448.  
  449. %Scrie?i predicatul replace(X,Y,L,R) care înlocuie?te pe X cu Y în lista adânca
  450. %L (la orice nivel de imbricare) ?i pune rezultatul în R.
  451. replace(H, Y, [H|T], [Y|R]):- !, replace(H, Y, T, R).
  452. replace(X, Y, [H|T], [H|R]) :- atomic(H), !, replace(X, Y, T, R).
  453. replace(X, Y, [H|T], R) :- replace(X, Y, H, R1), replace(X, Y, T, R2), append([R1], R2, R).
  454. replace(_, _, [], []).
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461. %-------------------------------ARBORI------------------------------------------
  462. %tree1(t(6, t(4,t(2,nil,nil),t(5,nil,nil)), t(9,t(7,nil,nil),nil))). operatie_pe_arbore(T,…).
  463.  
  464. inorder(t(K,L,R), List):-inorder(L,LL), inorder(R,LR),
  465. append(LL, [K|LR], List).
  466. inorder(nil, []).
  467.  
  468.  
  469.  
  470. % cheie, subarbore stâng ?i subarbore drept
  471. preorder(t(K,L,R), List):-preorder(L,LL), preorder(R, LR),
  472. append([K|LL], LR, List).
  473. preorder(nil, []).
  474.  
  475.  
  476. % subarbore stâng, subarbore drept ?i apoi cheia
  477. postorder(t(K,L,R), List):-postorder(L,LL), postorder(R, LR),
  478. append(LL, LR,R1), append(R1, [K], List).
  479. postorder(nil, []).
  480.  
  481. search_key(Key, t(Key, _, _)):-!.
  482. search_key(Key, t(K, L, _)):-Key<K, !, search_key(Key, L).
  483. search_key(Key, t(_, _, R)):-search_key(Key, R).
  484.  
  485.  
  486. insert_key(Key, nil, t(Key, nil, nil)). % insereaza cheia în arbore
  487. insert_key(Key, t(Key, L, R), t(Key, L, R)):-!. % cheia exista deja
  488. insert_key(Key, t(K,L,R), t(K,NL,R)):- Key<K,!,insert_key(Key,L,NL).
  489. insert_key(Key, t(K,L,R), t(K,L,NR)):- insert_key(Key, R, NR).
  490.  
  491.  
  492.  
  493. delete_key(Key, t(Key, L, nil), L):-!.
  494. delete_key(Key, t(Key, nil, R), R):-!.
  495. delete_key(Key, t(Key, L, R), t(Pred,NL,R)):-!,get_pred(L,Pred,NL).
  496. delete_key(Key, t(K,L,R), t(K,NL,R)):-Key<K,!,delete_key(Key,L,NL).
  497. delete_key(Key, t(K,L,R), t(K,L,NR)):-delete_key(Key,R,NR).
  498.  
  499. % cauta nodul predecesor
  500. get_pred(t(Pred, L, nil), Pred, L):-!.
  501. get_pred(t(Key, L, R), Pred, t(Key, L, NR)):-get_pred(R, Pred, NR).
  502.  
  503.  
  504.  
  505.  
  506. %Înal?ime unui arbore
  507. height(nil, 0).
  508. height(t(_, L, R), H):-height(L, H1),
  509. height(R, H2),
  510. max(H1, H2, H3),
  511. H is H3+1.
  512.  
  513. %Scrie?i un predicat care colecteaz? într-o list? toate cheile din frunzele
  514. %%arborelui binar.
  515.  
  516. collect(nil, []).
  517. collect(t(Key, nil, nil), [Key]).
  518. collect(t(_, L, R), List):- collect(L, R1),
  519. collect(R, R2),
  520. append(R1, R2, List).
  521.  
  522.  
  523. %---------------------------------------------arbri ternari
  524.  
  525.  
  526. append3([H|T], L2, L3, [H|R]) :- append3(T, L2, L3, R).
  527. append3([], [H|T], L3, [H|R]) :- append3([], T, L3, R).
  528. append3([], [], L3, L3).
  529.  
  530.  
  531.  
  532. inorder3(t(K,L,M,R), List):-inorder3(L,LL), inorder3(M, LM), inorder3(R,LR),
  533. append3(LL, [K|LM], LR, List).
  534. inorder3(nil, []).
  535. % cheie, subarbore stang si subarbore drept
  536. preorder3(t(K,L,M,R), List):-preorder3(L,LL), preorder3(M, LM), preorder3(R, LR),
  537. append3([K|LL], LM, LR, List).
  538. preorder3(nil, []).
  539.  
  540.  
  541. % subarbore stang, subarbore drept si apoi cheia
  542. postorder3(t(K,L,M,R), List):-postorder3(L,LL), postorder3(M, LM), postorder3(R, LR),
  543. append3(LL, LM, LR,R1), append(R1, [K], List).
  544. postorder3(nil, []).
  545.  
  546.  
  547. max3(X, Y, Z, M):- Max is max(X, Y), M is max(Max, Z).
  548.  
  549. height3(nil, 0).
  550. height3(t(_, L, M, R), H):-height3(L, H1),
  551. height3(M, H2),
  552. height3(R, H3),
  553. max3(H1, H2, H3, H4),
  554. H is H4+1.
  555.  
  556.  
  557. %-----------------STRUCTURI INCOMPLETE LISTE INCOMPLETE----------------------------------------------
  558.  
  559. member_il(_, L):-var(L), !, fail.
  560. member_il(X, [X|_]):-!.
  561. member_il(X, [_|T]):-member_il(X, T).
  562.  
  563.  
  564. insert_il(X, L):-var(L), !, L=[X|_].
  565. insert_il(X, [X|_]):-!. % elementul exist? deja
  566. insert_il(X, [_|T]):- insert_il(X, T).
  567.  
  568. delete_il(_, L, L):-var(L), !. % am ajuns la finalul listei
  569. delete_il(X, [X|T], T):-!. % ?tergem prima apari?ie ?i ne oprim
  570. delete_il(X, [H|T], [H|R]):-delete_il(X, T, R).
  571.  
  572.  
  573. %arbori
  574.  
  575. search_it(_, T):-var(T),!,fail.
  576. search_it(Key, t(Key, _, _)):-!.
  577. search_it(Key, t(K, L, _)):-Key<K, !, search_it(Key, L).
  578. search_it(Key, t(_, _, R)):-search_it(Key, R).
  579.  
  580. insert_it(Key, t(Key, _, _)):-!.
  581. insert_it(Key, t(K, L, R)):-Key<K, !, insert_it(Key, L).
  582. insert_it(Key, t(_, _, R)):-insert_it(Key, R).
  583.  
  584.  
  585.  
  586.  
  587. delete_it(Key, T, T):-var(T),!.
  588. delete_it(Key, t(Key, L, R), L):-var(R),!.
  589. delete_it(Key, t(Key, L, R), R):-var(L),!.
  590. delete_it(Key, t(Key, L, R), t(Pred,NL,R)):-!,get_pred(L,Pred,NL).
  591. delete_it(Key, t(K,L,R), t(K,NL,R)):-Key<K,!,delete_it(Key,L,NL).
  592. delete_it(Key, t(K,L,R), t(K,L,NR)):-delete_it(Key,R,NR).
  593. % caut? nodul predecesor
  594.  
  595. get_pred(t(Pred, L, R), Pred, L):-var(R),!.
  596. get_pred(t(Key, L, R), Pred, t(Key, L, NR)):-get_pred(R, Pred, NR).
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604. %Concateneaza 2 liste incomplete
  605. append_i(L1, L2, L2):-var(L1), !.
  606. append_i([H|T], L2, [H|R]):-append_i(T, L2, R).
  607.  
  608.  
  609. %Inverseaza o lista incompleta
  610. reverse_i(L, R):-rev_i(L, [], R).
  611. rev_i(L, Pr, [Pr|_]):-var(L), ! .
  612. rev_i([H|T], Pr, R):-rev_i(T, [H|Pr], R).
  613.  
  614.  
  615. %Converteste o lista incompleta într-o lista completa
  616. incomp_comp(L, []):-var(L), !.
  617. incomp_comp([H|T], [H|R]):-incomp_comp(T, R).
  618.  
  619. comp_incomp([], [_]).
  620. comp_incomp([H|T], [H|R]):-comp_incomp(T, R).
  621.  
  622.  
  623.  
  624.  
  625. %arbori
  626.  
  627. tree1(t(6, t(4, t(2, _, _), t(5, _, _)), t(9, t(7, _, _), _))).
  628.  
  629. preorder(T, R1):-pre(T, R), comp_incomp(R, R1).
  630.  
  631. pre(T, []):-var(T), ! .
  632. pre(t(K, L, R), List):-pre(L, LL), pre(R, RL), append([K|LL], RL, List).
  633.  
  634. max(A, B, A):-A > B, !.
  635. max(_, B, B).
  636.  
  637. %inaltime arbore incomplet
  638. height_i(T, 0):-var(T), !.
  639. height_i(t(_, L, R), H):-height_i(L, H1), height_i(R, H2), max(H1, H2, MH), H is MH + 1.
  640.  
  641.  
  642. in_tree_comp(t(K, L, R), t(K, nil, nil)):- var(L), !, var(R), !.
  643. in_tree_comp(t(K, L, R), t(K, NL, nil)):- var(R), !, in_tree_comp(L, NL).
  644. in_tree_comp(t(K, L, R), t(K, nil, NR)):- var(L), !, in_tree_comp(R, NR).
  645. in_tree_comp(t(K, L, R), t(K, NL, NR)):-in_tree_comp(L, NL), in_tree_comp(R, NR).
  646.  
  647.  
  648. %convertirea unui arbore incomplet intr-un arbore complet si invers.
  649. convert_it1(K,nil):-var(K),!.
  650. convert_it1(t(K,L,R),t(K,LL,RR)):- convert_it1(L,LL),convert_it1(R,RR).
  651. convert_il1(nil,_).
  652.  
  653.  
  654.  
  655. transform_arb(T, nil):-var(T),!.
  656. transform_arb(t(Key, L, R), L):-var(R),!.
  657. transform_arb(t(Key, L, R), R):-var(L),!.
  658. transform_arb(t(K,L,R), t(K,NL,R)):-transform_arb(K,L,NL).
  659. transform_arb(t(K,L,R), t(K,L,NR)):-transform_arb(K,R,NR).
  660.  
  661.  
  662.  
  663. %-------------------------------------LISTE DIFERENTA-----------------
  664.  
  665. %adaugare element in finalul listei
  666. add2(X, LS, LE, RS, RE):- RS = LS, LE = [X|RE].
  667.  
  668.  
  669. append_dl(LS1,LE1, LS2,LE2, RS,RE):- RS=LS1, LE1=LS2, RE=LE2.
  670.  
  671.  
  672.  
  673. %arbore
  674.  
  675. inorder_dl(nil,L,L). % lista vida este reprezentata de 2 variabile egale
  676. inorder_dl(t(K,L,R),LS,LE):-inorder_dl(L,LSL,LEL), % apel pe subarbore stâng
  677. inorder_dl(R,LSR,LER), % apel pe subarbore drept
  678. LS=LSL,
  679. LEL=[K|LSR], % K este adaugat în fa?a la LSR
  680. LE=LER.
  681.  
  682.  
  683.  
  684. quicksort_dl([H|T], S, E):- % s-a adaugat un parametru nou
  685. partition(H, T, Sm, Lg), % predicatul partition a ramas la fel
  686. quicksort_dl(Sm, S, [H|L]),
  687. quicksort_dl(Lg, L, E).
  688. quicksort_dl([], L, L). % condi?ia de terminare s-a modificat
  689.  
  690.  
  691. %----------------efecte laterale
  692.  
  693. :-dynamic memo_fib/2.
  694. fib(N,F):- memo_fib(N,F), !.
  695. fib(N,F):- N>1,
  696. N1 is N-1,
  697. N2 is N-2,
  698. fib(N1,F1),
  699. fib(N2,F2),
  700. F is F1+F2,
  701. assertz(memo_fib(N,F)).
  702. fib(0,1).
  703. fib(1,1).
  704. print_all:-memo_fib(N,F),
  705. write(N),
  706. write(' – '),
  707. write(F),
  708. nl,
  709. fail.
  710. print_all.
  711.  
  712.  
  713.  
  714. %colecteaza toate permutarile unei liste
  715. all_perm(L,_):- perm(L,L1), % predicatul de generare a unei permutari (vezi lucrare de laborator cu sortari)
  716. assertz(p(L1)),
  717. fail.
  718. all_perm(_,R):- collect_perms(R).
  719.  
  720. collect_perms([L1|R]):- retract(p(L1)), !, collect_perms(R).
  721. collect_perms([]).
  722.  
  723. %convertire lista incompleta in diferenta
  724. convertID(L,E,E) :- var(L), !.
  725. convertID([H|T], S, E) :- S=[H|T1], convertID(T,T1,E).
  726.  
  727. %convertire diferenta in incompleta
  728. convertDI(E,E,_) :- var(E), !.
  729. convertDI(SL, EL, [H|T]) :- SL=[H|SLint], convertDI(SLint,EL,T).
  730.  
  731. %comvertire din comlpeta in diferenta
  732. convertCD([H|[]],[H|EL],EL).
  733. convertCD([H|T],[H|R],EL):-convertCD(T,R,EL).
  734.  
  735. %convertire din diferenta in completa
  736. convertDC(L,[]):-var(L),!.
  737. convertDC([H|T],[H|R]):-convertDC(T,R).
  738.  
  739. %apaltizare lista diferenta
  740. flat_dl([H|T],[H|RS],RE):- atomic(H),!,flat_dl(T,RS,RE).
  741. flat_dl([H|T],RS,RE):- flat_dl(H,RS,RX),flat_dl(T,RX,RE).
  742. flat_dl([H|[]],[H|RE],RE).
  743.  
  744. %flat_dl([[1], 2, [3, [4, 5]]], RS, RE).
  745. %RS = [1, 2, 3, 4, 5|RE] ;
  746. %false
  747.  
  748.  
  749.  
  750. collecteven(nil,L,L).
  751. collecteven(t(K,L,R),LS,LE):- 0 is K mod 2,
  752. collecteven(L,LS,[K|LT]),
  753. collecteven(R,LT,LE).
  754. collecteven(t(_,L,R),LS,LE):-
  755. collecteven(L,LS,LT),
  756. collecteven(R,LT,LE).
  757.  
  758. %colecteaza noduri chei pare arbore binar folosind liste diferenta
  759. colect_pare(nil,L,L).
  760. colect_pare(t(K,L,R),LS,LE):-
  761. 0 is mod(K,2), !,
  762. colect_pare(L,LSL,LEL),
  763. colect_pare(R,LSR,LER),
  764. LS=LSL,
  765. LEL=[K|LSR],
  766. LE=LER.
  767. colect_pare(t(K,L,R),LS,LE):-
  768. colect_pare(L,LSL,LEL),
  769. colect_pare(R,LSR,LER),
  770. LS=LSL,
  771. LEL=[K|LSR],
  772. LE=LER.
  773.  
  774.  
  775.  
  776. collectIncompletTree(T,L,L,_,_):-var(T), !.
  777. collectIncompletTree(t(K,L,R),LS,LE,K1,K2):-
  778. K >= K1, K =< K2,
  779. collectIncompletTree(L,LS,[K|LT],K1,K2),
  780. collectIncompletTree(R,LT,LE,K1,K2).
  781. collectIncompletTree(t(_,L,R),LS,LE,K1,K2):-
  782. collectIncompletTree(L,LS,LT,K1,K2),
  783. collectIncompletTree(R,LT,LE,K1,K2).
  784.  
  785.  
  786.  
  787. %-------------------------GRAFURI------------------------
  788. node(a). node(b). %etc
  789. edge(a,b). edge(b,a).
  790. edge(b,c). edge(c,b).
  791.  
  792. %----------------------
  793.  
  794. :-dynamic neighbor/2.
  795. neighbor(a, [b, d]).
  796. neighbor(b, [a, c, d]).
  797. neighbor(c, [b, d]).
  798. neighbor(h, []).
  799. %---------------------
  800.  
  801. %conversie neighbor to edge
  802. neighb_to_edge:-retract(neighbor(Node,List)),!, %extrage un predicat neighbor ?i apoi îl proceseaza
  803. process(Node,List),
  804. neighb_to_edge.
  805. neighb_to_edge. % daca nu mai sunt predicate neighbor înseamna ca amterminat
  806. % procesarea presupune adaugare de predicate edge ?i node pentru un predicat neighbor
  807. process(Node, [H|T]):- assertz(edge(Node, H)), process(Node, T).
  808. process(Node, []):- assertz(node(Node)).
  809.  
  810.  
  811. %cauta path intre noduri path(a,c,R).
  812. path(X,Y,Path):-path(X,Y,[X],Path).
  813. path(X,Y,PPath, FPath):- edge(X,Z),
  814. not(member(Z, PPath)),
  815. append(PPath, [Z], R),
  816. path(Z, Y, R, FPath).
  817. path(X,X,PPath, PPath).
  818.  
  819.  
  820. %trecerea printr un anumit set de noduri restricted_path(a, c, [a,c,d], R).
  821.  
  822. restricted_path(X,Y,LR,P):- path(X,Y,P), check_restrictions(LR, P).
  823. check_restrictions([],_):- !.
  824. check_restrictions([H|T], [H|R]):- !, check_restrictions(T,R).
  825. check_restrictions(T, [_|L]):-check_restrictions(T,L).
  826.  
  827. %drumul cu lungime minima
  828. optimal_path(X,Y,Path):-asserta(sol_part([],100)),
  829. path(X,Y,[X],Path,1).
  830. optimal_path(_,_,Path):-retract(sol_part(Path,_)).
  831. path(X,X,Path,Path,LPath):- retract(sol_part(_,_)),!,asserta(sol_part(Path,LPath)),fail.
  832. path(X,Y,PPath,FPath,LPath):- edge(X,Z),
  833. not(member(Z,PPath)),
  834. LPath1 is LPath+1,
  835. sol_part(_,Lopt),
  836. LPath1<Lopt,
  837. append(PPath,[Z],R),
  838. path(Z,Y,R,FPath,LPath1).
  839. %conversie edge to neighbor
  840. edge_to_neighbor:-retract(node(Node)),!,
  841. process1(Node),
  842. edge_to_neighbor.
  843. edge_to_neighbor:- retract(edge(Node, Elem)),!,
  844. process2(Node, Elem),
  845. edge_to_neighbor.
  846. edge_to_neighbor.
  847. process1(Node):- assertz(neighbor(Node, [])).
  848. process2(Node, Elem):-retract(neighbor(Node,T)),
  849. assertz(neighbor(Node, [Elem|T])).
  850.  
  851.  
  852. %verifica daca un graf are ccluri cycle(a, R).
  853.  
  854. cycle(X, [X|R]):-edge(X,Z),edge(Z,X), path(Z, X, R).
  855.  
  856.  
  857.  
  858.  
  859. %------------------------DFS---------------------
  860. :- dynamic nod_vizitat/1.
  861. % d_search(Source, Path)
  862. d_search(X,_):-df_search(X,_). % parcurgerea nodurilor
  863. d_search(_,L):-!, collect_reverse([],L). % colectarea rezultatelor
  864. df_search(X,L):- asserta(nod_vizitat(X)),
  865. edge(X,Y),
  866. not(nod_vizitat(Y)),
  867. df_search(Y,L).
  868. % colectarea se face în ordine inversa
  869. collect_reverse(L,P):- retract(nod_vizitat(X)), !,
  870. collect_reverse([X|L],P).
  871. collect_reverse(L,L).
  872.  
  873. %------------------------BFS----------------------
  874. % parcurgerea nodurilor
  875. b_search(X,_):- assertz(nod_vizitat(X)),
  876. assertz(nod_de_expandat(X)),
  877. bf_search.
  878. b_search(_,R):-!, collect_reverse([],R). % colectarea rezultatelor
  879. bf_search:- retract(nod_de_expandat(X)),
  880. expand(X),!,
  881. bf_search.
  882. expand(X):-edge(X,Y),
  883. not(nod_vizitat(Y)),
  884. asserta(nod_vizitat(Y)),
  885. assertz(nod_de_expandat(Y)),
  886. fail.
  887. expand(_).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement