Функция разделения списка на части

      Комментарии к записи Функция разделения списка на части отключены

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

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

    questioner
    Участник

    Нужен предикат, который разбивает список на части, которые передаются в списке. Части могут содержать анонимные переменные, в этом случае понимаются как список любой длины.
    Предикат должен уметь выполнять обратную операцию, т.е, если на вход передан список частей — из них должен составляться список.
    Кроме того, на вход могу быть поданы одновременно и список, и некоторые части, в этом случаи предикат должен рассчитать остальные (неинициализированные) части.

    Если возможно разделение несколькими способами — правило должно находить их все, например:

    divide_list("divide into parts", ["divide", B, " ", C]), string_to_list(BS, B), string_to_list(CS, C).
    BS = "", CS = "into parts" ;
    BS = " into", CS = "parts" ;

  • #1910

    Для решение достаточно использовать стандартную функцию append:

    divide_list(Part, [Part]):-!.
    divide_list(List, [First_Part|Tail]):-
      append(First_Part, ListPart, List),
      divide_list(ListPart, Tail).

    Если список частей содержит единственную часть, представляющую собой искомый список, то правило завершается (решение найдено).
    В противном случае от списка частей берется первая. Эта часть отделяется от списка вызовом append — формируется подсписок, который обрабатывается рекурсивно с остальными частями.

    Вложения:

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