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

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

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

Помечено: ,

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

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

    Banner
    Участник

    Доброго времени суток, помогите пожалуйста разобраться:

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

  • #2893

    Поясните что должно случиться если во втором списке всего два элемента или, например пять элементов (меньше шести).

    Схематично обработка должна выглядеть так:

    list_processing(A, B, Result):-
      first_list_proc(A, AResult),
      second_list_proc(B, BResult),
      append(AResult, BResult, Result).

    Выделение всех элементов, кроме каждого третьего на языке Prolog может быть записана следующим образом:

    first_list_proc([], []).
    first_list_proc([A], [A]).
    first_list_proc([A, B], [A, B]).
    first_list_proc([A, B, _C|Tail], [A, B|TailResult]):-
      first_list_proc(Tail, Tailresult).

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

  • #2894

    Banner
    Участник

    Уточнений по этому поводу не было, но я так понимаю, что нам заранее известно что в списке 6 и > элементов

    • #2900

      Если известно, что элементов больше шести — то можно сделать так:

      second_list_proc([A, B, C|Tail], [A, B, C, D, E, F]):-
        append(_MiddleElements, [D, E, F], Tail).

      Тут от исходного списка сразу отделяются три первых элемента, а затем, этот список разделяется при помощи функции append на две части таким образом, что вторая часть содержит три элемента ([D, E, F]). Для получения результата нужно лишь поместить все выделенные элементы в один список.

  • #2903

    Banner
    Участник

    Каким должен быть запрос, если он вообще нужен ?

    Вложения:
    • #2907

      Прочитайте статью про обработку списков в Prolog — там все с картинками описано.

      Вот тут вы разделяете входной список на первые три элемента и остальную часть: [A, B, C|Tail]. Затем вы получаете с помощью append три последних элемента и помещаете все эти элементы в один список, который возвращаете в качестве результата в аргументе функции: [A, B, C, D, E, F].

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