:- use_module(library(lists)).
% ----------------------------
% задание 2: бинарные включения
% ----------------------------
% bis(+l,-s)
bis(L, S) :- bis1(L, [], S).
bis1([], A, A).
bis1([X|Xs], A, S) :-
bin_ins(X, A, A1),
bis1(Xs, A1, S).
% bin_ins(+x,+l,-r)
bin_ins(X, L, R) :-
length(L, N),
bin_pos(X, L, 0, N, P),
sp2(P, L, A, B),
append(A, [X|B], R).
% bin_pos(+x,+l,+lo,+hi,-p)
bin_pos(X, L, Lo, Hi, P) :-
( Lo >= Hi ->
P = Lo
nth0(M, L, V),
( X =< V ->
bin_pos(X, L, Lo, M, P)
bin_pos(X, L, M1, Hi, P)
)
).
% sp2(+k,+l,-a,-b)
sp2(0, L, [], L) :- !.
sp2(K, [X|Xs], [X|A], B) :-
K > 0,
sp2(K1, Xs, A, B).
% Пример использования бинарных включений
ex_bis :-
L = [3, 1, 4, 1, 5, 9, 2, 6],
bis(L, S),
format('Бинарные включения:~n'),
format(' Исходный список: ~w~n', [L]),
format(' Отсортированный список: ~w~n', [S]).
run_examples :-
ex_bis.
?- run_examples
Oi0gdXNlX21vZHVsZShsaWJyYXJ5KGxpc3RzKSkuCiUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQolINC30LDQtNCw0L3QuNC1IDI6INCx0LjQvdCw0YDQvdGL0LUg0LLQutC70Y7Rh9C10L3QuNGPCiUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKJSBiaXMoK2wsLXMpCmJpcyhMLCBTKSA6LSBiaXMxKEwsIFtdLCBTKS4KCmJpczEoW10sIEEsIEEpLgpiaXMxKFtYfFhzXSwgQSwgUykgOi0KICAgIGJpbl9pbnMoWCwgQSwgQTEpLAogICAgYmlzMShYcywgQTEsIFMpLgoKJSBiaW5faW5zKCt4LCtsLC1yKQpiaW5faW5zKFgsIEwsIFIpIDotCiAgICBsZW5ndGgoTCwgTiksCiAgICBiaW5fcG9zKFgsIEwsIDAsIE4sIFApLAogICAgc3AyKFAsIEwsIEEsIEIpLAogICAgYXBwZW5kKEEsIFtYfEJdLCBSKS4KCiUgYmluX3BvcygreCwrbCwrbG8sK2hpLC1wKQpiaW5fcG9zKFgsIEwsIExvLCBIaSwgUCkgOi0KICAgICggTG8gPj0gSGkgLT4KICAgICAgICBQID0gTG8KICAgIDsgTSBpcyAoTG8gKyBIaSkgLy8gMiwKICAgICAgbnRoMChNLCBMLCBWKSwKICAgICAgKCBYID08IFYgLT4KICAgICAgICAgIGJpbl9wb3MoWCwgTCwgTG8sIE0sIFApCiAgICAgIDsgTTEgaXMgTSArIDEsCiAgICAgICAgYmluX3BvcyhYLCBMLCBNMSwgSGksIFApCiAgICAgICkKICAgICkuCgolIHNwMigraywrbCwtYSwtYikKc3AyKDAsIEwsIFtdLCBMKSA6LSAhLgpzcDIoSywgW1h8WHNdLCBbWHxBXSwgQikgOi0KICAgIEsgPiAwLAogICAgSzEgaXMgSyAtIDEsCiAgICBzcDIoSzEsIFhzLCBBLCBCKS4KCiUg0J/RgNC40LzQtdGAINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPINCx0LjQvdCw0YDQvdGL0YUg0LLQutC70Y7Rh9C10L3QuNC5CmV4X2JpcyA6LQogICAgTCA9IFszLCAxLCA0LCAxLCA1LCA5LCAyLCA2XSwKICAgIGJpcyhMLCBTKSwKICAgIGZvcm1hdCgn0JHQuNC90LDRgNC90YvQtSDQstC60LvRjtGH0LXQvdC40Y86fm4nKSwKICAgIGZvcm1hdCgnICDQmNGB0YXQvtC00L3Ri9C5INGB0L/QuNGB0L7Qujogfnd+bicsIFtMXSksCiAgICBmb3JtYXQoJyAg0J7RgtGB0L7RgNGC0LjRgNC+0LLQsNC90L3Ri9C5INGB0L/QuNGB0L7Qujogfnd+bicsIFtTXSkuCnJ1bl9leGFtcGxlcyA6LQogICAgZXhfYmlzLgogCj8tIHJ1bl9leGFtcGxlcwo=