:- use_module(library(lists)).
% ----------------------------
% задание 1: шелл (седжвик)
% ----------------------------
% shs(+l, -s)
shs(L, S) :-
length(L, N),
sg(N, Gs),
sp(Gs, L, S).
% sg(+n, -gs)
sg(N, Gs) :-
( N =< 1 -> Gs = [1]
; sgk(N, 0, [], Rs),
reverse(Rs, Gs)
).
sgk(N, K, A, Rs) :-
hk(K, H),
hk(K1, H1),
( 3*H1 > N ->
Rs = [H|A]
; sgk(N, K1, [H|A], Rs)
).
% hk(+k,-h)
hk(K, H) :-
).
sp([], L, L).
sp([G|Gs], L, S) :-
gp(G, L, L1),
sp(Gs, L1, S).
% gp(+g,+l,-s)
gp(G, L, S) :-
en(L, 0, Ps),
findall(Ns
, (between
(0, G1
, R
), cls
(Ps
, G
, R
, Ns
)), Bs
), append(Bs, All),
keysort(All, Ss),
vs(Ss, S).
cls(Ps, G, R, Ns) :-
iv(Cs, Vs1, Is1),
ins(Vs1, Vs2),
pi(Is1, Vs2, Ns).
pr
(G
, R
, I
-_
) :- 0 is (I
- R
) mod G
.
en([], _, []).
en([X|Xs], I, [I-X|Ps]) :-
en(Xs, I1, Ps).
iv([], [], []).
iv
([I
-V
|T
], [V
|Vs
], [I
|Is]) :- iv
(T
, Vs
, Is).
pi([], [], []).
pi
([I
|Is], [V
|Vs
], [I
-V
|T
]) :- pi
(Is, Vs
, T
).
vs([], []).
vs([_-V|T], [V|Vs]) :- vs(T, Vs).
% ins(+l,-s)
ins([], []).
ins([X|Xs], S) :- ins(Xs, S1), is1(X, S1, S).
is1(X, [], [X]).
is1(X, [Y|Ys], [X,Y|Ys]) :- X =< Y, !.
is1(X, [Y|Ys], [Y|Zs]) :- is1(X, Ys, Zs).
% Пример использования сортировки Шелла
ex_shs :-
L = [3, 1, 4, 1, 5, 9, 2, 6],
shs(L, S),
format('Сортировка Шелла:~n'),
format(' Исходный список: ~w~n', [L]),
format(' Отсортированный список: ~w~n', [S]).
run_examples :-
ex_shs.
?- run_examples.
Cgo6LSB1c2VfbW9kdWxlKGxpYnJhcnkobGlzdHMpKS4KCiUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQolINC30LDQtNCw0L3QuNC1IDE6INGI0LXQu9C7ICjRgdC10LTQttCy0LjQuikKJSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgolIHNocygrbCwgLXMpCnNocyhMLCBTKSA6LQogICAgbGVuZ3RoKEwsIE4pLAogICAgc2coTiwgR3MpLAogICAgc3AoR3MsIEwsIFMpLgoKJSBzZygrbiwgLWdzKQpzZyhOLCBHcykgOi0KICAgICggTiA9PCAxIC0+IEdzID0gWzFdCiAgICA7IHNnayhOLCAwLCBbXSwgUnMpLAogICAgICByZXZlcnNlKFJzLCBHcykKICAgICkuCgpzZ2soTiwgSywgQSwgUnMpIDotCiAgICBoayhLLCBIKSwKICAgIEsxIGlzIEsgKyAxLAogICAgaGsoSzEsIEgxKSwKICAgICggMypIMSA+IE4gLT4KICAgICAgICBScyA9IFtIfEFdCiAgICA7ICAgc2drKE4sIEsxLCBbSHxBXSwgUnMpCiAgICApLgoKJSBoaygraywtaCkKaGsoSywgSCkgOi0KICAgICggMCBpcyBLIG1vZCAyIC0+CiAgICAgICAgUDJrICBpcyAxIDw8IEssCiAgICAgICAgSzIgICBpcyBLIC8vIDIsCiAgICAgICAgUDJrMiBpcyAxIDw8IEsyLAogICAgICAgIEggaXMgOSpQMmsgLSA5KlAyazIgKyAxCiAgICA7ICAgUDJrICBpcyAxIDw8IEssCiAgICAgICAgSzIgICBpcyAoSyArIDEpIC8vIDIsCiAgICAgICAgUDJrMiBpcyAxIDw8IEsyLAogICAgICAgIEggaXMgOCpQMmsgLSA2KlAyazIgKyAxCiAgICApLgoKc3AoW10sIEwsIEwpLgpzcChbR3xHc10sIEwsIFMpIDotCiAgICBncChHLCBMLCBMMSksCiAgICBzcChHcywgTDEsIFMpLgoKJSBncCgrZywrbCwtcykKZ3AoRywgTCwgUykgOi0KICAgIGVuKEwsIDAsIFBzKSwKICAgIEcxIGlzIEcgLSAxLAogICAgZmluZGFsbChOcywgKGJldHdlZW4oMCwgRzEsIFIpLCBjbHMoUHMsIEcsIFIsIE5zKSksIEJzKSwKICAgIGFwcGVuZChCcywgQWxsKSwKICAgIGtleXNvcnQoQWxsLCBTcyksCiAgICB2cyhTcywgUykuCgpjbHMoUHMsIEcsIFIsIE5zKSA6LQogICAgaW5jbHVkZShwcihHLCBSKSwgUHMsIENzKSwKICAgIGl2KENzLCBWczEsIElzMSksCiAgICBpbnMoVnMxLCBWczIpLAogICAgcGkoSXMxLCBWczIsIE5zKS4KCnByKEcsIFIsIEktXykgOi0gMCBpcyAoSSAtIFIpIG1vZCBHLgoKZW4oW10sIF8sIFtdKS4KZW4oW1h8WHNdLCBJLCBbSS1YfFBzXSkgOi0KICAgIEkxIGlzIEkgKyAxLAogICAgZW4oWHMsIEkxLCBQcykuCgppdihbXSwgW10sIFtdKS4KaXYoW0ktVnxUXSwgW1Z8VnNdLCBbSXxJc10pIDotIGl2KFQsIFZzLCBJcykuCgpwaShbXSwgW10sIFtdKS4KcGkoW0l8SXNdLCBbVnxWc10sIFtJLVZ8VF0pIDotIHBpKElzLCBWcywgVCkuCgp2cyhbXSwgW10pLgp2cyhbXy1WfFRdLCBbVnxWc10pIDotIHZzKFQsIFZzKS4KCiUgaW5zKCtsLC1zKQppbnMoW10sIFtdKS4KaW5zKFtYfFhzXSwgUykgOi0gaW5zKFhzLCBTMSksIGlzMShYLCBTMSwgUykuCgppczEoWCwgW10sIFtYXSkuCmlzMShYLCBbWXxZc10sIFtYLFl8WXNdKSA6LSBYID08IFksICEuCmlzMShYLCBbWXxZc10sIFtZfFpzXSkgOi0gaXMxKFgsIFlzLCBacykuCgolINCf0YDQuNC80LXRgCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDRgdC+0YDRgtC40YDQvtCy0LrQuCDQqNC10LvQu9CwCmV4X3NocyA6LQogICAgTCA9IFszLCAxLCA0LCAxLCA1LCA5LCAyLCA2XSwKICAgIHNocyhMLCBTKSwKICAgIGZvcm1hdCgn0KHQvtGA0YLQuNGA0L7QstC60LAg0KjQtdC70LvQsDp+bicpLAogICAgZm9ybWF0KCcgINCY0YHRhdC+0LTQvdGL0Lkg0YHQv9C40YHQvtC6OiB+d35uJywgW0xdKSwKICAgIGZvcm1hdCgnICDQntGC0YHQvtGA0YLQuNGA0L7QstCw0L3QvdGL0Lkg0YHQv9C40YHQvtC6OiB+d35uJywgW1NdKS4KICAgIAogICAgcnVuX2V4YW1wbGVzIDotCiAgICBleF9zaHMuCgo/LSBydW5fZXhhbXBsZXMuCg==