fork download
  1. :- use_module(library(lists)).
  2.  
  3. % ----------------------------
  4. % задание 1: шелл (седжвик)
  5. % ----------------------------
  6.  
  7. % shs(+l, -s)
  8. shs(L, S) :-
  9. length(L, N),
  10. sg(N, Gs),
  11. sp(Gs, L, S).
  12.  
  13. % sg(+n, -gs)
  14. sg(N, Gs) :-
  15. ( N =< 1 -> Gs = [1]
  16. ; sgk(N, 0, [], Rs),
  17. reverse(Rs, Gs)
  18. ).
  19.  
  20. sgk(N, K, A, Rs) :-
  21. hk(K, H),
  22. K1 is K + 1,
  23. hk(K1, H1),
  24. ( 3*H1 > N ->
  25. Rs = [H|A]
  26. ; sgk(N, K1, [H|A], Rs)
  27. ).
  28.  
  29. % hk(+k,-h)
  30. hk(K, H) :-
  31. ( 0 is K mod 2 ->
  32. P2k is 1 << K,
  33. K2 is K // 2,
  34. P2k2 is 1 << K2,
  35. H is 9*P2k - 9*P2k2 + 1
  36. ; P2k is 1 << K,
  37. K2 is (K + 1) // 2,
  38. P2k2 is 1 << K2,
  39. H is 8*P2k - 6*P2k2 + 1
  40. ).
  41.  
  42. sp([], L, L).
  43. sp([G|Gs], L, S) :-
  44. gp(G, L, L1),
  45. sp(Gs, L1, S).
  46.  
  47. % gp(+g,+l,-s)
  48. gp(G, L, S) :-
  49. en(L, 0, Ps),
  50. G1 is G - 1,
  51. findall(Ns, (between(0, G1, R), cls(Ps, G, R, Ns)), Bs),
  52. append(Bs, All),
  53. keysort(All, Ss),
  54. vs(Ss, S).
  55.  
  56. cls(Ps, G, R, Ns) :-
  57. include(pr(G, R), Ps, Cs),
  58. iv(Cs, Vs1, Is1),
  59. ins(Vs1, Vs2),
  60. pi(Is1, Vs2, Ns).
  61.  
  62. pr(G, R, I-_) :- 0 is (I - R) mod G.
  63.  
  64. en([], _, []).
  65. en([X|Xs], I, [I-X|Ps]) :-
  66. I1 is I + 1,
  67. en(Xs, I1, Ps).
  68.  
  69. iv([], [], []).
  70. iv([I-V|T], [V|Vs], [I|Is]) :- iv(T, Vs, Is).
  71.  
  72. pi([], [], []).
  73. pi([I|Is], [V|Vs], [I-V|T]) :- pi(Is, Vs, T).
  74.  
  75. vs([], []).
  76. vs([_-V|T], [V|Vs]) :- vs(T, Vs).
  77.  
  78. % ins(+l,-s)
  79. ins([], []).
  80. ins([X|Xs], S) :- ins(Xs, S1), is1(X, S1, S).
  81.  
  82. is1(X, [], [X]).
  83. is1(X, [Y|Ys], [X,Y|Ys]) :- X =< Y, !.
  84. is1(X, [Y|Ys], [Y|Zs]) :- is1(X, Ys, Zs).
  85.  
  86.  
  87. shellsort_analytical_complexity(N, Complexity) :-
  88. atomic_list_concat(['O(N^(4/3)) ', ' in average case. '], Complexity).
  89.  
  90. shellsort_complexity(N, NumericComplexity) :-
  91. NumericComplexity is N**(4/3).
  92.  
  93. % Пример использования сортировки Шелла
  94. ex_shs :-
  95. L = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9, 8, 2],
  96. shs(L, S),
  97. length(L, N),
  98. shellsort_analytical_complexity(N, Complexity), % Получаем аналитическое выражение
  99. shellsort_complexity(N, NumericComplexity), %Get a numeric value
  100. format('Сортировка Шелла:~n'),
  101. format(' Исходный список: ~w~n', [L]),
  102. format(' Отсортированный список: ~w~n', [S]),
  103. format(' Оценка сложности: ~w~n', [Complexity]),
  104. format(' Числовая оценка сложности: ~w для N = ~w~n', [NumericComplexity, N]).
  105.  
  106.  
  107.  
  108.  
  109. % ----------------------------
  110. % задание 2: бинарные включения
  111. % ----------------------------
  112.  
  113. % bis(+l,-s)
  114. bis(L, S) :- bis1(L, [], S).
  115.  
  116. bis1([], A, A).
  117. bis1([X|Xs], A, S) :-
  118. bin_ins(X, A, A1),
  119. bis1(Xs, A1, S).
  120.  
  121. % bin_ins(+x,+l,-r)
  122. bin_ins(X, L, R) :-
  123. length(L, N),
  124. bin_pos(X, L, 0, N, P),
  125. sp2(P, L, A, B),
  126. append(A, [X|B], R).
  127.  
  128. % bin_pos(+x,+l,+lo,+hi,-p)
  129. bin_pos(X, L, Lo, Hi, P) :-
  130. ( Lo >= Hi ->
  131. P = Lo
  132. ; M is (Lo + Hi) // 2,
  133. nth0(M, L, V),
  134. ( X =< V ->
  135. bin_pos(X, L, Lo, M, P)
  136. ; M1 is M + 1,
  137. bin_pos(X, L, M1, Hi, P)
  138. )
  139. ).
  140.  
  141. % sp2(+k,+l,-a,-b)
  142. sp2(0, L, [], L) :- !.
  143. sp2(K, [X|Xs], [X|A], B) :-
  144. K > 0,
  145. K1 is K - 1,
  146. sp2(K1, Xs, A, B).
  147.  
  148.  
  149. binary_insertion_analytical_complexity(N, Complexity) :-
  150. atomic_list_concat(['O(N^2) ', ' in worst/average case. O(N log N) is not possible. '], Complexity).
  151.  
  152.  
  153. binary_insertion_complexity(N, NumericComplexity) :-
  154. NumericComplexity is N*N.
  155.  
  156.  
  157. % Пример использования бинарных включений
  158. ex_bis :-
  159. L = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9, 8, 2],
  160. bis(L, S),
  161. length(L, N),
  162. binary_insertion_analytical_complexity(N, Complexity), %Get analytic expression
  163. binary_insertion_complexity(N, NumericComplexity),
  164. format('Бинарные включения:~n'),
  165. format(' Исходный список: ~w~n', [L]),
  166. format(' Отсортированный список: ~w~n', [S]),
  167. format(' Оценка сложности: ~w~n', [Complexity]),
  168. format(' Числовая оценка сложности (O(N^2)): ~w для N = ~w~n', [NumericComplexity, N]).
  169.  
  170. % Запуск всех примеров
  171. run_examples :-
  172. ex_shs,
  173. ex_bis.
  174.  
  175. ?- run_examples.
Success #stdin #stdout #stderr 0.06s 7216KB
stdin
Standard input is empty
stdout
Сортировка Шелла:
  Исходный список: [3,1,4,1,5,9,2,6,5,3,5,9,8,2]
  Отсортированный список: [1,1,2,2,3,3,4,5,5,5,6,8,9,9]
  Оценка сложности: O(N^(4/3))  in average case. 
  Числовая оценка сложности: 33.74199169845321 для N = 14
Бинарные включения:
  Исходный список: [3,1,4,1,5,9,2,6,5,3,5,9,8,2]
  Отсортированный список: [1,1,2,2,3,3,4,5,5,5,6,8,9,9]
  Оценка сложности: O(N^2)  in worst/average case. O(N log N) is not possible. 
  Числовая оценка сложности (O(N^2)): 196 для N = 14
stderr
Warning: /home/tHao87/prog:87:
	Singleton variables: [N]
Warning: /home/tHao87/prog:149:
	Singleton variables: [N]
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? EOF: exit