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

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

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

Помечено: ,

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 4 мес. назад.

  • Автор
    Сообщения
  • #2892

    Banner
    Участник

    Доброго времени суток, помогите пожалуйста разобраться: Даны два списка. Занести в результирующий сначала элементы первого списка кроме каждого третьего элемента, а затем первые три и последние три элемента второго списка. Не могу понять каким должно быть правило и запрос

  • #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).

Для ответа в этой теме необходимо авторизоваться.