Для сравнения, определение предиката sublist/2
, используемого в библиотеке Logtalk:
sublist(List, List).
sublist(Sublist, [Head| Tail]) :-
sublist(Tail, Head, Sublist).
sublist(Sublist, _, Sublist).
sublist([Head| Tail], _, Sublist) :-
sublist(Tail, Head, Sublist).
sublist([Head| Tail], Element, [Element| Sublist]) :-
sublist(Tail, Head, Sublist).
IIRC, это общее определение. Некоторые примеры вызовов могут быть:
?- list::sublist(Sublist, [1,2,3]).
Sublist = [1, 2, 3] ;
Sublist = [2, 3] ;
Sublist = [3] ;
Sublist = [] ;
Sublist = [2] ;
Sublist = [1, 3] ;
Sublist = [1] ;
Sublist = [1, 2].
?- list::sublist([1,2], List).
List = [1, 2] ;
List = [_1376, 1, 2] ;
List = [_1376, _1382, 1, 2] ;
List = [_1376, _1382, _1388, 1, 2] ;
...
?- list::sublist(Sublist, List).
Sublist = List ;
List = [_1172|Sublist] ;
List = [_1172, _1178|Sublist] ;
List = [_1172, _1178, _1184|Sublist] .
...
Обновление
Заметил, что определение в вопросе и определение в моем ответе не имеют одинаковую семантику.Определение в вопросе подразумевает последовательные элементы.Например,
?- sublist(Sublist, [1,2,3]).
Sublist = [] ;
Sublist = [1] ;
Sublist = [1, 2] ;
Sublist = [1, 2, 3] ;
Sublist = [] ;
Sublist = [2] ;
Sublist = [2, 3] ;
Sublist = [] ;
Sublist = [3] ;
Sublist = [] ;
false.
Одна из проблем в этом определении заключается в том, что решение пустого списка генерируется несколько раз.