Пролог: Список вложенных списков

#prolog

#пролог

Вопрос:

у меня есть задача создать список подсписков, в котором элементы отсортированы в последовательном порядке. У меня возникают трудности, потому что, когда он выполняет итерацию по списку и возвращает несколько списков со списком, это не то, что я хочу. Моя цель — список с несколькими подсписками длиной 3.

пример

 list([]).
list([_|T]) :- list(T).

sublist(L, []) :- list(L).
sublist([HX|TX],[HX|TY]) :- sublist(TX,TY).
sublist([_|TY], X) :- X = [_|_], sublist(TY, X).
  

При этом выводится каждый отдельный подсписк.

 ?- sublist([10,20,30,a,b], L).
L = [] ;
L = [10] ;
L = [10, 20] ;
L = [10, 20, 30] ;
L = [10, 20, 30, a] ;
L = [10, 20, 30, a, b] ;
L = [10, 20, 30, b] ;
..and so on
  

То, что я хочу, это что-то вроде этого

 ?- sublist([10,20,30,a,b], L).
L = [[10,20,30],[20,30,a],[30,a,b]] 
  

Я слишком много думал об этом, я думаю, и другая вещь X = [_,_,_] разрушает мою функциональность.

Ответ №1:

Вы можете использовать append/3 для получения всех «скользящих» подсписков.

Для конкретного случая из 3 элементов:

 sublist(L, LSubL):-
  findall([A,B,C], append(_, [A,B,C|_], L), LSubL).
  

Для более общего случая скользящего окна элементов ‘Size’:

 sliding_window(L, Size, LSubL):-
  length(SubL, Size),
  append(SubL, _, SubLO),
  findall(SubL, append(_, SubLO, L), LSubL).
  

Комментарии:

1. Отличное решение. Медленнее, чем решение, которое я первоначально опубликовал для небольших списков, но быстрее для списков большего размера. Удалил мой и повысил ваш.