fork download
  1. :- use_module(library(lists)).
  2. % ----------------------------
  3. % задание 2: бинарные включения
  4. % ----------------------------
  5.  
  6. % bis(+l,-s)
  7. bis(L, S) :- bis1(L, [], S).
  8.  
  9. bis1([], A, A).
  10. bis1([X|Xs], A, S) :-
  11. bin_ins(X, A, A1),
  12. bis1(Xs, A1, S).
  13.  
  14. % bin_ins(+x,+l,-r)
  15. bin_ins(X, L, R) :-
  16. length(L, N),
  17. bin_pos(X, L, 0, N, P),
  18. sp2(P, L, A, B),
  19. append(A, [X|B], R).
  20.  
  21. % bin_pos(+x,+l,+lo,+hi,-p)
  22. bin_pos(X, L, Lo, Hi, P) :-
  23. ( Lo >= Hi ->
  24. P = Lo
  25. ; M is (Lo + Hi) // 2,
  26. nth0(M, L, V),
  27. ( X =< V ->
  28. bin_pos(X, L, Lo, M, P)
  29. ; M1 is M + 1,
  30. bin_pos(X, L, M1, Hi, P)
  31. )
  32. ).
  33.  
  34. % sp2(+k,+l,-a,-b)
  35. sp2(0, L, [], L) :- !.
  36. sp2(K, [X|Xs], [X|A], B) :-
  37. K > 0,
  38. K1 is K - 1,
  39. sp2(K1, Xs, A, B).
  40.  
  41. % Пример использования бинарных включений
  42. ex_bis :-
  43. L = [3, 1, 4, 1, 5, 9, 2, 6],
  44. bis(L, S),
  45. format('Бинарные включения:~n'),
  46. format(' Исходный список: ~w~n', [L]),
  47. format(' Отсортированный список: ~w~n', [S]).
  48. run_examples :-
  49. ex_bis.
  50.  
  51. ?- run_examples
  52.  
Success #stdin #stdout #stderr 0.05s 7048KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
ERROR: /home/kK6bEl/prog:51:16: Syntax error: Unexpected end of file
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? EOF: exit