Преобразование списка

      Комментарии к записи Преобразование списка отключены

Помечено: ,

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

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

    questioner
    Участник

    Здравствуйте. У меня такое задание:

    Определить функцию, преобразующую список (a b c) к виду (a (b (c))).

    Пожалуйста подскажите хотя бы направление в котором надо думать. Я догадываюсь, что нужно использовать вложенность списков…

  • #1712

    На SWI Ваша задача решается очень просто, как-то так:

    innering([], []):-!.
    innering([Head], [Head]):-!.
    innering([Head|Tail], [Head|[InneringTail]]):-
        innering(Tail, InneringTail).

    Если исходный список содержит менее двух элементов — результатом будет являться такой же список. В остальных случаях список разделяется на голову и хвост (Tail). В результате рекурсивной обработки Tail формируется InneringTail. Результатом работы предиката является список из первого элемента исходного списка и InneringTail, вложенном в дополнительный список.

    На диалектах со статической типизацией типа Turbo пролога или Visual Prolog МБ тоже решается, но немного иначе.

    • #1713

      Надо на Turbo prolog. Ввел этот код и система выдает ошибку:

      Type error: illegal variable type for this position.

      Курсор стоит на InneringTail, подцели innering(Tail, InneringTail)

      • #1714

        Понятия не имею как это нормально решить на Turbo Prolog. Суть в том, что твой предикат ожидает список целых чисел, а ты ему пихаешь список, в котором вперемешку и числа и другие списки. Турбо пролог не сжует это, можно попробовать подумать в сторону описания своего домена типа списка:

        domains
          d_list = list(integer, d_list); list(d_list); empty

        и дальше работать с этим доменом, но это будет очень не красиво выглядеть.

        • #1715

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

          This functor has already been used in the domain declaration list

          В общем, я не знаю чем помочь.
          В SWI Prolog, код, который я привел выше работает, может быть стоит попробовать пропихнуть его?

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