Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 12.28 KB | None | 0 0
  1. 11:
  2. edge(1,2).
  3. edge(1,5).
  4. edge(2,3).
  5. edge(2,5).
  6. edge(3,4).
  7. edge(4,5).
  8. edge(4,6).
  9.  
  10.  
  11. :- dynamic nod_vizitat/1.
  12. % d_search(Source, Path)
  13. d_search(X,_):-df_search(X,_). % parcurgerea nodurilor
  14. d_search(_,L):-!, collect_perms(L). % colectarea rezultatelor
  15. df_search(X,L):-
  16. assertz(nod_vizitat(X)),
  17. edge(X,Y),
  18. not(nod_vizitat(Y)),
  19. df_search(Y,L).
  20.  
  21. % colectarea se face în ordine inversa
  22. collect_reverse(L,P):-
  23. retract(nod_vizitat(X)), !,
  24. collect_reverse([X|L],P).
  25. collect_reverse(L,L).
  26.  
  27. collect_perms([L1|R]):- retract(nod_vizitat(L1)), !, collect_perms(R).
  28. collect_perms([]).
  29.  
  30. % b_search(Source, Path)
  31. b_search(X,_):- % parcurgerea nodurilor
  32. assertz(nod_vizitat(X)),
  33. assertz(nod_de_expandat(X)),
  34. bf_search.
  35. b_search(_,R):-!, collect_reverse([],R). % colectarea rezultatelor
  36. bf_search:-
  37. retract(nod_de_expandat(X)),
  38. expand(X),!,   
  39. bf_search.
  40. expand(X):-
  41. edge(X,Y),
  42. not(nod_vizitat(Y)),
  43. asserta(nod_vizitat(Y)),
  44. assertz(nod_de_expandat(Y)),
  45. fail.
  46. expand(_).
  47.  
  48. d_search1(X,L,_):- dl_search(X,L,_).
  49. d_search1(_,_,L):- !, collect_reverse([],L). % colectarea rezultatelor
  50.  
  51. dl_search(X,D,L):- D>0 ,
  52.  asserta(nod_vizitat(X)),
  53.  edge(X,Y),
  54.  not(nod_vizitat(Y)),
  55.  D1 is D-1,
  56.  dl_search(Y,D1,L).
  57.  
  58.  
  59.  %Lab 10, capra varza
  60.  
  61. edge([F1,L,C,V],[F2,L,C,V]):-
  62.     ship(F1,F2),
  63.     check(F1,L,C,V).
  64.  
  65. 9:
  66. add1(X, [H|T], [H|R]):- add1(X, T, R).
  67. add1(X, [], [X]).
  68.  
  69. add2(X, LS, LE, RS, RE):- RS = LS, LE = [X|RE].
  70.  
  71. tree1(t(6, t(4,t(2,nil,nil),t(5,nil,nil)), t(9,t(7,nil,nil),nil))).
  72.  
  73. append_dl(LS1,LE1, LS2,LE2, RS,RE):- RS=LS1, LE1=LS2, RE=LE2.
  74.  
  75. inorder_dl(nil,L,L). % lista vida este reprezentată de 2 variabile
  76. inorder_dl(t(K,L,R),LS,LE):-
  77. inorder_dl(L,LSL,LEL), % apel pe subarbore stâng
  78. inorder_dl(R,LSR,LER), % apel pe subarbore drept
  79. LS=LSL,
  80. LEL=[K|LSR], % K este adăugat în fața la LSR
  81. LE=LER.
  82.  
  83. quicksort_dl([H|T], S, E):- % s-a adăugat un parametru nou
  84. partition(H, T, Sm, Lg), % predicatul partition a rămas la fel
  85. quicksort_dl(Sm, S, [H|L]),
  86. quicksort_dl(Lg, L, E).
  87. quicksort_dl([], L, L). % condiția de terminare s-a modificat
  88.  
  89. :-dynamic memo_fib/2.
  90. fib(N,F):- memo_fib(N,F), !.
  91. fib(N,F):- N>1,
  92. N1 is N-1,
  93. N2 is N-2,
  94. fib(N1,F1),
  95. fib(N2,F2),
  96. F is F1+F2,
  97. assertz(memo_fib(N,F)).
  98. fib(0,1).
  99. fib(1,1).
  100.  
  101. print_all:-memo_fib(N,F),
  102. write(N),
  103. write(' – '),
  104. write(F),
  105. nl,
  106. fail.
  107. print_all.
  108.  
  109. perm(L, [H|R]):-append(A, [H|T], L), append(A, T, L1), perm(L1, R).
  110. perm([], []).
  111.  
  112.  
  113. all_perm(L,_):- perm(L,L1), % predicatul de generare a unei permutări (vezi lucrare de laborator cu sortări)
  114. assertz(p(L1)),
  115. fail.
  116. all_perm(_,R):- collect_perms(R).
  117. collect_perms([L1|R]):- retract(p(L1)), !, collect_perms(R).
  118. collect_perms([]).
  119.  
  120. tolistdif(H, L, L):- var(H), var(L), !.
  121. tolistdif([H|T], [H|LS], LE) :- tolistdif(T, LS, LE).
  122.  
  123. comptolistdif([], L, L):- var(L), !.
  124. comptolistdif([H|T], [H|LS], LE) :- comptolistdif(T, LS, LE).
  125.  
  126. all_deco(L,_):- append(L2,L1,L), % predicatul de generare a unei permutări (vezi lucrare de laborator cu sortări)
  127. assertz(p(L1, L2)),
  128. fail.
  129. all_deco(_,R):- collect_perms1(R).
  130. collect_perms1([[L1,L2]|R]):- retract(p(L1,L2)), !, collect_perms1(R).
  131. collect_perms1([]).
  132.  
  133. 8:
  134.  
  135.  
  136. member_il(_, L):-var(L), !, fail.
  137. member_il(X, [X|_]):-!.
  138. member_il(X, [_|T]):-member_il(X, T).
  139.  
  140. insert_il(X, L):-var(L), !, L=[X|_].
  141. insert_il(X, [X|_]):-!. % elementul există deja
  142. insert_il(X, [_|T]):- insert_il(X, T).
  143.  
  144. delete_il(_, L, L):-var(L), !. % am ajuns la finalul listei
  145. delete_il(X, [X|T], T):-!. % ștergem prima apariție și ne oprim
  146. delete_il(X, [H|T], [H|R]):-delete_il(X, T, R).
  147.  
  148. search_it(_, T):-var(T),!,fail.
  149. search_it(Key, t(Key, _, _)):-!.
  150. search_it(Key, t(K, L, _)):-Key<K, !, search_it(Key, L).
  151. search_it(Key, t(_, _, R)):-search_it(Key, R).
  152.  
  153. insert_it(Key, t(Key, _, _)):-!.
  154. insert_it(Key, t(K, L, R)):-Key<K, !, insert_it(Key, L).
  155. insert_it(Key, t(_, _, R)):-insert_it(Key, R).
  156.  
  157.  
  158. delete_it(Key, T, T):-var(T),!.
  159. delete_it(Key, t(Key, L, R), L):-var(R),!.
  160. delete_it(Key, t(Key, L, R), R):-var(L),!.
  161. delete_it(Key, t(Key, L, R), t(Pred,NL,R)):-!,get_pred(L,Pred,NL).
  162. delete_it(Key, t(K,L,R), t(K,NL,R)):-Key<K,!,delete_it(Key,L,NL).
  163. delete_it(Key, t(K,L,R), t(K,L,NR)):-delete_it(Key,R,NR).
  164. % caută nodul predecesor
  165. get_pred(t(Pred, L, R), Pred, L):-var(R),!.
  166. get_pred(t(Key, L, R), Pred, t(Key, L, NR)):-get_pred(R, Pred, NR).
  167.  
  168. append1(V, R, R):- var(V), !.
  169. append1([H|T], L ,[H|R]):- append1(T, L, R).
  170.  
  171. reverse2(V, P, R):- var(V), !, R=P.
  172. reverse2([H|T], P, R):- reverse2(T,[H|P], R).
  173.  
  174. conv(X, []) :- var(X), !.
  175. conv([H|T], [H|R]):- conv(T, R).
  176.  
  177. preorder(V, []):- var(V), !.
  178. preorder(t(K,L,R), List):-preorder(L,LL), preorder(R, LR), append1([K|LL], LR, List).
  179.  
  180. 7:
  181. tree1(t(6, t(4,t(2,nil,nil),t(5,nil,nil)), t(9,t(7,nil,nil),nil))).
  182. tree2(t(8, t(5, nil, t(7, nil, nil)), t(9, nil, t(11, nil, nil)))).
  183. tree3(t(6, t(4, nil, nil,nil), t(5,nil,nil,nil),t(9,nil,nil,nil))).
  184.  
  185. inorder(t(K,L,R), List):-inorder(L,LL), inorder(R,LR), append(LL, [K|LR], List).
  186. inorder(nil, []).
  187.  
  188. % cheie, subarbore stâng și subarbore drept
  189. preorder(t(K,L,R), List):-preorder(L,LL), preorder(R, LR), append([K|LL], LR, List).
  190. preorder(nil, []).
  191.  
  192. % subarbore stâng, subarbore drept și apoi cheia
  193. postorder(t(K,L,R), List):-postorder(L,LL), postorder(R, LR), append(LL, LR,R1), append(R1, [K], List).
  194. postorder(nil, []).
  195.  
  196. pretty_print(nil, _).
  197. pretty_print(t(K,L,R), D):-D1 is D+1,
  198. pretty_print(L, D1),
  199. print_key(K, D),
  200. pretty_print(R, D1).
  201. % predicat care afișează cheia K la D tab-uri față de marginea din stânga și inserează o linie nouă
  202. print_key(K, D):-D>0, !, D1 is D-1, write('\t'), print_key(K, D1).
  203. print_key(K, _):-write(K), write('\n').
  204. % write('\n') îi echivalent cu predicatul nl
  205.  
  206. search_key(Key, t(Key, _, _)):-!.
  207. search_key(Key, t(K, L, _)):-Key<K, !, search_key(Key, L).
  208. search_key(Key, t(_, _, R)):-search_key(Key, R).
  209.  
  210. insert_key(Key, nil, t(Key, nil, nil)). % inserează cheia în arbore
  211. insert_key(Key, t(Key, L, R), t(Key, L, R)):-!. % cheia există deja
  212. insert_key(Key, t(K,L,R), t(K,NL,R)):- Key<K,!,insert_key(Key,L,NL).
  213. insert_key(Key, t(K,L,R), t(K,L,NR)):- insert_key(Key, R, NR).
  214.  
  215. delete_key(Key, t(Key, L, nil), L):-!.
  216. delete_key(Key, t(Key, nil, R), R):-!.
  217. delete_key(Key, t(Key, L, R), t(Pred,NL,R)):-!,get_pred(L,Pred,NL).
  218. delete_key(Key, t(K,L,R), t(K,NL,R)):-Key<K,!,delete_key(Key,L,NL).
  219. delete_key(Key, t(K,L,R), t(K,L,NR)):-delete_key(Key,R,NR).
  220.  
  221. get_pred(t(Pred, L, nil), Pred, L):-!.
  222. get_pred(t(Key, L, R), Pred, t(Key, L, NR)):-get_pred(R, Pred, NR).
  223.  
  224.  
  225. height(nil, 0).
  226. height(t(_, L, R), H):-height(L, H1), height(R, H2), max1(H1, H2, H3), H is H3+1.
  227.  
  228. max1(A, B, C):- A > B, C = A.
  229. max1(_, B, C):- C = B.
  230.  
  231. max2(A, B, C, D):- max1(A, B, D1), max1(C, D1, D).
  232.  
  233. inorder3(t(K,L,M,R), List):-inorder3(L,LL), inorder3(R,LR),inorder3(M,LM),
  234.    append(LL, [K|LM], List1), append(List1, LR, List).
  235. inorder3(nil, []).
  236.  
  237. preorder3(t(K,L,M,R), List):-preorder3(L,LL), preorder3(R,LR),preorder3(M,LM),
  238.    append([K|LL], LM, List1), append(List1, LR, List).
  239. preorder3(nil, []).
  240.  
  241. postorder3(t(K,L,M,R), List):-postorder3(L,LL), postorder3(R, LR), postorder3(M, LM),
  242. append(LL, LM,R1), append(R1, [K|LR], List).
  243. postorder3(nil, []).
  244.  
  245.  
  246. 6:list1([1,2,3,[4]]).
  247. list2([[1],[2],[3],[4,5]]).
  248. list3([[],2,3,4,[5,[6]],[7]]).
  249. list4([[[[1]]],1,[1]]).
  250. list5([1,[2],[[3]],[[[4]]],[5,[6,[7,[8,[9],10],11],12],13]]).
  251. list6([alpha,2,[beta],[gamma,[8]]]).
  252.  
  253. depth([],1).
  254. depth([H|T],R):- atomic(H), !, depth(T,R).
  255. depth([H|T],R):- depth(H,R1), depth(T,R2), R3 is R1+1, max1(R3,R2,R).
  256.  
  257. max1(A, B, C):- A > B, C = A.
  258. max1(A, B, C):- C = B.
  259.  
  260. flatten([],[]).
  261. flatten([H|T], [H|R]):- atomic(H), !, flatten(T,R).
  262. flatten([H|T], R):- flatten(H,R1), flatten(T,R2), append(R1,R2,R).
  263.  
  264. heads([],[],_).
  265. % dacă flag=1 atunci suntem la început de lista și putem extrage capul listei; în apelul recursiv setam flag=0
  266. heads([H|T],[H|R],1):- atomic(H), !, heads(T,R,0).
  267. % dacă flag=0 atunci nu suntem la primul element atomic și atunci continuam cu restul elementelor
  268. heads([H|T],R,0):- atomic(H), !, heads(T,R,0).
  269. % dacă am ajuns la aceasta clauza înseamnă că primul element nu este atomic și atunci trebuie să apelam recursiv și pe acest element
  270. heads([H|T],R,_):- heads(H,R1,1), heads(T,R2,0), append(R1,R2,R).
  271. heads_pretty(L,R):- heads(L, R, 1).
  272.  
  273. member2(X,L):- flatten(L,L1), member(X,L1).
  274.  
  275. count(L, R):- flatten(L, R1), length1(R1, R).
  276.  
  277. length1([], 0).
  278. length1([H|T], Len) :- length1(T, Lcoada), Len is 1+Lcoada.
  279.  
  280. sum(L, R):- flatten(L, L1), s1(L1, R).
  281.  
  282. s1([], 0).
  283. s1([H|T], Sum1) :- s1(T, S2), Sum1 is H+S2.
  284.  
  285.  
  286. 5:
  287.  
  288. perm_sort(L,R):-perm(L, R), is_ordered(R), !.
  289.  
  290. perm(L, [H|R]):-append(A, [H|T], L), append(A, T, L1), perm(L1, R).
  291. perm([], []).
  292.  
  293. is_ordered([H1, H2|T]):-H1 =< H2, is_ordered([H2|T]).
  294. is_ordered([_]).
  295.  
  296. sel_sort(L, [M|R]):- min(L, M), delete1(M, L, L1), sel_sort(L1, R).
  297. sel_sort([], []).
  298.  
  299. min([H|T], M) :- min(T, M), M<H, !.
  300. min([H|_], H).
  301.  
  302. delete1(X, [X|T], T) :- !.
  303. delete1(X, [H|T], [H|R]) :- delete1(X, T, R).
  304. delete1(_, [], []).
  305.  
  306. ins_sort([H|T], R):- ins_sort(T, R1), insert_ord(H, R1, R).
  307. ins_sort([], []).
  308.  
  309. insert_ord(X, [H|T], [H|R]):-X>H, !, insert_ord(X, T, R).
  310. insert_ord(X, T, [X|T]).
  311.  
  312. bubble_sort(L,R):-one_pass(L,R1,F), nonvar(F), !, bubble_sort(R1,R).
  313. bubble_sort(L,L).
  314.  
  315. one_pass([H1,H2|T], [H2|R], F):-H1>H2, !, F=1, one_pass([H1|T],R,F).
  316. one_pass([H1|T], [H1|R], F):-one_pass(T, R, F).
  317. one_pass([], [] ,_).
  318.  
  319. quick_sort([H|T], R):- % alegem pivot primul element
  320. partition(H, T, Sm, Lg),
  321. quick_sort(Sm, SmS), % sortam sublista cu elementele mai mici decât pivotul
  322. quick_sort(Lg, LgS), % sortam sublista cu elementele mai mari decât pivotul
  323. append(SmS, [H|LgS], R).
  324. quick_sort([], []).
  325.  
  326. partition(H, [X|T], [X|Sm], Lg):-X<H, !, partition(H, T, Sm, Lg).
  327. partition(H, [X|T], Sm, [X|Lg]):-partition(H, T, Sm, Lg).
  328. partition(_, [], [], []).
  329.  
  330. merge_sort(L, R):-
  331. split(L, L1, L2), % împarte L în doua subliste de lungimi egale
  332. merge_sort(L1, R1),
  333. merge_sort(L2, R2),
  334. merge(R1, R2, R). % interclasează sublistele ordonate
  335. merge_sort([H], [H]). % split returnează fail dacă lista ii vidă sau are doar un singur element
  336. merge_sort([], []).
  337. split(L, L1, L2):- length(L, Len), Len>1, K is Len/2, splitK(L, K, L1, L2).
  338. splitK([H|T], K, [H|L1], L2):-K>0,!,K1 is K-1,splitK(T, K1, L1, L2).
  339. splitK(T, _, [], T).
  340. merge([H1|T1], [H2|T2], [H1|R]):-H1<H2, !, merge(T1, [H2|T2], R).
  341. merge([H1|T1], [H2|T2], [H2|R]):-merge([H1|T1], T2, R).
  342. merge([], L, L).
  343. merge(L, [], L).
  344.  
  345. perm2(L, [H|R]):- member(H, L), delete1(H, L, L1), perm(L1, R).
  346. perm2([], []).
  347.  
  348. sel_sort2(L, [M|R]):- max(L, M), delete1(M, L, L1), sel_sort(L1, R).
  349. sel_sort2([], []).
  350.  
  351. max2([H|T], M) :- max2(T, M), char_code(M,M1), char_code(H,H1), M1>H1, !.
  352. max2([H|_], H).
  353.  
  354. charsort(L, [M|R]):- max2(L, M), delete1(M, L, L1), charsort(L1, R).
  355. charsort([], []).
  356.  
  357. lensort(L, [M|R]):- max3(L, M), delete1(M, L, L1), lensort(L1, R).
  358. lensort([], []).
  359.  
  360. max3([H|T], M) :- max3(T, M), length(H,H1), length(M,M1), M1>H1, !.
  361. max3([H|_], H).
  362.  
  363. 4:
  364. member1(X, [X|_]) :- !.
  365. member1(X, [_|T]) :- member1(X, T).
  366.  
  367. delete1(X, [X|T], T) :- !.
  368. delete1(X, [H|T], [H|R]) :- delete1(X, T, R).
  369. delete1(_, [], []).
  370.  
  371. length1([], 0).
  372. length1([H|T], Len) :- length1(T, Lcoada), Len is 1+Lcoada.
  373.  
  374. length2([], Acc, Len) :- Len=Acc.
  375. length2([H|T], Acc, Len) :- Acc1 is Acc + 1, length2(T, Acc1, Len).
  376. length2_pretty(L, R) :- length2(L, 0, R).
  377.  
  378. reverse1([], []).
  379. reverse1([H|T], R) :- reverse1(T, Rcoada), append(Rcoada, [H], R).
  380.  
  381. reverse2([], Acc, R) :- Acc=R.
  382. reverse2([H|T], Acc, R) :- Acc1=[H|Acc], reverse2(T, Acc1, R).
  383. reverse2_pretty(L, R) :- reverse2(L, [], R).
  384.  
  385. min1([H|T], M) :- min1(T, M), M<H, !.
  386. min1([H|_], H).
  387.  
  388. min2([], Mp, M) :- M=Mp.
  389. min2([H|T], Mp, M) :- H<Mp, !, min2(T, H, M).
  390. min2([H|T], Mp, M) :- min2(T, Mp, M).
  391. min2_pretty([H|T], M) :- min2(T, H, M).
  392.  
  393. union([], L, L).
  394. union([H|T], L2, R) :- member(H, L2), !, union(T, L2, R).
  395. union([H|T], L2, [H|R]) :- union(T, L2, R).
  396.  
  397. inters([],L2,[]).
  398. inters([H|T], L2, [H|R]) :- member(H, L2), !, inters(T, L2, R).
  399. inters([H|T], L2, R) :- inters(T, L2, R).
  400.  
  401. diff([],_,[])
  402. diff([H|T], L2, R) :- member(H, L2), !, diff(T, L2, R).
  403. diff([H|T], L2, [H|R]) :- diff(T, L2, R).
  404.  
  405. delmin(L,R) :- min1(L,M), delete(L,M,R).
  406.  
  407. reverse_k(L,K,R) :- K = 1, reverse1(L,R).
  408. reverse_k([H|T],K,R) :- K1 is K-1 , reverse_k(T,K1,R1), R = [H|R1].
  409. reverse_k([],_,[]).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement