% USAGE: sublist([4,5,6], [1,2,3,4,3,2,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10], Index).
% sublist(X, Y, I) succeeds if I is the index at which the list X can be found inside the list Y.
sublist([X|Xs], Ys0, I) :-
find_head(X, Ys0, Ys1, 1, I),
match_rest(Xs, Ys1).
find_head(X, [X|Ys], Ys, I, I).
find_head(X, [_|Ys0], Ys1, I0, I2) :-
find_head(X, Ys0, Ys1, I1, I2).
match_rest([], _).
match_rest([X|Xs], [X|Ys]) :- match_rest(Xs, Ys).
go :-
findall(Index
, (subarray
([4,5,6], [1,2,3,4,3,2,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10], Index
)), Indices
), writeln(Indices).
:- go.
JSBVU0FHRTogc3VibGlzdChbNCw1LDZdLCBbMSwyLDMsNCwzLDIsMSwyLDMsNCw1LDYsNyw4LDksMTAsMSwyLDMsNCw1LDYsNyw4LDksMTBdLCBJbmRleCkuCiUgc3VibGlzdChYLCBZLCBJKSBzdWNjZWVkcyBpZiBJIGlzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgbGlzdCBYIGNhbiBiZSBmb3VuZCBpbnNpZGUgdGhlIGxpc3QgWS4Kc3VibGlzdChbWHxYc10sIFlzMCwgSSkgOi0KICBmaW5kX2hlYWQoWCwgWXMwLCBZczEsIDEsIEkpLAogIG1hdGNoX3Jlc3QoWHMsIFlzMSkuCgpmaW5kX2hlYWQoWCwgW1h8WXNdLCBZcywgSSwgSSkuCmZpbmRfaGVhZChYLCBbX3xZczBdLCBZczEsIEkwLCBJMikgOi0KICBJMSBpcyBJMCArIDEsCiAgZmluZF9oZWFkKFgsIFlzMCwgWXMxLCBJMSwgSTIpLgoKbWF0Y2hfcmVzdChbXSwgXykuCm1hdGNoX3Jlc3QoW1h8WHNdLCBbWHxZc10pIDotIG1hdGNoX3Jlc3QoWHMsIFlzKS4KCmdvIDotCiAgICBmaW5kYWxsKEluZGV4LCAoc3ViYXJyYXkoWzQsNSw2XSwgWzEsMiwzLDQsMywyLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDEsMiwzLDQsNSw2LDcsOCw5LDEwXSwgSW5kZXgpKSwgSW5kaWNlcyksCiAgICB3cml0ZWxuKEluZGljZXMpLgoKOi0gZ28u