#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. Отличное решение. Медленнее, чем решение, которое я первоначально опубликовал для небольших списков, но быстрее для списков большего размера. Удалил мой и повысил ваш.