Ответ в теме: Занести в результирующий сначала элементы первого списка кроме каждого третьего

      Комментарии к записи Ответ в теме: Занести в результирующий сначала элементы первого списка кроме каждого третьего отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Занести в результирующий сначала элементы первого списка кроме каждого третьего Ответ в теме: Занести в результирующий сначала элементы первого списка кроме каждого третьего

#3053

Здравствуйте. Вам сначала нужен предикат, выделяющий каждый третий элемент списка:

third_elements([], []).
third_elements([_], []).
third_elements([_, _], []).
third_elements([_, _, Element|Tail], [Element|TailThird]):-
  third_elements(Tail, TailThird).

Тут записано, что если в исходном списке менее трех элементов — то результатом является пустой список. В противном случае, первые два элемента пропускаются, третий запоминается в переменной Element, остальные элементы (Tail) обрабатываются рекурсивно. К результатам, полученным при рекурсивном вызове дописывается запомненный Element.

Чтобы выделить первый три элемента достаточно отделить их от исходного списка с помощью механизма разделения на голову и хвост:
first_three([A, B, C|Tail], [A, B, C]).

Чтобы получить последние три элемента можно воспользоваться функцией append. С ее помощью можно как соединить два списка в один, так и разделить один исходный на два. Такое разделение будет выполнено всеми возможными способами (с использованием механизма поиска с возвратами). Нам нужно потребовать, чтобы второй список состоял из трех элементов:

last_three(List, [A, B, C]):-
  append(_FirsElements, [A, B, C], List).

Наконец, нужно соединить все это в одном предикате:

solve(ListA, ListB, Result):-
  third_elements(ListA, ThirdAElements),
  first_three(ListB, FirstBElements),
  last_three(ListB, LastBElements),
  append(FirstBElements, LastBElements, BElements),
  append(ThirdAElements, BElements, Result).